OVH Cloud OVH Cloud

Soustraction dans un recordset

21 réponses
Avatar
LeSoviet
Je renseigne un champ sur click d'un bouton via un recordset :

Dim rst As DAO.Recordset
Dim db As database
Dim t As String

t =3D Me.ElapsedTime.Value

Set db =3D CurrentDb
Set rst =3D db.OpenRecordset("Table1", dbOpenDynaset)
With rst
.AddNew
.fields("Champ1") =3D t
.Update
End With
rst.Close
Set rst =3D Nothing


J'aimerai sur ce m=EAme click qu'un autre champ (champ2) soit =E9galement
renseign=E9 par la soustraction de l'enregistrement nouvellement cr=E9=E9
(Champ1 avec Max(ID)) et de l'enregistrement pr=E9c=E9dent(Champ1 avec
Max(ID)-1).

Voici la structure de ma table
ID----Champ1-------Champ2
1------213243
2------876746
3------553451
4------876367
5------454546


Merci pour vos conseils

10 réponses

1 2 3
Avatar
Jessy Sempere
Bonjour

Essais :
.fields("Champ2") = t - dlookup("Champ1","Table1","Id = " & me.id-1)

@+
Jessy Sempere
------------------------------------
Site @ccess : http://access.fr.free.fr/
Pour l''''efficacité de tous :
http://www.mpfa.info/
------------------------------------



Je renseigne un champ sur click d'un bouton via un recordset :

Dim rst As DAO.Recordset
Dim db As database
Dim t As String

t = Me.ElapsedTime.Value

Set db = CurrentDb
Set rst = db.OpenRecordset("Table1", dbOpenDynaset)
With rst
.AddNew
.fields("Champ1") = t
.Update
End With
rst.Close
Set rst = Nothing


J'aimerai sur ce même click qu'un autre champ (champ2) soit également
renseigné par la soustraction de l'enregistrement nouvellement créé
(Champ1 avec Max(ID)) et de l'enregistrement précédent(Champ1 avec
Max(ID)-1).

Voici la structure de ma table
ID----Champ1-------Champ2
1------213243
2------876746
3------553451
4------876367
5------454546


Merci pour vos conseils




Avatar
Eric
Bonjour,

Pourquoi stocker la différence avec l'enregistrement précédent puisque
par simple requête tu as ces valeurs ?

Toutefois,
en supposant que l'ID est un numero incrémentiel sans trou, en mettant
avant le .Update ceci :
.fields("champ2")=val(nz(dlookup("champ2","Table1","Id=" &
Fields("Id")-1)))-val(t)
(Adapter le calcul de la différence)

mais je reste perplexe puisque lors de la création de l'enregistrement
tu ne définis pas la valeur de ID. S'il s'agit d'un num auto, tu auras
des trous dans la séquence donc il te faudrait récupérer avant AddNew le
plus grand numéro attribué pour l'utiliser dans le DLookUp()
De plus, est-ce volontaire de définir t comme une chaine de caractères ?


Je renseigne un champ sur click d'un bouton via un recordset :

Dim rst As DAO.Recordset
Dim db As database
Dim t As String

t = Me.ElapsedTime.Value

Set db = CurrentDb
Set rst = db.OpenRecordset("Table1", dbOpenDynaset)
With rst
.AddNew
.fields("Champ1") = t
.Update
End With
rst.Close
Set rst = Nothing


J'aimerai sur ce même click qu'un autre champ (champ2) soit également
renseigné par la soustraction de l'enregistrement nouvellement créé
(Champ1 avec Max(ID)) et de l'enregistrement précédent(Champ1 avec
Max(ID)-1).

Voici la structure de ma table
ID----Champ1-------Champ2
1------213243
2------876746
3------553451
4------876367
5------454546


Merci pour vos conseils



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
Eric
.../...
manque le . devant Fields("Id") dans le dlookup
.fields("champ2")=val(nz(dlookup("champ2","Table1","Id=" &
.Fields("Id")-1)))-val(t)

Bonjour,

Pourquoi stocker la différence avec l'enregistrement précédent puisque
par simple requête tu as ces valeurs ?

Toutefois,
en supposant que l'ID est un numero incrémentiel sans trou, en mettant
avant le .Update ceci :
.fields("champ2")=val(nz(dlookup("champ2","Table1","Id=" &
Fields("Id")-1)))-val(t)
(Adapter le calcul de la différence)

mais je reste perplexe puisque lors de la création de l'enregistrement
tu ne définis pas la valeur de ID. S'il s'agit d'un num auto, tu auras
des trous dans la séquence donc il te faudrait récupérer avant AddNew le
plus grand numéro attribué pour l'utiliser dans le DLookUp()
De plus, est-ce volontaire de définir t comme une chaine de caractères ?


Je renseigne un champ sur click d'un bouton via un recordset :

Dim rst As DAO.Recordset
Dim db As database
Dim t As String

t = Me.ElapsedTime.Value

Set db = CurrentDb
Set rst = db.OpenRecordset("Table1", dbOpenDynaset)
With rst
.AddNew
.fields("Champ1") = t
.Update
End With
rst.Close
Set rst = Nothing


J'aimerai sur ce même click qu'un autre champ (champ2) soit également
renseigné par la soustraction de l'enregistrement nouvellement créé
(Champ1 avec Max(ID)) et de l'enregistrement précédent(Champ1 avec
Max(ID)-1).

Voici la structure de ma table
ID----Champ1-------Champ2
1------213243
2------876746
3------553451
4------876367
5------454546


Merci pour vos conseils





--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr


Avatar
LeSoviet
On 21 fév, 15:36, Eric wrote:
.../...
manque le . devant Fields("Id") dans le dlookup
.fields("champ2")=val(nz(dlookup("champ2","Table1","Id=" &
.Fields("Id")-1)))-val(t)






Bonjour,

Pourquoi stocker la différence avec l'enregistrement précédent pu isque
par simple requête tu as ces valeurs ?

Toutefois,
en supposant que l'ID est un numero incrémentiel sans trou, en mettant
avant le .Update ceci :
.fields("champ2")=val(nz(dlookup("champ2","Table1","Id=" &
Fields("Id")-1)))-val(t)
(Adapter le calcul de la différence)

mais je reste perplexe puisque lors de la création de l'enregistrement
tu ne définis pas la valeur de ID. S'il s'agit d'un num auto, tu auras
des trous dans la séquence donc il te faudrait récupérer avant Ad dNew le
plus grand numéro attribué pour l'utiliser dans le DLookUp()
De plus, est-ce volontaire de définir t comme une chaine de caractè res ?

Je renseigne un champ sur click d'un bouton via un recordset :

Dim rst As DAO.Recordset
Dim db As database
Dim t As String

t = Me.ElapsedTime.Value

Set db = CurrentDb
Set rst = db.OpenRecordset("Table1", dbOpenDynaset)
With rst
.AddNew
.fields("Champ1") = t
.Update
End With
rst.Close
Set rst = Nothing

J'aimerai sur ce même click qu'un autre champ (champ2) soit égalem ent
renseigné par la soustraction de l'enregistrement nouvellement cré é
(Champ1 avec Max(ID)) et de l'enregistrement précédent(Champ1 avec
Max(ID)-1).

Voici la structure de ma table
ID----Champ1-------Champ2
1------213243
2------876746
3------553451
4------876367
5------454546

Merci pour vos conseils



--
A+
Erichttp://www.mpfa.info/
Archives :http://groups.google.fr/group/microsoft.public.fr.access?hl=f r- Masquer le texte des messages précédents -

- Afficher le texte des messages précédents -


Re,

Effectivement, ID est un NumAuto. Ce qui fait que je ne comprend pas
bien pourquoi je devrais avoir des trous.



Avatar
Eric
re,

Si tu viens à supprimer un enregistrement par exemple le numéro 5 suite
à une erreur de saisie, le prochain numéro attribué par Access sera le 6
donc tu auras un trou entre le 4 et le 6.


Effectivement, ID est un NumAuto. Ce qui fait que je ne comprend pas
bien pourquoi je devrais avoir des trous.



--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
LeSoviet
On 21 fév, 17:23, Eric wrote:
re,

Si tu viens à supprimer un enregistrement par exemple le numéro 5 sui te
à une erreur de saisie, le prochain numéro attribué par Access sera le 6
donc tu auras un trou entre le 4 et le 6.




Effectivement, ID est un NumAuto. Ce qui fait que je ne comprend pas
bien pourquoi je devrais avoir des trous.


--
A+
Erichttp://www.mpfa.info/
Archives :http://groups.google.fr/group/microsoft.public.fr.access?hl=fr


Re,

impossible puisque le renseignement des champs de la table se fait via
le code du bouton et non manuellement (comme ça peut être le cas du
remplissage du contenu d'une textbox à la main par ex). Dc pas de
suppression de valeur dans la table, donc pas de trous potentiels.

Par contre, est-ce trop demander de me dire comment fait-on pour
récupérer la plus grande valeur d'ID par recordset comme tu l'as
suggérer ? Je ne manie vraiment pas bien ce type de codage.

Merci par avance


Avatar
Eric

Re,

impossible puisque le renseignement des champs de la table se fait via
le code du bouton et non manuellement (comme ça peut être le cas du
remplissage du contenu d'une textbox à la main par ex). Dc pas de
suppression de valeur dans la table, donc pas de trous potentiels.

Par contre, est-ce trop demander de me dire comment fait-on pour
récupérer la plus grande valeur d'ID par recordset comme tu l'as
suggérer ? Je ne manie vraiment pas bien ce type de codage.

Merci par avance



Bon,,je note Pas de trous possible, personne n'ira supprimmer un
enregistrement dans la table. ;-)

Pour récupérer le plus grand ID attribué, tu peux faire, avant
d'invoquer la méthode AddNew, sous réserve que le recordset est trié sur
l'Id (tri croissant).
If not .eof then
.movelast
LeMax=!Id
Else
LeMax=0
End If
Il te faudra bien sûr déclarer en début de procédure LeMax comme un
entier Long.

Autre solution avec la fonction de domaine DMax() que tu peux placer
avant l'ouverture du recordset, sans inquiétude pour l'ordre du recordset:
LeMax=DMax("Id","Table1")

--
A+
Eric
http://www.mpfa.info/
Archives : http://groups.google.fr/group/microsoft.public.fr.access?hl=fr

Avatar
LeSoviet
Bonsoir,

j'ai une incompatibilité de type sur cette ligne :

.fields("champ2")=val(nz(dlookup("champ2","Table1","Id="
& .Fields("Id")-1)))-val(t)

Bon, autant pour moi si je prend des réflexions mais les valeurs de
Champ1 n'ont pas cette forme 000000 mais celle-ci 00:00:00:00. Mea
Culpa.
J'ai défini les types de données des Champs 1 et 2 dans le table à
texte parce que c'est ainsi que sont déclarées les valeurs qui les
renseignent, d'où cette question pertinente : "De plus, est-ce
volontaire de définir t comme une chaine de caractères ?"

"Ma" base est issue de ce code : http://support.microsoft.com/kb/233275/fr
J'arrive à récupérer la valeur de Me!ElapsedTime via t =
Me.ElapsedTime.Value (dans le 1er message) mais pas à alimenter Champ2
qui est la soustraction de la dernière valeur de Champ1 et son avant
dernière valeur.

Désolé pour mes explications initiales et merci d'avance de votre aide
Avatar
Jessy Sempere
Bonjour

Ton incompatibilité est effectivement du au format texte de tes champs...
Malheureusement il ne s'agit pas simplement de modifier la synthaxe, ta
donnée est particulière, c'est un format d'heure avec des millisecondes,
l'idéale je pense, c'est que tu es un champ qui stock la valeur réelle en
millisecondes avant la mise en forme.

Sinon, tu dois convertir pour revenir en millisecondes, faire ton calcul et
reconvertir le résultat dans ton format...
C'est tordu. ;-))
Enfin, voilà normalement le code qui devrait convenir pour faire ce que je
disais "tordu"...


Dim strTimeLast as string
Dim strTimeDiff as string
Dim sngTimeLast as single
Dim sngTimeNew as single
Dim sngTimeDiff as single

strTimeLast = dlookup("champ1", "Table1", "Id=" & Me.id-1)
sngTimeLast = (left(strTimeLast,2) * 3600000) + _
(mid(strTimeLast,4,2)*60000) + _
(mid(strTimeLast,7,2)*1000) + _
right(strTimeLast,2)
sngTimeNew = (left(t,2) * 3600000) + _
(mid(t,4,2)*60000) + _
(mid(t,7,2)*1000) + right(t,2)

sngTimeDiff = sngTimeNew - sngTimeLast

strTimeDiff = Format((sngTimeDiff 3600000), "00") _
& ":" & Format((sngTimeDiff 60000) Mod 60, "00") _
& ":" & Format((sngTimeDiff 1000) Mod 60, "00") _
& ":" & Format((sngTimeDiff Mod 1000) 10, "00")

.fields("champ2")=strTimeDiff

--
@+
Jessy Sempere
------------------------------------
Site @ccess : http://access.fr.free.fr/
Pour l'efficacité de tous :
http://www.mpfa.info/
------------------------------------
"LeSoviet" a écrit dans le message de news:

Bonsoir,

j'ai une incompatibilité de type sur cette ligne :

.fields("champ2")=val(nz(dlookup("champ2","Table1","Id="
& .Fields("Id")-1)))-val(t)

Bon, autant pour moi si je prend des réflexions mais les valeurs de
Champ1 n'ont pas cette forme 000000 mais celle-ci 00:00:00:00. Mea
Culpa.
J'ai défini les types de données des Champs 1 et 2 dans le table à
texte parce que c'est ainsi que sont déclarées les valeurs qui les
renseignent, d'où cette question pertinente : "De plus, est-ce
volontaire de définir t comme une chaine de caractères ?"

"Ma" base est issue de ce code : http://support.microsoft.com/kb/233275/fr
J'arrive à récupérer la valeur de Me!ElapsedTime via t Me.ElapsedTime.Value (dans le 1er message) mais pas à alimenter Champ2
qui est la soustraction de la dernière valeur de Champ1 et son avant
dernière valeur.

Désolé pour mes explications initiales et merci d'avance de votre aide
Avatar
LeSoviet
Bonjour,

J'ai un message d'erreur sur le premier click du bouton « Erreur
3021 : Aucun enregistrement en cours ».

Normal, puisqu'il n'y a pas de valeurs précédentes pour ID et les
Champs 1 et 2.

Comment contourner le pb ?
Où dois-je placer ce code parmi le code du bouton pour que les Champs
1 et 2 correspondant à la même valeur d'ID soient insérés dans Tabl e1?

Merci d'avance pour votre aide
1 2 3