ecranbleu27
Messages postés190Date d'inscriptionvendredi 4 juin 2004StatutMembreDernière intervention29 avril 2009
-
30 mai 2006 à 15:21
ecranbleu27
Messages postés190Date d'inscriptionvendredi 4 juin 2004StatutMembreDernière intervention29 avril 2009
-
2 juin 2006 à 05:43
bjr
suite à une saisie dans une form ,et validation ds une bd access,
je fais la somme d'un champs exprimé en heure,
le total s'appelle sommecolonne(que je place dans (txt1.text),mais lorsque cela dépasse 24H il me met une date .... moi je voudrais , si la somme des heures est 32H , qu'il me mette bien 32h dans mon txt1.text=sommecolonne.
merci pour votre aide
patrik
ecranbleu27
Messages postés190Date d'inscriptionvendredi 4 juin 2004StatutMembreDernière intervention29 avril 20091 2 juin 2006 à 05:43
bjr
un grand merci pour ton aide,
je pense que j'ai trouvé une solution qui a l'air d'aller.....
Public Sub totpiece()
Dim heure As Integer
Dim minute As Integer
Dim atab() As String
Dim VAR1 As Integer
Dim sql As String
Set ADOsum = New ADODB.Recordset
sql = "SELECT numero, SUM(duree) AS tot FROM restau GROUP BY numero HAVING (numero= " & y & ")"
ADOsum.Open sql, cnn, adOpenDynamic, adLockOptimistic, adCmdText
atab = Split(Format(ADOsum("tot"), "##.00"), ",")
heure = heure + Val(atab(0))
minute = minute + Val(atab(1))
If minute >= 60 Then
heure = (heure + 1)
Else: heure = heure
End If
TxtR(4).Text = Val(heure)
TxtR(5).Text = Val((minute Mod 60))
End Sub
si ca peut en aider d'autres,
il faudrait juste que je teste ce qu'il me donne comme résultat si je transforme mon fields(2) en format heure
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 30 mai 2006 à 18:32
Salut
A mon avis, tu as utilisé un format DateHeure à la colonne sommecolonne (ou une de tes variables intermédiaire est dans ce format).
Déclare-la en Entier-Long
Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
Champion du monde de boule de cristal - 2005 Le savoir est la seule matière qui s'accro
ecranbleu27
Messages postés190Date d'inscriptionvendredi 4 juin 2004StatutMembreDernière intervention29 avril 20091 31 mai 2006 à 05:59
bjr
en fait en changeant le format de la colonne sommecolonne en "entier_long" et en retestant je me suis rappellé que j'avais déjà essayé de le faire, mais là mon probléme est tout autre;
lorsque je fais ma saisie dans ma form de l'heure (qui est donc un entier-long ) si je lui tape 3.30 (donc 3H30) lorsque je valide il me le transforme aussi sec en 3.00 ( si je tape 4.60 ---> 5.00)
et je ne comprends pas pourquoi il arrondi automatiquement.....
dans les deux cas j'ai un bleme.....
HELP!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Vous n’avez pas trouvé la réponse que vous recherchez ?
ecranbleu27
Messages postés190Date d'inscriptionvendredi 4 juin 2004StatutMembreDernière intervention29 avril 20091 31 mai 2006 à 10:38
bon j'ai trouvé, pour l'arrondi dans la table access je l'ai mis en réel double,ca marche il n'arrondi plus.
maintenant mon total se fait bien, bon, mais il faut que je transforme en heures puisque j'ai un chiffre.voici le code que je me suis fait
il calcule le total et le transforme en heure mais ya un hic,
dans mon total(var1=sommecolonne+.fields(2))
il ne prend que les dizaines,
donc j'ai un message "indice en dehors de la plage" en ce qui concerne les minutes....puisque ya que les dizaines il doit pas trouver les minutes et bug!
Public Sub totpiece()
Dim heure As Integer
Dim minute As Integer
Dim sommecolonne As Integer
Dim atab() As String
Dim VAR1 As Integer
With ADOREST
While Not (.EOF)
VAR1 = sommecolonne + .Fields(2)
.MoveNext
Wend
End With
If NbrEnreg <> 0 Then
atab = Split(VAR1, ",")
heure = heure + Val(atab(0))
minute = minute + atab(1)
End If
If minute >= 60 Then
heure = (heure + 1)
Else: heure = heure
End If
TxtR(4).Text = Val(heure) & "," & Format(Val((minute Mod 60)), "##,00")
frmrestau.TxtR(4).Text = Format(var1, "###0.00")
End Sub
billoute 50
Messages postés76Date d'inscriptionlundi 20 mars 2006StatutMembreDernière intervention30 octobre 20072 31 mai 2006 à 11:04
Je n'ai pas tout compris peut tu donner un exemple de ce que tu veux stp (point de départ: ton total et ce que tu souhaite avoir)pour voir si je peux t'aider
exemple: mon total = 36,5 je souhaite avoir 36h30min c'est sa que tu veu ou autre chose
ecranbleu27
Messages postés190Date d'inscriptionvendredi 4 juin 2004StatutMembreDernière intervention29 avril 20091 31 mai 2006 à 15:04
bjr
je pars d'une saisie dans un form, pour tel travail : tant d'heures effectuées;
ceci incremente bien sur une bd access.
sur ma form j'ai un textbox ou je souhaite avoir le total au fur et a mesure des saisies (validées) sur ce nb d'heures effectuées .
puis un cmd impression dans crystal report.(ou je passe en parametre ce total pour l'avoir en impression avec le détail.
je voudrais effectivement que ce total "d'heures" soit exprimés le plus réalistement possible.
si mon détail d'heures est en "entier", alors oui il me faut le réexprimer en heures (ex : total= 22.90 donc je veux voir apparaite 23.30)
visiblement si je formate mon détail d'heures en format "heure" ,il ne sait pas faire un total superieur à 24H .
je patauge , c'est la derniere chose qu'il me reste à faire pour cloturer mon prog.
le code ennoncé plus est faux.celui- ci passe mieux mais bloque tjrs sur les minutes si il y a 0 apres la virgule (ex 2.00, car lors du rappel du fields(2)de la base access , celui-ci me rapatrie un nb entier lorsqu'il y a un 0 apres la virgule, si j'ai 2,00 dans ma base access il me renvoie 2, et donc erreur sur les minutes)
Public Sub totpiece()
Dim heure As Integer
Dim minute As Integer
Dim x As Integer, y As Integer
Dim atab() As String
Dim VAR1 As Double
With ADOREST
While Not (.EOF)
VAR1 = VAR1 + .Fields(2)
.MoveNext
Wend
End With
atab = Split(VAR1, ",")
heure = heure + Val(atab(0))
minute = minute + atab(1)
If minute >= 60 Then
heure = (heure + 1)
Else: heure = heure
End If
TxtR(4).Text = Val(heure) & "," & Format(Val((minute Mod 60)), "##,0")
End Sub
j'espere avoir été plus clair, merci d'avance.
patrik
billoute 50
Messages postés76Date d'inscriptionlundi 20 mars 2006StatutMembreDernière intervention30 octobre 20072 31 mai 2006 à 15:37
Je me pose une question les chiffre qu tu additionne correspondent à des heures ou pas?
Ce que je veu dire c quel format a ton chiffre : 0,50 correspond à 50 min ou 30 min dans ton prog.
Je pense que si tu fait 0,50 + 0,30 + 0,40 tu trouve 1,20
donc si 0,50 correspond à 50min tu as donc 120 min il te suffit donc de faire:
var1 = var1 * 100
heure = 0
do while i<60
heure=heure+1
var1 = var1 - 60
loop
minute = var1
au contraire si 0,50 corraespond as 30min tu as donc 1,2h dans ce cas
i=Instr(Var1,",") te renvoi la position de la virgule
heure= left(Var1, i-1)
minute = (Var1-heure)*0,6
ecranbleu27
Messages postés190Date d'inscriptionvendredi 4 juin 2004StatutMembreDernière intervention29 avril 20091 31 mai 2006 à 16:35
merci pour ton interet et ta rapidité,
si l'utilisateur tape : 0,50 cela correspond à 50mn,
1,40 à une heure et quarante minutes, logiquement il ne tapera jamais
1,65 mais 2,05 pour 2heures et cinq minutes.
donc ce serait le premier cas, qu'il faut que teste.
billoute 50
Messages postés76Date d'inscriptionlundi 20 mars 2006StatutMembreDernière intervention30 octobre 20072 31 mai 2006 à 17:00
Le probleme qui peut donc se poser c'est quand par exemple ton résultat = 10,05
tu sais pas si tu as additionner 5,00 et 5,05 où le résultat est de 10h00
ou 4,55et 5,50 où le résultat est de 10h45
Donc je pense que tu as deux solutions:
soit tu reviens sur la vesion précédente où le résultat ne dépasse pa 24h si tu peu avoir le nombre de jour sa serai ok :
nbJour* 24 + total
sinon il faut que tu inclu dans ta boucle une formule pour transformer 5,50 (pour 5h50) en 5.83 (pour 5,83h):
With ADOREST
While Not (.EOF)
i=instr( .Fields(2),",")
j=left(.Fields(2), i-1)
k= .Fields(2) / 0,6
VAR1 = VAR1 + j + k
.MoveNext
Wend
End With
A la fin tu devrai avoir un total par ex 36,75 (pour 36,75h) que tu retransforme en 36.45
i = instr(VAR1,",")
heure= left(Var1, i-1)
minute = (Var1-heure)*0,6
ecranbleu27
Messages postés190Date d'inscriptionvendredi 4 juin 2004StatutMembreDernière intervention29 avril 20091 31 mai 2006 à 17:22
-ptite question : i, j, k tu les déclares comment en variant ?
le i du premier code ds ta réponse précedente , il correspond à quoi?
VAR1 = VAR1 * 100
heure = 0
Do While i < 60
heure = heure + 1
VAR1 = VAR1 - 60
Loop
minute = VAR1
car lorsque j'ai testé le precedent, il m'a mis dépassement de la
capacité......
billoute 50
Messages postés76Date d'inscriptionlundi 20 mars 2006StatutMembreDernière intervention30 octobre 20072 31 mai 2006 à 17:32
i j et k sont des variables quelconques i et j sont des entiers et k un réel
en ce qui concerne la solution que tu vien de marquer oublie la car en réfléchissant ma solution ne marche pas car il faudrais que t chiffres soit tjrs inférieur à 1. Quand je parlai de revenir à la version précédente je pensai à celle que tu avai dés le départ.
ecranbleu27
Messages postés190Date d'inscriptionvendredi 4 juin 2004StatutMembreDernière intervention29 avril 20091 31 mai 2006 à 18:23
bien
mais pour ta derniere,
j=left(.Fields(2), i-1)
là il me dit : argument ou appel de procédure incorect......
mais ma version avec un nb de jour , c'est pas tres cool, ca fait pas fini.......
ecranbleu27
Messages postés190Date d'inscriptionvendredi 4 juin 2004StatutMembreDernière intervention29 avril 20091 1 juin 2006 à 05:41
bjr
si je garde ma toute premiere version qui au dela de 24H me met une date+ la difference d'heure
ex : si j'avais 25H il me le transformait en [31/3/1899 01:00:00]
(et non pas un nb de jours), je trouve que visuelement ca ne le fait pas ,
l'utilisateur va renseigner au fur et a mesure ses travaux effectués, il voudra connaitre son total d'heures qu'il a passé à bosser; en general les heures ca parle plus que des jours, (on peut par contre apres preciser : ca fait tant de jours, de minutes etc....)
c'est comme si tu comptabilises les heures passées à faire un prog, tu regarde le nb d'heure pas les jours......
il n'existe pas un truc en vb qui puisse additionner des heures au delà de 24h....??
patrik
billoute 50
Messages postés76Date d'inscriptionlundi 20 mars 2006StatutMembreDernière intervention30 octobre 20072 1 juin 2006 à 08:09
Que je sache non mais je suis qu'un débutant!!!
Tu as essayé ce que je t'avai mis avec mid à la place de left?
"sinon il faut que tu inclu dans ta boucle une formule pour transformer 5,50 (pour 5h50) en 5.83 (pour 5,83h):
With ADOREST
While Not (.EOF)
i=instr( .Fields(2),",")
j=mid(.Fields(2),1, i-1)
k= .Fields(2) / 0,6
VAR1 = VAR1 + j + k
.MoveNext
Wend
End With
A la fin tu devrai avoir un total par ex 36,75 (pour 36,75h) que tu retransforme en 36.45
i = instr(VAR1,",")
heure= mid(Var1,1, i-1)
minute = (Var1-heure)*0,6"
ecranbleu27
Messages postés190Date d'inscriptionvendredi 4 juin 2004StatutMembreDernière intervention29 avril 20091 1 juin 2006 à 08:27
non ca ne marche pas avec mid, ca me dit pareil...
par contre , lorsque je calcul mon total avec:
With ADOREST
While Not (.EOF)
VAR1 = VAR1 + .Fields(2)
.MoveNext
Wend
End With
si la valeur de .fields(2) dans ma table access est de 2,00 (reel double ,2 décimales
j'ai essayé les autres ; pareil!)
il me rappatrie un nb entier (2) comment puis-je rappatrier vraiment 2,00, cad comment garder les zéros aprés la virgule , car pour les minutes il me les faut.
j'ai essayé avec round; cdec mais niet , en mode débogage il me montre tjrs un deux entier
(si j'ai une valeur avec deux chiffres apres la virgule, no problem!)