Newsgroup: it.comp.lang.visual-basic
Titolo: AIUTO URGENTE! Problema di somma con orari!

Scusate se riposto sempre lo stesso problema ma per me è IMPORTANTE
risolverlo.
Ciao, grazie innanzitutto per la disponibilità, ormai sono alla fine, le ho
pensate tutte ma niente da fare quindi un vero aiuto per me è fondamentale.
Ti spiego con un esempio cosa devo fare:
in label1 ho un'orario(16.30), in label2 ho un'altro orario(18.30), in
label3 devo avere la differenza tra label2 e label1, quindi label3(02.00).
Fin quà è stato semplice ottenerlo, il problema inizia quando tra label2 e
label1 c'è una differenza che è uguale a 24 ore, in pratica in label3 si
visualizza in tal caso 00.00 e non 24.
Inoltre bisogna considerare che la differenza tra i due valori(visto che
sono orari) può anche essere con la mezz'ora(es: 02.30), e questo per me è
importante.
Infine la somma totale del valore di label3(considera che esiste una matrice
di label3) quindi 02.00+02.30+03.00+01.00...e cosi via è facile che supera
anch'essa le 24 ore es: 32 ore; ecco  a me mi risulta non 32 ma 8(32 - 24),
in pratica arrivando a la somma a 24 il programma la considera mezzanotte e
me la visualizza 00.00, se la supera ricopmincia es:02.00 per 26 ore, 03.00
per 27 ore.
Spero di essermi spiegato bene e che tu mi potrai essere di aiuto.
Grazie, Vincenzo

 ha scritto nel messaggio
news:8fet7c$90h$1...@pegasus.tiscalinet.it...


Ciao,
sono sicuro che esiste un metodo per la manipolazione degli orari, ma non ho
molto tempo per guardarci, io comunque il problema, se non ci sono altri
sistemi lo risolverei cosi':
Option Explicit
Private Sub Command1_Click()
    Dim O1 As Single, O2 As Single
    O1 = Val(L1) 'valore della Label1
    O2 = Val(L2) 'valore della Label2
    L3 = Format(Meno(O1, O2), "ore ## . minuti ##")
End Sub
Function Meno(Uno As Single, Due As Single) As Single
    Meno = Orario(Decimale(Due) - Decimale(Uno))
End Function
Function Decimale(Valore As Single) As Single
    Dim Resto As Single
    Decimale = (((Valore * 100) Mod 100) / 6 * 10)
    If Decimale - Int(Decimale) > 0.5 Then Decimale = Decimale + 1
    Decimale = (Int(Decimale) / 100) + Int(Valore)
End Function
Function Orario(Valore As Single) As Single
    Orario = (((Valore * 100) Mod 100) / 10 * 6)
    If Orario - Int(Orario) > 0.5 Then Orario = Orario + 1
    Orario = (Int(Orario) / 100) + Int(Valore)
End Function
Di questo codice non garantisco al 100X100 la correttezza, guardaci.
Infine, da un punto di vista concettuale e' giusto che non vengano indicate
le 24.00 ma bensi' le 00.00 in quanto essendo i due valori coincidenti, lo
scadere del primo corrisponde al secondo, che in quanto punto di inizio e'
predominante.
beppe

per prima cosa un saluti a tutti i frequentatori del ng ( visto che è la
prima volta che scrivo ... )
per risolvere il problema di vincenzo...
per prima cosa devi capire come funzionano le date e le ore ...
in vb le date in termini matematici corrispondo ad un valore double da 1 =
01/01/1900 ore 00:00
le ore di conseguenza sono le frazioni dell'intero
per convenzione il valore 0 corrisponde al 31/12/1899 ore 00:00
in termini matematici il tuo orario viene espresso come frazione di un
intero dove un intero corrisponde ad un giorno cioè :
le ore 12:00 = 0,5
le ore 18:00 = 0,75
le ore 01:00 = 4,16666666666667E-02
Quindi se esegui le somme come hai descritto i risultati sono corretti...
sommando ad es. 0,5+0,75 ( le ore 12:00+ ore 18:00 ) ottieni un numero 1,25
che convertito in data da
31/12/1899 6.00.00
cioe un giorno e un quarto.
la cosa che ti posso consigliare è che se devi eseguire dei calcoli in
termini di ore è meglio che lavori in visualizzazione come hai fatto ma che
per i calcoli utilizzi il tutto convertito in secondi e visualizzare i dati
convertendo i secondi in ore con una apposita funzione

Il problema puo' essere risolto convertendo il campo da base 60 a base 100
(intendo memorizzando il dato in base 100),  cosi' la matematica tra
date/orari si semplifica notevolmente.
Occorrono due funzioni di conversione 60->100 e 100->60 per salvare e
visualizzare i dati.
Ciao.
Lorenzo

 ha scritto nel messaggio
news:958147085.914205@linuxintra...


Per favore potresti spoegarmi meglio cosa intendi per convertire il campo e


 convertendo i secondi in ore con una apposita funzione
scusa la somma pigrizia,
se l'hai fatta non e' che la posteresti ?
:) <--- fontsize= 128
tia, pal

Mi senbrava gia' di avertele postate forse VOLEVO e poi non l'ho fatto bho
!!!!!
Per risolvere tale problema tempo fa ho fatto 2 semplici funzioni, una che
data un'ora in formato hh:mm ritorna i secondi corrispondenti e viceversa...
insomma, le varie ore vanno trasformate in secondi, a questo punto faccio le
operazioni che voglio e poi ritrasformo in formato ora..... ecco le 2
funzioni....
Function Convert_To_Ora(ByVal Secondi As Single) As String
         Dim Appo As Single
         Dim Ora As String, Minuti As String
         Appo = Secondi \ 3600
         Ora = Trim$(Str$(Appo))
         If Len(Ora) = 1 Then Ora = "0" & Ora
         Secondi = Secondi - Appo * 3600
         Appo = Secondi \ 60
         Minuti = Trim$(Str$(Appo))
         If Len(Minuti) = 1 Then Minuti = "0" & Minuti
         Convert_To_Ora = Ora & ":" & Minuti
End Function
Function Convert_To_Secondi(Ora As String) As Single
         Ora = Trim$(Ora)
         If (Not IsDate(Ora) Or Len(Ora) <> 5) And Val(Mid$(Ora, 1, 2) &
Mid$(Ora, 4, 2)) < 2400 Then
            Convert_To_Secondi = -1
            Exit Function
         End If
         Convert_To_Secondi = Val(Mid$(Ora, 1, 2)) * 3600 + Val(Mid$(Ora, 4,
2)) * 60
End Function
Ciao
Ven.