OVH Cloud OVH Cloud

positionnement sur un enregistrement precis d'une table

14 réponses
Avatar
c.barbier
Bonjour,

Je souhaite a l'aide d'un recordset, me positionner sur un
enregistrement precis.
Pour cela, j'ai recuperer la position de l'enregistrement a
l'aide de la fonction :
position = rst_mvt.AbsolutePosition. Mais je n'arrive pas a me
repositionner sur cet enregistrement pour continuer le parcours de la
table. Je pense que cela vient du fait que la fonction que j'utilise
est destinee au formulaire mais je ne suis pas certaine. Voici ci
dessous le code de la procedure. Dans les commentaires, j'ai indique
ou se situe le probleme.
Merci beaucoup,

Sub Remonte_Mouvement()
'variable permettant de designer la table article
Dim db_stock As DAO.Database
Dim rst_stock As DAO.Recordset

'variable permettant de designer la table mouvement
Dim db_mvt As DAO.Database
Dim rst_mvt As DAO.Recordset

Dim Date_Souhaitee As Date
Dim pmpactuel As Double
Dim pmpsortie As Double

Dim position As Long
Dim resultat As Integer
Dim quantite_actuelle As Double
Dim quantitesortie As Double
Dim val_stock_mag As Double

Initialisation_Table
Date_Souhaitee = Date_Saisie()

'Ouverture et positionnement au debut de la table mouvement
Set db_mvt = CurrentDb()
Set rst_mvt = db_mvt.OpenRecordset("SELECT * from dbo_mouvement_copie")

'Tant que l'on n'a pas atteint la fin de la table mouvement
While ((Not rst_mvt.EOF) And (rst_mvt![Date] > Date_Souhaitee))

'ouverture et positionnement au debut de la table article
Set db_stock = CurrentDb()
Set rst_stock = db_stock.OpenRecordset("SELECT * from StockIni")
resultat = 0
While ((Not rst_stock.EOF) And (resultat <> 1))
If rst_stock![Code Article] = rst_mvt![Article] Then 'ce n'est
ni un document ni un outil
resultat = 1
pmpactuel = rst_stock![PMP Actuel]
quantite_actuelle = rst_stock![Quantite Actuelle]
val_stock_mag = rst_stock![Valeur Stock]
End If
rst_stock.MoveNext
Wend
rst_stock.MovePrevious
Select Case rst_mvt![TypeMvt]
Case "ISS-WO", "ISS-UNP"
quantite_actuelle = quantite_actuelle + rst_mvt![QteMvt]
val_stock_mag = val_stock_mag + pmpactuel *
rst_mvt![QteMvt]
'insertion dans la table stockini
Insertion_Table rst_stock, quantite_actuelle, val_stock_mag

Case "RCT-PO"
pmpactuel = (pmpactuel * quantite_actuelle - rst_mvt![Prix]
* rst_mvt![QteMvt]) / (quantite_actuelle - rst_mvt![QteMvt])
quantite_actuelle = quantite_actuelle - rst_mvt![QteMvt]
val_stock_mag = val_stock_mag - rst_mvt![Prix] *
rst_mvt![QteMvt]
'insertion dans la table stockini
Insertion_Table rst_stock, quantite_actuelle, val_stock_mag
rst_stock.Edit
rst_stock("[PMP Actuel]") = pmpactuel
rst_stock.Update

Case "RCT-RS", "RCT-UNP"
resultat = 0
pmpsortie = pmpactuel
quantitesortie = quantite_actuelle

position = rst_mvt.AbsolutePosition 'GARDE LA POSITION DE
L'ENREGISTREMENT COURANT

