Newsgroup: it.comp.appl.access
Titolo: Comparazione fra tabelle, anzi fra singoli record di e diverse tabelle

Ho scaricato dalla rete un mdb che contiene un codice che scrive in
una terza tabella le differenze riscontate tra i record di due diverse
tabelle.
Ho modificato (fino a che ci sono riuscito) il codice in questione al
fine di ottenere quanto segue:
In una Maschera ,PRIMA di Aggiornamento, ho inserito il seguente
codice che mi permette di azzerare le tabelle
"TabellaPrimaDellaModifica" e "TabellaDopoLaModifica" e di inserire
nella tabella "TabellaPrimaDellaModifica" il record cosě come era
prima della modifiche apportate:
Private Sub Form_BeforeUpdate(Cancel As Integer)
    DoCmd.SetWarnings False
    DoCmd.RunSQL "DELETE TabellaPrimaDellaModifica.*,
TabellaPrimaDellaModifica.Con FROM TabellaPrimaDellaModifica WHERE
(((TabellaPrimaDellaModifica.Con) Is Not Null));", -1
    DoCmd.RunSQL "DELETE TabellaDopoLaModifica.*,
TabellaDopoLaModifica.Con FROM TabellaDopoLaModifica WHERE
(((TabellaDopoLaModifica.Con) Is Not Null));", -1
    DoCmd.RunSQL "INSERT INTO TabellaPrimaDellaModifica SELECT
Tabella.* FROM Tabella WHERE
(((Tabella.Con)=[Forms]![Scheda]![Con]));", -1
    End Sub 
Nella Stessa Maschera, DOPO Aggiornamento, ho inserito il seguente
codice che mi permette di inserire il record cosě come modificato
nella TabellaDopoLaModifica e, attraverso il modulo CompareTables2, di
ottenere in una terza tabella (denominata "TabellaDiscrepanze")che
contiene le differenze fra i due record prima e dopo l'aggiornamento
Private Sub Form_AfterUpdate()
DoCmd.SetWarnings False
     'questo va messo dopo il salvataggio del record cosi il codice
confronta i due testi
    DoCmd.RunSQL "INSERT INTO TabellaDopoLaModifica SELECT Tabella.*
FROM Tabella WHERE (((Tabella.Con)=[Forms]![Scheda]![Con]));", -1
    Call CompareTables2("TabellaPrimaDellaModifica", "Con",
"TabellaPrimaDellaModifica", "TabellaDopoLaModifica")
    DoCmd.RunSQL "INSERT INTO Storico ( Con, NomeCampo, VecchioTesto,
NuovoTesto ) SELECT TabellaDiscrepanze.Con,
TabellaDiscrepanze.NomeCampo, TabellaDiscrepanze.VecchioTesto,
TabellaDiscrepanze.NuovoTesto FROM TabellaDiscrepanze;", -1
End Sub
Trascrivo qui di seguito il modulo "CompareTables2" :
Sub CompareTables2(BaseTable As String, PrimaryKeyField As String, _
                BaseTableQuery As String, TabellaDiComparazioneQuery
As String)
'parameters
'   BaseTable: the table that is considered the 'base', that is, the
one considered accurate
'   PrimaryKeyField: the primary key for both tables
'   qryBase: an ordered query based on the 'base' table
'   qryVarying: an ordered query based on the table being compared to
the 'base'
On Error GoTo Err_CompareTables
Dim db As Database
Dim rstBase As Recordset
Dim rstVarying As Recordset
Dim tdf As TableDef
Dim fld As Field
Dim FieldChanged As Boolean
Dim ErrorMessage As String
Set db = CurrentDb
Set rstBase = db.OpenRecordset(BaseTableQuery)
Set rstVarying = db.OpenRecordset(TabellaDiComparazioneQuery)
Set tdf = db.TableDefs(BaseTable)
db.TableDefs.Delete "TabellaDiscrepanze"
db.Execute ("CREATE TABLE TabellaDiscrepanze (Con TEXT(255), NomeCampo
TEXT(255), VecchioTesto TEXT(255), NuovoTesto TEXT(255));")
rstBase.MoveFirst
rstVarying.MoveFirst
Do Until rstBase.EOF
    If rstVarying.EOF = True Then
        ErrorMessage = "**** record " & rstBase(PrimaryKeyField) & _
                    " deleted ****"
        db.Execute ("INSERT INTO TabellaDiscrepanze (Con) " _
                & "VALUES ( '" & ErrorMessage & "');")
 
        For Each fld In tdf.Fields
            db.Execute ("INSERT INTO TabellaDiscrepanze (Con,
NomeCampo, VecchioTesto)" _
                    & " VALUES ( '" & rstBase(PrimaryKeyField) & "','"
