Newsgroup: it.comp.appl.access
Titolo: campo calcolato in base a campo data errore tipo di dati non corrispondenti

ciao a tutti,
ho questo codice che in base alla data passata mi calcola una data diversa in un campo calcolato (in query).
 
ricevo l'errore tipo di dati non corrispondenti
alex ti prego aiutami
 
Public Function prova(dataPassata As Date) As Date
 
Dim N_lun_giov As Single
Dim dataPassata1 As Date
 
dataPassata1 = DateAdd("d", 0, [dataPassata])
N_lun_giov = Weekday(dataPassata1, vbMonday)
If N_lun_giov = 1 Or N_lun_giov = 4 Then
prova = dataPassata1
Else
dataPassata1 = DateAdd("d", -1, [dataPassata1])
N_lun_giov = Weekday(dataPassata1, vbMonday)
    If N_lun_giov = 1 Or N_lun_giov = 4 Then
    prova = dataPassata1
    Else
    dataPassata1 = DateAdd("d", -1, [dataPassata1])
    prova = dataPassata1
    End If
End If
 
 
 
End Function

 ho questo codice che in base alla data passata mi calcola una data diversa in un campo calcolato (in query). 
 
ho semplificato molto per isolare il problema che si verifica quando cerco di filtrare la query con  i comandi dell'interfaccia access
 
public Function prova(dataPassata As Date) As Date
Dim N_lun_giov As Integer
N_lun_giov = Weekday(dataPassata, vbMonday)
If N_lun_giov = 1 Or N_lun_giov = 4 Then
prova = #12/20/2020#
else 
prova = #12/31/2020#
End If
end function
 il campo calcolato mi da il risultato voluto
ma quando filtro su una delle due date ottengo errore dati non corrispondenti
grazie 
Vito


Inversione MESE/GIORNO...?
 
@Alex


no non è quello.
ho provato anche con un codice che mi avevi scritto tu per dividere un mese in tre decadi  ad ogni decade un numero (1,2,3)
il filtro mi da sempre quell'errore
quello che vorrei capire se dipende dal codice o se access non permette filtri su campi calcolati 
il bello è che il report ragguppato per le due date funziona!!!

Il giorno mercoledì 2 dicembre 2020 alle 08:07:47 UTC+1 @Alex ha scritto:

no non è quello.
anche un tuo codice per ottenere tre decadi mi da lo stesso errore, ma in entrambi i casi però  i report funzionano
Public Function DS(dataPassata As Date) As integer
'************* CODICE DI ALEX
Dim mDay As Integer
 
mDay = Day(dataPassata)
Select Case mDay
  Case Is < 10: DS = 1
  Case Is < 20: DS = 2
  Case Else: DS = 3
  End Select
con questo codice ottengo in un campo calcolato  1, 2, 3 ma il filtro al volo mi dice dati non corrispondenti
 
quello che non riesco a capire è:
un problema di access a filtrare su campo calcolato
qualcosa di sbagliato nel codice

 il filtro mi da sempre quell'errore sul campo calcolato DS


=[Forms]![frmINTERVALLODATA]![csDATAINIZIO] And <=[Forms]![frmINTERVALLODATA]![csDATAFINE]
come posso sostituirlo con qualcosa di equivalente? Ho provato con questa funzione
 
Public Function intervallodata() As String
intervallodata = ">=[Forms]![frmINTERVALLODATA]![csDATAINIZIO]  And <= [Forms]![frmINTERVALLODATA]![csDATAFINE]"
End Function
nella casella criteri della query ho scritto
intervallodata() 
e niente, non funziona
grazie Vito

Vito Fanciullo used his keyboard to write :

Perché non ti decidi a mettere online l'espressione sql della query?
 
Bruno


giusto, ma ti riferisci a quale mio quesito? in realtà ne ho esposti due anche se non si dovrebbe.....
 
cmq questo ultimo , ovvero quello della funzione intervallodata()
 
SQL banale
SELECT programmazione.dataArrivo FROM programmazione WHERE programmazione.dataArrivo=intervallodata()
 
codice nella funzione
Public Function intervallodata() As String
Dim INT1 As String
 Dim INT2 As Date
 INT1 = ">= #12/02/2020# And <= #12/31/2020#"
 'INT2 = #12/23/2020#
intervallodata = INT1
end function
 
se imposto  intervallodata()  = INT1 ricevo l'errore tipo di dati non corrispondenti
se imposto  intervallodata()  = INT12 il filtro funziona
 
grazie 
Vito

It happens that Vito Fanciullo formulated :

Pare proprio che la creazione di un WHERE con Between
non sia possibile.
Dipendendo dall'uso che devi fare della query, altri modi vi sono
di assegnare il Between nei Criteria.
 
Tu che uso devi farne?
 
Bruno

=[Forms]![frmINTERVALLODATA]![csDATAINIZIO] And <=[Forms]![frmINTERVALLODATA]![csDATAFINE]
che però  mi da fastidio nel codice VBA  per via dell'errore previsto 1 (
allora ho pensato via codice di passagli >= #12/02/2020# And <= #12/31/2020#
 
credo di aver trovato una soluzione

= #12/02/2020# And <= #12/31/2020# con una funzione
 a quanto pare non l'accetta.
per ora ho risolto con una impostazione SQL via codice
CurrentDb.QueryDefs("qryProgrammazione").sql....ecc ecc........
WHERE programmazione.dataArrivo >=#" & Format(data1, "mm/dd/yyyy") & "# and  programmazione.dataArrivo <=#" & Format(data2, "mm/dd/yyyy") & "#
data1 e data2 sono #12/02/2020#,  #12/31/2020#
grazie Bruno
ciao Vito

Vito Fanciullo wrote on 04-12-20 :

Se la query la crei da VBA, allora va bene tutto, anche il Between.
La puoi anche creare con le griglia QBE che accetta ddmmaaa anche
nel formato gg/mm.
Poi nella stringa SQL se lo trasforma nel formato che accetta mmddyyyy.
 
Bruno


ok grazie bruno, ho risolto i miei due problemi. Per quanto riguarda il primo, raggruppamento per lunedì e mercoledi della settimana, incollo una utile funzione
qua puoi vedere output
https://ibb.co/5r8NdGn
 
 
Public Function LG(dataPassata As Date) As Date 
Dim N_lun_merc As Single
Dim N_lun_merc2 As Single
 
Dim dataPassata2 As Date
Dim dataPassata3 As Date
Dim dataPassata4 As Date
 
N_lun_merc = Weekday(dataPassata, vbMonday)
 
If N_lun_merc = 1 Or N_lun_merc = 3 Then ' lunedì o mercoledì
dataPassata4 = DateAdd("d", 0, dataPassata)
prova = dataPassata4
Else
dataPassata2 = DateAdd("d", -1, dataPassata)
N_lun_merc2 = Weekday(dataPassata2, vbMonday)
    If N_lun_merc2 = 1 Or N_lun_merc2 = 3 Then
    prova = dataPassata2
    Else
    dataPassata3 = DateAdd("d", -1, dataPassata2)
    prova = dataPassata3
    End If
 
End If