Newsgroup: it.comp.lang.visual-basic
Titolo: Calcolo tra le ore

Ciao a tutti.
in una maschera continua ho un campo denominato "Ora inizio
intervento".
vorrei colorare lo sfondo di questa e forse altre caselle nel caso in
cui è passata più di un' ora da quando ho inserito il dato in ora
inizio intervento.
Facendo qualcosa tipo If Hour() - Hour(Ora inizio intervento) > 0.59
Then
                                  Me.Ora inizio intervento.BackColor =
RGB(255,0,0)
                                  End If
mi colora tutti i campi oppure non ne colora nessuno a seconda del
valore che metto dopo >.
come posso creare questo codice?
Grazie
Marco

Marco75 wrote:

VB6 o VB.Net?
In VB6 puoi usare DateDiff per vedere quante ore hai tra una data e 
un'altra.
Altrimenti puoi vedere se
dataora1 - dataora2 >= 1/24
dato che 1 equivale a un giorno se considerato di tipo data.
Ciao 

 VB6 o VB.Net?
Sono in VB6
non ho al momento 2 campi ora ma un campo ora da confrontare con l'
ora del PC e, se passa più di un tot si colora. (Come ora PC posso
usare Hour() e basta?)

 non ho al momento 2 campi ora ma un campo ora
...
Il ragionamento e' lo stesso
if DateDiff ("H",Campo1,time) > 1 then ...
dove DateDiff ti fa appunto la differenza tra due date (l'orario e'
comunque una data, Campo1 e' l'ora che devi valutare (vedi tu se e' il
caso di fare un Cdate(Campo1), Time restituisce l'ora (ore, minuti,
secondi) del sistema.
Tieni conto che il DateDiff ti sottrae il primo argomento data al secondo,
quindi avrai una differenza positiva se il primo e' piu' piccolo del
secondo, altrimenti avrai una differenza negativa
Ciao
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 secondi) del sistema.
Tieni conto che se campo1 contiene solo l'orario lo confronti con Time, 
altrimenti lo confronti con Now.
Ciao 


Anche se la tua idea è sicuramente valida non funziona.
Credo che la difficoltà sia nel riconoscere il nome del campo che si
chiama ORA RICHIESTA INTERVENTO. ho provato a fare
ORA_RICHIESTA_INTERVENTO, a metterlo tra parentesi e a digitare il
percorso completo Forms![maschera]![campo] ma nulla cioè se la
condizione non è soddisfatta si colora di verde e questo lo fa
benissimo ma sul resto sembra non reagire...



Allora, la soluzione funziona :)
Che poi tu la implementi in modo sbagliato non saprei...
Che valore c'è in questo campo?
Qual è il codice che usi?
Ciao

 Anche se la tua idea è sicuramente valida non funziona.
...
Come ti ha detto Fabio, se la casella diventa verde, vuol dire che la
funzione, funziona (scusa il gioco di parole).
Un piccolo avvetimento.. occhio che se fai la differenza di ore (non
prendendo in considerazione la data), allo scattare della mezzanotte
potresti avere qualche problemino.
Se ad esempio nel primo campo hai le 23:50 e dopo 20 minuti (00:10) provi
a fare la differenza tra le ore, il risultato non sara' 1, ma -23 (cioe'
negativo).
Stesso discorso se fai la differenza tra due ore di un giorno successivo,
cioe' 12:00 del 10/07 e le 12:30 del 11/07 riceverai ancora 1, e non 25.
In piu', se utilizzi come intervallo le ore (la "h" ce abbiamo messo come
parametro), datediff ti fa la differenza tra le ore dei due orari, cioe'
se hai 22.30 e 22.59, la differenza e' 0, mentre tra 22.30 e 23.00, la
differenza e' 1.
Vedi tu se e' il caso di utilizzare i minuti (n) come parametro.


 Qual è il codice che usi?
ho provato a mettere giù questo codice
If DateDiff("H", Time, ORA RICHIESTA INTERVENTO) > 1 Then
Me.ORA_RICHIESTA_INTERVENTO.BackColor = RGB (255,0,0)
Else
Me.ORA_RICHIESTA_INTERVENTO.BackColor = RGB (0,255,0)
End if
Non usato alcun DIM per dichiarare il campo. Dici che devo dichiararlo
in qualche modo?

 in qualche modo?


 ti restituisce un valore maggiore di 1, cosa e' che non ti torna?