& fld.Name & "','" & rstBase(fld.Name) & "');")
            FieldChanged = True
        Next fld
        rstBase.MoveNext
    ElseIf rstBase(PrimaryKeyField) > rstVarying(PrimaryKeyField) Then
        ErrorMessage = "**** record " & rstVarying(PrimaryKeyField) &
_
                    " added ****"
        db.Execute ("INSERT INTO TabellaDiscrepanze (Con) " _
                & "VALUES ( '" & ErrorMessage & "');")
 
        For Each fld In tdf.Fields
            db.Execute ("INSERT INTO TabellaDiscrepanze (Con,
NomeCampo, NuovoTesto)" _
                    & " VALUES ( '" & rstVarying(PrimaryKeyField) &
"','" & fld.Name & "','" & rstVarying(fld.Name) & "');")
            FieldChanged = True
        Next fld
 
        rstVarying.MoveNext
    ElseIf rstBase(PrimaryKeyField) < rstVarying(PrimaryKeyField) Then
        ErrorMessage = "**** record " & rstBase(PrimaryKeyField) & _
                    " deleted ****"
        db.Execute ("INSERT INTO TabellaDiscrepanze (Con) " _
                & "VALUES ( '" & ErrorMessage & "');")
 
        For Each fld In tdf.Fields
            db.Execute ("INSERT INTO TabellaDiscrepanze (Con,
NomeCampo, VecchioTesto)" _
                    & " VALUES ( '" & rstBase(PrimaryKeyField) & "','"
& fld.Name & "','" & rstBase(fld.Name) & "');")
            FieldChanged = True
        Next fld
        rstBase.MoveNext
    Else
        FieldChanged = False
        For Each fld In tdf.Fields
            If rstBase(fld.Name) <> rstVarying(fld.Name) Then
                If Not FieldChanged Then
                   ' pippo ErrorMessage = "**** record " &
rstBase(PrimaryKeyField) & _
                        " Modified ****"
                    db.Execute ("INSERT INTO TabellaDiscrepanze (Con)
" _
                        & "VALUES ( '" & ErrorMessage & "');")
                End If
                db.Execute ("INSERT INTO TabellaDiscrepanze (Con,
NomeCampo, VecchioTesto, NuovoTesto)" _
                        & " VALUES ( '" & rstBase(PrimaryKeyField) &
"','" & fld.Name & "','" & rstBase(fld.Name) & "','" &
rstVarying(fld.Name) & "');")
                FieldChanged = True
            End If
        Next fld
       ' If Not FieldChanged Then
        '    ErrorMessage = "Record " & rstBase(PrimaryKeyField) & _
         '           " identical"
       ' End If
        rstBase.MoveNext
        rstVarying.MoveNext
        FieldChanged = False
    End If
Loop
Do Until rstVarying.EOF
    ErrorMessage = "**** record " & rstVarying(PrimaryKeyField) & _
                " added to ****"
        db.Execute ("INSERT INTO TabellaDiscrepanze (Con) " _
                & "VALUES ( '" & ErrorMessage & "');")
 
        For Each fld In tdf.Fields
            db.Execute ("INSERT INTO TabellaDiscrepanze (Con,
NomeCampo, NuovoTesto)" _
                    & " VALUES ( '" & rstVarying(PrimaryKeyField) &
"','" & fld.Name & "','" & rstVarying(fld.Name) & "');")
            FieldChanged = True
        Next fld
    rstVarying.MoveNext
Loop
Exit_CompareTables:
    Set rstBase = Nothing
    Set rstVarying = Nothing
    db.Close
    Exit Sub
