Newsgroup: it.comp.appl.access
Titolo: VBA sintassi corretta per utilizzo DSUM - calcolare credito residuo (ricariche - acquisti) di card ricaricabili - Errore 3075 operatore mancante

Ciao a tutti,
 
ho due tabelle :
 
movimenti
attivazioni card
 
nella tabella movimenti memorizzo le operazioni di ricarica credito e acquisti relativi alle card
 
nella tabella attivazioni card memorizzo per ogni card la data attivazione e la data disattivazione.
 
Sulla maschera movimenti (legata alla tabella movimenti) riporto alcune informazioni relative alle card, per ogni card visualizzo i relativi movimenti in una sottomaschera che preleva i dati da una query, poi visualizzo la data ultima attivazione e ultima disattivazione e visualizzo lo stato della card (attiva o non attiva).
 
Vorrei visualizzare il credito residuo della card ed ho pensato di usare in vba questo codice :
 
ricariche = DSum("importo", "movimenti", "[idtipomovimento]= " & "1" & " AND [idcard] = " & Me.IDCard & " AND " & [Data] & " BETWEEN " & ultimaattivazione & " AND " & dataodierna)
 
 
quando però eseguo il codice mi viene un errore Runtime 3075 operatore mancante ma non capisco come mai.
 
Per calcolare il credito residuo avevo pensato che potevo filtrare i vari movimenti della card e sommare prima tutte le ricariche effettuate  dall'ultima attivazione (solo sulle card attive)  fino alla data odierna e poi sottrarre a tale importo la somma di tutti i movimenti di acquisto effettuati nella stesso lasso di tempo.
 
Purtroppo non riesco ad andare avanti nemmeno con il solo calcolo delle ricariche da cui sottrarre poi gli acquisti.
 
Qualcuno mi sa aiutare o suggerire un metodo migliore?
 
grazie in anticipo.


Non è corretto il criterio Between. 'Data' va scritta testualmente, non come campo.
Quando ricevi questo tipo di errori metti il criterio o SQL che stai costruendo in una variabile e vai a vedere con debug.print o con un punto di interruzione che valore ha, il più delle volte ti accorgi subito dov'è l'errore.
Inoltre ti consiglio di usare sempre il formato #yyyy-mm-dd# quando scrivi SQL o usi Dsum, Dmax, ecc...
 
criterio = "[idtipomovimento]= 1 AND [idcard] = " & Me.IDCard & " AND Data BETWEEN #" & format(ultimaattivazione,"yyyy-mm-dd") & "# AND #" & format(dataodierna,"yyyy-mm-dd") & "#"
debug.print criterio
ricariche = DSum("importo", "movimenti", criterio)
 
Ciao.
-Marco-
 


Ciao Marco e grazie per la spiegazione.
Proverò quanto hai detto , io però ho bisogno di confrontare data e ora e non solo la data, i campi che contengono le date nel mio caso devono avere anche l'ora in quanto una card può essere disattivata lo stesso giorno ad esempio alle 12.30 e successivamente attribuita ad altro utente alle 12.31 e quindi il calcolo lo devo fare solo sui consumi e ricariche dall'ultima attivazione alla data e ora in cui effettuo l'operazione di ricarica o acquisto. Se mi baso solo sulla data mi troverei dei conti errati in quanto l'utente precedente potrebbe avere ancora dei crediti che non ha usufruito e questi andrebbero a vantaggio del nuovo utente che invece è obbligato a ricaricare prima di poter effettuare acquisti (i crediti residui vengono persi se ancora presenti nel momento in cui la card viene disattivata)
Si tratta di un sistema di gestione card per un campeggio dove il cliente ricarica la sua card e poi usa quella invece di portarsi a presso il denaro.
Mi sai consigliare come fare?
Devo mettere data e ora in due campi separati o pensi che posso usare tutto in un solo campo che contiene data e ora?
Grazie in anticipo.


Ho risolto da solo usando il campo data e ora (now) e confrontandoli con una semplice formula.
Riporto quanto fatto :
 
Private Sub dateAttivazione()
 
'verifico l'ultima attivazione e disattivazione per la card selezionata
ultimaAttivazione = Nz(DLast("Dataora", "AttivazioniCard", "IDCard = " & Me.IDCard & " and Dataora is not null and idonoff = 1"))
ultimaDisattivazione = Nz(DLast("Dataora", "AttivazioniCard", "IDCard = " & Me.IDCard & " and Dataora is not null and idonoff = 2"))
 
Me.ultimaAttivazione = ultimaAttivazione
Me.ultimaDisattivazione = ultimaDisattivazione
 
'verifico se la card è attiva o meno
If Nz(ultimaAttivazione) > Nz(ultimaDisattivazione) Then
    Me.statocard = "ATTIVA"
 
Else
    Me.statocard = "DISATTIVA"


Marco, ma non dichiari alcuna Variabile...?
NOn ti sembra strano...?
 
NOn hai impostato la Dichiarazione ESPLICITA delle VARIABILI dalle Impostazioni del VBA...?
Fai attezione nemmeno fossi uno sviluppatore provetto... rischi errori e non accorgertene...!
 
Altra cosa..., dici di usare Now() con data ed ora... ma nel codice di esempio che esponi non c'è traccia... quindi, se vuoi dare una spiegazione concreta metti quello di cui parli, altrimenti non mettere nulla...!
 
L'uso poi di NOW() spesso inganna i meno pratici... quando si creano CRITERI volti al Giorno, è estremamente sbagliato usare Now() se non depurato di hh:mm:ss....
 
Date()<>Now() e se quando salvi una Data della Transazione salvi anche hh:mm:ss non la troverai mai più se cerchi per Giorno, tantomeno se cerchi con Now()...
 
Per il resto... non ho altro.
 
@Alex