ACCESS 2013: QUERY DI SELEZIONE CON FUNZIONE IIf NIDIFICATA

di il
15 risposte

ACCESS 2013: QUERY DI SELEZIONE CON FUNZIONE IIf NIDIFICATA

Salve a tutti,
ho realizzato una query di selezione con la quale devo verificare se è vera una determinata condizione, cioè una sequenza di dati , scrivere "OK" quando la condizione si verifica.
L'ho fatto scrivendo una funzione IIf nidificata e utilizzando una LEFT JOIN sulla "stessa" tabella in modo da far verificare i valori di una certa sequenza di record. Funziona tutto alla perfezione con il solo problema che non posso inserire nella query più di un tot di condizioni IIf, con il risultato che per ottenere quello che mi serve ho dovuto realizzare una quantità infinita di query.
L'aiuto che vi chiedo è se esiste un altro modo per ottenere quello che mi serve o se esiste un modo per aumentare la quantità di nidificazioni della funzione IIf.

Vi allego l'sql di una tabella che ho fatto.

Grazie Leonardo

SELECT TABELLA1LOOP.ID, TABELLA1LOOP.ORA, TABELLA1LOOP.ORASEC, TABELLA1LOOP.DATA, TABELLA1LOOP.LOOP, TABELLA1LOOP.OTL, TABELLA1LOOP.TRAM, TABELLA1LOOP_1.ORA, TABELLA1LOOP_1.ORASEC, TABELLA1LOOP_1.DATA, TABELLA1LOOP_1.LOOP, TABELLA1LOOP_1.OTL, TABELLA1LOOP_1.TRAM, IIf(TABELLA1LOOP.LOOP="01.201.7" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.001.1" And TABELLA1LOOP_1.OTL=1,"OK", IIf(TABELLA1LOOP.LOOP="01.001.1" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.001.3" And TABELLA1LOOP_1.OTL=1,"OK", IIf(TABELLA1LOOP.LOOP="01.001.3" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.003.1" And TABELLA1LOOP_1.OTL=1,"OK", IIf(TABELLA1LOOP.LOOP="01.003.1" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.003.3" And TABELLA1LOOP_1.OTL=1,"OK", IIf(TABELLA1LOOP.LOOP="01.003.3" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.004.3" And TABELLA1LOOP_1.OTL=1,"OK", IIf(TABELLA1LOOP.LOOP="01.004.3" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.102.1" And TABELLA1LOOP_1.OTL=1,"OK", IIf(TABELLA1LOOP.LOOP="01.102.1" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.102.3" And TABELLA1LOOP_1.OTL=1,"OK", IIf(TABELLA1LOOP.LOOP="01.160.1" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.160.3" And TABELLA1LOOP_1.OTL=1,"OK", IIf(TABELLA1LOOP.LOOP="01.160.3" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.103.1" And TABELLA1LOOP_1.OTL=1,"OK", IIf(TABELLA1LOOP.LOOP="01.103.1" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.103.3" And TABELLA1LOOP_1.OTL=1,"OK", IIf(TABELLA1LOOP.LOOP="01.103.3" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.103.5" And TABELLA1LOOP_1.OTL=1,"OK", IIf(TABELLA1LOOP.LOOP="01.103.5" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.165.1" And TABELLA1LOOP_1.OTL=1,"OK", "")))))))))))) AS Risultato
FROM TABELLA1LOOP AS TABELLA1LOOP LEFT JOIN TABELLA1LOOP AS TABELLA1LOOP_1 ON TABELLA1LOOP.ID+1=TABELLA1LOOP_1.ID;

