Condividi:        

confronto campi tabelle access

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

confronto campi tabelle access

Postdi miko » 07/01/20 06:32

Buongiorno,
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.;

Immagine

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.

Immagine

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
windows 10 - office 2013
miko
Utente Senior
 
Post: 521
Iscritto il: 29/12/09 10:44

Sponsor
 

Postdi archimede » 07/01/20 17:50

Non ho capito una mazza, purtroppo.

Proviamo un passo alla volta.

Dato il primo record di tabella1 (5, 25, 39, 55, 66, 69) qual è la prima SINGOLA informazione che ti serve?
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: confronto campi tabelle access

Postdi miko » 10/01/20 08:02

Buongiorno,
spiacente per la mancanza di chiarezza.
provo a descrivere nuovamente e diversamente il problema.

Ho 2 tabelle identiche, tabella1 e tabella2, uguali in struttura, numero di records e campi, contenti gli stessi valori;

le 2 tabelle, ogni tanto, vengono aggiornate aggiungendo altri records,
in ogni record i valori sono disposti in ordine crescente, dal più piccolo al più grande, da sinistra verso destra

il procedimento di calcolo si svolge in questo modo:

1) confrontare ogni records della tabella1 con tutti i records della tabella2

2) contare quanti numeri uguali ci sono in ogni confronto tra i 2 record presi in esame

3) il risultato che vorrei ottenere però non è la quantità di numeri uguali che si ha in ogni confronto tra record, cioè se si hanno 2, oppure 3,...., oppure 6, numeri uguali,

ma quante volte si ha 1 solo numero uguale, oppure 2 numeri uguali, …oppure 6 numeri uguali, cioè numeri singoli, coppie, terzine, ... sestine oppure nessun numero uguale, in ogni confronto tra record

4) Perciò a seconda di quanti numeri uguali si hanno in un confronto tra record, inserire 1 nel corrispondente campo, da Ses a Nie, del record della tabella 1 preso in esame.

Nie <<< nesun numero uguale, ...... Uno <<< 1 numero uguale, ...... Cop <<< 2 numeri uguali,
….
Qin <<< 5 numeri uguali, ..... Ses <<< 6 numeri uguali,

5) il risultato del confronto viene inserito solo in tabella1, nei campi citati, ed in corrispondenza del record di tabella1, preso in esame, aggiungendo, eventualmente, ai valori già presenti nei campi Nie – Ses quelli che derivano dai successivi confronti.

esempio:

confrontiamo record1 di tabella1 con tutti i records di tabella2

record1 - tabella1 (5, 25, 39, 55, 66, 69)......NO confronto con......record1 - tabella2 (5, 25, 39, 55, 66, 69)
in questo caso non eseguiamo il confronto, essendo tabelle uguali, è come cercare numeri uguali di un record in se stesso

record1 - tabella1 (5, 25, 39, 55, 66, 69)......confronto con......record2 - tabella2 (3, 42, 43, 48, 56, 71)
nessun numero uguale >>> conteggio = 1
nel campo Nie, del record1 di tabella1, inserisco 1 ad indicare che 1 volta non si hanno numeri in comune.

record1 - tabella1 (5, 25, 39, 55, 66, 69)......confronto con......record3 - tabella2 (5, 25, 38, 55, 67, 69)
qui si hanno 4 numeri uguali >>> conteggio = 1
nel campo QUA, del record1 di tabella1, inserisco 1 ad indicare che 1 volta si hanno 4 numeri uguali, quartina.

record1 - tabella1 (5, 25, 39, 55, 66, 69)......confronto con......record4 - tabella2 (7, 45, 66, 70, 73, 90)
qui si ha 1 numero uguale >>> conteggio = 1
nel campo Uno, del record1 di tabella1, inserisco 1 ad indicare che 1 volta si è avuto 1 numero uguale, numeri singoli .
………………
………………………

record1 - tabella1 (5, 25, 39, 55, 66, 69)......confronto con......record8 - tabella2 (5, 25, 39, 55, 66, 69)
qui si hanno 6 numeri uguali >>> conteggio = 1
nel campo Ses, del record1 di tabella1, inserisco 1 ad indicare che 1 volta si sono avuti 6 numeri uguali, una sestina .
………………………….
……………………………….
Continuo con

