Newsgroup: it.comp.appl.access
Titolo: DSum con più Criteri

Salve 
Mi occorre ricavare la somma di ImportoFattura da una Qry1 avente le seguenti condizioni Where: 
CampoTipo = Fornitore o Cliente
CampoDATA = DAL....Al
 
Ho creato quindi una Form nella quale ho inserito due controlli per le date (DAL AL)
e un controllo per scegliere il Fornitore o Cliente (Campo Integer con valori 1 e 2 ) 
 
il seguente codice mi dà ERRORE Tipo non Corrispondente... dove sbaglio?
 
Dim Tot as Currency
 
Tot = DSum("ImportoFattura", "Qry1", "TIPO =" & Me!TIPO and "DataFattura between #" & Me!Dal & "# and #" & Me!Al & "#")
 
Grazie.

Ho provato anche a cambiare il Formato DATA
 
And "DataFattura between #" & Format(Me!Dal, "mm/dd/yyyy") & "# and #" & Format(Me!Al, "mm/dd/yyyy") & "#")
 
Stesso messaggio di errore....

Salve,
 
Gabriapuglisi ha scritto:

Soprattutto devi includere il primo AND nella stringa:
 
Tot = DSum("ImportoFattura", "Qry1", "TIPO =" & Me!TIPO " And 
DataFattura Between " & Format(Me!Dal, "\#yyyy\-mm\-dd\#") & " And " & 
Format(Me!Al, "\#yyyy\-mm\-dd\#"))
 
v.a. 
http://www.donkarl.com/it?FAQ6.8
 
 
-- 
Ciao
Karl
*********
http://www.AccessDevCon.com
 
Access FAQ: 
http://www.donkarl.com/it
 
 
 
 


Buongiorno Karl e grazie per la risposta!
La tua stringa mi da un errore di sintassi,appena copiata sull'editor.
   Previsto: separatore di elenco oppure) 
E mi indica l'errore proprio su quel And. Infatti se posticipo le virgolette Dopo And, l'errore di sintassi sparisce ma in esecuzione mi dà l'errore di Tipo non Corrispondente!
La cosa mi sta confondendo non poco... da giorni! 


Ma aggiungo: Sono abbastanza certo che il problema sta nella concatenazione della stringa. Infatti se mando in esecuzione la prima condizione (senza le date) funziona!
E se mando in esecuzione solo la seconda condizione (Le date, così come erano scritte nel mio codice) funziona!
Quindi anche se mi restituisce ERRORE di TIPO mi sa che il problema è in quella concatenazione AND ...
Nel dubbio, si aggiunge il fatto che nel codice del tuo sito il metodo per cambiare formato data è "\#yyyy\-mm\-dd\#"   ...che è diverso da quello usato da me. 
Help!

gabria...@gmail.com
 formulated on Saturday :

I parametri DSum sono tre:
"ImportoFattura" = nome del campo
"Qry1"           = Domain
"TIPO = X"       = Condizione
 
Tu poni X =  [TIPO] & " And [DataFattura] BETWEEN #" & Format([Dal], _
             "mm/dd/yyyy") & "# AND #" & Format([Al], _
             "mm/dd/yyyy") & "#"
che non ha senso!!!
 
Ora secondo te, X dovrebbe essere uguale a che cosa?
 
Bruno


Grazie per la risposta.
Scusa Bruno ma non mi sembra di aver mai scritto Tipo= X
Tipo è Numerico (come scrivo nel primo post chiamandolo CampoTipo)
Quindi nella stringa "TIPO =" & Me!TIPO (controllo della form)
o forse non ho capito la tua domanda...


Tu scrivi a un certo punto "Non ha senso".
Per essere più chiari mi serve ottenere una somma degli importi fatture entro un certo periodo ma devo prima distinguere i Fornitori (Tipo =1) dai Clienti (Tipo=2)
Tale somma, lo so,potrei ottenerla in altri modi ma sto provando ad ottenerla direttamente con DSum