Sì diventa verde ma quello che mi serve non è il verde che ho messo
solo per prova Else.
E poi credo che diventi verde non perchè ha assimilato il valore dei
campi ora ma semplicemente perchè la formula tra le ore non ha
funzionato di conseguenza interviene l' Else.   Non so se mi sono
spiegato bene...
Se qualcuno dopo un' ora non ha ancora effettuato l' intervento,
quella casella deve diventare rossa quindi si avranno caselle rosse e
caselle "normali" nella maschera continua. dovrò infatti aggiungere un
po' di righe di codice inquanto devo vedere altri campi; se questi
sono ancora vuoti, vuol dire che non si è completato l' intervento per
cui va a vedere il famoso campo ora e lo colora.

 in qualche modo?
Ma... 'sto campo da qualche parte arriverà, credo.
Mica se lo inventa VB.
Guarda la prima riga del modulo/form di questo codice: deve essere
Option Exlicit
Se non c'è gliela scrivi, poi riesegui il programma e segui le istruzioni.
Ciao
Ciao

 cui va a vedere il famoso campo ora e lo colora.


 pezzettino di codice per far cambiare il colore a cio' che vuoi.
Domandone difficilissimone :)
Come si fa a capire per quale etereo motivo va nell'else?
Ciao 

 Come si fa a capire per quale etereo motivo va nell'else?
...
Dici nel suo codice?
come gli hai detto tu, mette un breakpoint e vede che cavolo c'e' tra
quelle variabili, poi magari postando il codice *vero* che ha scritto....
:-)


Ciao
Ho cambiato tattica...
metto una casella in più dove gli dico "ora attuale" - 1 ora poi la
confronto tramite if then
Come faccio però a tirare indietro l' ora attuale di un certo orario
in una casella?
Grazie

 in una casella?
...
Ehmmm... con DateDiff


> Dai, non e' cosi' difficile da analizzare, prova a scrivere qui il codice
    If DateDiff("N", Time, ORA_RICHIESTA_INTERVENTO) > 1 then
    Me.ORA_RICHIESTA_INTERVENTO.BackColor = RGB(255, 0, 0)   rosso
    ElseIf Me.NOME_MANUTENTORE <> "" Then
    Me.ORA_RICHIESTA_INTERVENTO.BackColor = RGB(0, 255, 0)   verde
    End If
scusami ma proprio non ne vengo a capo... sarà la mia testa che ha
bisogno di ferie!!!

     Me.ORA_RICHIESTA_INTERVENTO.BackColor = RGB(255, 0, 0)   rosso
...
Ecco da cosa temo che ORA_RICHIESTA_INTERVENTO sia il nome di una Label
Poi, al resto ci mettiamo mano dopo, prima sistemiamo qui


> Ecco da cosa temo che ORA_RICHIESTA_INTERVENTO sia il nome di una Label
Se con Label intendi una casella di testo derivante da query allora sì
If DateDiff("N", ORA_RICHIESTA_INTERVENTO, Time) > 1 Then
Me.ORA_RICHIESTA_INTERVENTO.BackColor = RGB(255, 0, 0)
Se Time lo metto così come vedi mi da un errore Impossibile trovare il
progetto o una libreria e comunque non funziona neanche con Now cioè
funziona nel senso che colora il campo solo che colora anche quelli in
cui l' ora di differenza non è scaduta...

 cui l' ora di differenza non è scaduta...
...
Utilizzando Now, chiedi al sistema non solo l'orario, ma anche la data.
Fai una comparazione tra il 10/07/2007 alle 16:00 e il giorno di default
(che se non sbaglio e' il 01/01/1900 ) alle ore indicate da te nella
textbox.. come puoi immaginare, e' molto facile che il risultato sia
maggiore di 1 ora :-)


 cui l' ora di differenza non č scaduta...
