Ajout d'un enregistrement dans 3 tables en VBA

Fermé
Yop - 19 mars 2021 à 22:37
yg_be Messages postés 22791 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 mai 2024 - 20 mars 2021 à 10:42
Bonjour,

Je travaille pour une congrégation religieuse et j'ai une base de données de gestion d'information sur les religieuses. Cette base de données a été créée sous Access 2003, migrée en Access 2010, puis en Access 2016 l'an dernier.

J'ai trois tables liées par le numéro de matricule de la nouvelle religieuse, avec une relation un-à-un avec intégrité référentielle :
- Personne, qui donne les informations courantes d'une religieuse : nom, prénom, date de naissance, etc.
- Histoire, qui donne les informations familiales;
- Religion, qui donne les informations sur sa vie religieuse.

Quand j'ajoute une religieuse, l'information doit donc s'ajouter dans les trois tables. J'ai un formulaire qui permet d'ajouter un enregistrement dans les trois tables à partir des informations d'une autre table (Novice).

Tout fonctionnait parfaitement depuis des années. Mon problème c'est que depuis que j'utilise Access 2016, le code VBA du bouton d'ajout du formulaire ne fonctionne plus. Je reçois le message que je ne peux ajouter un enregistrement dans la table Personne, car un enregistrement est requis dans la table Histoire.

Je ne comprend pas pourquoi cela fonctionnait sous Access 2010, et que ça ne marche plus sous Access 2016. Je n'avais pas touché au code VBA, ni aux relations entre les tables.

J'utilise des recordsets pour copier les informations dans chacune des tables et une fonction « Addprofesse » avec la méthode Addnew pour ajouter le numéro de matricule que je demande à l'utilisateur.

Voici un extrait du code :

Private Sub Ajoutprofesse
  • Déclarations


Set bds = CurrentDb
Set rst = bds.OpenRecordset("SELECT * FROM PERSONNE" & _
" WHERE ((PERSONNE.NUM) < 90000)" & _
" ORDER BY PERSONNE.NUM DESC;", dbOpenDynaset)
  • Ici, il y a le message demandant le numéro de matricule à l'utilisateur.


rst.MoveFirst
Notemp = InputBox(Message, Titre)
If Notemp = "" Then
rst.Close
bds.Close
Exit Sub
Else
Nopers = Notemp
End If

Addprofesse rst, Nopers, Nompers

With rst
.Bookmark = .LastModified
.Edit
!PRENOM = Prenompers
!DATE_NAIS = Nz(Me!DATE_NAIS)
!DATE_TEMPO = Nz(Me!DATE_TEMPO)
!PROV_ACT = Me!PROV_ACT
!Remarque = Nz(Me!REM_CAND)
.Update
End With

rst.Close

Set rst = bds.OpenRecordset("SELECT * FROM HISTOIRE;", dbOpenDynaset)

Addprofesse rst, Nopers, Nompers

With rst
.Bookmark = .LastModified
.Edit
!ASS_SOC = Nz(Me!ASS_SOC)
!ASS_MAL = Nz(Me!ASS_MAL)
!VILLE_NAIS = Nz(Me!VILLE_NAIS)
  • Autres champs

.Update
End With

rst.Close

Set rst = bds.OpenRecordset("SELECT * FROM RELIGION;", dbOpenDynaset)

Addprofesse rst, Nopers, Nompers
  • Suite du code de la procédure Ajoutprofesse pour l'ajout des informations dans la table Religion.


J'ai essayé de créer des recordsets avec un nom spécifique à chaque table pour que je puisse les mettre avant le « rst.Close » du recordset lié à la table PERSONNE, afin d'ajouter tout de suite le nouveau matricule qui est maintenant ajouté dans la table Personne, mais j'ai eu le même message d'erreur.

Merci de me conseiller, car je ne comprend vraiment pas pourquoi cela ne fonctionne plus et je n'ai pas envie d'entrer toutes les données à la mitaine dans les trois tables.

Cordialement!

1 réponse

yg_be Messages postés 22791 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 mai 2024 1 467
20 mars 2021 à 09:55
bonjour,
le plus simple serait que tu partages ton fichier, même sans les données.

merci d'utiliser les balises de code quand tu partages du code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

sur quelle ligne de code l'erreur se produit-elle?

je suis étonné que tu utilises une requête avec un critère ((PERSONNE.NUM) < 90000) pour faire des insertions dans la table.

si tu fais une insertion "à la mitaine" dans la table Personne, as-tu le même message d'erreur?

je suppose que, dans Addprofesse, tu fais addnew et update.
tu te retrouves donc à faire:
addnew
(remplir quelques champs)
update
bookmark=
edit
(remplir quelques champs)
update

je suggère de faire plutôt:
addnew
(remplir quelques champs)
(remplir quelques champs)
update


peut-être suffit-il de changer l'ordre des tables, de d'abord créer l'enregistrement dans la table histoire?

as-tu la possibilité de tester avec une version antérieure de Access, pour confirmer ton hypothèse que le soucis est lié au changement de version?

si le soucis est lié au changement de version, je suppose que, précédemment, Access ne vérifiait les contraintes entre les tables qu'à la fin de l'exécution du programme, tandis qu'il les vérifierait maintenant dès l'insertion.

quand tu as testé avec des recordset spécifiques, je suppose que tu as donc regroupé tous les close. à quelle ligne le message d'erreur était-il généré, dans ce cas-là?
0
yg_be Messages postés 22791 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 17 mai 2024 1 467
20 mars 2021 à 10:42
utilises-tu DAO?
dim rst as dao.recordset
?

si oui, j'essaierais peut-être ceci:
Sub '...
'début du code
DAO.DBEngine.BeginTrans
On Error GoTo tran_Err
' mise à jour des tables
DAO.DBEngine.CommitTrans
' suite du code
Exit Sub
tran_Err:
    DAO.DBEngine.Rollback
    MsgBox "Transaction failed. Error: " & err.Description
End Sub

je n'ai pas testé, j'imagine que cela pourrait encourager Access à "regrouper" les trois insertions et à ne vérifier les contraintes qu'après les trois insertions.
0