Je tenais tout d'abord à remercier les responsables pour ce site et pour la mine d’or qu’il contient en terme de conseils, tutos, aides, etc. Merci aussi à vous tous, les contributeurs, qui l'alimentez par l'aide que vous apportez au fil du temps. Grâce à nombre d’entre vous, j’ai pu me lancer dans la mise en place de différents projets autour de moi. Débutant avec l’outils LibreOffice Base, je ne suis pas un habitué des bases de données (ni de SQL ou code de programmation basic).
Je mets en place une base de données pour une association qui collabore avec des [Structures] avec lesquelles elle réalise des [Captations]. Chaque [Année], des [Actions] sont mises en place avec chacune de ces [Structures] et des [Séries] de [Productions] découlent des [Captations].
Afin de faciliter la lisibilité et le suivi des actions menées, j’ai logiquement pensé à utiliser Base pour mettre en oeuvre tout cela avec les tables que vous devinez dans le paragraphe précédent.
Dans ma base de données, j’ai créé des formulaires pour aider les différents utilisateurs à y enregistrer l'ensemble des éléments. Le tout semble opérationnel. À l’usage, une partie me semble perfectible, mais cela dépasse mes connaissances. J’aimerais que dans mes formulaires, les zones de liste puissent être utilisées pour filtrer le contenu des suivantes. C'est le cas dans mon formulaire consacré aux productions "Form-Production". Afin qu'il soit un peu plus élaboré, j'ai commencé à y travailler.
Selon les relations de table, chaque production est liée à :
- une action,
- une série,
- une année,
- une structure
- une captation (également appelée par endroit "enregistrement", désolé pour cette erreur de débutant)
Grâce à votre site, j'ai pu mettre en oeuvre des listes déroulantes pour faciliter la démarche. Et, grâce au travail de Pierre-Yves Samyn ici, j’ai été en mesure de configurer, dans mon formulaire Form-Production, des listes liées à la table T_Structures, afin filtrer les autres listes déroulantes qui suivent. Cependant, j’aimerais ajouter un deuxième critère de filtrage lié, cette fois-ci, à la table T_Annees (à laquelle sont liées les actions, les séries, les captations et les productions, mais pas les structures).
En clair, dans l’exemple ci-dessous (cf PJ), je lance le formulaire MENU et je clique sur le bouton « Production » qui lance l’ouverture du formulaire Form-Production sur un nouvel enregistrement (merci à ceux qui m'ont aidé à programmer cela). Je remplis ou modifie les données d’une [Production], puis je choisis la [Structure] à laquelle elle est liée dans la liste déroulante. Alors, le filtrage s’effectue dans [Actions], [Séries] et [Captations] selon la structure choisie. Ensuite, je choisis l’[Année] qui concerne la production, et j’aimerais que cela puisse ajouter un filtre aux [Actions], [Séries] et [Captations] pour que n’apparaissent dans ces listes déroulantes que les ‘enregistrements de table’ qui concernent à la fois la structure et l'année choisies.
Comment me recommandez-vous procéder ? Est-il possible d’adapter le code de Pierre-Yves Samyn pour y parvenir ?
J’ai recherché sur différents supports, mais il ne me semble pas que cela ait été demandé. Évidemment, si le sujet a déjà été évoqué, et que j’ai manqué ça, merci de m’indiquer les mots-clés pour que je le retrouve.
(EDIT : Il y a bien cela, mais la 'solution' n'est pas apportée et je ne peux pas adapter cela à ma situation.)
Pour mieux comprendre, j’ai recréé une base de données (ci-dessous) utilisant les éléments mentionnés plus haut et qui peut servir à faire des tests.
J’ai essayé d’être aussi clair que possible et espère que vous comprendrez ma demande. J’espère pouvoir lire vos conseils et recommandations.
Merci d’avoir lu et bonne continuation à chacun.
SOLUTION
Afin de faire gagner du temps aux autres utilisateurs qui chercheront des informations sur les listes déroulantes en cascade ou les listes liées, voici la solution apportée par Rafkus_pl, merci à lui !![]()
En ajoutant à vos macros et en adaptant le code ci-après à votre table :NB: Ce code contient une fonction qui peut être appelée par différentes macros qui en auraient besoin sans avoir besoin de saisir à nouveau la fonction.Code : Tout sélectionner
Sub Liaison_Structures_Annees 'd'après le code partagé ici : https://forum.openoffice.org/fr/forum/viewtopic.php?p=383695#p383695 DIM oForms As Object DIM lst_SourceA As Object, lst_SourceB As Object DIM lst_DestA As Object, lst_DestB As Object, lst_DestC As Object DIM sFiltre As string oForms = ThisComponent.DrawPage.Forms.GetByName("MainForm") lst_SourceA = oForms.getByName("lstStructure") lst_SourceB = oForms.getByName("lstAnnee") sFiltre = condition_listbox(lst_SourceA, "", """ID_Structure"" = ") sFiltre = condition_listbox(lst_SourceB, sFiltre, """ID_Annee"" = ") lst_DestA = oForms.getByName("lstAction") lst_DestA.ListSource() = array("SELECT ""NomAction"", ""ID"" FROM ""T_Actions"" " & sFiltre & " ORDER BY ""NomAction"" ASC") lst_DestA.Refresh lst_DestB = oForms.getByName("lstSerie") lst_DestB.ListSource() = array("SELECT ""NomSerie"", ""ID"" FROM ""T_Series"" " & sFiltre & " ORDER BY ""NomSerie"" ASC") lst_DestB.Refresh lst_DestC = oForms.getByName("lstCaptation") lst_DestC.ListSource() = array("SELECT ""NomCaptation"", ""ID"" FROM ""T_Enregistrements"" " & sFiltre & " ORDER BY ""NomCaptation"" ASC") lst_DestC.Refresh End Sub Function condition_listbox(oListBox as Object, sFiltr as string, sCondition as string)as string dim var_Id as string if oListBox.SelectedItems(0) > 0 then var_Id = oListBox.valueItemList(oListBox.SelectedItems(0)) if sFiltr = "" then sFiltr = " WHERE " else sFiltr = sFiltr & " AND " condition_listbox = sFiltr & sCondition & Var_Id else condition_listbox = sFiltr end if end Function
Désignez ensuite cette macro dans votre formulaire aux fonctions ci-dessous :
- le formulaire lui-même : dans les "Propriétés du formulaire" -> choisir l'onglet "Événements" -> affectez la macro à l'événement "Après le changement d'enregistrement" ;
- la/les liste(s) "source" : en passant par exemple par le "Navigateur de formulaire" -> choisir la liste concernée -> clic-droit "Propriétés" -> dans les "Propriétés : Zone de liste" -> choisir l'onglet "Événements" -> affectez la macro à l'événement "Modifié(es)" (reproduire ces étapes pour toutes les listes sources concernées).
Ci-joint, une base dans laquelle le formulaire utilise le code donné plus haut avec deux listes "source" et trois listes "de destination" (qui seront impactées par les listes "source". En espérant que ça sera utile à d'autres !
À bientôt !