It happens that 
gabria...@gmail.com
 formulated :

Rifaccio la domanda, senz'altre considerazioni:
che cosa ti aspetti ottenere per X, tale che
"TIPO = X" sia la condizione del DSum?
 
Hai detto poc'anzi che "Tipo è Numerico" quindi ti aspetti
di ottenere un valore numerico da:
    [TIPO] & " And [DataFattura] BETWEEN #" & Format([Dal], _
                   "mm/dd/yyyy") & "# AND #" & Format([Al], _
                   "mm/dd/yyyy") & "#"
ed è quest'ultima espressione che non ha senso, perché essa
ti può solo rendere:
True oppure False
 
Quindi è come se scrivessi, per la condizione DSum:
"TIPO = False",  oppure
"TIPO = True"
il che equivale a:
"TIPO = 0, oppure
"TIPO = -1
 
Mentre tu ti aspetti 1 OR 2.
 
Bruno


E' vero, io mi aspetto di ottenere 1 o 2 a seconda dei parametri che ho assegnato alla Form. 
Quindi da DSUM mi aspetto:
Fammi la Somma di ImportoFatture DOVE Tipo è = 1 oppure 2 a seconda di ciò che ho selezionato nella Form, AND DOVE la DataFattura è DAL...AL
Non capisco perché il primo criterio dovrebbe essere un "interrutore" ON/OFF False/True...
O Mi dai i FORNITORI tra una data e l'altra
O Mi dai i CLIENTI tra una data e l'altra
A seconda di cosa ho selezionato nella Form
Mi sono spiegato o ancora una volta sono io che non ho capito ? 

Se non hai valori a ZERO.... Non basta <3...?
 
P.s. Non entro nel merito della sintassi che ha preso direzioni artistiche che lascio a Bruno.
@Alex

 Mi sono spiegato o ancora una volta sono io che non ho capito ? 
 
Se hai una tabella denominata "TabFat"
che abbia un campo denominato "ImportoFat"
un campo "DataFat"
e un campo TipoFat...
 
Allora la somma delle fatture Tipo = 2, che abbiano una
data compresa fra 1/3/2019 e 15/3/2019 si ottiene con:
 
DSum("ImportoFat", "TabFat", "DataFat Between #" & _
       Format("1/3/2019", "mm/dd/yyyy") & _
       "# And #" & Format("15/3/2019", "mm/dd/yyyy") & _
       "# AND TipoFat = 2")
 
 
Se i parametri di DSum li prelevi da controlli su una Form
denominati DataIni, DataFin, TipoFattura, allora:
 
DSum("ImportoFat", "TabFat", "DataFat Between #" & _
        Format([DataIni], "mm/dd/yyyy") & _
       "# AND #" & Format([DataFin], "mm/dd/yyyy") & _
       "# AND TipoFat = " & [TipoFattura])
 
DSum e le altre Domain Functions sono robaccia
da non usare in Access.
 
Buona Pasquetta
Bruno

 
 
Hmm, sì, se vedo bene manca un & dopo la prima condizione, cioè dopo 
Me!TIPO:
 
Tot = DSum("ImportoFattura", "Qry1", "TIPO =" & Me!TIPO & " And 
DataFattura Between " & Format(Me!Dal, "\#yyyy\-mm\-dd\#") & " And " & 
Format(Me!Al, "\#yyyy\-mm\-dd\#"))
 



Buongiorno Bruno. Il tuo augurio di buona Pasquetta ha funzionato...così come il tuo codice :-) Grazie Mille!  
P.s.
Come mai la consideri "robaccia"? Poco affidabile? Instabile? Meglio usare  Query e Report? (Figurati che io queste funzioni D... le ho scoperte da poco, ma non dirlo a nessuno!) ;-)


Grazie Karl... come sempre anche il tuo codice funziona, come quello di Bruno,(Sebbene la formattazione data sia differente... questa cosa vorrei capirla però)  Grazie ancora !!! :-)

 
 
