2010-08-27 5 views
1

Dans ms-access 2007, j'essaye de créer un formulaire pour une table. cette table a des clés étrangères de 2 tables parentes. donc je pensais que je ferais de ces champs une recherche. mais je ne pouvais pas créer une seule recherche pour chaque table parente car ce sont des clés composites.Zone de liste déroulante MS-Access non liée dans DataSheet?

J'ai décidé de créer une requête dans laquelle pour chacune de ces tables parent et la table enfant avec un champ supplémentaire pour chaque clé composite. Cela fonctionne correctement avec un formulaire normal utilisant un ComboBox non lié ... mais le ComboBox non lié ne fonctionne pas dans un sous-formulaire DataSheet. Lorsque j'apporte des modifications à une zone de liste déroulante dans le code de sous-formulaire, elles sont également appliquées à toutes les autres zones de liste déroulantes dans la même colonne.

Mes questions:

  • est-il un moyen de changer les valeurs de la ComboBox non liée individuelles?

  • Existe-t-il un contrôle différent que je devrais utiliser autre que ComboBox ou le sous-formulaire DataSheet?

  • Quel est le travail normal pour cette situation?

I ne peut pas se lier du ComboBox parce que le champ de la requête est calculé/une expression comme je.

Répondre

0

Les formulaires et fiches techniques en continu ne fonctionnent pas bien pour l'édition dans les situations où les listes déroulantes doivent être modifiées conditionnellement. Le problème est que si vous utilisez l'événement OnCurrent pour définir la source de la liste déroulante de la zone de liste déroulante, il sera OK pour cette ligne, mais masquera les valeurs stockées pour les autres lignes.

La solution est de ne jamais utiliser de formulaires/fiches de données continues pour éditer des données quand c'est le cas (je ne les utilise pratiquement jamais pour l'édition, en fait). Vous pouvez créer deux sous-formulaires, un sous-formulaire continu/de feuille de données qui fonctionne comme une liste et un sous-formulaire de détail qui affiche un enregistrement. Rendez le sous-formulaire de liste non modifiable et la sous-forme de détail modifiable. Vous pouvez lier les deux en utilisant la propriété Link Child/Link Master du contrôle de sous-formulaire de détail et le définir sur le PK du sous-formulaire de liste. !

Si votre liste sous-formulaire est moi Liste et vos détails Me est le formulaire et le champ PK est MyID, vos propriétés de lien pour le sous-formulaire de détail seraient:

Master: Me!List.Form!MyID 
    Child: MyID 

Lorsque vous passez à un autre enregistrer dans le formulaire de liste, il sera automatiquement chargé dans le formulaire enfant. Toute modification apportée au détail précédemment affiché sera sauvegardée avant le départ de l'enregistrement.

1

je suis tombé sur une forme de ce problème moi-même, pour le bien de la postérité:

Bien que généralement, les conseils « Ne pas utiliser les formulaires/datasheets continue dans cette situtation » est le meilleur conseil ... Il est possible de contourner cela. Toutefois, l'accès ne vous permet pas de mettre à jour la valeur d'un seul contrôle sur une feuille de données. Ce qui peut être utilisé dans ce cas est une table temporaire, qui peut, lorsqu'elle est utilisée comme une source d'enregistrements, devenir la valeur de ces contrôles. Vous devrez repeupler la table, et requery les contrôles (requerying le formulaire entier devrait fonctionner aussi bien) chaque fois que le calcul doit changer, cependant. En outre, si vous activez la modification sur les contrôles, vous devrez écrire un VBA sur chaque contrôle pour gérer l'événement de mise à jour (Avant la mise à jour) et exécuter votre propre requête pour mettre à jour les tables source, pas simplement la table temporaire. Agaçant de faire peut-être, mais efficace.

Il y a un autre possibillité, qui peut également fonctionner, mais je n'ai pas essayé de faire quelque chose de tout à fait comme moi-même. La rowsource d'une zone de liste déroulante peut être très complexe, il est donc probable que vous n'avez pas besoin de mettre à jour les zones de liste déroulantes avec VBA. La rowsource peut dépendre d'autres contrôles (comme une autre combobox) en utilisant la syntaxe Me.Form! ControlName ou Forms! FormName! ControlName, ce qui vous permettra de former la clé composite. Bien sûr, vous pouvez également sélectionner des requêtes avec une source de rangées. Ce qui est plus intéressant, c'est que les requêtes peuvent référencer les contrôles sur votre formulaire, à condition que le formulaire soit ouvert, et vous devriez pouvoir le modifier avec VBA si vous le devez. Entre les deux, vous devriez pouvoir forcer l'accès, les coups de pied et les cris, afficher les données que vous souhaitez, même sur une feuille de données, et permettre à l'utilisateur de modifier ces données (mais seulement si vous le souhaitez à) et en utilisant l'événement BeforeUpdate, faites glisser les données modifiées vers la table d'où il provient.

Questions connexes