15 Risposte

  • Re: ACCESS 2013: QUERY DI SELEZIONE CON FUNZIONE IIf NIDIFICATA

    leonardocarrani ha scritto:


    ... Funziona tutto alla perfezione con il solo problema...
    Che bello il "funziona tutto alla perfezione" ma non funziona proprio del tutto. Scusa la battuta.

    leonardocarrani ha scritto:


    non posso inserire nella query più di un tot di condizioni IIf, con il risultato che per ottenere quello che mi serve ho dovuto realizzare una quantità infinita di query.
    L'aiuto che vi chiedo è se esiste un altro modo per ottenere quello che mi serve o se esiste un modo per aumentare la quantità di nidificazioni della funzione IIf.

    Vi allego l'sql di una tabella che ho fatto.
    SELECT TABELLA1LOOP.ID, TABELLA1LOOP.ORA, TABELLA1LOOP.ORASEC, TABELLA1LOOP.DATA, TABELLA1LOOP.LOOP, TABELLA1LOOP.OTL, TABELLA1LOOP.TRAM, TABELLA1LOOP_1.ORA, TABELLA1LOOP_1.ORASEC, TABELLA1LOOP_1.DATA, TABELLA1LOOP_1.LOOP, TABELLA1LOOP_1.OTL, TABELLA1LOOP_1.TRAM,
    IIf(TABELLA1LOOP.LOOP="01.201.7" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.001.1" And TABELLA1LOOP_1.OTL=1,"OK",
    IIf(TABELLA1LOOP.LOOP="01.001.1" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.001.3" And TABELLA1LOOP_1.OTL=1,"OK",
    IIf(TABELLA1LOOP.LOOP="01.001.3" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.003.1" And TABELLA1LOOP_1.OTL=1,"OK",
    IIf(TABELLA1LOOP.LOOP="01.003.1" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.003.3" And TABELLA1LOOP_1.OTL=1,"OK",
    IIf(TABELLA1LOOP.LOOP="01.003.3" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.004.3" And TABELLA1LOOP_1.OTL=1,"OK",
    IIf(TABELLA1LOOP.LOOP="01.004.3" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.102.1" And TABELLA1LOOP_1.OTL=1,"OK",
    IIf(TABELLA1LOOP.LOOP="01.102.1" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.102.3" And TABELLA1LOOP_1.OTL=1,"OK",
    IIf(TABELLA1LOOP.LOOP="01.160.1" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.160.3" And TABELLA1LOOP_1.OTL=1,"OK",
    IIf(TABELLA1LOOP.LOOP="01.160.3" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.103.1" And TABELLA1LOOP_1.OTL=1,"OK",
    IIf(TABELLA1LOOP.LOOP="01.103.1" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.103.3" And TABELLA1LOOP_1.OTL=1,"OK",
    IIf(TABELLA1LOOP.LOOP="01.103.3" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.103.5" And TABELLA1LOOP_1.OTL=1,"OK",
    IIf(TABELLA1LOOP.LOOP="01.103.5" And TABELLA1LOOP.OTL=0 And TABELLA1LOOP_1.LOOP="01.165.1" And TABELLA1LOOP_1.OTL=1,"OK", ""))))))))))))
    AS Risultato
    FROM TABELLA1LOOP AS TABELLA1LOOP LEFT JOIN TABELLA1LOOP AS TABELLA1LOOP_1 
    ON TABELLA1LOOP.ID+1=TABELLA1LOOP_1.ID;
    No, c'è qualcosa che non va da qualche parte se sei costretto a fare quella sequenza infinita di IIf. Potrebbe trattarsi di mancata normalizzazione o... boh!
    Prova a dare qualche informazione più precisa sul contenuto della tabella (ad esempio cosa significano i vari campi) e del tipo di verifica che devi fare.
  • Re: ACCESS 2013: QUERY DI SELEZIONE CON FUNZIONE IIf NIDIFICATA

    Philcattivocarattere ha scritto:


    No, c'è qualcosa che non va da qualche parte se sei costretto a fare quella sequenza infinita di IIf. Potrebbe trattarsi di mancata normalizzazione o... boh!
    Ho lo stesso sospetto anch'io. Non ce la vedo affatto una espressione così complessa.
  • Re: ACCESS 2013: QUERY DI SELEZIONE CON FUNZIONE IIf NIDIFICATA

    Ciao buongiorno, e grazie per l'attenzione.
    Allora, provo a spiegarmi meglio...

    Ho una tabella che si chiama TABELLA1LOOP dove ho una serie di campi. Devo effettuare un controllo su questi campi e mettere la scritta "OK" se la condizione è verificata altrimenti esegui un altro controllo ecc.
    Il campo LOOP contiene un "articolo" (possono essere più di 50 articoli diversi) e il campo OTL contiene un "numero" che può essere 1 o 0.
    Il problema con la sql che ho fatto è che funziona fino a che non supero il limite di nidificazioni. Se il controllo che devo fare supera il numero max di IIf che ACCESS consente sono costretto a fare una ulteriore query. Siccome le combinazioni di articoli che devo controllare è numerosa sono costretto a realizzare molte query. Quello che chiedevo è se esiste un modo diverso per fare lo stesso controllo.

    Comunque quello che devo fare è:

    se il LOOP=01.201.7 e OTL=0 e LOOP del record successivo è =01.001.1 e OTL del record successivo è =1 scrivi "OK" altrimenti esegui un altro controllo ecc.

    siccome i controlli che devo fare per mettere OK sono più di 100 ho dovuto realizzare una decina di query che ovviamente funzionano tutte allo stesso modo ma fanno il controllo su sequenze di codici diversi.

    Credo di non essere stato molto chiaro ma lo spero vivamente e confido nella vostra capacità
    altrimenti proverò a fare altri esempi...magari utilizzando le pere e le mele!!!

    Grazie ancora
    Leonardo
  • Re: ACCESS 2013: QUERY DI SELEZIONE CON FUNZIONE IIf NIDIFICATA

    leonardocarrani ha scritto:


    Ciao buongiorno, e grazie per l'attenzione.
    Allora, provo a spiegarmi meglio...

    Ho una tabella che si chiama TABELLA1LOOP dove ho una serie di campi. Devo effettuare un controllo su questi campi e mettere la scritta "OK" se la condizione è verificata altrimenti esegui un altro controllo ecc.
    Il campo LOOP contiene un "articolo" (possono essere più di 50 articoli diversi) e il campo OTL contiene un "numero" che può essere 1 o 0.
    Il problema con la sql che ho fatto è che funziona fino a che non supero il limite di nidificazioni. Se il controllo che devo fare supera il numero max di IIf che ACCESS consente sono costretto a fare una ulteriore query. Siccome le combinazioni di articoli che devo controllare è numerosa sono costretto a realizzare molte query. Quello che chiedevo è se esiste un modo diverso per fare lo stesso controllo.

    Comunque quello che devo fare è:

    se il LOOP=01.201.7 e OTL=0 e LOOP del record successivo è =01.001.1 e OTL del record successivo è =1 scrivi "OK" altrimenti esegui un altro controllo ecc.

    siccome i controlli che devo fare per mettere OK sono più di 100 ho dovuto realizzare una decina di query che ovviamente funzionano tutte allo stesso modo ma fanno il controllo su sequenze di codici diversi.

    Credo di non essere stato molto chiaro ma lo spero vivamente e confido nella vostra capacità
    altrimenti proverò a fare altri esempi...magari utilizzando le pere e le mele!!!

    Grazie ancora
    Leonardo
    A questo punto penso che non ci siano altre soluzioni se non la creazione di una funzione con vba (quindi richiamabile anche nelle query)
    C'è una tabella dove c'è l'abbinamento tra i due codici LOOP da confrontare? Il confronto su OTL è sempre 0 il primo e 1 il successivo? Altrimenti anche quello credo che potrebbe essere oggetto della tabella che a questo punto potresti nominare "controlli". Tipo
    LOOP1 ------ OTL1 ------ LOOP2 ------ OTL2
    "01.201.7" --- 0 ----------"01.001.1"------1
    "01.001.1" --- 0 ----------"01.001.3"------1
    "01.001.3" --- 0 ----------"01.003.1"------1
    (li ho presi dalla query che avevi pubblicato)
    Vedo però che c'è questa "ripetizione": quello che io ho chiamato LOOP2 è sempre LOOP1 del controllo successivo.
    Ripilogando:
    Il controllo che devi fare è sempre LOOP1 e OTL1 = 0 da confrontare con LOOP2 e OTL = 1 altrimenti il controllo successivo è il precedente valore di LOOP2 diventa LOOP1 del nuovo controllo con OTL questa volta 0 e un nuovo LOOP2 con OTL2 e via dicendo?
    Aggiungo una richiesta: potresti pubblicare un piccolo estratto della tabella, per vedere come sono i valori. Chissà, forse arriva l'illuminazione.
  • Re: ACCESS 2013: QUERY DI SELEZIONE CON FUNZIONE IIf NIDIFICATA

    leonardocarrani ha scritto:


    Ho una tabella che si chiama TABELLA1LOOP dove ho una serie di campi. Devo effettuare un controllo su questi campi e mettere la scritta "OK" se la condizione è verificata altrimenti esegui un altro controllo ecc.
    È sbagliato l'approccio di costruzione della tabella. Una tabella di Access deve contenere CAMPI OMOGENEI in base al nome stesso della tabella. Per me una tabella così non ha né capo né coda.
  • Re: ACCESS 2013: QUERY DI SELEZIONE CON FUNZIONE IIf NIDIFICATA

    La TABELLA1LOOP è una tabella costruita automaticamente attraverso lo scarico dei dati da una apparecchiatura che rileva il passaggio di un mezzo in un determinato percorso.
    Sul percorso sono dislocati una certa quantità di sensori (il mio campo LOOP) che rilevano il passaggio del mezzo attraverso il codice 1 e 0 del campo OTL.
    1 significa "mezzo sul sensore" e 0 significa "mezzo uscito dal sensore".
    Ora, siccome i sensori sul percorso sono fissi, cioè non ne è modificabile l'ordine, è ovvio che un percorso che parte da A ed arriva a B è formato da una certa quantità di sensori che saranno sempre in una determinata sequenza se vanno in in senso e nella sequenza opposta se il percorso e fatto da B ad A.
    Il campo OTL in pratica è come se mi indicasse il tempo di passaggio sul sensore. Ovvero quando il "mezzo" arriva sul sensore ho un primo OTL=1 ma se il "mezzo" sosta sul sensore prima di ripartire avrò una serie di OTL=1 e poi un OTL=0.
    Può verificarsi anche che ci siano più OTL=0 per lo stesso sensore.
    È per questo che ho la necessità di fare questa selezione per prendere i sensori che mi interessano con i codici OTL 1 e 0 che mi interessano.

    Per rispondere a "Philcattivocarattere"
    Non esiste una tabella con i controlli, non ci avevo pensato, ma potrei ragionarci e provare a farla.
    La deduzione che hai fatto te sulla sequenza è generalmente corretta anche se potrebbero verificarsi delle eccezioni.
  • Re: ACCESS 2013: QUERY DI SELEZIONE CON FUNZIONE IIf NIDIFICATA

    Philcattivocarattere ha scritto:


    leonardocarrani ha scritto:


    C'è una tabella dove c'è l'abbinamento tra i due codici LOOP da confrontare? Il confronto su OTL è sempre 0 il primo e 1 il successivo? Altrimenti anche quello credo che potrebbe essere oggetto della tabella che a questo punto potresti nominare "controlli". Tipo
    LOOP1 ------ OTL1 ------ LOOP2 ------ OTL2
    "01.201.7" --- 0 ----------"01.001.1"------1
    "01.001.1" --- 0 ----------"01.001.3"------1
    "01.001.3" --- 0 ----------"01.003.1"------1
    (li ho presi dalla query che avevi pubblicato)
    .
    Realizzando una tabella con i controlli come mi hai suggerito, come potrei poi eseguire la verifica sulla tabella di origine?
    Grazie
    Leonardo
  • Re: ACCESS 2013: QUERY DI SELEZIONE CON FUNZIONE IIf NIDIFICATA

    leonardocarrani ha scritto:


    La TABELLA1LOOP è una tabella costruita automaticamente attraverso lo scarico dei dati da una apparecchiatura che rileva il passaggio di un mezzo in un determinato percorso.
    Sul percorso sono dislocati una certa quantità di sensori (il mio campo LOOP) che rilevano il passaggio del mezzo attraverso il codice 1 e 0 del campo OTL.
    1 significa "mezzo sul sensore" e 0 significa "mezzo uscito dal sensore".
    ...
    Per rispondere a "Philcattivocarattere"
    Non esiste una tabella con i controlli, non ci avevo pensato, ma potrei ragionarci e provare a farla.
    La deduzione che hai fatto te sulla sequenza è generalmente corretta anche se potrebbero verificarsi delle eccezioni.
    Ora ci sono sufficienti informazioni, credo, per iniziare a studiare qualcosa di "decente".
  • Re: ACCESS 2013: QUERY DI SELEZIONE CON FUNZIONE IIf NIDIFICATA

    Io sto facendo la tabella con i vari controlli.

    Grazie
    Leonardo
  • Re: ACCESS 2013: QUERY DI SELEZIONE CON FUNZIONE IIf NIDIFICATA

    Ciao Buongiorno,
    fatta la tabella con i controlli, mettendo in ogni record le combinazioni di controllo:
    LOOP1 - OTL1 - LOOP2 - OTL2

    fatto questo mi sono arenato perchè non so come fare il controllo con la TABELLA1LOOP.

    Dovendo fare il controllo su record consecutivi dovrei mettere nella query la TABELLA1LOOP la TABELLA1LOOP_1 e la TABELLA_CONTROLLO ma non so cme strutturare la sql

    Ciao
    Leonardo
  • Re: ACCESS 2013: QUERY DI SELEZIONE CON FUNZIONE IIf NIDIFICATA

    leonardocarrani ha scritto:


    Ciao Buongiorno,
    fatta la tabella con i controlli, mettendo in ogni record le combinazioni di controllo:
    LOOP1 - OTL1 - LOOP2 - OTL2

    fatto questo mi sono arenato perchè non so come fare il controllo con la TABELLA1LOOP.

    Dovendo fare il controllo su record consecutivi dovrei mettere nella query la TABELLA1LOOP la TABELLA1LOOP_1 e la TABELLA_CONTROLLO ma non so cme strutturare la sql
    Suggerisco l'apertura di un nuovo thread, magari riportando il link a questo, visto che siamo passati da una query di seleziona con troppi IIf ad un "nuovo" sistema arrivare a fare quello che ti interessa, cioè una serie "di controlli"
    Nel nuovo thread riporta a grandi linee la struttura delle tabelle TABELLA1LOOP e TABELLA_CONTROLLO, con qualche record dimostrativo (per i campi rilevanti) di entrambe, spiegando cosa vuoi ottenere.
  • Re: ACCESS 2013: QUERY DI SELEZIONE CON FUNZIONE IIf NIDIFICATA

    Era un tentativo per seguire la strada che avevi suggerito. Forse ho capito male?
    Non mi sembra che il problema sia cambiato, ma se devo aprire un nuovo thread ok.

    Ma la soluzione con gli IIf non è in alcun modo modificabile o ampliabile nella quantità di condizioni?

    Grazie
    Leonardo
  • Re: ACCESS 2013: QUERY DI SELEZIONE CON FUNZIONE IIf NIDIFICATA

    leonardocarrani ha scritto:


    Era un tentativo per seguire la strada che avevi suggerito. Forse ho capito male?
    Non mi sembra che il problema sia cambiato, ma se devo aprire un nuovo thread ok.

    Ma la soluzione con gli IIf non è in alcun modo modificabile o ampliabile nella quantità di condizioni?

    Grazie
    Leonardo
    No, usare gli IIf in quel modo non è il modo giusto per operare e il limite non è superabile (vado a logica, non ne cerco nemmeno la conferma sul web).
    Che il problema di partenza sia sempre lo stesso, cioè arrivare ad avere OK sul campo "Risultato" se il controllo è superato, sono d'accordo. Sicuramente non ci si arriverà con IIf nidificate a raffica. Quindi un nuovo thread che riporta un titolo adeguato aiuterà l'intero forum a capire di cosa si parla e a leggere eventualmente il contenuto e a contribuire, ognuno nel limite delle proprie conoscenze.
  • Re: ACCESS 2013: QUERY DI SELEZIONE CON FUNZIONE IIf NIDIFICATA

    Ok, capito.

    Grazie
    Leonardo
Devi accedere o registrarti per scrivere nel forum
15 risposte