ho bisogno ancora del vostro aiuto.
non conosco access, sono agli inizi, e dopo circa 2 mesi di studio e lettura su access e di vari codici non sono riuscito a risolvere il seguente problema.
Ho 2 tabelle identiche, uguali in struttura e contenti gli stessi valori, uguale numero di records e campi come in fig.;
le 2 tabelle vengono aggiornate aggiungendo altri records,
in questo progetto i campi interessati sono:
N1, N2, N3, N4, N5, N6, per la tabella 1
E1, E2, E3, E4, E5, E6, per la tabella 2
si tratta di confrontare ciascun records della tabella 1 con tutti i records della tabella 2 alla ricerca dei numeri uguali, e di riportare il risultato del confronto in altri campi, già predisposti, della tabella 1.
il risultato in questo caso non è la quantità di numeri uguali ma il numero di volte in cui si hanno numeri singoli, coppie, terzine, ... sestine oppure nessun numero uguale.
Ad esempio:
confrontiamo il primo record di tabella 1, campi da N1 ad N6, con tutti i records di tabella 2, campi da E1 ad E6;
poiché le tabelle in questo caso sono uguali devo saltare il primo record della tabella 2 ed iniziare dal record 2 di tabella 2,
cosi anche quando si esaminano gli altri records di tabella 1 e si fa il confronto con lo stesso record in tabella 2.
confrontiamo ogni campo del record 1 della tabella 1 con tutti i campi del record 2 di tabella 2
quindi N1 con tutti i campi da E1 ad E6 di tabella 2;
poi N2 con tutti i campi da E1 ad E6 di tabella 2;
……
Infine
N6 con tutti i campi da E1 ad E6 di tabella 2;
nel record 2 di tabella 2 non ci sono numeri uguali al record 1 di tabella 1, quindi inserisco il valore 1 nel campo Nie del record 1 di tabella 1, ad indicare che 1 volta non si hanno numeri in comune.
Poiche il conto dei campi inizia da zero, il primo campo utile in cui inserire il risultato, nel mio caso, è il numero 13, mentre l’ultimo è 19.
Passiamo a confrontare sempre il record 1 di tabella 1 con il successivo record di tabella 2, record 3, e qui si hanno 4 numeri uguali,
inserisco, sempre nel record 1 di tabella 1, il valore 1 nel campo Qua, ad indicare che 1 volta si hanno 4 numeri uguali, una quartina.
in pratica è come avere 2 range uguali e confronto ogni riga del range1 con ciascuna riga del range2, escludendo dal range2 la riga uguale.
confrontando il record 1 di tabella 1 con il record 4 di tabella 2, trovo 1 numero uguale, e nel campo Uno, sempre nel record 1 di tabella 1, inserisco il valore 1.
continuando il confronto tra il record 1 di tabella 1 ed i records successivi di tabella 2, nel record 5, e poi in record 8, trovo 6 numeri uguali, quindi nel campo Ses, sempre nel record 1 di tabella 1, inserisco prima il valore 1 e poi 2.
Continuo in questo modo a confrontare il record 1 di tabella 1 con i restanti records di tabella 2 fino all’ultimo record di tabella 2, aggiungendo ai valori già presenti nei campi da Ses a Nie i risultati di questi ulteriori confronti.
terminato il confronto tra il record 1 di tabella 1 con i tutti i records di tabella 2, passo a confrontare, in egual modo, il record 2 di tabella 1 con i tutti i records di tabella 2, escludendo dal confronto il record uguale di tabella 2, ed inserendo questa volta nei campi da Ses a Nie del record 2 di tabella 1 i risultati del confronto.
così procedo per gli altri records di tabella 1 e tabella2.
faccio notare, può essere utile per velocizzare il confronto, che i numeri in ciascun records delle due tabelle sono unici e disposti in ordine crescente, da sinistra verso destra.
Come scrivevo all’inizio dopo tanto studio e lettura di access, provando col metodo join, con select…from, e tante query inutili, sono riuscito solo a realizzare il seguente codice, incompleto perché manca la parte di calcolo dei numeri uguali, e che non differisce da un codice per excel:
- Codice: Seleziona tutto
Option Compare Database
Sub TROVA()
Dim db As DAO.Database
Dim Tab1 As DAO.Recordset
Dim Tab2 As DAO.Recordset
Set db = CurrentDb
Set Tab1 = db.OpenRecordset("TABELLA1", dbOpenDynaset)
Set Tab2 = db.OpenRecordset("TABELLA2", dbOpenDynaset)
Tab2.MoveFirst
Do Until Tab2.EOF
Tab1.MoveFirst
Do Until Tab1.EOF
For K = 4 To 9
For J = 4 To 9
B = Tab2.Fields(K).Value 'ELIMINARE
C = Tab1.Fields(J).Value 'ELIMINARE
If Tab2.Fields(K).Value <> Tab1.Fields(J).Value Then
' QUI INSERIRE COSA FARE
End If
Next J
Next K
Tab1.MoveNext
Loop 'RIFERITO A Tab1
Tab2.MoveNext
Loop 'RIFERITO A Tab2
Tab1.Close
Tab2.Close
db.Close
Set Tab1 = Nothing
Set Tab2 = Nothing
Set db = Nothing
End Sub
volevo sfruttare la potenza e la velocità di access per realizzare quanto descritto.
Forse sarebbe meglio una macro da inserire in un modulo e collegata ad una maschera così con il debug riesco a capire il funzionamento di access dal momento che sono ancora alle prime armi, ma va bene qualunque soluzione.
Ciao e grazie