While resultat <> 1 'Tant que l'on n'a pas trouve un
mouvement ISS-WO ou ISS-UNP
If rst_stock![Code Article] = rst_mvt![Article] Then
Select Case rst_mvt![TypeMvt]
Case "ISS-UNP", "ISS-WO"
resultat = 1 'la derniere sortie ISS-UNP ou
ISS-WO a ete trouve
'recuperation du PMP
quantite_actuelle = quantite_actuelle -
rst_mvt![QteMvt]
val_stock_mag = val_stock_mag - pmpsortie *
rst_mvt![QteMvt]
Insertion_Table rst_stock,
quantite_actuelle, val_stock_mag
Case "ISS-SO"
quantitesortie = quantitesortie +
rst_mvt![QteMvt]
Case "RJCT-WO", "RCT-WO", "RCT-RS", "RCT-WO"
quantitesortie = quantitesortie -
rst_mvt![QteMvt]
Case "CYC-RCNT"
If rst_mvt![QteMvt] > 0 Then
'c'est une entree
quantitesortie = quantitesortie -
rst_mvt![QteMvt]
Else
'c'est une sortie
quantitesortie = quantitesortie +
rst_mvt![QteMvt]

End If
Case "RCT-PO"
'calcul du nouveau PMP
pmpsortie = (pmpsortie *
quantite_actuelle - rst_mvt![Prix] * rst_mvt![QteMvt]) /
(quantite_actuelle - rst_mvt![QteMvt])
End Select
rst_mvt.MoveNext
End If
Wend



DoCmd.GoToRecord acDataTable, rst_mvt, acGoTo,
position 'RETOUR A L'ENREGISTREMENT QUI ETAIT EN COURS. MAIS CETTE
LIGNE NE FONCTIONNE PAS, IL NE VEUT PAS DE L'OBJET. Cela est
certainement du au fait qu'il ne s'agit pas d'un formulaire. Avez
vous une autre fonction a me proposer pour retourner a
l'enregistrement qui etait en cours ?





Case "ISS-SO"
quantite_actuelle = quantite_actuelle +
rst_mvt![QteMvt]
val_stock_mag = val_stock_mag + rst_mvt![Prix]
* rst_mvt![QteMvt]
Insertion_Table rst_stock, quantite_actuelle,
val_stock_mag
Case "CYC-RCNT"
If rst_mvt![QteMvt] > 0 Then 'c'est une entree
quantite_actuelle = quantite_actuelle -
rst_mvt![QteMvt]
val_stock_mag = val_stock_mag - pmpactuelle
* rst_mvt![QteMvt]
Else 'c'est une sortie
quantite_actuelle = quantite_actuelle +
rst_mvt![QteMvt]
val_stock_mag = val_stock_mag + pmpactuelle
* rst_mvt![QteMvt]
End If

End Select
rst_stock.Close 'fermeture de la table stock
'Liberation des variables objet permettant de designer la
table article
Set rst_stock = Nothing
Set db_stock = Nothing

rst_mvt.MoveNext
Wend

rst_mvt.Close 'fermeture de la table article
'Liberation des variables objet permettant de designer la table article
Set rst_mvt = Nothing
Set db_mvt = Nothing
End Sub

4 réponses

1 2
Avatar
c.barbier
Bonjour,

Ok, c&#8217;est bon, ca marche. Merci beaucoup.
Mais je ne comprends pas pourquoi la condition Not rst_mvt.EOF et la
condition rst_mvt![Date] > Date_Souhaitee sont incompatibles ?
Est ce que c&#8217;est pareil pour la condition Not rst_stock.EOF et la
condition resultat <> 1 ?

De plus, j&#8217;ai un petit probleme au niveau de la saisie de la
date. Mon pb est le suivant :

Je souhaite pouvoir saisir dans une inputbox une date de la forme
dd/mm/yyyy. Sur le forum, j&#8217;ai vu la fonction suivante :

