Verifica gruppi valori

di il
12 risposte

Verifica gruppi valori

Ciao,

ho un db access 2007 e devo effettuare un controllo su alcuni campi di una tabella. Posso benissimo implementare un controllo iterativo via VBA ma volevo capire se riuscivo a ottenere lo stesso risultato con una "semplice" macro.

In una tabella ho 2 campi, A e B.
Ho poi una tabella di controllo così composta:

A valori B
abc bla bla
abc bip bip
cde boom

In pratica per tutti i possibili valori di A mi elenca i valori ammessi in B.
Devo perciò verificare nella prima tabella che appunto questo vincolo sia soddisfatto. In altre parole trovare i valori non corrispondenti tra le due tabella MA in funzione del valore di A.

Nella realtà ho 3 campi di cui controllare i valori, ma per semplicità farei la verifica 3 volte.

Sono capace di verificare i campi non corrispondenti (left join e condizione che il campo a destra sia null) ma come gestire il fatto che il controllo deve prima filtrare per ciacun valore di A?

Grazie!
Mark

12 Risposte

  • Re: Verifica gruppi valori

    Personalmente non ho capito nè l'esempio nè l'obiettivo...!
    Se potessi riprovare a spiegare con qualche esempio non falsato da Campi/Nomi/Valori fuorvianti...
    potrebbe essere di aiuto.
  • Re: Verifica gruppi valori

    Ulp
    Ci riprovo... sorry.

    Partiamo dall'incomincio

    Questa la tabella con i dati:
    
    ID	[...]	INDICE		VAL1	 VAL2	   VAL3
    0			   Pippo		 Rosso   Sax		 Mare
    1			   Paperino    Giallo  Violino	Montagna
    2			   Topolino	 Giallo  Flauto	 Collina
    3			   Pippo		 Viola	Sax		 Collina
    4			   Pippo		 Blu	  Flauto	
    
    INDICE è il campo che identifica la tipologia dei valori da controllare.
    VALx sono proprio i campi da controllare.

    Con quale regola? Ho un foglio Excel così fatto:
    
    INDICE		VAL1	  VAL2	  VAL3
    Pippo		 Rosso	 Sax		Mare
    			   Blu		Corno	 Collina
    							         Montagna
    Paperino	 Giallo	Violino  Montagna
    			   Viola			    Mare
    Topolino	 Giallo	Flauto	Mare
    			   Blu		Sax
    					      Violino
    
    In pratica mi dice quali valori (VALx) sono ammessi per ciascun INDICE.
    Devo quindi verificare se i dati della tabella iniziale sono corretti secondo queste regole o evidenziare anche le righe che hanno almeno uno dei campi VAL non valorizzato.
    Nell'esempio:
    
    2			Topolino	Giallo	Flauto	Collina
    3			Pippo		Viola	 Sax		Collina
    4			Pippo		Blu		Flauto	
    

    Sono righe errate, perché secondo il foglio Excel, Topolino non ammette il valore Collina per VAL3, Pippo non ammette Viola come VAL1, Flauto come VAL2 e VAL3 non è valorizzato.

    Spero ora sia più chiaro.
    Ripeto, sono in grado di fare il tutto in maniera iterativa tramite VBA. Solo che su un gran numero di righe (la tabella iniziale ha quasi 10000 record) rimane un po' lungo e laborioso.

    Volevo capire se tramite dei JOIN si riesca a verificare facilmente questa cosa.

    Se ancora non mi sono spiegato fammi sapere
    Grazie!
    Marco
  • Re: Verifica gruppi valori

    Per verificare il criterio che l'INDICE abbia tutti i campi VALx valorizzati puoi usare questo predicato:
    
    SELECT *,( Len(Val1 & "")>0 AND Len(Val2 & "")>0 AND Len(Val3 &"")>0) AS CRITERIO
    FROM NomeTabella;
    Otterai un campo chiamato [CRITERIO] che se TRUE(-1) significa che TUTTI i campi VALx sono valorizzati... se FALSE(0) no.

    Per il secondo controllo stento ancora a comprendere come sia possibile il controllo in quanto la Tabella di riferimento di Excel non è confrontabile con una Tabella di Access in quanto mancano delle valorizzazioni.

    Ma sicuramente sono io che mi perdo qualche dettaglio.

    @Alex
  • Re: Verifica gruppi valori

    Ciao @Alex,

    grazie della risposta.
    Ho esposto il problema così come mi si è presentato.

    Naturalmente la tabella Excel non può essere utilizzata così com'è, ma l'idea era di tradurla in una o più tabelle Access adatte allo scopo.

    Avevo cercato di fare un esempio nel primo post. Una possibilità potrebbe essere:
    
    INDICE    VAL    VALORE
    Pippo     1      Rosso
    Pippo     1      Blu
    Pippo     2      Sax
    Pippo     2      Corno
    Pippo     3      Mare
    Pippo     3      Collina
    Pippo     3      Montagna
    
    Che è quello che farei con la soluzione iterativa:

    1. filtro per il primo indice (es. Pippo)
    2. filtro per il primo VAL
    3. ottengo i possibili valori (Rosso, Blu) e controllo con un LEFT JOIN nella tabella sorgente
    4. ripeto i punti 2-3 per gli altri VAL
    5. ripeto i punti 1-4 per tutti gli altri indici

    A occhio si può fare con una query + sottoquery, ma non riesco a "vederla".

    Grazie per la pazienza
  • Re: Verifica gruppi valori

    Allora... Ci ho provato a trovare query e sottoquery e sembra funzionare
    Ovviamente essendo le mie conoscenze in access ancora troppo approssimative forse farò qualche passaggio in più.
    Lo faccio per Pippo

    Questa è la tabella tab_excel
    
    INDICE	VAL	VALORE
    Pippo	1	Rosso
    Pippo	1	Blu
    Pippo	2	Sax
    Pippo	2	Corno
    Pippo	3	Mare
    Pippo	3	Collina
    Pippo	3	Montagna
    Paperino	1	Giallo 
    Paperino	1	Viola 
    Paperino	2	Violino
    Paperino	3	Mare
    Paperino	3	Montagna
    Topolino	1	Giallo
    Topolino	1	Blu
    Topolino	2	Flauto
    Topolino	2	Sax
    Topolino	2	Violino
    Topolino	3	Mare
    Poi una tabella tab_Dati con i campi
    ID-INDICE-VAL1-VAL2-VAL3
    con ID chiave primaria

    Filtro Tab_Excel con Pippo e i tre Valx.
    Chiamerò le query rispettivamente per i 3 Valx
    Sql_ExcelPippo1-Sql_ExcelPippo2-Sql_ExcelPippo3
    SELECT Tab_Excel.INDICE, Tab_Excel.VALORE, Tab_Excel.Val AS VAL1
    FROM Tab_Excel
    WHERE (((Tab_Excel.INDICE)="pippo") AND ((Tab_Excel.Val)=1));
    
    SELECT Tab_Excel.INDICE, Tab_Excel.VALORE, Tab_Excel.Val AS VAL2
    FROM Tab_Excel
    WHERE (((Tab_Excel.INDICE)="pippo") AND ((Tab_Excel.Val)=2));
    
    SELECT Tab_Excel.INDICE, Tab_Excel.VALORE, Tab_Excel.Val AS VAL3
    FROM Tab_Excel
    WHERE (((Tab_Excel.INDICE)="pippo") AND ((Tab_Excel.Val)=3));
    
    Filtro da tab_dati "pippo", la query si chiama sql_datiPippo
    SELECT Tab_Dati.ID, Tab_Dati.INDICE, Tab_Dati.val1, Tab_Dati.val2, Tab_Dati.val3
    FROM Tab_Dati
    WHERE (((Tab_Dati.INDICE)="pippo"));
    
    Ora cerco i dati che ci sono in tab_dati ma non ci sono in tab_excel, le query si chiamano
    rispettivamente Pippo1-Pippo2-Pippo3
    SELECT Sql_datiPippo.ID, Sql_datiPippo.INDICE, Sql_datiPippo.val1
    FROM Sql_datiPippo LEFT JOIN sql_ExcelPippo1 ON Sql_datiPippo.val1 = sql_ExcelPippo1.VALORE
    WHERE (((sql_ExcelPippo1.VALORE) Is Null));
    
    SELECT Sql_datiPippo.ID, Sql_datiPippo.INDICE, Sql_datiPippo.val2
    FROM Sql_datiPippo LEFT JOIN sql_ExcelPippo2 ON Sql_datiPippo.val2 = sql_ExcelPippo2.VALORE
    WHERE (((sql_ExcelPippo2.VALORE) Is Null));
    
    SELECT Sql_datiPippo.ID, Sql_datiPippo.INDICE, Sql_datiPippo.val3
    FROM Sql_datiPippo LEFT JOIN sql_ExcelPippo3 ON Sql_datiPippo.val3 = sql_ExcelPippo3.VALORE
    WHERE (((sql_ExcelPippo3.VALORE) Is Null));
    
    
    Adesso ricostruisco il formato ID-INDICE-VAL1-VAL2-VAL3 dei risultati ottenuti, sempre per pippo.
    Dapprima unisco gli ID di pippo1-pippo2-pippo3, la query si chiama "UnionePippo123"
    SELECT ID, indice
    FROM pippo1
    UNION
    SELECT ID, indice
    FROM pippo2
    UNION SELECT ID, indice
    FROM pippo3;
    
    Poi con tre join sugli ID ricreo la struttura completa
    SELECT UnionePippo123.ID, UnionePippo123.indice, Pippo1.val1, Pippo2.val2, Pippo3.val3
    FROM ((UnionePippo123 LEFT JOIN Pippo2 ON UnionePippo123.ID = Pippo2.ID) LEFT JOIN Pippo1 ON UnionePippo123.ID = Pippo1.ID) LEFT JOIN Pippo3 ON UnionePippo123.ID = Pippo3.ID;
    
    Il risultato è questo
  • Re: Verifica gruppi valori

    Ciao nelsonblu, grazie mille!
    La strada che hai seguito era quella che intendevo io quando parlavo di metodo iterativo. Infatti dovrei eseguire una prima SELECT DISTINCT INDICE sulla tabella dati per trovare tutti i campi indice (pippo, paperino, ecc....). Dopodiché modificare ed eseguire via codice le query base che hai proposto in modo da adeguarle all'indice corrente.

    Speravo che si riuscisse a sfruttare il processo iterativo già presente nel motore delle query, facendogli ciclare automaticamente i campi indice, senza dover intervenire manualmente modificando ad ogni passo gli argomenti della query.

    A questo punto capisco che non è possibile e procedo a mano via VBA.
  • Re: Verifica gruppi valori

    In vba non la vedo manco tanto semplice la cosa... anzi! Sicuramente meno performante delle query.
    Le query poi alla fine sono tante ma neppure poi tantissime.
    In realtà ho provato a farle tutte e ci ho impiegato meno di 10 minuti essendo per lo piu un copia-incolla.
    Ho creato una tab_Dati di 10000 record e ho lanciato le due Query definitive,
    TotValidi e TotNonValidi, con tutti gli indici e tutti i valori, ebbene il risultato è sorprendente.
    Il mio pc datato risolve la questione in meno di 300 millisecondi.. un battito di ciglia
  • Re: Verifica gruppi valori

    Scusa, non mi sono spiegato ancora.
    Utilizzerei VBA per creare dinamicamente le query in funzione del campo INDICE (in altre parole invoco la query passando di volta in volta un valore diverso al parametro WHERE).
    Dal momento che i possibili valori del campo indice sono potenzialmente illimitati non avrebbe senso creare ogni volta un set di query diverso!
  • Re: Verifica gruppi valori

    _Mark_ ha scritto:


    Dal momento che i possibili valori del campo indice sono potenzialmente illimitati...
    Ma questo cambia proprio tutto!
    Sta cosa importantissima la dici solo ora?
  • Re: Verifica gruppi valori

    I'm sorry

    Quando all'inizio parlavo di:
    In pratica per tutti i possibili valori di A mi elenca i valori ammessi in B.
    intendevo proprio che non conosco a priori quali saranno. Anche perché io non ho mai visto una tabella "statica". Anche solo aggiungere un campo richiederebbe di creare un altro set di query ed effettuare modifiche al codice!

    Cerco sempre di trovare una soluzione generale. Alla fine ho fatto quello che pensavo di fare inizialmente che avevo maldestramente descritto nei primi post, e che tu hai spiegato più correttamente

    In definitiva creo dinamicamente le query da codice ciclando sui vari INDICI e accodando i risultati in una tabella di output.
  • Re: Verifica gruppi valori

    Mmm.. mi è venuta un'idea.
    Ormai solo per studio, visto che hai risolto con le query ciclate.
    Ma dato che sto imparando questo Access da poco, ogni problema diventa un ottimo modo per esercitarmi.
    Pensavo ad una emulazione del cerc.vert di excel
    In pratica unisco i campi dell'excel in un campo nuovo che chiamerò [controlloExcel]

    Pippo 1 Rosso = Pippo1Rosso
    Pippo 1 Blu = Pippo1Blu
    Pippo 2 Sax = Pippo2Sax
    etc etc per tutti gli indici

    nella tabella Dati,
    - aggiungo 3 campi [controllo1],[controllo2],[controllo3] e un campo [controlloTotale]
    - dove [controlloN]= Indice&n&Valore con N=1,2,3
    - cerco [controlloN] con tabellaexcel.findfirst nel campo [controlloExcel].

    Se non lo trovo tabellaexcel.nomatch diventa True e
    do valore "NO" ad una variabile C1,C2,C3
    [controlloTotale]=C1&C2&C3

    E quindi diventa poi semplice selezionare i record che hanno il campo [controlloTotale] vuoto da quelli che invece avranno almeno un NO

    Che ne pensi come idea?
  • Re: Verifica gruppi valori

    Mi sembra una buona alternativa. Personalmente più che modificare la tabella sorgente farei una query SELECT * a cui aggiungo i 3 campi controllo più quello totale così da lasciare intatta l'originale.

    E' comunque un metodo iterativo e credo vi possano essere più strade per raggiungere lo stesso obiettivo, appoggiandosi comunque a un minimo di codice che permetta di ciclare manualmente.

    Ciao e buon weekend!
Devi accedere o registrarti per scrivere nel forum
12 risposte