Inserire valori in tabella di cui non si conosce il nome dei campi

di marman47 il
8 risposte
In una procedura VBA di ACCESS (di OFFICE 365), che ho realizzato per una associazione di volontariato, voglio eseguire delle statistiche su valori contenuti in alcune tabelle; vi risparmio il codice e le tabelle utilizzate ma cerco di fare una sintesi del problema.
Ho due tabelle; la tabella1 contiene i nomi dei campi del record di tabella2.
Il mio obiettivo è quello di utilizzare il contenuto della tabella1 per individuare e valorizzare i campi della tabella2.

Supponendo che il contenuto della tabella1 sia:
record 1 = "cam1"
record 2 = "cam2"

Mentre tabella2 non contiene alcun record

Ho il seguente codice che accede alle tabelle.

Dim pnt1 AS Recordset
Dim pnt2 AS Recordset
Dim nome_campo AS String
Set pnt1 = CurrentDB.OpenRecordset ("SELECT tabella1.campo1 FROM tabella1")
Set pnt2 = CurrentDB.OpenRecordset ("SELECT tabella2.cam1, tabella2.cam2 FROM tabella2")
fino qui tutto bene; ora voglio aggiungere un nuovo record in tabella2 e valorizzare cam1 e cam2 traendo il nome del campo dalla tabella1

questo è il pseudo-codice per spiegare ciò che vorrei ottenere:

pnt2.AddNew
nome_camp = cam1
pnt2![nome_camp] = "pippo" 	' valorizza pnt2!cam1
nome_camp = cam2
pnt2![nome_camp] = 1234		' valorizza pnt!cam2
pnt2.Update
alla fine la tabella2 dovrà contenere il nuovo record -> pippo, 1234

Ho fatto ricerche su internet ma non ho trovato soluzioni; un grazie anticipato a chi potrà darmi una dritta per risolvere il quesito.

8 Risposte

  • Non ho capito...
  • In effetti suona un pò strano; è come dire
    "ecco le chiavi della mia macchina ma non so qual'è nel parcheggio "

    un esempio sarebbe di aiuto
  • Il titolo può trarre in inganno ma la sostanza è questa:
    Devo archiviare un valore in una tabella di cui conosco il numero sequenziale del campo all'interno del record ma non conosco il suo nome.
    per rifarmi al pseudo-codice, devo:
    
    pnt2.AddNew
    numero_campo = 1
    pnt2![numero_campo] = "pippo" 	' valorizza pnt2!cam1
    numero_campo = 2
    pnt2![numero_campo] = 1234		' valorizza pnt!cam2
    pnt2.Update
    
    tabella2 dovrà contenere il nuovo record -> pippo, 1234

    Spero di essermi spiegato
  • Vedi l'oggetto Field e la la Fields collection:
    https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/field-object-dao
    https://docs.microsoft.com/en-us/office/vba/access/concepts/data-access-objects/read-from-and-write-to-a-field-in-a-dao-recordset
    https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/the-field-object
    https://docs.microsoft.com/en-us/office/client-developer/access/desktop-database-reference/fields-collection-dao
  • marman47 ha scritto:


    ...
    Devo archiviare un valore in una tabella di cui conosco il numero sequenziale del campo all'interno del record ma non conosco il suo nome.
    ...
    Ciao,
    puoi accedere al campo tramite il suo indice dalla collection Fields

    Opss... non avevo visto la risposta di willy55 tra l'altro ricca di link
  • Grazie Willi, le tue indicazioni si sono rivelate preziosissime, ho risolto il mio problema.
    La cosa è risultata di una semplicità estrema, ecco il brogliaccio di codice che mi consente di fare quanto desideravo
    
    Sub Archivia()
         
        Dim MioDB As Database
        Dim rstTab As Recordset
         
        Set MioDB = CurrentDb
        Set rstTab = MioDB.OpenRecordset("Tabella")
         
        Debug.Print rstTab.Fields(0).Name, rstTab.Fields(0).Value
        Debug.Print rstTab.Fields(1).Name, rstTab.Fields(1).Value
        rstTab.Edit
        rstTab.Fields(1).Value = "Pippo"
        rstTab.Update
        Debug.Print rstTab.Fields(1).Name, rstTab.Fields(1).Value
         
        rstTab.Close
        MioDB.Close
         
    End Sub
    
    Ora posso ricavare il nome del campo in base alla sua posizione nel record, e modificarne il contenuto; il risultato dell'output
  • marman47 ha scritto:


    ...Ora posso ricavare il nome del campo in base alla sua posizione nel record...
    in base al suo indice nella collection fields del recordset. Dire "in base alla sua posizione nel record" può generare confusione in chi non ha ancora le idee chiarissime. Di fatto il risultato è "lo stesso" ma è il concetto che ci sta sotto che è diverso.
  • Osservazione corretta, grazie a tutti!
Devi accedere o registrarti per scrivere nel forum
8 risposte