Err_CompareTables:
    If Err.Number = 3010 Then   '*** if the error is the table is
missing
        Resume Next             '*** then skip the delete line and
resume on the next line
    ElseIf Err.Number = 3265 Then
        Resume Next
    Else
        MsgBox Err.Description      '*** write out the error and exit
the sub
        Resume Exit_CompareTables
    End If
End Sub
Il problema č questo:
Se modifico il valore di un qualsiasi controllo nella tabella
"TabellaDiscrepanze" mi compare, per esempio VECCHIOTESTO "Pippo"
NUOVOTESTO "Beppe"; Invece se il VECCHIOTESTO o il NUOVOTESTO non
contiene alcun valore il codice CompareTables2 non genera nessun nuovo
record.
A me interessa che venga creato un nuovo record sia nel caso che venga
inserito del testo in un campo prima vuoto, sia nel caso che venga
cancellato tutto il contenuto da un campo che prima conteneva un
valore.
.... Spero di essere stato chiaro.
Qualcuno puň aiutarmi?

 tabelle.
Spiega bene cosa intendi per "differenze riscontrate tra i record di
due diverse tabelle".
Due record si considerano uguali quando hanno gli stessi
campi ovvero quando hanno gli stessi campi .AND. sono
uguali i contenuti dei campi corrispondenti?
Quindi controllo a livello di numero e nome dei
campi ovvero anche dei loro contenuti?
Le due tabelle hanno lo stesso numero di record?
I record hanno lo stesso numero di campi?
Ciao
Bruno

...

Mi riferisco alle differenze riscontrate solo in ordine al CONTENUTO
dei campi.
In particolare, a me interessa solo  il controllo a livello di
CONTENUTO in quanto:
1)so che le due tabelle hanno gli stessi campi;
2)so che entrambe le tabelle hanno un unico record in quanto io stesso
all'inizio del modulo azzero entrambe le tabelle e poi inserisco in
una il record cosě come era prima dell'aggiornamento e nell'altra il
record cosě come appare dopo l'aggiornamento.
Spero di essermi spiegato.
Ciao Federico

 Ciao Federico
Sì, ti sei spegato.
Però vorrei farti ancora qualche domanda:
1 - le due tabelle continueranno sempre ad avere un
     record ciascuna?
2 - potresti mandarmi il nome e il tipo dei campi il cui
     contenuto va raffrontato?
3 - qual è l'output del confronto:
        a) semplicemente indicare i record delle due tabelle
            che differiscono per almeno un campo
        b) indicare anche dettagliatamente quali sono i campi
            corrispondenti che differiscono?
4 - esistono chiavi primarie sulle due tabelle?
Bruno 

...

1 - Si, sono tabelle dove metto provvisoriamente il record su cui sto
lavorando con la maschera (la maschera è collegata ad una quarta
tabella, la Tabella "TaInt", nella quale archivio i dati del mio DB):
in soldoni, per mezzo della maschera scrivo i dati nella Tabella
"TaInt"; prima di aggiornare azzero le tabelle che mi servono per la
comparazione, poi scrivo nella prima tabella il record così come è
prima dell'aggiornamento e nell'altra Tabella il record così come
risulta dopo l'aggiornamento di uno o più campi. A questo punto ( e
con questo rispondo al punto 3), per mezzo del modulo CompareTables2
creo un record nella Tabella  "TabellaDiscrepanze", record che
contiene le differenze nel record prima e dopo l'aggiornamento, record
che poi IncolloAccodo ad una ulteriore Tabella (TaIntStorico)
unitamente al nome dell'utente e la data della modifica e con ciò
posso documentare chi e quando ha creato o modificato un certo record.
2- I campi delle Tabelle sono diversi e di diverso formato (testo,
data, memo, ecc.). Se occorre posso mandarti il db zippato così fai
prima a vedere cosa ti serve. Tieni conto, però che "funziona" già
tutto, manca solo .....nel modulo CompareTables2 le istruzioni per
..... far funzionare il tutto non solo nel caso in cui modifico un
campo, ma anche nel caso in cui inserisco del testo in un campo vuoto
o elimino tuttoiol testo da un campo.
ciao Federico

 ciao Federico
