Access 2013: Query di controllo record successivi

di il
13 risposte

Access 2013: Query di controllo record successivi

Ciao a tutti,
provo a spiegare il problema. Devo effettuare un controllo su una tabella TBL_LOOP.
La tabella è composta dai seguenti campi:
ID - ORA - DATA - LOOP - OTL - SELEZ

La TBL_LOOP è 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.

Ho creato anche una tabella TBL_CONTROLLI dove ho inserito per ogni record la sequenza da verificare. I campi sono:
ID - LOOP1 - OTL1 - LOOP2 - OTL2

esempio di TBL_LOOP:
ID ORA DATA LOOP OTL SELEZ
1 16:24:09 01/01/2015 01.020.4 1
2 16:24:11 01/01/2015 01.020.4 0
3 16:24:39 01/01/2015 01.205.7 1
4 16:24:42 01/01/2015 01.205.7 0
5 16:25:44 01/01/2015 01.205.7 1
6 16:27:01 01/01/2015 01.205.7 1
7 16:27:56 01/01/2015 01.205.7 1
8 16:30:15 01/01/2015 01.205.7 1
9 16:30:25 01/01/2015 01.205.7 0
10 16:30:44 01/01/2015 01.020.4 1

esempio di TBL_CONTROLLI:
ID LOOP1 OTL1 LOOP2 OTL2
1 01.201.7 0 01.001.1 1
2 01.001.1 0 01.001.3 1
3 01.001.3 0 01.003.1 1
4 01.003.1 0 01.003.3 1
5 01.003.3 0 01.004.3 1

esempio della tabella TBL_LOOP dopo il controllo con l'aggiunta di "OK" a controllo verificato:

86 16:51:23 01/01/2015 01.002.2 1
87 16:51:25 01/01/2015 01.002.2 0
88 16:51:53 01/01/2015 01.201.7 1
89 16:51:55 01/01/2015 01.201.7 0
90 16:52:01 01/01/2015 01.201.5 1
91 16:52:03 01/01/2015 01.201.5 0
92 16:53:13 01/01/2015 01.201.7 1
93 16:53:18 01/01/2015 01.201.7 1
94 16:53:18 01/01/2015 01.201.7 1
95 16:53:34 01/01/2015 01.201.7 0 OK
96 16:53:54 01/01/2015 01.001.1 1
97 16:53:55 01/01/2015 01.001.1 0 OK
98 16:54:07 01/01/2015 01.001.3 1
99 16:54:09 01/01/2015 01.001.3 0 OK
100 16:54:57 01/01/2015 01.003.1 1
101 16:54:58 01/01/2015 01.003.1 0 OK
102 16:55:42 01/01/2015 01.003.3 1
103 16:55:44 01/01/2015 01.003.3 0 OK
104 16:55:55 01/01/2015 01.004.3 1
105 16:55:56 01/01/2015 01.004.3 0 OK
106 16:56:13 01/01/2015 01.102.1 1

Spero vivamente di essere stato chiaro e mi scuso se non lo sono stato.

Grazie
Leonardo

link al thread di partenza dove avevo utilizzato la funzione IIf che però è limitata nel numero delle nidificazioni: http://www.iprogrammatori.it/forum-programmazione/access/access-2013-query-selezione-con-funzione-iif-nidificata-t24181.html

