Newsgroup: it.comp.appl.access
Titolo: tipo non corrispondente

ciao a tutti
 
ho errore "tipo non corrispondente" su DataC 
perchè al momento della dichiarazione il controllo data
è vuoto.
 
Dim DataDal As Date, DataAl As Date, DataC As Date
DataDal = Format(Forms("frmMenuPrincipale")!dal, "dd/mm/yy")
DataAl = Format(Forms("frmMenuPrincipale")!al, "dd/mm/yy")
DataC = Format(Me.Parent!SM_DettFatturaFornitore.Form!txtMaxDataCarico, "dd/mm/yy")
 
grazie per l'aiuto


Hai sempre una capacità di complicarti le cose che è ormai un tuo marchio di fabbrica...!
 
Prova così:
DataC = Format(Me.Parent!SM_DettFatturaFornitore!txtMaxDataCarico, "dd/mm/yy")
 
P.S. perchè definisci le variabili come Date mentre sai bene che la Funzione FORMAT restituisce uno STRING... quindi di fatto viene fatta una conversione a date, motivo per cui sei sicuro vada tutto bene...?
 
Se quelle variabili le usi per fare calcoli non serve la formattazione, se le usi per VISUALIZZARE non serve dichiararle come DATE...
 
Vedi tu... 
 
@Alex


grazie Alex
già con Dim ... as String va bene
 
Allora quando si deve usare 'Dim ... As Data'?
grazie

 grazie
 
Una variabile di tipo DATE si usa se, il dato elementare da usare è una DATA e questa(la variabile) viene usata per manipolazioni o calcoli con le funzioni preposte alla manipolazione delle date.
 
FORMATTARE invece è solo un'azione finalizzata alla VISUALIZZAZIONE e questo sapendo che la funzione Format restituisce un VarType di tipo String e sapendo che sul valore non si eseguono calcoli si evita la Conversione in Date.
 
Una Variabile DATA non ha senso venga formattata.
 
@Alex


allora facendo riferimento a questa function
ByVal DataOrd As Variant, _
ByVal FirstDataOrd As Variant, _
ByVal NextDataOrd As Variant) As Boolean
 
perchè variant e non data?
ancora grazie
 
Public Function fctConf_dataOrdine( _
  ByVal DataOrd As Variant, _
  ByVal FirstDataOrd As Variant, _
  ByVal NextDataOrd As Variant) As Boolean
 
  Dim TipoConfronto As Byte
  Dim DataDal As String
  Dim DataAl As String
 
  DataDal = Format(Forms("frmMenuPrincipale")!dal, "dd/mm/yy")
  DataAl = Format(Forms("frmMenuPrincipale")!al, "dd/mm/yy")
 
  If IsNull(DataOrd) Then TipoConfronto = 1
  If DataOrd < FirstDataOrd Then TipoConfronto = 2
  If DataOrd > NextDataOrd Then TipoConfronto = 3
  If DataOrd < DataDal Then TipoConfronto = 4
  If DataOrd > DataAl Then TipoConfronto = 5


Intanto come sai serve attivare sempre la LOGICA e la CONOSCENZA nelle cose, perchè non è sempre tutto BIANCO o NERO... la programmazione offre sfumature di grigio finalizzate a diverse azioni/esigenze.
 
Ad esempio se un parametro deve essere OPTIONAL, si usa spesso la definizione per omissione(significa VARIANT) perchè offre la possibilità di usare ISMISSING(variabile) cosa che invece se venisse definita come Date non verrebbe consentito....
 
Esempio, da provare in Finestra IMMEDIATA usando [?x]:
 
Function X(Optional mD As Date)
    If IsMissing(mD) Then
        MsgBox "TRACCIATA"
    Else
        MsgBox "NON TRACCIATA"
    End If
End Function
 
Ora prova questa allo stesso modo:
Function X(Optional mD)
    If IsMissing(mD) Then
        MsgBox "TRACCIATA"
    Else
        MsgBox "NON TRACCIATA"
    End If
End Function
 
Come vedi sono 2 cose da sapere, poi uno le usa come ritiene....!
 
