PDA

Visualizza la versione completa : [VB6] Errore assurdo su due date!


Gammino
15-11-2002, 16:10
:eek: Non ci credo neanche io...

Ho 2 variabili di tipo Date in una Sub, che uso per gestire due orari (senza tenere traccia del giorno).

Le due variabili seguono strade diverse subendo operazioni varie ed alla fine le confronto.

Supponendo che Data1 risulti 12.15.00, e che anche Data2 risulti 12.15.00 per lui DATA1 > DATA2 !!!!!

Ho pensato subito ad un errore di data, o ad un errore tipo AM/PM allora ho inserito:

MsgBox CSng(Data1)
MsgBox Csng(Data2)

SONO UGUALI!!! Lo stesso numero!

Aiutatemi, please! Non so proprio dove... :dhò:

Genius7115
15-11-2002, 16:22
il problema risiede nel fatto che un tipo Date ha una dimensione di 8 byte e cioè paragonabile ad un double. ora basta che un valore decimale sia diverso quando avviene il cast del dato nel formato date ed ecco l'errore. Il date è un formato elapsed time.

Toeke
15-11-2002, 16:27
Per ovviare al problema potresti convertire le due date in string.
Oppure caricare in due variabili locali che poi si confrontino tra loro.

Gammino
15-11-2002, 16:55
Scusa Genius ma ovviamente non ti ho seguito mica troppo (mica tutti Geniis :gren: , scherzo!).
Tornando seri (+ o -), una variabile Date è di 8 byte, ok come un Double perchè la data è immagazzinata come numero a virgola mobile, la parte intera identifica la data, la parte decimale identifica l'ora...

Il problema è che vorrei avere la possibilità di VEDERE realmente che Data1 è MAGGIORE davvero di Data2 per poter trovare il mio errore.

E poi ho provato a fare DateDiff("s",Data1,Data2) è mi da 0.
Come faccio ad estrapolare il numero Double che genera la data?
Basta un CDbl?
Ti sarei molto grato per una risposta!

X Toeke: E' vero, ci avevo pensato; convertendo in stringa risolverei il singolo problema anche se poi dovrei riconvertire in formato Date per fare il confronto (sennò "10.12" risulterebbe < di "8.20" :quipy: ) e poi mi rimarrà sempre il terrore che si ripresenti il problema ogni volta che farò operazioni sulle date, se non capisco bene cosa lo causa.
Comunque parliamo già di due variabili locali di tipo Date che confronto tra loro.

Grazie ad entrambi! Attendo e spero news...

Toeke
15-11-2002, 17:23
Private Sub Form_Load()
Dim data1 As Date
Dim data2 As Date
data1 = Date
data2 = Date
If data1 = data2 Then
MsgBox "le date sono uguali"
ElseIf data1 < data2 Then
MsgBox data1 < data2
Else
MsgBox data1 < data2
End If
End Sub


Questo semplice script non mi genera l'errore che vai descrivendo :bhò:

Cmq se tratto le date con il formato stringa le tratto senza virgole, punti o altro.
Personalmente per ovviare i problemi con le date uso questo formato yyyymmgg il cui confronto non da la possibilita di errore.

:ciauz:

Gammino
15-11-2002, 18:10
Mi sa che sto facendo venire il mal di testa anche a te... :p

Dunque...
Innanzitutto sono delle variabili in formato Date ma contengono orari percui, come scrivevo prima, anche senza usare la punteggiatura "1015" per lui sarebbe comunque prima di "800" (10.15 e 8.00). Inoltre tenendo le variabili di tipo String non potrei usare DateAdd, ecc.

Lo so che così funziona; il problema si verifica solo dopo alcune semplici operazioni di addizione e sottrazione contenuti nella mia Sub.

Secondo me uno dei passaggi della mia sub "attacca" al valore una sorta di "infinitesimo" di secondo (credo fosse quello che spiegava Genius) e DEVO capire quale operazione per non incorrere nuovamente nell'errore in futuro!

Facendo
Data2=CDate(CStr(Data2)) e quindi praticamente facendo una doppia conversione Date-String-Date infatti il tutto funziona, ma non posso fare sempre questa operazione ogni volta che devo fare delle operazioni con il valore di un orario...

Mi sto "insegugiando" :d56: , se lo sgamo vi faccio sapere...

Sono sempre bene accetti suggerimenti di ogni sorta!

Gammino
15-11-2002, 18:34
Guardate un pò... Questo è il codice:
MsgBox CDbl(Date1) & ">" & CDbl(Date2) & "=" & (CDbl(Date1) > CDbl(Date2)) e il risultato è nell'immagine allegata...

NON E' POSSIBILEEEEE

Mi stà dicendo che (1>1)=True !!!!

darkblOOd
15-11-2002, 18:43
ma non puoi usare 2 variabili Date ? :master:

Gammino
15-11-2002, 20:02
Uso 2 variabili Date!

Gente qui c'è da rabbrividire...:d56:

Dopo ore di testardaggine gurdate cosa ho trovato:

In un form, inserite un commandbutton e copiate il seguente codice:

Private Sub Command1_Click()
Dim Data1 As Date, Data2 As Date
Data1 = CDate("8:45")
Data2 = CDate("0:30")

Data2 = Data2 + Data1
MsgBox "8:45 + 0:30 = 9:15, giusto? Lui dice che è " & (Data2 = #9:15:00 AM#)

MsgBox "Proviamo con DateAdd..."

Data1 = CDate("8:45")
Data2 = CDate("0:30")

Data1 = DateAdd("n", 30, Data1)
MsgBox "8:45 + 0:30 = 9:15, giusto? Lui dice che è " & (Data1 = CDate("9:15"))
End Sub Non vi dico i risultati!

Ho anche capito dov'è il bug... ma sono ancora scioccato...

Ve lo narro quando mi sono ripreso... :cry:

Gammino
16-11-2002, 12:04
In parole povere per VB6 aggiungendo 30 minuti alle 8.45 non si ottengono esattamente le 9.15.

Credo che ciò sia dovuto al fatto che si sommano due numeri double periodici (8.45 e 0.30), anche se non ho ancora capito bene il motivo reale.

Se provate questo codice capite bene l'enigna.
Somma 30 minuti alle 8.45, confronta il valore ottenuto dalla somma con CDate("09:15") e ritorna False invece di True!


MsgBox "Se non erro 8:45 + 30 min = 9:15? Proviamo..."
MsgBox "Se a voi, in VB6, da True brucio il mio PC..."
MsgBox (DateAdd("n", 30, CDate("8:45")) = CDate("9:15"))
MsgBox "E, ancor più assurdo, i due valori Double sono identici!...: " & CDbl(DateAdd("n", 30, CDate("8:45"))) & " = " & CDbl(CDate("9:15"))
MsgBox "Fatemi sapere!"

Loading