Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > IHM
IHM Ce forum est dédié aux questions relatives à la création de formulaires et d'états, avec ou sans code VBA, et macros.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/12/2011, 11h04   #1
Membre habitué
 
Avatar de DamKre
 
Homme
Enseignant
Inscription : janvier 2007
Messages : 516
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2007
Messages : 516
Points : 117
Points : 117
Par défaut After Insert qui fonctionne mal une fois sur deux

Bonjour,

J'ai une db qui reprend des comptes bancaires.
  • J'ai un formulaire principal contenant les comptes ;
  • J'ai un sous-formulaire contenant la liste des opérations de ce compte ( +1000€, -250€, etc ) ;
  • Chaque opération est numérotée ( 1,2,3,... ) ;
  • Après chaque insertion d'une opération, je souhaite (évidemment) que le numéro soit le numéro précédent + 1, et que le solde soit le solde précédent + l'opération courante.

Dans le principe, tout fonctionne pas trop mal, à ceci près :
  • La première insertion d'opération fonctionne à merveille : après l'opération 2 se trouve l'opération 3 et le solde est correct ;
  • Dès la seconde insertion, cela foire : au lieu d'avoir 4, puis 5, puis 6, ... comme numéro, je reste à 3 et le solde est incorrect. Access reste toujours sur l'enregistrement 2 et ne reprend pas le précédent.

Le code en lui-même fonctionne bien, puisque le premier ajout est correct. Par contre, ce sont les suivants qui "foirent".

Voici le code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Private Sub Form_AfterInsert()
On Error GoTo Erreurs
 
Dim oRst As DAO.Recordset
Set oRst = CurrentDb.OpenRecordset("SELECT * FROM T_Operations WHERE Id_Cmt=" & Me.Id_Cmt.Value, dbOpenDynaset)
oRst.MoveLast 'Ouvre le dernier enregistrement
oRst.MovePrevious 'Aller ensuite à l'enregistrement précédent, puisque le dernier = l'enregistrement en cours et donc ne contient pas encore le solde et le numéro
 
Me.Ope_Solde.Value = oRst.Fields("Ope_Solde").Value + Me.Ope_Oper.Value
 
Me.Ope_Num.Value = oRst.Fields("Ope_Num").Value + 1
 
oRst.Close
Set oRst = Nothing
 
DoCmd.SetWarnings False 'Désactive les messages de confirmation
DoCmd.RunSQL ("UPDATE T_Comptes SET T_Comptes.Cmt_Somme = " & Me.Ope_Solde.Value & " WHERE (((T_Comptes.Id_Cmt)=" & Me.Id_Cmt.Value & "));")
DoCmd.SetWarnings True 'Réactive les messages de confirmation
 
Exit Sub
 
Erreurs:
Select Case err.Number
    Case 3021
        Me.Ope_Num.Value = 1
        Me.Ope_Solde.Value = Me.Ope_Oper.Value
        DoCmd.SetWarnings False 'Désactive les messages de confirmation
        DoCmd.RunSQL ("UPDATE T_Comptes SET T_Comptes.Cmt_Somme = " & Me.Ope_Solde.Value & " WHERE (((T_Comptes.Id_Cmt)=" & Me.Id_Cmt.Value & "));")
        DoCmd.SetWarnings True 'Réactive les messages de confirmation
    Case Else
        MsgBox err.Description, vbCritical
End Select
Si vous aviez une piste pour résoudre ce souci, je suis évidemment preneur !
Merci de votre aide !
__________________
DamKre
Un responsable informatique finit toujours par être considéré :
- soit inutile, puisque ça marche,
- soit incompétent, puisque ça ne marche pas.
(Sagesse populaire)
DamKre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/12/2011, 17h54   #2
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 090
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 090
Points : 11 622
Points : 11 622
Bonjour,

Chercher le dernier N° n'a pas de sens dans ton cas. Il faut plutot chercher le plus haut.

Code :
1
2
3
4
5
dim rst as dao.recordset
set rst = currentdb.openrecordset("select TOP 1 Id_Ope, solde  FROM T_Operations WHERE Id_Cmt=" & Me.Id_Cmt.Value & " ORDER BY Id_Ope DESC;"
NewNumeroOpe = rst.fields(0) + 1
NewSolde =  rst.fields(1) + me.montantOperation
...
Cordialement,
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/12/2011, 21h09   #3
Membre habitué
 
Avatar de DamKre
 
Homme
Enseignant
Inscription : janvier 2007
Messages : 516
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2007
Messages : 516
Points : 117
Points : 117
Citation:
Envoyé par loufab Voir le message
Chercher le dernier N° n'a pas de sens dans ton cas. Il faut plutot chercher le plus haut.
J'avoue que je ne comprends pas le pourquoi...

Je teste tout cela ; merci de ta réponse.
__________________
DamKre
Un responsable informatique finit toujours par être considéré :
- soit inutile, puisque ça marche,
- soit incompétent, puisque ça ne marche pas.
(Sagesse populaire)
DamKre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/12/2011, 10h01   #4
Rédacteur/Modérateur

 
Avatar de loufab
 
Homme Fabrice CONSTANS
Ingénieur développement logiciels
Inscription : avril 2005
Messages : 7 090
Détails du profil
Informations personnelles :
Nom : Homme Fabrice CONSTANS
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : avril 2005
Messages : 7 090
Points : 11 622
Points : 11 622
Bonjour,

Parceque le dernier est subjectif dans une base de données.

Autant chercher la véritable information. Tu veux le plus grand numéro, que tu interprètes comme le dernier, alors cherche le plus grand et non le dernier.

Cordialement,
__________________
Classe MELA(CRUD) Opérateur IN et zone de liste
MsGraph et VBA - 1e Partie 2e partie
Entête d'états-Opérateur LIKE-Evénements formulaires-Cours 2010
Complément :Générateur de msgbox
Visitez mon Blog
Les questions techniques par MP ne sont pas lues et je ne pratique pas l'extispicine
loufab est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2011, 10h29   #5
Membre habitué
 
Avatar de DamKre
 
Homme
Enseignant
Inscription : janvier 2007
Messages : 516
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Belgique

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : janvier 2007
Messages : 516
Points : 117
Points : 117
merci pour tout
__________________
DamKre
Un responsable informatique finit toujours par être considéré :
- soit inutile, puisque ça marche,
- soit incompétent, puisque ça ne marche pas.
(Sagesse populaire)
DamKre est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h58.


 
 
 
 
Partenaires

Hébergement Web