Ok, prova a inviarmi il file.
Intanto dimmi cosa intendi per discrepanze.
Se in un campo c'è scritto "Federico" e io ci vado
a scriver sopra "Bruno", tu nella "TabellaDiscrepanze" riporti
l'intero record che ha il campo con scritto "Federico", poi
ancora l'intero record che ha il campo con scritto "Bruno"
e così via tutte le volte che qualcuno fa dei cambiamenti?
Bruno

 Bruno
Ti ho inviato il file 5 giorni fa.
Fammi sapere se ti è arrivato e (ove tu l'abbia ricevuto) se pensi di
potermi dare una risposta.
Intanto, come già riferito 5 giorni fa, ti ribadisco che nella
"TabellaDiscrepanze" riporto un record dove in un campo Chiamato
NomeCampo c'è scritto NomeDiBattesimo , in un secondo campo Chiamato 
VecchioTesto c'è scritto Federico e un ultimo campo Chiamato
NuovoTesto c'è scritto Bruno.
Il tutto lo vedrai meglio se userai il DB che ti ho inoltrato.
Fammi sapere
Federico

 Federico
Non ho ricevuto niente.
Hai tolto quelle X davanti al mio cognome nell'e-mail
address?
Bruno 

...

Ti ho di nuovo inviato il file 4 giorni fa.
Ho tolto le x davanti al tuo cognome.
Pensi di potermi rispondere?
Grazie.
Federico

 Federico
Sì, ho ricevuto il file (PerMarco?)
La tabella principale è TaInt.
Tu vuoi che qualsiasi modifica apportata ad un qualunque campo di TaInt 
venga rilevata, se la modifica viene effettuata in un campo che né 
inizialmente né alla fine risulti blank.
Quindi solo modifica e non cancellazione o creazione di testo.
Come pensi di compilare il campo di TaIntStorico denominato Utente?
(nell'esempio che mi hai inviato porta di default "UtenteCheOpera").
In questo week-end vedrò di combinare qualcosa.
Posso sostituire, cambiare, eliminare una o più delle tabelle Discrepanze, 
Prima della modifica, Dopo la modifica?
Ciao
Bruno 

 Bruno
Sì, la mia tabella principale è TaInt, mentre TaIntStorico ha la
funzione di documentare i cambiamenti apportati a qualsiasi campo e
l'utente che apporta i cambiamenti.
No, io vorrei che  fosse rilevata qualsiasi modificazione di ogni
campo e cioè un campo non contenente alcun dato che dopo la modifica
contiene un dato ( da nulla a Pippo); campo che contiene un dato che
dopo la modifica contiene un dato diverso (da Pippo a Pluto) oppure
campo che dopo la modifica non contiene più alcun dato (da Pippo a
nulla)
La compilazione del campo Utente avviene nel seguente modo: il
programma ha sempre aperta una Maschera (SchedaPrincipale) la quale
contiene un controllo (ImpTo) nel quale salvo il nome dell'Impiegato
nel momento in cui inserisce la sua password per entrare nel
programma. Io non farò altro che inserire nel codice  ….. Me.Utente =
Forms. SchedaPrincipale. ImpTo.
Le Tabelle Discrepanze, Prima della modifica, Dopo la modifica sono
solo degli strumenti con i quali cercavo di ottenere il risultato di
cui sopra. Io sono poco esperto di VBA, anche da 4 o 5 anni mi diverto
da matti a costruire programmi; sono solo un praticone e mi manca
tutto quel retroterra culturale specifico e quindi spesso mi ritrovo a
fare il tragitto Firenze Roma passando da Venezia oppure a tagliare il
burro con una sega elettrica perché quella è l'unica strada che
conosco o l'unico strumento che so usare. Ergo, …. le Tabelle
Discrepanze, Prima della modifica, Dopo la modifica mi servivano a
fare quello che volevo fare, ma  se puoi farne a meno puoi anche
eliminarle.
Ciao e grazie
Federico

 Federico
Per Bruno
Non vorrei apparirti insistente, ma io continuo ad avere bisogno della
soluzione al mio quesito.
Se pensi di non potermela fornire fammelo sapere in modo che io possa
riformulare il quesito nel NG.
Ti ringrazio
Federico