record1 - tabella1 (5, 25, 39, 55, 66, 69)...confronto con tutti i rimanenti record di tabella2 fino all’ultimo record di tabella 2,
aggiungendo ai valori, eventualmente già presenti nei campi da Ses a Nie del record1 di tabella1, il risultato di questi ulteriori confronti;

se quindi in un successivo confronto si trova 1 numero uguale, ed il campo Nie era = 1, diventerà Nie = 1 + 1 = 2
se in un successivo confronto si trovano 4 numeri uguali, ed il campo Qua era = 3, diventerà Qua = 3 + 1 = 4
così per gli altri campi.

Finito l’esame del record1 di tabella1, considero il record2 di tabella1 e lo confronto con tutti i record di tabella2

Il risultato del confronto ora verrà inserito nei campi da Ses a Nie del record2 di tabella1

record2 - tabella1 (3, 42, 43, 48, 56, 71)……confronto con……record1 - tabella2 (5, 25, 39, 55, 66, 69)
nessun numero uguale >>> conteggio = 1
nel campo Nie, del record2 di tabella 1, inserisco 1 ad indicare che 1 volta non si hanno numeri in comune.

record2 - tabella1 (3, 42, 43, 48, 56, 71)…… NO confronto con……record2 - tabella2 (3, 42, 43, 48, 56, 71)
in questo caso non eseguiamo il confronto, essendo tabelle uguali, è come cercare numeri uguali di un record in se stesso

record2 - tabella1 (3, 42, 43, 48, 56, 71)……confronto con……record3 - tabella2 (5, 25, 38, 55, 67, 69)
nessun numero uguale >>> conteggio = 1
nel campo Nie, del record 2 di tabella 1, aggiungo 1 al valore già presente, per cui Nie diventerà:
Nie = 1 (precedente) + 1 (attuale) = 2
………………………
……………………………

record2 - tabella1 (3, 42, 43, 48, 56, 71)……confronto con……record 6 - tabella2 (3, 42, 43, 48, 56, 71)
qui si hanno 6 numeri uguali >>> conteggio = 1
nel campo Ses, del record 2 di tabella 1, inserisco 1 ad indicare che 1 volta si sono avuti 6 numeri uguali, una sestina .
………………
…………….
Continuo l’esame del record2 di tabella1, confrontandolo con tutti i restanti e successivi record di tabella 2.

Poi passo al record3 di tabella1 e lo confronto con tutti i record di tabella2, e così via fino all’ultimo record di tabella1.

Come si nota il conteggio è sempre = 1, bisogna solo inserire il valore 1, nei campi da Ses a Nie, a seconda della quantità di numeri uguali trovati in ogni confronto, aggiungendoli ai valori, eventualmente già presenti,
scrivo impropriamente, ad esempio, per il campo Ses
Ses.Value = Ses.Value + 1

Poiche il conto dei campi inizia da zero, il primo campo utile, Ses, in cui inserire il conteggio, nel mio caso, è il numero 13, mentre l’ultimo, Nie, è 19.

Anche se la descrizione è prolissa spero questa volta in una migliore chiarezza del procedimento.

Ciao e grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 521
Iscritto il: 29/12/09 10:44

Re: confronto campi tabelle access

Postdi davide72 » 10/01/20 11:33

adesso è claro
davide72
Utente Senior
 
Post: 6494
Iscritto il: 10/06/14 22:01

Postdi archimede » 10/01/20 12:38

SQL non è un linguaggio "procedurale" in cui elabori un record alla volta: devi pensare in termini di "insiemi" di dati.

Ad esempio puoi fare una query che ti dice quanti sono i records di tabella2 che contengono il valore di tabella1.n1 in uno qualsiasi dei campi n1 - nx, cose di questo genere.

Per fare quello che vuoi (ammesso e non concesso che abbia capito cosa desideri ottenere) bisogna scrivere del codice procedurale in VBA temo (sul quale non posso esserti d'aiuto). Ma non sarà una soluzione efficiente, specie se la quantità di dati che devi gestire è notevole (migliaia di records per ciascuna tabella).

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Postdi archimede » 12/01/20 19:02

Forse ho trovato un modo per farlo quasi completamente in SQL.

1) Creare una funzione VBA chiamata conta che riceve in input 2 serie da 6 numeri ciascuna (quindi 12 numeri) e ritorna il conto di quanti numeri della prima serie sono presenti nella seconda. Attenzione: il codice che segue e' per Oracle, in quanto io non ho a disposizione Access per provare, ma dovrebbe essere semplice "tradurlo" in VBA:
Codice: Seleziona tutto
function conta(n1 in number, n2 in number, n3 in number, n4 in number, n5 in number, n6 in number,
               m1 in number, m2 in number, m3 in number, m4 in number, m5 in number, m6 in number)
