Parametrizzazione della funzione DateAdd

di il
6 risposte

Parametrizzazione della funzione DateAdd

Buonasera a tutti!
Per la mia tesi devo analizzare delle movimentazioni di un magazzino logistico: la forma della tabella che devo analizzare è:
Cliente | Codice Prodotto | Data di movimentazione | Quantità movimentata
Ora, a me interessa conteggiare il numero di record per ogni prodotto in un determinato intervallo di tempo.

Ciò che ho pensato è una query del genere:
SELECT Database.Cliente, Database.[Codice prodotto], Database.[Data di movimentazione] , Count(Database.[Quantità movimentata]) as Conteggio_15gg
FROM Database
WHERE (Database.[Data di movimentazione] Between [inserire data] And DateAdd("d"; -15; "[inserire data]")
GROUP BY Database.Cliente, Database.[Codice prodotto];
In modo tale da poter sottrarre 15 giorni ad una qualsiasi data che io scelgo!

Quando cerco di eseguire la query, però, mi dice
...Espressione con errori o troppo complessa per essere valutata...
.

Che cosa sto sbagliando?

Spero di essere stata chiara nella spiegazione!

6 Risposte

  • Re: Parametrizzazione della funzione DateAdd

    Visto che impieghi la medesima data di partenza (per determinare l'intervallo della quindicina di giorni) e magari questa viene chiesta all'atto della esecuzione della query; Access non riesce ad effettuare il calcolo (data di inizio e fine periodo) e fornisce il messaggio, per cui puoi realizzare un pannello di interfaccia che chieda la data da inserire, effettui la sottrazione dei quindici giorni ed in tal caso l'intervallo viene calcolato e la query si ritrova le due date elaborate.
  • Re: Parametrizzazione della funzione DateAdd

    L'utilizzo di Query con Parametri DIRETTI è estremamente discutibile... ovviamente se serve solo a te che lo usi va bene... me se al posto delle date l'eventuale UTENTE scrivesse PIPPO e PLUTO...?

    Normalmente si usano Maschere di interfaccia utente al fine di passare i parametri in modo VALIDATO, ed evitare SQL INJECTION.
  • Re: Parametrizzazione della funzione DateAdd

    willy55 ha scritto:


    Visto che impieghi la medesima data di partenza (per determinare l'intervallo della quindicina di giorni) e magari questa viene chiesta all'atto della esecuzione della query; Access non riesce ad effettuare il calcolo (data di inizio e fine periodo) e fornisce il messaggio, per cui puoi realizzare un pannello di interfaccia che chieda la data da inserire, effettui la sottrazione dei quindici giorni ed in tal caso l'intervallo viene calcolato e la query si ritrova le due date elaborate.
    Grazie mille dello spunto!
    Ora provo
  • Re: Parametrizzazione della funzione DateAdd

    @Alex ha scritto:


    L'utilizzo di Query con Parametri DIRETTI è estremamente discutibile... ovviamente se serve solo a te che lo usi va bene... me se al posto delle date l'eventuale UTENTE scrivesse PIPPO e PLUTO...?

    Normalmente si usano Maschere di interfaccia utente al fine di passare i parametri in modo VALIDATO, ed evitare SQL INJECTION.
    Si, serviva solo a me!
    Ma se con le maschere elimino la "discutibilità" della cosa, ora lavoro su questo!
  • Re: Parametrizzazione della funzione DateAdd

    Inoltre io eviterei il count delle quantità movimentate e la select della data movimentazione. A te serve sapere il numero di movimenti per prodotto in un determinato intervallo quindi ti basta fare la select del cliente e codice prodotto e il count (codice prodotto) nel periodo richiesto. A meno che non ti interessi anche la data, allora in quel caso dovresti raggruppare anche per quella nel Gourp By
  • Re: Parametrizzazione della funzione DateAdd

    Ciao a tutti quelli che mi hanno risposto!
    Vi volevo ringraziare, perchè grazie alle vostre risposte sono riuscita a risolvere... E visto che ne sono molto fiera, vi dico anche come (probabilmente per voi è una ovvietà, ma per me che sono alle prime armi è una figata!):
    • Ho creato una maschera di calcolo in cui inserire (tramite maschera di input, così non si possono scrivere né PIPPO né PLUTO) la data iniziale di interesse,
    • Tramite una casella combinata ho fatto in modo di inserire le opzioni di "numero" da inserire nella funzione dateAdd,
    • Ho creato 3 ulteriori caselle di testo che mi calcolano a ritroso le date partendo da quella inserita da me, sottraendovi il numero di mesi selezionati nella casella combinata (la prima calcola DataIniziale - x Mesi = PrimaDataFinale, la seconda calcola PrimaDataFinale - x Mesi = SecondaDataFinale e così via).
    Dopodichè ho riscritto la query che vi avevo postato all'inizio, con alcune modifiche; invece che utilizzare il count, ho scritto:
     IIf(Eval([Qry_Database_Unito_18_19.Data] Between [Maschere]![Maschera_Date]![txt_DataIniziale] And [Maschere]![Maschera_Date]![txt_PrimaDataFinale]);Conteggio([Quantità]);"0")
    in modo tale che se in quel periodo non vi fossero movimentazioni il valore restituito è "0".
    Ho ripetuto questa espressione per tutti gli intervalli calcolati dalla maschera.

    Con una seconda query ho poi sommato i valori calcolati, in modo da non avere recordo dello stesso codice ripetuti (ancora non ho capito come evitare il select sulla data, ma comunque funziona, e per quello che devo fare io, anche due query vanno bene).

    Dalla maschera posso eseguire la seconda query tramite un pulsante di comando, così aggiorna la prima e ottengo il risultato che desideravo.

    Magari non la soluzione stilistiamente più bella, ma sono felice!

    Per me il problema è risolto!!!

    Grazie ancora a tutti
Devi accedere o registrarti per scrivere nel forum
6 risposte