13 Risposte

  • Re: Access 2013: Query di controllo record successivi

    Io ho capito poco e niente. Siamo sicuri che Access sia l'applicazione giusta per un lavoro del genere?
  • Re: Access 2013: Query di controllo record successivi

    Credo di aver compreso, ma trovo qualche anomalia di struttura.

    Definiti i LOOP come percorsi obbligati nei quali hai più sensori, va da se che l'ideale sarebbe definire LOOP e SENSORI, quindi una Tabella di TRANSITI, il tutto relazionato...

    E' ovvio che il transito è definito dalla sequenza 1-0 in quest'ordine... quindi confermato il passaggio dal sensore dovrai verificare il sensore successivo...
    La sequenza dei sensori la devi definire nella Tabella LOOP e sensori con un numerico progressivo...

    Detto ciò, io fare una Funzione VBA alla quale passo il LOOP, ed il 1° Tempo di passaggio dal 1° sensore ed il sensore corrente..., quindi estraggo i Records relativi al LOOP specifico a far data dal 1° ed inizio l'elaborazione sequenziale...
    Il risultato dovrà essere valorizzato, per quanto ho capito, dovrà essere OK solo sull'ultima uscita...

    La cosa non è complessa, ma nemmeno così banale... sempre io abbia compreso bene.
  • Re: Access 2013: Query di controllo record successivi

    leonardocarrani ha scritto:


    ...
    Ho creato anche una tabella TBL_CONTROLLI dove ho inserito per ogni record la sequenza da verificare. I campi sono:
    ID - LOOP1 - OTL1 - LOOP2 - OTL2

    esempio di TBL_LOOP:
    ID ORA DATA LOOP OTL SELEZ
    1 16:24:09 01/01/2015 01.020.4 1
    2 16:24:11 01/01/2015 01.020.4 0
    3 16:24:39 01/01/2015 01.205.7 1
    4 16:24:42 01/01/2015 01.205.7 0
    5 16:25:44 01/01/2015 01.205.7 1
    6 16:27:01 01/01/2015 01.205.7 1
    7 16:27:56 01/01/2015 01.205.7 1
    8 16:30:15 01/01/2015 01.205.7 1
    9 16:30:25 01/01/2015 01.205.7 0
    10 16:30:44 01/01/2015 01.020.4 1

    esempio di TBL_CONTROLLI:
    ID LOOP1 OTL1 LOOP2 OTL2
    1 01.201.7 0 01.001.1 1
    2 01.001.1 0 01.001.3 1
    3 01.001.3 0 01.003.1 1
    4 01.003.1 0 01.003.3 1
    5 01.003.3 0 01.004.3 1

    esempio della tabella TBL_LOOP dopo il controllo con l'aggiunta di "OK" a controllo verificato:
    ...
    Vedi che già iniziano ad arrivare opinioni un po' più strutturate e ragionate.
    Però hai proposto un estratto "non significativo" dei record, nel senso che in TBL_CONTROLLI non trovo niente che posso abbinare a TBL_LOOP! Per formulare qualcosa di concreto potresti indicare i controlli sui LOOP che sono nella prima tabella? Io sto ancora ragionando come semplice query. VBA è il passo successivo, eventualmente.
    Aggiugo: forse riesco a combinare qualcosa con l'esempio del risultato post controllo.
  • Re: Access 2013: Query di controllo record successivi

    leonardocarrani ha scritto:


    ...provo a spiegare il problema. Devo effettuare un controllo su una tabella TBL_LOOP.
    Ecco la mia proposta senza l'uso di VBA, solo query.
    Questi sono i punti fermi della mia analisi:
    1) non ho capito niente di punti, sensori, loop e tempi.
    2) la tabella dei controlli (che ti avevo suggerito di costuire nel thread precedente) è "fissa", non cambia ad ogni scarico di dati. (è ovvio che nel tempo, se cambia "il percorso", anche questi cambieranno).
    Ho inteso pertanto l'operazione che chiedi come una "verifica" dei controlli presenti nella tabella TBL_CONTROLLI.

    ==Fase 1==
    Metto insieme ogni record di TBL_LOOP con il record successivo
    SELECT TBL_LOOP.ID AS id1, TBL_LOOP.LOOP AS loop1, TBL_LOOP.OTL AS otl1,
    TBL_LOOP_1.ID AS id2, TBL_LOOP_1.LOOP AS loop2, TBL_LOOP_1.OTL AS otl2
    FROM TBL_LOOP INNER JOIN TBL_LOOP AS TBL_LOOP_1 
    ON tbl_loop.id+1=tbl_loop_1.id;
    Per comodità mi riferitò a questa prima query con il nome di T_NEW

    ==Fase 2==
    SELECT T_NEW.id1, T_NEW.loop1, T_NEW.otl1, T_NEW.id2, T_NEW.loop2, T_NEW.otl2
    FROM (...) As T_NEW INNER JOIN TBL_CONTROLLI 
    ON (T_NEW.otl2 = TBL_CONTROLLI.OTL2) AND 
    (T_NEW.loop2 = TBL_CONTROLLI.LOOP2) AND 
    (T_NEW.otl1 = TBL_CONTROLLI.OTL1) AND 
    (T_NEW.loop1 = TBL_CONTROLLI.LOOP1);
    Con questa query metto in relazione il risultato di T_NEW con TBL_CONTROLLI, in modo che restituisca quelli che hanno perfetta corrispondenza (cioè il controllo è superato - verificato). Per comodità mi riferirò a questa query come CTL_OK

    ==Fase 3==
    UPDATE TBL_LOOP INNER JOIN (...) AS CTL_OK 
    ON TBL_LOOP.ID = CTL_OK.id1 
    SET TBL_LOOP.SELEZ = "OK";
    Con questa imposto ad OK il campo SELEZ della tabella TBL_LOOP per indicare che il controllo è superato.

    Con i pochi record che hai pubblicato, il risultato è quello che mi aspettavo. Il tutto, ripeto, con le due premesse di inizio post.
  • Re: Access 2013: Query di controllo record successivi

    Per Philcattivocarattere:

    La tabella elaborata, quella con l'aggiunta di "OK", è esattamente identica a TBL_LOOP con la sola aggiunta degli "OK".

    La prima che ho messo era per far vedere un esempio di tipologia di dati mentre l'ultima è quella con l'aggiunta degli "OK".

    Come ha precisato la TBL_CONTROLLI è fissa.

    Provo a dare un'occhiata alle tue soluzioni

    Grazie
    Leonardo
  • Re: Access 2013: Query di controllo record successivi

    Scusa Philcattivocarattere,
    nella fase2 e fase3 c'è (...)
    cosa vuol dire?

    Scusa l'ignoranza.
    Leonardo
  • Re: Access 2013: Query di controllo record successivi

    Per Philcattivocarattere,

    scusa ma ero un pochino annebbiato, risolto il quesito (...),
    sembra che funzioni tutto ok ed è molto molto molto più agevole della mia lugubrazione con gli IIf!

    Grazie mille
    Leonardo
  • Re: Access 2013: Query di controllo record successivi

    Buongiorno a tutti,
    volevo sapere se con la soluzione suggerita sarebbe possibile, qualora nel campo fosse già presente la scritta "OK", lasciarla e aggiungerla solo dove la condizione è confermata.

    Grazie
    Leonardo
  • Re: Access 2013: Query di controllo record successivi

    leonardocarrani ha scritto:


    ...
    volevo sapere se con la soluzione suggerita sarebbe possibile, qualora nel campo fosse già presente la scritta "OK", lasciarla e aggiungerla solo dove la condizione è confermata.
    Attenzione: questo significa che quel record non ha superato quelle che nel thread ho chiamato "Fase1 e Fase2" ma che il valore OK già presente deriva da "elaborazioni precedenti" o da altre origini (ad esempio un inserimento manuale). Consapevole di questo... certo che è possibile, basta aggiungere alla query di UPDATE la condizione WHERE appropriata.
    UPDATE TBL_LOOP INNER JOIN (...) AS CTL_OK
    ON TBL_LOOP.ID = CTL_OK.id1
    SET TBL_LOOP.SELEZ = "OK"
    WHERE TBL_LOOP.SELEZ ... 
    ... aspetta... rileggendo il tutto però m'è sorto il dubbio sulla corretta interpretazione della richiesta. Tu vuoi che in presenza di SELEZ già valorizzati con OK si rifaccia la verifica e che eventualmente quelli che NON passano non abbiano più l'OK? Perché se è così quello che ho detto prima non vale. Aspetto chiarimenti prima di ulteriori interventi.
  • Re: Access 2013: Query di controllo record successivi

    Intanto grazie ancora per l'interessamento.
    Volevo sapere se avendo fatto precedentemente un controllo e di conseguenza ho la scritta "OK" su alcuni campi, posso fare un nuovo controllo, magari con criteri diversi dal primo, e aggiungere "OK" a quei campi che corrispondono alla verifica, lasciare "OK" ai campi che hanno già "OK" da precedenti controlli e lasciare vuoto in tutti gli altri.

    Grazie
    Leonardo
  • Re: Access 2013: Query di controllo record successivi

    Ho visto che se aggiungo il codice che hai messo con IS NULL nella condizione WHERE funziona.

    Grazie
    Leonardo
  • Re: Access 2013: Query di controllo record successivi

    leonardocarrani ha scritto:


    Volevo sapere se avendo fatto precedentemente un controllo e di conseguenza ho la scritta "OK" su alcuni campi, posso fare un nuovo controllo, magari con criteri diversi dal primo, e aggiungere "OK" a quei campi che corrispondono alla verifica, lasciare "OK" ai campi che hanno già "OK" da precedenti controlli e lasciare vuoto in tutti gli altri.
    Allora vale quello che avevo detto prima quanto alla modifica della query di UPDATE.
    Vedi di impostare bene il criterio da verificare: se è un campo Null o stringa a lunghezza zero o usare il "trucchetto" per comprenderli entrambi, in base al quale
    Len(Null & vbNullString) = 0
    oppure ancora per esclusione: quelli che già non sono "OK"
    Mentre scrivevo hai risolto da solo.
  • Re: Access 2013: Query di controllo record successivi

    Grazie!
Devi accedere o registrarti per scrivere nel forum
13 risposte