return number is
    cnt number := 0;
begin
    if n1 in (m1, m2, m3, m4, m5, m6) then
        cnt := cnt + 1;
    end if;
    if n2 in (m1, m2, m3, m4, m5, m6) then
        cnt := cnt + 1;
    end if;
    if n3 in (m1, m2, m3, m4, m5, m6) then
        cnt := cnt + 1;
    end if;
    if n4 in (m1, m2, m3, m4, m5, m6) then
        cnt := cnt + 1;
    end if;
    if n5 in (m1, m2, m3, m4, m5, m6) then
        cnt := cnt + 1;
    end if;
    if n6 in (m1, m2, m3, m4, m5, m6) then
        cnt := cnt + 1;
    end if;
    return cnt;
end;


2) Creare una view (vista per Office in italiano?) chiamata conteggio in Access:
Codice: Seleziona tutto
select tb1.*, conta(tb1.n1, tb1.n2, tb1.n3, tb1.n4, tb1.n5, tb1.n6,
                    tb2.n1, tb2.n2, tb2.n3, tb2.n4, tb2.n5, tb2.n6) conto
  from tab1 tb1, tab2 tb2
 where tb1.id<>tb2.id;


3) Creare una view, che dovrebbe tornare il risultato desiderato:
Codice: Seleziona tutto
select tb1.*,
       (select count(*) from conteggio c where c.id=tb1.id and conto=0) Nie,
       (select count(*) from conteggio c where c.id=tb1.id and conto=1) Uno,
       (select count(*) from conteggio c where c.id=tb1.id and conto=2) Cop,
       (select count(*) from conteggio c where c.id=tb1.id and conto=3) Ter,
       (select count(*) from conteggio c where c.id=tb1.id and conto=4) Qua,
       (select count(*) from conteggio c where c.id=tb1.id and conto=5) Qui,
       (select count(*) from conteggio c where c.id=tb1.id and conto=6) Ses
  from tab1 tb1
 order by tb1.id;


Le prove che ho fatto sembravano dare il risultato desiderato, ma ovviamente sono state fatte con quattro dati in croce: non garantisco che la soluzione regga con una mole di dati notevole.

Infine segnalo che per fare tutto questo NON servono due tabelle: potresti ottenere lo stesso risultato avendo solo Tab1.

HTH.

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: confronto campi tabelle access

Postdi miko » 16/01/20 09:57

Salve,
purtroppo non conosco access, e non so cosa sia Oracle né come e dove usarlo, per cui ho l’ulteriore problema di studiarmi anche oracle per tradurre il codice in access.
Non posso perciò esprimermi sul risultato ma posso apprezzare e ringraziarti per questo tuo ulteriore impegno.
Forse anche io ho trovato un diverso criterio di calcolo per giungere alla soluzione con access.
Continuando le mie letture su access ho trovato che il metodo più veloce per estrarre informazioni e fare uso dei JOIN e delle istruzioni SELECT …. FROM …. WHERE con le varie clausole DISTINCT, IN.. etc.

Cogliendo il tuo suggerimento che scrivevi in precedenza
… devi pensare in termini di "insiemi" di dati

Cosa che non avevo capito, pensavo che access ragionasse in modo simile ad excel
e
… Ad esempio puoi fare una query che ti dice quanti sono i records di tabella2 che contengono il valore di tabella1.n1 in uno qualsiasi dei campi n1 - nx

È proprio quest'ultimo il risultato che vorrei ottenere

scorriamo i record di tab1
Prendiamo il record1 di tab1 >>> (5, 25, 39, 55, 66, 69)
ricordo che:
record1 - tab1 (5, 25, 39, 55, 66, 69)......NO confronto con......record1 - tab2 (5, 25, 39, 55, 66, 69)
in questo caso non eseguiamo il confronto, essendo tabelle uguali, è come cercare numeri uguali di un record in se stesso

