View Full Version : [VBA] Query con parametri
Set dbs = CurrentDb
Set FidoResiduo = dbs.OpenRecordset("SELECT DISTINCTROW Sum(TabellaOperazioni.[TOTALE SEND]) AS [TOTALE SEND]," _
& "Sum(TabellaOperazioni.[IMPORTO RECEIVE]) AS [IMPORTO RECEIVE]," _
& "Sum(TabellaOperazioni.[TOTALE QUICK]) AS [TOTALE QUICK], Sum(TabellaOperazioni.BONIFICO) AS BONIFICO," _
& "Sum([TabellaOperazioni].[TOTALE SEND])-NZ(Sum([TabellaOperazioni].[IMPORTO RECEIVE]))-NZ(Sum([TabellaOperazioni].[BONIFICO]))+NZ(Sum([TabellaOperazioni].[TOTALE QUICK])) AS [DA PAGARE]," _
& "Round(DLookUp('[fido settimanale]','[tblFido]')+nz(Sum([TabellaOperazioni].[BONIFICO]))-nz(Sum([TabellaOperazioni].[TOTALE SEND]))+nz(Sum([TabellaOperazioni].[IMPORTO RECEIVE]))-nz(Sum([TabellaOperazioni].[TOTALE QUICK])),2) AS [FIDO RESIDUO]" _
& "FROM TabellaOperazioni WHERE(((TabellaOperazioni.DATA) Between Date() And Date()-5))")
Con questo codice eseguo una query su una tabella filtrando i dati in base alla data che deve essere compresa (between) tra oggi e oggi-5.
Io vorrei sostituire date()-5 con una variabile ma non sò come si fa.
È access, sì?
Bé, non lo conosco bene, ma da quello che vedo il metodo OpenRecordset prende come argomento una stringa che contiene un'istruzione SQL, giusto?
Puoi comporre l'istruzione come vuoi. Ad esempio:
stringaSQL = "select " & nomeCampo & " from tabella"
Set FidoResiduo = dbs.OpenRecordset(stringaSQL)
dove nomeCampo è una variabile di tipo String.
Analogamente per la data.
Però devi fare attenzione al formato della data. Access se non sbaglio accetta le date nel formato seguente:
#5/15/2008#
compresi i segni "#", che quindi dovrai mettere tu, eventualmente. Nota che qui la data è nel formato #g/m/aaaa# per cui quello è il 15 maggio.
Fa' qualche tentativo per essere sicuro che la data venga passata correttamente.
Oppure, per non porti neanche il problema, rendi dinamico solo lo scarto (cioè "5" nell'espressione "Date() - 5"), così non devi preoccuparti del formato della data.
Private Sub Comando517_Click()
Dim inizio, fine
Dim Criteri As String
If Weekday(Date) = 1 Then 'Domenica
inizio = Date - 6
End If
If Weekday(Date) = 2 Then 'Lunedi
inizio = Date
End If
If Weekday(Date) = 3 Then 'Martedi
inizio = Date - 1
End If
If Weekday(Date) = 4 Then 'Mercoledi
inizio = Date - 2
End If
If Weekday(Date) = 5 Then 'Giovedi
inizio = Date - 3
End If
If Weekday(Date) = 6 Then 'Venerdi
inizio = Date - 4
End If
If Weekday(Date) = 7 Then 'Sabato
inizio = Date - 5
End If
Criteri = "'(TabellaOperazioni.DATA) between " & Date & " And " & inizio & "'"
Set dbs = CurrentDb
Set FidoResiduo = dbs.OpenRecordset("SELECT DISTINCTROW Sum(TabellaOperazioni.[TOTALE SEND]) AS [TOTALE SEND]," _
& "Sum(TabellaOperazioni.[IMPORTO RECEIVE]) AS [IMPORTO RECEIVE]," _
& "Sum(TabellaOperazioni.[TOTALE QUICK]) AS [TOTALE QUICK], Sum(TabellaOperazioni.BONIFICO) AS BONIFICO," _
& "Sum([TabellaOperazioni].[TOTALE SEND])-NZ(Sum([TabellaOperazioni].[IMPORTO RECEIVE]))-NZ(Sum([TabellaOperazioni].[BONIFICO]))+NZ(Sum([TabellaOperazioni].[TOTALE QUICK])) AS [DA PAGARE]," _
& "Round(DLookUp('[fido settimanale]','[tblFido]')+nz(Sum([TabellaOperazioni].[BONIFICO]))-nz(Sum([TabellaOperazioni].[TOTALE SEND]))+nz(Sum([TabellaOperazioni].[IMPORTO RECEIVE]))-nz(Sum([TabellaOperazioni].[TOTALE QUICK])),2) AS [FIDO RESIDUO]" _
& "FROM TabellaOperazioni WHERE(((TabellaOperazioni.DATA) Between Date() And Date()-5))")
MsgBox FidoResiduo("FIDO RESIDUO")
End Sub
Sì parliamo di Access, questa routine mi serve per visualizzare il fido residuo della settimana in corso, dal lunedì ad oggi, infatti la prima parte della routine assegna alla variabile "inizio" il valore calcolato togliendo a "date" tanti giorni quanti sono quelli da lunedì ad oggi, perciò io vorrei passare alla SQL la mia variabile.
& "FROM TabellaOperazioni WHERE(((TabellaOperazioni.DATA) Between Date() And Date()-5))")
Riporto solo l'ultima linea del tuo codice.
Così, al volo :
& "FROM TabellaOperazioni WHERE(((TabellaOperazioni.DATA) Between Date() And " & CDate(inizio) & "))" )
Se non ho fatto casino con le tonde dovrebbe andare... ;)
Function CalcolaFidoResiduo()
Dim Differenza
If Weekday(Date) = 1 Then 'Domenica
Differenza = -6
End If
If Weekday(Date) = 2 Then 'Lunedi
Differenza = -0
End If
If Weekday(Date) = 3 Then 'Martedi
Differenza = -1
End If
If Weekday(Date) = 4 Then 'Mercoledi
Differenza = -2
End If
If Weekday(Date) = 5 Then 'Giovedi
Differenza = -3
End If
If Weekday(Date) = 6 Then 'Venerdi
Differenza = -4
End If
If Weekday(Date) = 7 Then 'Sabato
Differenza = -5
End If
Set dbs = CurrentDb
Set FidoResiduo = dbs.OpenRecordset("SELECT DISTINCTROW Sum(TabellaOperazioni.[TOTALE SEND]) AS [TOTALE SEND]," _
& "Sum(TabellaOperazioni.[IMPORTO RECEIVE]) AS [IMPORTO RECEIVE]," _
& "Sum(TabellaOperazioni.[TOTALE QUICK]) AS [TOTALE QUICK], Sum(TabellaOperazioni.BONIFICO) AS BONIFICO," _
& "Sum([TabellaOperazioni].[TOTALE SEND])-NZ(Sum([TabellaOperazioni].[IMPORTO RECEIVE]))-NZ(Sum([TabellaOperazioni].[BONIFICO]))+NZ(Sum([TabellaOperazioni].[TOTALE QUICK])) AS [DA PAGARE]," _
& "Round(DLookUp('[fido settimanale]','[tblFido]')+nz(Sum([TabellaOperazioni].[BONIFICO]))-nz(Sum([TabellaOperazioni].[TOTALE SEND]))+nz(Sum([TabellaOperazioni].[IMPORTO RECEIVE]))-nz(Sum([TabellaOperazioni].[TOTALE QUICK])),2) AS [FIDO RESIDUO]" _
& "FROM TabellaOperazioni WHERE (TabellaOperazioni.DATA) between Date() And " & "Date()" & Differenza)
End Function
Ho risolto in questo modo
Grazie mille:D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.