FAQ MS-Access
FAQ MS-AccessConsultez toutes les FAQ
Nombre d'auteurs : 140, nombre de questions : 926, dernière mise à jour : 15 juin 2021
- Comment interdire la manipulation d'enregistrements dans un formulaire dépendant ?
- Comment interdir les modifications des données d'un sous-formulaire ?
- Comment empêcher Access d'enregistrer de lui-même les modifications/ajouts d'enregistrements du formulaire ?
- Comment empêcher la mise à jour/l'ajout des données d'un formulaire dépendant ?
- Comment fait-on pour un avoir un message de confirmation avant sauvegarder un enregistrement modifié ?
- Comment supprimer l'enregistrement en cours dans un formulaire dépendant ?
- Sauvegarde de l'enregistrement en cours par le code, après modification/ajout d'un enregistrement.
- Comment mettre à jour des données calculées d'une table depuis un formulaire ?
Comment interdire les :
Modifications :
Me.AllowEdits
=
False
Ajouts :
Me.AllowAdditions
=
False
Suppressions :
Me.AllowDeletions
=
False
Une autre possibilité est définir la propriété du Recordset du formulaire à Instantané.
Me.sF_SousForm.Form.AllowEdits
=
False
Il ne faut pas faire un formulaire lié.
Méthode
- Créer formulaire déconnecté
- Créer un Recordset
- Afficher les données du Recordset dans le formulaire
- Faire autant de boutons que d'actions dans votre formulaire (Validation, Suppression, Suivant, Précédent...). À chaque bouton correspond bien sûr une action (Requête de suppression, d'ajout...).
Pour qu'Access n'enregistre pas les modifications faites dans un formulaire, il faut utiliser l'événement BeforeUpdate et y placer la ligne suivante :
Cancel =
True
Il faut mettre le message de confirmation sur l'événement "BeforeUpdate" du formulaire :
Private
Sub
Form_BeforeUpdate
(
Cancel As
Integer
)
If
MsgBox
(
"Voulez-vous confirmer la modification"
, vbQuestion
+
vbYesNo
, "CONFIRMATION"
) =
vbNo
Then
Me.undo
Cancel =
true
End
if
End
Sub
Voici le code généré par Access à l'aide de l'assistant de création de bouton.
Private
Sub
btnSuppr_Click
(
)
On
Error
GoTo
Err_btnSuppr_Click
DoCmd.DoMenuItem
acFormBar, acEditMenu, 8
, , acMenuVer70
DoCmd.DoMenuItem
acFormBar, acEditMenu, 6
, , acMenuVer70
Exit_btnSuppr_Click
:
Exit
Sub
Err_btnSuppr_Click
:
MsgBox
Err
.Description
Resume
Exit_btnSuppr_Click
End
Sub
Vous devinerez donc que ce sont les lignes suivantes qui suppriment l'enregistrement :
DoCmd.DoMenuItem
acFormBar, acEditMenu, 8
, , acMenuVer70
DoCmd.DoMenuItem
acFormBar, acEditMenu, 6
, , acMenuVer70
Access n'enregistre les modifications ou les nouvelles données qu'après changement d'enregistrement.
Voici le code permettant d'obliger Access à sauvegarder les modifications portées à l'enregistrement actuel :
DoCmd.RunCommand
acCmdSaveRecord
Pour exécuter ce code, il faut activer la référence : Microsoft DAO 3.x Object Library.
L'événement Form_Error (Sur erreur) est levé à chaque erreur du formulaire. C'est donc dans cet événement que va se dérouler le traitement de correction.
Étape 1 : vérifier l'erreur qui est levée. Celle qui nous concerne est 3022, risque de doublons. Étape 2 : on récupère le jeu de données du formulaire (puisque c'est ici que figure la quantité déjà validée). Étape 3 : on se positionne sur le bon enregistrement (en fonction de numCommande et NumProduit). Étape 4 : si l'enregistrement existe (normalement il existe sinon l'erreur n'aurait pas eu lieu, mais on n'est jamais assez prudent), dans ce cas on met à jour sa quantité. C'est à dire : quantité avant + nouvelle quantité. Étape 5 : on annule la saisie de l'utilisateur, on recharge le formulaire et enfin, on dit à VBA que l'erreur a été corrigée (acDataErrContinue).
Private
Sub
Form_Error
(
DataErr As
Integer
, Response
As
Integer
)
Dim
oRst As
DAO.Recordset
If
DataErr =
3022
Then
Set
oRst =
Me.RecordsetClone
With
oRst
.FindFirst
"NumProduit="
&
Me.NumProduit
&
" AND NumCommande="
&
Me.NumCommande
If
Not
.NoMatch
Then
.Edit
.Fields
(
"Qte"
).Value
=
.Fields
(
"Qte"
) +
Me.Qte
.Update
Me.Undo
Me.Requery
Response
=
acDataErrContinue
End
If
End
With
Set
oRst =
Nothing
End
If
End
Sub
Ici la structure de ma table était : NumCommande,NumProduit,Qte.
Les champs du formulaire étaient nommés pareil.
Lien : Définition et manipulation de données avec DAO par Tofalu
Lien : Comment déclarer une référence dans MS Access ?