Conteggio Righe in una query con campo calcolato DateDiff

di il
27 risposte

Conteggio Righe in una query con campo calcolato DateDiff

Ho una query di selezione con due campi Data che provengono da una Tabella (tab01); con un terzo campo calcolato del tipo
DurataMesi: DateDiff("m";[tab01]![Data1];[tab01]![Data2])
Calcolo la distanza tra le due date; la query funziona regolarmente; dovrei conteggiare i Record estratti.
Tentativi effettuati:
1) intRecord = DCount("Data1", "qry23a") (in una maschera)
2) Query di Raggruppamento e funzione conteggio
ricevo in entrambi i casi l'errore "chiamata di routine non valida"
Ho provato anche ad assegnare la qry23a ad una casella di riepilogo (con la speranza di poter contare con la proprietà ListCount le sue righe); la casella mostra metà dei record della qry23a (che non mi spiego).
Grazie!

27 Risposte

  • Re: Conteggio Righe in una query con campo calcolato DateDiff

    StefanoR ha scritto:


    Ho una query di selezione con due campi Data che provengono da una Tabella (tab01);
    Pubblica la SQL della query "qry23a".
    Già che ci sei dai un'occhiata all'editor di VBA (ALT + F11), vai su Strumenti - Riferimenti e guarda se qualche voce è segnalata come mancante.
  • Re: Conteggio Righe in una query con campo calcolato DateDiff

    StefanoR ha scritto:


    Ho una query di selezione con due campi Data che provengono da una Tabella (tab01); con un terzo campo calcolato del tipo
    DurataMesi: DateDiff("m";[tab01]![Data1];[tab01]![Data2])
    Calcolo la distanza tra le due date; la query funziona regolarmente; dovrei conteggiare i Record estratti.
    Tentativi effettuati:
    1) intRecord = DCount("Data1", "qry23a") (in una maschera)
    2) Query di Raggruppamento e funzione conteggio
    ricevo in entrambi i casi l'errore "chiamata di routine non valida"
    Ho provato anche ad assegnare la qry23a ad una casella di riepilogo (con la speranza di poter contare con la proprietà ListCount le sue righe); la casella mostra metà dei record della qry23a (che non mi spiego).
    Grazie!
    Scusa ma conteggiare rispetto a cosa...?
    Se la Query ha il calcolo delle Distanze, e raggruppi... non serve fare il calcolo delle distanze... se invece vuoi sapere quanti hanno la stessa Distanza... allora ha un senso...
  • Re: Conteggio Righe in una query con campo calcolato DateDiff

    Grazie Alex; la seconda che hai detto; per l'esattezza voglio conoscere quante sono le distanze calcolate con un numero di mesi tra 0 e 12 (ho omesso di dire che nella qry23a c'è il criterio che non crea problemi)
  • Re: Conteggio Righe in una query con campo calcolato DateDiff

    Philcattivocarattere, grazie.
    SQL in questione
    SELECT tab01_Prigionieri.DataCattura, tab01_Prigionieri.DataRimpatrio, DateDiff("m",[tab01_Prigionieri]![DataCattura],[tab01_Prigionieri]![DataRimpatrio]) AS DurataPrigioniaMesi
    FROM tab01_Prigionieri
    WHERE (((tab01_Prigionieri.DataCattura) Is Not Null) AND ((tab01_Prigionieri.DataRimpatrio) Is Not Null) AND ((DateDiff("m",[tab01_Prigionieri]![DataCattura],[tab01_Prigionieri]![DataRimpatrio]))>=0 And (DateDiff("m",[tab01_Prigionieri]![DataCattura],[tab01_Prigionieri]![DataRimpatrio]))<=12));

    Circa i riferimenti attivi sono (Access 2010; win7)
    Visual Basic For Applications
    Microsoft Access 14.0
    Ole Automatio
    Microsoft Office 14.0 Access database engine...

    Se è d'aiuto il contesto del problema (anche per Alex):
    Ho un elenco di persone (prigionieri della seconda guerra mondiale) con relativa "data di cattura" e "data di rimpatrio"; vorrei calcolare la "durata della prigionia" (appunto datediff in termini di mesi); quindi con una serie di qry di selezione conteggiare le durate di uno, due, tre anni etc. per trarne una statistica. Ho usato spesso in questi casi un'espressione Dcount("*";"originedati") su una maschera, ma ugualmente ricevo l'errore. Altro tentativo strano che poteva dare frutti e stava funzionando è stato usare la qry come origine dati di un form (e in questo caso a differenza della casella di riepilogo, come detto, che mostrava metà record!) quindi conteggiare i record del Form (ma non ho proseguito su questo filone).
    Grazie
  • Re: Conteggio Righe in una query con campo calcolato DateDiff

    Allora non puoi avere semplicemente il Calcolo... altrimenti quando raggruppi con conteggio raggruppi per 0-2-2-3...12..15..ecc...
    Devi realizzare un calcolo che non restituisca la distanza, ma un BOOLEANO che se (0<=Distanza<=12)=True
    Allora a quel punto raggruppi e Conti ottenendo il conteggio dei True e dei False.
    Chiaramente questa query deve avere solo 1 Campo, quello calcolato altrimenti non ottieni nulla di sensato.
    Ora se non c'è possibilità di Differenza Negativa... ti basterebbe scrivere così:
    
    SELECT (DateDiff("m";[Data1];[Data2])<=12) As DistMin FROM tab01
    GROUP BY DateDiff("m";[Data1];[Data2])<=12
  • Re: Conteggio Righe in una query con campo calcolato DateDiff

    A me con dcount funziona.
    Questo è l'SQL della query
    SELECT TabellaTest.Data1, TabellaTest.Data2, DateDiff("m",[data1],[data2]) AS Espr1 FROM TabellaTest;
    e questo è il vba
      MsgBox (DCount("Data1", "QueryTest"))
    controlla che non ci sia qualche errore di sintassi anche se mi pare strano visto che dici che la query funziona.

    ho inserito 3 record e la dcount ritorna 3
  • Re: Conteggio Righe in una query con campo calcolato DateDiff

    Grazie Alex e Beachman; ho seguito i vostri suggerimenti; non ho ancora risolto. Questi i tentativi:
    Strategia Beachman:
    - ho anch'io realizzato una tabella di prova e una qry con campo calcolato DateDiff come sopra con Criterio tra 0 e 12; vengono poi tranquillamente conteggiate le righe con una semplice Dcount("*";"qry") in una maschera
    Strategia Alex:
    - ho provato a generare true/false con un campo calcolato di questo tipo (forse non proprio come intendevi tu, ma tant'è!)
    DurataPrigioniaMesi: IIf(DateDiff("m";[tab00A]![DataInizio];[tab00A]![DataFine])>=0 And DateDiff("m";[tab00A]![DataInizio];[tab00A]![DataFine])<=12;1;0)
    La Query groupby basata su questo campo conteggia correttamente.

    Devo concludere che potrebbe esserci un problema con i dati sulla mia tabella che giustifica l'errore "chiamata di routine non valida"; mi impegno a dare il prossimo esito.
  • Re: Conteggio Righe in una query con campo calcolato DateDiff

    StefanoR ha scritto:


    Devo concludere che potrebbe esserci un problema con i dati sulla mia tabella che giustifica l'errore "chiamata di routine non valida"
    Direi proprio di sì.
    Dividerei l'operazione ulteriormente in due step:
    1) una query che esclude le date Null
    2) sulla query di cui al punto 1 fare il calcolo con DateDiff.
    E' possibile che i dati nella tabella siano "corrotti"? Il compatta/ripristina con eventuale esportazione del tutto in un database nuovo risolve?
  • Re: Conteggio Righe in una query con campo calcolato DateDiff

    Caso risolto. Il problema stava in due record (sui circa 3000) con due date "sbagliate" 30/12/1899. Le soluzioni discusse sopra erano tutte corrette. Ringrazio per gli interventi e gli ottimi suggerimenti: Alex, Beachman e Philcattivocarattere.

    Se può essere utile per altri, in sintesi indico i passaggi (e mia interpretazione):
    - i Dati provenivano da un foglio Excel importato nel Database Access
    - Le date erano già state bonificate per eliminare le imperfezioni (es assenza di barra)
    - L'importazione era avvenuta senza scarto di record e il campo aveva nella tabella Access il formato data (da qui non mi è venuto da pensare subito a problemi sui dati, il mini test di Beachman è stato utile)
    - ho provato per individuare le date sbagliate le funzioni isDate e CDate, ma senza successo (nel senso che Access non mi identificava il problema)
    - una mia interpretazione è che Excel mi pare abbia un calendario interno che parte dal 1/1/1900, forse questo ha fatto si che il dato venisse importato perchè comunque la struttura della data era rispettata, ma access non gli avesse attribuito il formato Data!
    - con opportune selezioni di record ho localizzato la porzione dei 3000 che creava il problema; è stata utile la funzione Year che invece non riconoscendo come Data il dato mostrava un errore ed ho potuto identificare con esattezza i due record

    Grazie di nuovo
    un saluto
  • Re: Conteggio Righe in una query con campo calcolato DateDiff

    StefanoR ha scritto:


    Caso risolto. Il problema stava in due record (sui circa 3000) con due date "sbagliate" 30/12/1899.
    Hai fatto bene ad usare le virgolette per racchiudere l'aggettivo sbagliate. Non esistono date sbagliate in un campo data. O è Null o è una data (valida, cioè all'interno del range delle date accettate da Access: 1° gennaio dell'anno 100 e 31 dicembre 9999)
    Le date sono in realtà numeri, lo zero rappresenta la data che fa da "spartiacque" tra i valori positivi e quelli negativi: le date prima del 30/12/1899 sono memorizzate con numeri negativi, i numeri positivi per le date successive.
    L'unico problema poteva essere la presenza di Null ma già li escludevi con la query. Non considero l'eventualità delle "parti decimali" che memorizzano l'ora.

    StefanoR ha scritto:


    ...
    - una mia interpretazione è che Excel mi pare abbia un calendario interno che parte dal 1/1/1900, forse questo ha fatto si che il dato venisse importato perchè comunque la struttura della data era rispettata, ma access non gli avesse attribuito il formato Data!
    - con opportune selezioni di record ho localizzato la porzione dei 3000 che creava il problema; è stata utile la funzione Year che invece non riconoscendo come Data il dato mostrava un errore ed ho potuto identificare con esattezza i due record
    non l'ho capita. CDate e IsDate non facevano una piega mentre Year sì? Boh!
    Sono un po' (che scritto da me si legge "molto") curioso. Potresti pubblicare quell'elenco di partenza, anche quello con gli errori, ovviamente senza nomi o altro, solo per la parte delle date ed eventualmente delle chiavi primarie, il minimo indispensabile per lavorarci su? File di Excel compreso, con le stesse caratteristiche: il minimo indispensabile.
    Se non puoi pubblicare niente qui devi avvalerti di un servizio di file hosting esterno (google drive, onedrive, dropbox senza parlare poi dei siti di file sharing)
  • Re: Conteggio Righe in una query con campo calcolato DateDiff

    Giusto per portare qualche informazione in più.

    Ho provato a scrivere nella tabella di prova la data "30/12/1899" e mi viene visualizzata come "00:00:00", le altre data precedenti o successive le visualizza correttamente, sembra che solo quella dia problemi.

    La datediff poi funziona correttamente ma la data viene visualizzata male sia sulla tabella che sulla query.

    Potrebbe dipendere dal fatto che quella è la data 0 per access come riporta microsoft

    https://docs.microsoft.com/it-it/office/troubleshoot/access/store-calculate-compare-datetime-data
  • Re: Conteggio Righe in una query con campo calcolato DateDiff

    Beachman ha scritto:


    Potrebbe dipendere dal fatto che quella è la data 0 per access come riporta microsoft
    https://docs.microsoft.com/it-it/office/troubleshoot/access/store-calculate-compare-datetime-data
    è esattamente quello che ho detto.

    Beachman ha scritto:


    come "00:00:00", le altre data precedenti o successive le visualizza correttamente
    La visualizzazione, come dice la parola stessa, è solo un problema di "visualizzazione". Il dato nel database è memorizzato come numero (double, per completezza). Quella sembra la visualizzazione della parte oraria ma non significa nulla.
    Io resto sempre dell'opinione che per capire davvero (ammesso che abbia significato capire dov'è il problema) cosa è successo servono i dati di partenza. Anche se alla fine visto che è stato risolto tutto si tratta di "pura accademia".
  • Re: Conteggio Righe in una query con campo calcolato DateDiff

    Grazie Philcattivocarattere e Beachman; sto preparando i dati (Excel e tabella Access, depurata dagli altri campi) per togliere gli ultimi dubbi a fini di studio; posso mandarvi un allegato tramite un link al mio googledrive che pubblico qui oppure è possibile mandarvelo direttamente tramite altro canale?
  • Re: Conteggio Righe in una query con campo calcolato DateDiff

    StefanoR ha scritto:


    posso mandarvi un allegato tramite un link al mio googledrive che pubblico qui oppure è possibile mandarvelo direttamente tramite altro canale?
    Se non hai a disposizione la scheda "Allegati" per caricare il file su questo sito direttamente (diventa disponibile dopo un tot di post) google drive è uno dei tanti sistemi che vedo usare, va bene.
Devi accedere o registrarti per scrivere nel forum
27 risposte