Sub Date_Saisie()
Dim date_souhaitee As Date
On Error Resume Next
Do
Err.Clear
date_souhaitee = CDate(InputBox("Si la date vous convient, cliquez
sur OK", "Veuillez saisir une date", Format(Now, "dd/mm/yyyy")))
Loop While Err.Number <> 0
Debug.Print date_souhaitee
End Sub

Je ne comprends pas dans quel cas, on a le message « Veuillez saisir
une date » qui s&#8217;affiche.
De plus, lorsque je saisie comme date uniquement un chiffre, par
exemple 8, il me retourne une date incoherente avec la saisie (il
retourne par exemple 03/02/1900). Comment fait on pour que si
l&#8217;utilisateur saisi un seul chiffre et non une date, ca detecte
l&#8217;erreur et lui demande de resaisir une date ?

Merci beaucoup,
Avatar
Raymond [mvp]
parce qu'il faut que les deux conditions soient réunies pour que la boucle
cesse, ce qui a peu de chance de se trouver sur une fin de fichier qui n'a
pas d'enregistrement actif.
c'est valable pour tout ton code.
si tu saisis un nombre pour indiquer la date, tu indiques donc le nombre de
jours écoulés depuis la date de référence qui est le 31/12/1899. si tu
composes 10 tu indiques la date du 9 janvier 1900.
--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://OfficeSystem.Access.free.fr/runtime/
http://users.skynet.be/mpfa/ pour débuter sur le forum


a écrit dans le message de news:

Bonjour,

Ok, c&#8217;est bon, ca marche. Merci beaucoup.
Mais je ne comprends pas pourquoi la condition Not rst_mvt.EOF et la
condition rst_mvt![Date] > Date_Souhaitee sont incompatibles ?
Est ce que c&#8217;est pareil pour la condition Not rst_stock.EOF et la
condition resultat <> 1 ?

De plus, j&#8217;ai un petit probleme au niveau de la saisie de la
date. Mon pb est le suivant :

Je souhaite pouvoir saisir dans une inputbox une date de la forme
dd/mm/yyyy. Sur le forum, j&#8217;ai vu la fonction suivante :

Sub Date_Saisie()
Dim date_souhaitee As Date
On Error Resume Next
Do
Err.Clear
date_souhaitee = CDate(InputBox("Si la date vous convient, cliquez
sur OK", "Veuillez saisir une date", Format(Now, "dd/mm/yyyy")))
Loop While Err.Number <> 0
Debug.Print date_souhaitee
End Sub

Je ne comprends pas dans quel cas, on a le message « Veuillez saisir
une date » qui s&#8217;affiche.
De plus, lorsque je saisie comme date uniquement un chiffre, par
exemple 8, il me retourne une date incoherente avec la saisie (il
retourne par exemple 03/02/1900). Comment fait on pour que si
l&#8217;utilisateur saisi un seul chiffre et non une date, ca detecte
l&#8217;erreur et lui demande de resaisir une date ?

Merci beaucoup,
Avatar
Jc
Bonjour(soir) Raymond,

"Raymond [mvp]" a écrit dans le message de
news:
parce qu'il faut que les deux conditions soient réunies pour que la boucle
cesse, ce qui a peu de chance de se trouver sur une fin de fichier qui n'a
pas d'enregistrement actif.
c'est valable pour tout ton code.
si tu saisis un nombre pour indiquer la date, tu indiques donc le nombre
de jours écoulés depuis la date de référence qui est le 31/12/1899. si tu
composes 10 tu indiques la date du 9 janvier 1900.


Ce n'est pas le 30-12-1899, plutôt ?

--
Bonne fin de journée.
----------------------------------------
Jclg88
Cliquer sur ce lien pour me joindre par mél :
http://cerbermail.com/?JVKAlLV1Rf
----------------------------------------

Avatar
Raymond [mvp]
oui, oui, exact, erreur de frappe.

--
@+
Raymond Access MVP
http://OfficeSystem.Access.free.fr/
http://OfficeSystem.Access.free.fr/runtime/
http://users.skynet.be/mpfa/ pour débuter sur le forum


"Jc" a écrit dans le message de news:

Bonjour(soir) Raymond,


Ce n'est pas le 30-12-1899, plutôt ?


1 2