2009-07-09 4 views
0

Je suis en train de concevoir une petite interface utilisateur Access 2007 avec des tables SQL Server.Certaines questions de programmation 2007 accès sur des formulaires

J'ai un sous-formulaire sur ma page, qui est une feuille de données. Pour chaque enregistrement parent sélectionné (disons la table A, et la table B a une clé étrangère de la table A) dans la vue du formulaire, je veux écrire tous les enregistrements liés dans la feuille de données.

Il ya 5 clients. Chacun a plusieurs ordres. Vous pouvez parcourir les clients dans le formulaire. Mais pour chaque clic sur le bouton suivant, je souhaite afficher toutes les commandes pertinentes dans la feuille de données (la feuille de données me permettra également d'écrire de nouveaux enregistrements).

En outre, dans la feuille de données (imaginez qu'il s'agit de commandes), puis-je définir la valeur PK ID pour qu'elle soit automatiquement identique à celle de l'enregistrement client actuellement affiché?

Merci

Répondre

0

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.

+0

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

+0

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