Si je lis correctement, vous dites que vous avez la principale table parent comme la partie principale de la forme, et que vous voulez les enregistrements enfants présentent sous une forme de sous que vous naviguez autour . Access fonctionne de cette façon par défaut et vous n'aurez pas à écrire de code du tout. En outre, si vous ajoutez des enregistrements enfants au sous-formulaire, la valeur de la clé étrangère sera définie correctement pour vous. Encore une fois, aucun code n'est nécessaire. Donc, construisez un formulaire standard basé sur la table parent principale. Ensuite, vous pouvez construire un formulaire continu Basé sur la table des enfants et déposez-le dans le formulaire principal ci-dessus.
Vous ouvrez ensuite le formulaire principal en mode conception et configurez la feuille de propriétés du sous-formulaire. Dans cette feuille de propriétés, définissez simplement le lien principal et liez les champs enfant. Le maître de lien sera défini sur la clé primaire dans le formulaire principal, et le lien enfant doit être défini = le champ de clé étrangère de la table dans le sous-formulaire.
Une fois que ce qui précède est fait, alors le tout devrait fonctionner sans aucun codage et tout.
Quant à l'enfant d'ajouter un message d'erreur:
En supposant que vous avez un formulaire principal client, l'utilisateur ne peut pas ajouter une commande jusqu'à ce qu'ils naviguent à un nouveau record du client. S'ils ne naviguent pas vers un nouvel enregistrement client, ils modifieront un client existant dans ce formulaire principal. Dans tous les cas, un enregistrement client principal sera toujours ajouté avant même de pouvoir entrer une commande client. Je suppose qu'un utilisateur peut accéder à un enregistrement client vierge, puis passer le curseur (focus) dans le sous-formulaire où les commandes sont et commencer à taper. Même dans ce scénario, un enregistrement client vierge sera ajouté lorsque l'attention se déplace du formulaire client principal au sous-formulaire commandes. (Ainsi, l'interface utilisateur gère l'ajout de l'enregistrement parent lorsque vous utilisez un formulaire principal classique + une configuration de sous-formulaire)
Donc, du point de vue de l'interface utilisateur, cela ne sera pas vraiment possible pour l'utilisateur pour entrer des commandes sans un enregistrement client principal existant déjà. Pour cette raison, vous n'obtiendrez pas un message d'erreur sur l'enregistrement client parent qui n'existe pas. Vous n'allez obtenir ce type d'erreur que si la personne ouvre le formulaire de commande en tant que sous-formulaire, puis essaie d'ajouter un nouvel enregistrement de commande. Dans ce cas, vous obtiendrez un message d'erreur. Par conséquent, je ne vois vraiment pas le besoin de piéger ce message d'erreur. Je ne permettrais pas à l'utilisateur d'ouvrir le sous-formulaire de manière autonome.Si, pour une raison étrange, vous autorisez l'ouverture du sous-formulaire séparément du formulaire principal, ouvrez le formulaire avec additons = false (et encore une fois, vous évitez d'avoir besoin du message d'erreur).
Je suppose que si pour certaines raisons les utilisateurs sont autorisés à ouvrir ce sous-formulaire ou le formulaire de commandes séparément et que vous n'avez pas désactivé les ajouts autorisés, ils pourraient alors accéder à un nouvel enregistrement vide, et signifie que le FK de l'enregistrement client ne serait pas défini correctement. S'il y a des dispositions dans ce formulaire commandes pour sélectionner un client, alors vous pourriez certainement mettre le code suivant dans l'avant l'événement de mise à jour de ce formulaire commandes:
If isnull(foreign key field name goes here) = true then
Msgbox “ you must select a customer before you can enter an order”
Cancel = true
End if
Encore une fois dans un sens ne sont pas piéger vraiment le message d'erreur qu'un enregistrement enfant est sur le point d'être ajouté sans l'enregistrement parent existant. Nous utilisons simplement l'interface d'interface utilisateur pour indiquer à l'utilisateur de faire une action qui empêchera ce message d'erreur de se produire en premier lieu.
Merci pour cela! J'ai déjà travaillé avant, mais j'ai besoin de m'entraîner. Existe-t-il un moyen d'empêcher l'utilisateur d'ajouter un enregistrement à, dans ce cas, des commandes, lorsqu'il n'y a pas une seule ligne client? L'accès déclenche une erreur (je ne me souviens pas des détails), ne puis-je pas remplacer l'erreur d'Access par mon propre message d'erreur/boîte? – dotnetdev
Si la clé étrangère de la table B est requise, le moteur de base de données doit générer une erreur. Sur le formulaire, il existe un événement Form_Error qui doit déclencher toutes les erreurs de données. – Mark3308