Queries |
2.5 Generare automaticamente una query di accodamento tra due tabelle con numero diverso di campi. |
Lorenzo Coronati |
Public Function AccodaTabella(TabDa As String, TabA As String) As String 'Autore: Lorenzo Coronati 'Ritorna una stringa sql per accodare i record della TabDa in TabA 'impostando a null eventuali campi presenti solo in TabA Dim d As DAO.Database Set d = CurrentDb Dim t As DAO.TableDef, t1 As DAO.TableDef Set t = d.TableDefs(TabDa) Set t1 = d.TableDefs(TabA) Dim s As String s = "INSERT INTO " & TabA & " (##) SELECT §§ FROM " & TabDa & ";" Dim f As DAO.Field For Each f In t1.Fields s = SostituisciStringa(s, f.Name & ", ##", "##") If EsisteCampo(t, f.Name) Then s = SostituisciStringa(s, TabDa & "." & f.Name & ", §§", "§§") Else s = SostituisciStringa(s, "null, §§", "§§") End If Next f s = EliminaStringa(s, ", ##") s = EliminaStringa(s, ", §§") AccodaTabella = s End Function Public Function EsisteCampo(t As TableDef, c As String) As Boolean On Error GoTo annulla Debug.Print t.Fields(c).Name EsisteCampo = True Exit Function annulla: EsisteCampo = False End Function Public Function SostituisciStringa(campo As String, commento As String, car As String) As String Dim i As Integer i = InStr(1, campo, car) - 1 SostituisciStringa = Left(campo, i) SostituisciStringa = SostituisciStringa & commento & Right(campo, Len(campo) - i - Len(car)) End Function Public Function EliminaStringa(s As String, car As String) As String EliminaStringa = Left(s, InStr(1, s, car) - 1) & Right(s, Len(s) - InStr(1, s, car) - Len(car) + 1) End FunctionServe per generare automaticamente una query di accodamento da una tabella all'altra quando le due strutture sono diverse (campi in piu' o in meno). Tipico esempio di utilizzo: upgrade del be da una qualsiasi versione precedente. Tu fornisci la nuova tabella e vuoi accodarci i record di quella vecchia. Quando i campi hanno lo stesso nome, no problem, ma se hai nuovi campi e non sai quali sono... Comprese nel prezzo le routine per verificare se un campo esiste, per sostituire una parte di stringa in un'altra, per eliminare un pezzo di stringa. Nota Le funzioni di cui sopra fanno riferimento alla libreria Microsoft DAO quindi, se si usa una versione di Access successiva ad Access 97, occorre aggiungere al database i riferimenti a Microsoft DAO 3.6 Object Library. |