P.s.
Al di là del Copia e Incolla però vorrei capire meglio la stringa.
In sintesi: eliminando le & di concatenazione e gli apici di stringa intermedi("), nella parte CRITERI c'è scritto: 
"Primo Criterio = Me!Campo AND Datafattura Tra (FormatoData) AND (FormatoData) ) ...Mi mancano però le stringhe di chiusura aperte al primo criterio... dove sono finite?  Le ultime virgolette della stringa sono dentro la formattazione della data... Format(Me!Al, "\#yyyy\-mm\-dd\#"))
 

gabria...@gmail.com
 used his keyboard to write :

Sono di una lentezza paurosa paragonate al risultato di una query.
Naturalmente va bene tutto se stiamo in un migliaio di record,
ma poi...
 
Bruno

Sulla singola chiamata sono comode, ancorché basti scrivere una manciata di righe per crearsi una DLookupEx(...) che migliora l'originale.
La differrnza infatti su chiamata ONE-SHOT anche se visibile non è tale da rendere utile menzionare altre strategie...
Cosa molto differente invece è quando si usano in query che ovviamente chiamano qualche centinaio-migliaio di volte...
 
Per chi è pigro:
http://allenbrowne.com/ser-42.html
 
 
Ho ottenuto ulteriori migliorie,rilevanti, usando un Recordset di tipo Static nella funzione la dove la chiamata viene da query...
Vabbè sono tutti esperimenti che ognuno se vuole farà...
 
@Alex

Giusto per chiarire l'affermazione riduttiva in quanto generalizzata, di Bruno, sull'uso delle Funzioni di Aggregazione allego un Link, sicuramente di un personaggio Autorevole, che con prove spiegate e documentare nonchè replicabili ci  fa capire meglio di cosa parliamo quando si parla di MEGLIO/PEGGIO... 
 
https://codekabinett.com/rdumps.php?Lang=2&targetDoc=access-performance-counting-records
 
 
@Alex


Grazie Alex, ho dato un occhiata. Molto interessante.
Attualmente i miei Db gestiscono Recordset di centinaia di record, (in alcuni casi sotto i 100) ...lontanissimi dai 707 mila record del test!
In ogni caso... non ho capito cosa è la seconda misurazione; Deltaw...

 In ogni caso... non ho capito cosa è la seconda misurazione; Deltaw...
 
Sempliemente ha usato un METODO a Riferimento, nella prima Tabella il Metodo(3) che poi è citato in coda... ed il DELTA è semplicemente la differenza in Sec. dal metodo in Analisi rispetto al metodo di Riferimento...
 
Stessa cosa sotto relativamente al Metodo(5).
 
Il riassunto provato dai numeri è in ogni caso chiaro, se fai la singola chiamata usa pure le Funzioni di aggregazione sui Domini... anche se in termini % le differenze sembrano numeroni... parliamo di una PIPPA in termini pratici.
 
Se invece devi inserire in una Query con molti dati un DCOUNT... e/o eseguire un DCOUNT in un ciclo con un umero rilevante di Iterazioni la differenza potrebbe essere eccessiva e giustificare l'osservazione, a quel punto dovrai ottimizzare la Funzione che sostituisce la chiamata nativa... con una realmente ottimizzata, e li hai gli esempi per il DCOUNT...!
 
@Alex

 ...

Forse è più chiaro con interruzioni di righe dove si vede che c'è sempre 
una coppia di virgolette:
 
"TIPO ="
  &
Me!TIPO
  &
" And DataFattura Between "
  &
Format(Me!Dal, "\#yyyy\-mm\-dd\#")
  &
" And "
  &
Format(Me!Al, "\#yyyy\-mm\-dd\#")
 



Buongiorno Karl...
si così è molto più chiaro.
Mi ero ingannato pensando di vedere alla fine un'unica stringa racchiusa tra due virgolette. Grazie!