quindi partiamo dal record2 di tab2

Contiamo quanti sono i records di tab2 che contengono il valore di record1-tab1.n1 = 5, in uno qualsiasi dei campi n1 – n6 di tab2
Chiamiamo ContaN1 questo numero, lo memorizziamo in una variabile e scriviamo : Conta = ContaN1

Aggiungiamo a Conta, quanti sono i records di tab2 che contengono il valore di record1-tab1.n2 = 25, in uno qualsiasi dei campi n1 – n6 di tab2, chiamiamo ContaN2 questo numero

Quindi Conta diventerà : Conta = ContaN1 + ContaN2
……
infine

Aggiungiamo a Conta, quanti sono i records di tab2 che contengono il valore di record1-tab1.n6 = 69, in uno qualsiasi dei campi n1 – n6 di tab2

Il risultato finale è : Conta = ContaN1 + ContaN2 + ContaN3 + ContaN4 + ContaN5 + ContaN6

Inseriamo Conta nel campo Uno di record1 tab1.

Consideriamo sempre record1 di tab1 >>> (5, 25, 39, 55, 66, 69) ed contiamo tutte le coppie 5-25, 5-39,…66-69, prese singolarmente, e quindi

Contiamo quanti sono i records di tab2 che contengono la coppia 5-25 di record1-tab1, in qualsiasi coppia dei campi n1 – n6 di tab2
poi aggiungiamo, quanti sono i records di tab2 che contengono la coppia 5-39 di record1-tab1, in qualsiasi coppia dei campi n1 – n6 di tab2
Così per tutte le altre coppie.

Il conteggio finale, Conta = Conta di (5-25) + Conta di (5-39) + ...Conta di (66-69), lo inseriamo nel campo Cop sempre di record1-tab1.

Poi passiamo a contare le terzine, …, cinquine, sestine ed infine quando non si hanno numeri uguali.

Terminato l’esame di record1-tab1, consideriamo record2-tab1, non lo confrontiamo con record2-tab2 perché sono uguali, e ripetiamo il procedimento, descritto in precedenza,

Contiamo quanti sono i records di tab2 che contengono il valore di record2-tab1.n1 in uno qualsiasi dei campi n1 – n6 di tab2, …. e così via.

Questo per tutti i record di tab1.

Ricordo che il primo campo utile di tab1, Ses, in cui inserire il conteggio, nel mio caso, è il numero 13, mentre l’ultimo, Nie, è 19.

Credo che si possa realizzare, è solo ripetitivo.
Io però non sono ancora in grado di realizzare query o macro così complesse, ho solo fatto 1 semplice query con la creazione guidata che poi ho cercato di modificare senza riuscirci.
Se possibile invece delle query, il cui codice ancora non capisco, preferirei le macro o la macro in vba così posso scorrere il codice e capire il funzionamento.
Se non è possibile va bene la query o più query distinte per le varie ricerche.
per ora le tabelle sono uguali ma poi devo usare il codice anche per tabelle diverse
Ciao e grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 521
Iscritto il: 29/12/09 10:44

Postdi archimede » 16/01/20 12:27

Oracle è un altro db relazionale.

Non devi "studiare Oracle", semplicemente guardare il codice che ho scritto io, capire cosa fa e fare una funzione VBA che fa la stessa cosa: alla fine la tua funzione sarà simile a quella scritta da me, solo con una sintassi leggermente diversa.

Magari qualcun altro esperto di VBA può aiutarti a scrivere la funzione.

Alessandro
archimede
Moderatore
 
Post: 2851
Iscritto il: 07/11/02 12:41
Località: Genova

Re: confronto campi tabelle access

Postdi miko » 21/01/20 06:22

Buongiorno,
qualche utente del forum che conosce access potrebbe aiutarmi a realizzare in vba
quanto riportato nella mia ultima descrizione,
non riesco neanche a tradurre il codice di archimede,
sono ad un punto morto.
ciao grazie
windows 10 - office 2013
miko
Utente Senior
 
Post: 521
Iscritto il: 29/12/09 10:44


Torna a Applicazioni Office Windows


Topic correlati a "confronto campi tabelle access":


Chi c’è in linea

Visitano il forum: Nessuno e 14 ospiti