Bonjour à toutes et tous,
Je pensais poster une question pour un problème (lire infra) et puis la solution est venue...
En fait, je souhaitais pouvoir sélectionner pour chaque ligne d'un sous-formulaire en continu, une valeur dans une première zone de liste déroulante (ZDL) et en fonction de celle-ci, la seconde ZDL aurait d'abord présenté les valeurs liées puis le reste des autres valeurs.
Après pas mal d'essais et errances, je viens d'y arriver, aidé par des informations obtenues sur ce site et ma question peut se transformer en contribution qui pourrait aider d'autres développeurs.
Utilisant Access 2010 (mais rien n'empèche de voir pour les autres versions) pour mon application personnelle "ACHATS", j'ai la table "Dépense" dont la clef est "dDépens_K" et la table subordonnée "Ligne" dont la clef est composée de "dDépens_Kn" (lié 1 à plusieurs à "dDépens_K") et "oLigne_K".
Pour chaque ligne, je dois préciser la Nature et l'Usage, qui dans mon cas particulier, me sont utiles pour établir et suivre mon budget pour la rénovation d'un bâtiment. Dans la majorité des cas, un Usage est sélectionné en fonction de la Nature. Par ex. pour la Nature = "10, Outils", il y a plusieurs Usages "1010, Outils électriques", "1020, Outils de peinture", etc. Certains Usages ne sont pas liés à une Nature précise (comme "6090 Divers divers").
Pour gèrer mes données, le formulaire "frmDépense" permet de sélectionner la Dépense à traiter et d'en afficher les lignes liées dans un sous-formulaire "sfrmLigne", contenu dans le contrôle "ctlSFrmLigne", avec les champs liés père : "dDépens_K" et fils : "dDépens_Kn".
Le sous-formulaire est en continu, chaque ligne ayant 2 ZDL : "cboNature" pour la Nature et "cboUsage" pour l'Usage.
Dans la requête "qscboUsage" alimentant "cboUsage", j'ai placé un champ calculé, non visible et premier trié en croissant :
Champ : TRI: VraiFaux(([Forms]![frmDépense]![sfrmLigne].[Form]![cboNature]>0) Et ([Forms]![frmDépense]![sfrmLigne].[Form]![cboNature]<100) Et (Int([iUsage_K]/100)=[Forms]![frmDépense]![sfrmLigne].[Form]![cboNature]); Vrai; Faux)
Cela fonctionne et même mieux qu'un simple filtre lors de mes étapes préliminaires. D'avance, je remercie celui ou celle qui m'indiquerait des améliorations à apporter ou des avis sur les essais précédents.
En effet ma première étape fut de filtrer les Usages en fonction de Nature, mais alors je ne pouvais sélectionner d'autres Usages. Dans la requête "qscboUsage", j'ai utilisé un champ calculé :
1 2
| Champ : NatID: Int([iUsage_K]/100)
Critères : Forms![frmDépense]![sfrmLigne].[Form]![cboNature] |
Cela fonctionnait plus ou moins bien mais j'avais des problèmes d'affichage incomplet : seules certaines lignes affichent l'Usage, les autres ont une ZDL vide. Dès que je place le curseur sur un champ de cette ligne, la ZDL affiche correctement ses informations. Et les lignes (in)complètes sont différentes dès que je sélectionne un champ dans une autre ligne. J'ai quand même tenté ma formule Filtre+Tri qui n'a pas ce problème d'affichage. Quelqu'un peut-il m'expliquer ?
Pour information "A Ne Pas Faire", j'ai eu plusieurs essais infructueux où j'obtenais pour chaque ligne de la dépense une question du style requête paramétrée avec un libellé comme :
Formulaires!frmDépense!ctlSFrmLigne.cboNature
et parfois la fermeture immédiate du formulaire sans autre avis. J'ai fini par utiliser la bonne syntaxe en incluant ".[Form]" et en utilisant le nom du sous-formulaire au lieu du nom du contrôle le contenant.
Syntaxes ne fonctionnant pas :
Forms]![frmDépense]![ctlSFrmLigne]![cboNature] (pas de [Form])
Forms]![frmDépense]![ctlSFrmLigne].[cboNature] (idem et un point au lieu de "!")
Forms![frmDépense]![ctlSFrmLigne].[Form]![cboNature] (usage du nom du contrôle au lieu du nom de formulaire)
Merci de m'avoir lu...
Michel-H.
Partager