Nel codice che proponi tuttavia io ci vedo molti errori tecnici non indifferenti, mescolati e confusi... che non sono solo per la definizione dei Parametri della Funzione, quanto al confronto tra VarType(Date) e VarType(Stringa)...
 
  If DataOrd < DataDal Then TipoConfronto = 4
  If DataOrd > DataAl Then TipoConfronto = 5
 
Ovviamente funziona per il semplice motivo che l'interprete VBA di Access va a fare un CASTING forzato del varType... da Stringa a Date, ma se tu invece di scrivere questa roba:
 
  Dim DataDal As String
  Dim DataAl As String 
  DataDal = Format(Forms("frmMenuPrincipale")!dal, "dd/mm/yy")
  DataAl = Format(Forms("frmMenuPrincipale")!al, "dd/mm/yy") 
 
scrivessi una cosa ben più intelligente:
  Dim DataDal As Date
  Dim DataAl As Date
  DataDal = Forms("frmMenuPrincipale")!dal
  DataAl = Forms("frmMenuPrincipale")!al 
 
magari funzionerebbe ugualmente...?
 
La conversione in accezione ANGLOSASSONE si fa SOLO quando si deve scrivere dentro JET, altrimenti tu non lavori in accezione anglosassone...!!!!
E se sei costretto a convertirle qualche cosa devi averla sbagliata...
 
Mi fermo... ci sono troppe mancanze da poter affrontare tutto insieme.
 
@Alex

 Mi fermo... ci sono troppe mancanze da poter affrontare tutto insieme.
 
Grazie Alex
 
dimmi gli errori che hai visto...

La funzione è incompleta ma quello che ti ho segnalato ovvero 3 errori concettuali a mio avviso seri sono troppi... in 3 righe di codice.
 
@Alex

 @Alex
 
ciao Alex
l'ho ricontrollata, cosi' va bene?
 
Public Function fctConf_dataOrdine( _
  ByVal DataOrd As Variant, _
  ByVal FirstDataOrd As Variant, _
  ByVal NextDataOrd As Variant) As Boolean
 
  Dim TipoConfronto As Byte
  Dim DataDal As Date
  Dim DataAl As Date
 
  DataDal = Forms("frmMenuPrincipale")!dal
  DataAl = Forms("frmMenuPrincipale")!al
 
  If IsNull(DataOrd) Then TipoConfronto = 1
  If DataOrd < FirstDataOrd Then TipoConfronto = 2
  If DataOrd > NextDataOrd Then TipoConfronto = 3
  If DataOrd < DataDal Then TipoConfronto = 4
  If DataOrd > DataAl Then TipoConfronto = 5
 
  Select Case TipoConfronto
    Case Is = 1
      MsgBox "Devi inserire la data Ordine!", vbExclamation, "Attenzione!"
        Exit Function
    Case Is = 2
      MsgBox "La data Ordine deve essere uguale o superiore alla data Ordine precedente " _
        & FirstDataOrd & ".", vbExclamation, "Attenzione!"
        Exit Function
    Case Is = 3
      MsgBox "La data Ordine deve essere uguale o inferiore alla data Ordine successiva " _
        & NextDataOrd & ".", vbExclamation, "Attenzione!"
        Exit Function
    Case Is = 4
      MsgBox "La 'data Ordine' deve essere uguale o superiore al " & DataDal & ".", _
        vbExclamation, "Attenzione!"
        Exit Function
    Case Is = 5
      MsgBox "La 'data Ordine' deve essere uguale o inferiore al " & DataAl & ".", _
        vbExclamation, "Attenzione!"
        Exit Function
 
  End Select
 
fctConf_dataOrdine = True
End Function


ciao Alex
quale delle due è corretta?
 
Dim DataC As Variant
 
DataC = Me.Parent!SM_DettFatturaFornitore.Form!txtMaxDataCarico
*******************
 
Dim DataC As Date
 
DataC = Nz(Me.Parent!SM_DettFatturaFornitore.Form!txtMaxDataCarico)


Dipende, nessuna delle 2 anche... oppure entrambe...!
 
La 1° è Variant... ha senso nel tuo caso...?
Può assumere NULL...?
 
La 2° che è Date, se NULL che valore prende secondo te che usi NZ...?
 
@Alex


posso solo dire che il controllo 'txtMaxDataCarico' assume un valore
dopo l'inserimento della data, ma non so cosa sia meglio usare.
 
grazie