Senti ciccio, a mo' mi incavolo, ma non ti preoccupare, tanto questo č il 
mio ultimo intervento visto che tanto a te di spiegare 'sto problema non te 
ne frega un accidenti.
SONO ORE che ti chiedo CHE CACCHIO DI VALORE C'E' in 
ORA_RICHIESTA_INTERVENTO???
Che BICACCHIO di dato č ORA_RICHIESTA_INTERVENTO?
C'HAI MESSO QUEL PIFFERO di Option Explicit in cima al codice?
Ma porc... tutto sta nel capire quanto fa a - b e tu ancora non hai 
verificato quanto vale a e b, ma ti lamenti solo che il risultato SECONDO 
TE, visto che nemmeno questo hai visto, non va bene.
Ciao 

 questo articolo e` stato inviato via web dal servizio gratuitohttp://
www.newsland.it/newssegnala
 gli abusi ad 
a...@newsland.it
Probabilmente era un problema di librerie. mi sono spostato su un
portatile e funziona anche il Time.
Ciò nonostante o colora tutto di verde o tutto di rosso.
Ora sono così:
Me.ORA_RICHIESTA_INTERVENTO.SetFocus    (se non è attivata mi da
errore)
If DateDiff ("n", Cdate(ORA_RICHIESTA_INTERVENTO.Text), Time()) > 60
Then
Rosso
else
Verde
End if
Così è tutto verde; se metto < 60 è tutto rosso...
Mi spiace dover insistere così e ti ringrazio per la pazienza....

 Ciao
Non capisco cosa intendi con "Che valore c'è?" le 16.22?
Ora richiesta intervento? è una casella di testo associata ad una
query.
Option Explicit in cima c'è e di quello sono sicuro
mi spiace farti inc.. ma sono totalmente autodidatta su VBA e a parte
pochi comandi sono ignorante totale nel senso che più o meno copio
bellamente ciò che mi scrivete...
Per verivicare A e B come dici devo usare Dim ...As ...?
Scusami ancora

 Mi spiace dover insistere cosě e ti ringrazio per la pazienza....
...
Probabilmente perche' nel codice Rosso e Verde, dici a tutti i controlli
di diventare Rosso o Verde.
Se tu scrivi Me.ORA_RICHIESTA_INTERVENTO.BackColor = vbGreen (vabbe', tu
dai i valori in RGB, e' uguale), soltanto la textbox che si chiama
ORA_RICHIESTA_INTERVENTO deve diventare verde.
Ah, la storia della libreria che dicevi... non mi convince molto :-)
-- 
questo articolo e` stato inviato via web dal servizio gratuito 


 Ah, la storia della libreria che dicevi... non mi convince molto :-)
Bè nemmeno a me ma passando su un altro PC va tutto ;-)

 Per verivicare A e B come dici devo usare Dim ...As ...?
Per verificare A e B, te l'ho già scritto!
Metti un breakpoint sulla riga dell'IF: clicchi con il mouse sull'IF, premi 
F9 (se sei su vb6, per il resto non lo so), fai girare il programma (F5), ti 
si ferma sul breakpoint (lo vedi da una riga gialla sull'IF), vai con il 
mouse su A e lui ti dice quanto vale, vai con il mouse su B e lui ti dice 
quanto vuole, ma meglio ancora, premi CTRL+G (sempre in VB6) e scrivi
? TypeName(A), A
e ti dice, cos'è A, se una stringa, una data o che cavolo è, e il suo 
valore.
Per essere corretto deve essere una data.
Detto tutto questo guarda questo codice di esempio:
    Dim s As String
    Dim d As Date
    Dim h As Double
    Dim m As Long
    ' deve andare a tutti i costi
    d = Time
    ' mettiamo caso che sia una stringa
    ' anche se è tecnicamente errato
    s = "16.22"
    h = DateDiff("h", Time, CDate(s))
    m = DateDiff("n", Time, CDate(s))
Verifica quanto valgono h (ore di differenza) e m (minuti di differenza).
Adesso da me sono le 17.34 e valgono
h = 1
m = 72
Adesso, dire che se faccio
If DateDiff("n", Time, CDate(s)) > 60 Then
    Rosso
Else
    Verde
End If
Va in verde è una palla colossale perchè tutti sanno che 72 è > di 60 e 
quindi rosso.
Se non è così significa che CDate(IL_TUO_CAVOLO_DI_DATO) o Time danno dei 
valori sballati.
Ciao

 "n") nel codice, dopo 1 minuto da tutti rossi diventano tutti verdi
...
Che cosa e' "tutti rossi", "tutti verdi" ???
che roba e'?, di cosa parliamo?


 che roba e'?, di cosa parliamo?
vuol dire che nella form non viene analizzato ogni record nel senso
che se la difefrenza tra le ore è > 1 minuto per es tutti i campi di
ogni record si colorano di verde, compresi quelli in cui il tempo non
è ancora scaduto...
Se per es ora sono le 18.00 e ho tre record in cui le ore sono 15.00,
15.30 e 17.50, solo il campo delle 17.50 deve essere con sfondo verde
mentre gli altri 2 devono avere sfondo rosso visto che è passato il
tempo prestabilito.
So che non è facile farsi capire a volte ma vi ringrazio perchè
fornite sempre valida collaborazione

Boh, mi arrendo, non riesco proprio a capire.


 Boh, mi arrendo, non riesco proprio a capire.
Più o meno ho risolto
grazie per l' aiuto