PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV (précédentes versions) → Liaison Table / Combos en cascade
Liaison Table / Combos en cascade
Débuté par David, 21 jan. 2020 15:33 - 24 réponses
Membre enregistré
66 messages
Popularité : +0 (2 votes)
Posté le 21 janvier 2020 - 15:33
Bonjour

J'ai un problème de liaison entre une Table sur une fenêtre et des combos sur une autre fenêtre.

Je sélectionne une ligne dans ma table et je clic sur un bouton "modifier" ce qui m’amène à une autre fenêtre pour modifier ma fiche. Jusqu’à maintenant, il n'y avait pas de problème car j'avais des Champs de saisie dans cette fenêtre.

J'ai remplacé ces champs de saisie par des combos alimentés par des requêtes.

Tout fonctionne parfaitement sur les Combos alimentés par une Requête simple.

Le problème vient des 3 Combos en cascade (Département, Ville, Adresse)
Je récupère bien dans le Combo "Département" mais pas dans les 2 autres.

Merci de votre éclairage !

David
Membre enregistré
3 845 messages
Popularité : +227 (347 votes)
Posté le 22 janvier 2020 - 09:59
Bonjour,
Tes combos sont-ils bien reliés à quelque chose ? (option liaison dans ton champ colonne)
La requête a-t-elle été ré exécutée après la modif
TableAffiche a-t-il été utilisé

Ce sont les 3 cas les plus courants

--
Il y a peut être plus simple, mais, ça tourne
Message modifié, 22 janvier 2020 - 10:03
Membre enregistré
66 messages
Popularité : +0 (2 votes)
Posté le 22 janvier 2020 - 10:29
Bonjour Voroltinquo

Mes 3 Combos sont reliés à mon fichier BDAtelier (liaison)
Combo_Département relié à BD_Atelier==>Département
Combo_Ville relié à BD_Atelier==>Ville
Combo_Adresse relié à BD_Atelier==>Adresse

et dans la rubrique "contenu" il y a la requête de chaque combo.

Mes 3 requêtes fonctionnent bien en mode test

Le code de mon bouton "modifier" est
// Une ligne est-elle sélectionné ?
SI TableSelect(TABLE_BDAteliers)=-1 ALORS RETOUR

// Ouverture de la fiche du fichier en mode modification
Ouvre(FEN_TABLEAJOUTAteliers)

// Rafraichissement de la table
TableAffiche(TABLE_BDAteliers,taCourantEnreg)


Merci de l'aide apportée
Membre enregistré
3 845 messages
Popularité : +227 (347 votes)
Posté le 22 janvier 2020 - 11:09
David a écrit :
Mes 3 requêtes fonctionnent bien en mode test

Elles ont beau fonctionner en mode test, si tu ne les exécutes pas, tu as des problèmes
En fonction du mode de remplissage de ton champ table :
REQ_RequêteRemplissage.pParam1=ValeurParamètre1
...
REQ_RequêteRemplissage.pParamn=ValeurParamètren
HExécuteRequête(REQ_RequêteRemplissage)
TableAffiche(TABLE_TableRemplieParRequête)


ou

REQ_RequêteRemplissage.pParam1=ValeurParamètre1
...
REQ_RequêteRemplissage.pParamn=ValeurParamètren
TableAffiche(TABLE_TableRemplieParRequête,taRéExécuteRequete)


--
Il y a peut être plus simple, mais, ça tourne
Message modifié, 22 janvier 2020 - 11:10
Membre enregistré
66 messages
Popularité : +0 (2 votes)
Posté le 22 janvier 2020 - 12:21
Merci mais je suis perdu !

SI TableSelect(TABLE_BDAteliers)=-1 ALORS RETOUR

Ouvre(FEN_AJOUTAteliers)

REQ_DEPARTEMENT=TABLE_BDAteliers.COL_DEPARTEMENT,taCourantEnreg)
REQ_VILLE.pExtraitVille=TABLE_BDAteliers.COL_VILLE,taCourantEnreg)
REQ_ADRESSE.pExtraitAdresse=TABLE_BDAteliers.COL_ADRESSE,taCourantEnreg)

HExécuteRequête(REQ_DEPARTEMENT)
HExécuteRequête(REQ_VILLE)
HExécuteRequête(REQ_ADRESSE)

TableAffiche(TABLE_BDAteliers.COL_DEPARTEMENT,taCourantEnreg)
TableAffiche(TABLE_BDAteliers.COL_VILLE,taCourantEnreg)
TableAffiche(TABLE_BDAteliers.COL_ADRESSE,taCourantEnreg)


Ma table est remplie par "contenu"==>"Fichier parcouru"==>BD_Ateliers
Membre enregistré
3 845 messages
Popularité : +227 (347 votes)
Posté le 22 janvier 2020 - 12:53
Peut on avoir une copie écran de ton analyse ?
Le code des requêtes qui alimentent les combos ?
Ce que tu veux obtenir et ce que tu obtiens réellement ?
Tout est en amont et non lors de l'affichage.

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
66 messages
Popularité : +0 (2 votes)
Posté le 22 janvier 2020 - 14:51


Membre enregistré
66 messages
Popularité : +0 (2 votes)
Posté le 22 janvier 2020 - 15:00
Combo DEPARTEMENT
REQ_VILLE.pExtraitVille=COMBO_DEPARTEMENT..Valeur
HExécuteRequête(REQ_VILLE)
ListeAffiche(COMBO_VILLE)


Combo VILLE
REQ_ADRESSE.pExtraitAdresse=COMBO_VILLE..Valeur
HExécuteRequête(REQ_ADRESSE)
ListeAffiche(COMBO_ADRESSE)


Pas de code pour COMBO ADRESSE
Membre enregistré
66 messages
Popularité : +0 (2 votes)
Posté le 22 janvier 2020 - 15:07


Membre enregistré
66 messages
Popularité : +0 (2 votes)
Posté le 22 janvier 2020 - 15:21
Impossible d'envoyer le résultat obtenu (problème upload)

Sur une autre feuille 3 Combos. Il n'y a que le Combo Département qui reçois
Membre enregistré
3 845 messages
Popularité : +227 (347 votes)
Posté le 22 janvier 2020 - 22:17
Dans un premier temps il n'y a pas de liaison, dans un deuxième temps il y a des redondances, l'adresse n'a rien faire dans la ville.
Si on a la ville, on a le département, mais ils ne doivent pas être dans la même table. Dans ta table Département, tu ne dois avoir que la colonne département ainsi que son n° qui pourra servir de PK. Dans au niveau de la ville tu dois avoir le nom de la ville et son CP, éventuellement relié au département, enfin au niveau de la table Atelier, la ville et le département sont inutiles, ils sont remplacés par la liaison Ville-Atelier

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
66 messages
Popularité : +0 (2 votes)
Posté le 22 janvier 2020 - 23:01
Merci de l'aide mais trop compliqué pour moi à ce jour.
Je vais remettre mes champs de saisie.
Membre enregistré
66 messages
Popularité : +0 (2 votes)
Posté le 24 janvier 2020 - 14:30
Re à tous !

Je me suis remis sur ce cas car j'aimerais vraiment comprendre ce problème.
J'ai donc créé un nouveau projet "Essais" et je met ci-dessous tout les éléments !

Pour le Bouton "Nouveau"
Tout fonctionne parfaitement

Pour le Bouton "Modifier"
Après avoir sélectionné un élément dans la Table et cliqué sur "Modifier
Il n'y a QUE la Combo "DEPARTEMENT" qui est remplie avec la bonne valeur.
Les autres Combos sont vides.

J'aimerais que les 3 Combos soit remplies et que je puisse changer si besoin

Merci de l'éclairage apportée.

David

Dans la première fenêtre "FEN_TABLEATELIERS"

- Une Table "TABLE_BDAteliers" avec remplissage par fichier "BD_Ateliers" Rubrique mémorisée et Rubrique de parcours sur "ID-Ateliers"

FichierVersEcran()


- Un bouton "Nouveau"

FEN_TABLEATELIERS..Visible=Faux

HRAZ(BD_Ateliers)
SI Ouvre(FEN_AJOUTAteliers) ALORS
TableAffiche(TABLE_BDAteliers,taCourantPremier)
FIN


- Un bouton "Modifier"

FEN_TABLEATELIERS..Visible=Faux
SI TableSelect(TABLE_BDAteliers)=-1 ALORS RETOUR
Ouvre(FEN_AJOUTAteliers)


Dans ma deuxième fenêtre
FichierVersEcran()
MaFenêtre..ValeurRenvoyée = Faux
SI BD_Ateliers..NouvelEnregistrement = Vrai ALORS

BTN_Modifier..Libellé = "Valider"

COMBO_VILLE..Visible=Faux
COMBO_ADRESSE..Visible=Faux
FIN


- un Combo "COMBO_DEPARTEMENT"
REQ_EXTRAIRE_VILLE.pExtraitVille=COMBO_DEPARTEMENT..Valeur
HExécuteRequête(REQ_EXTRAIRE_VILLE)
ListeAffiche(COMBO_VILLE)

COMBO_VILLE..Visible=Vrai
ComboOuvre(COMBO_VILLE)


Liaison ==> MonoFichier==>Analyse==>"BD-Ateliers"==>"DEPARTEMENT"
Contenu ==> Fichier/Requête ==> Accès direct ==>Fichier parcouru "REQ_DEPARTEMENT" ==> Rubrique Affichée et mémorisée "DEPARTEMENT"


- un Combo "COMBO_VILLE"
REQ_EXTRAIRE_ADRESSE.pExtraitAdresse=COMBO_VILLE..Valeur
HExécuteRequête(REQ_EXTRAIRE_ADRESSE)
ListeAffiche(COMBO_ADRESSE)

COMBO_ADRESSE..Visible=Vrai
ComboOuvre(COMBO_ADRESSE)


Liaison ==> MonoFichier==>Analyse==>"BD-Ateliers"==>"VILLE"
Contenu ==> Fichier/Requête ==> Accès direct ==>Fichier parcouru "REQ_EXTRAIRE_VILLE" ==> Rubrique Affichée et mémorisée "VILLE"


- un Combo "COMBO_ADRESSE"
(Pas de code dans ce Combo")

Liaison ==> MonoFichier==>Analyse==>"BD-Ateliers"==>"ADRESSE"
Contenu ==> Fichier/Requête ==> Accès direct ==>Fichier parcouru "REQ_EXTRAIRE_ADRESSE" ==> Rubrique Affichée et mémorisée "ADRESSE"


- un bouton "BTN_Modifier"
EcranVersFichier()
SI BD_Ateliers..NouvelEnregistrement = Vrai ALORS
HAjoute(BD_Ateliers)
SINON
HModifie(BD_Ateliers)
FIN

FEN_TABLEATELIERS..Visible=Vrai

// Ferme la fenêtre
Ferme("",Vrai)


REQ-DEPARTEMENT
SELECT DISTINCT
BD_Départements_Villes_Adresses.DEPARTEMENT AS DEPARTEMENT
FROM
BD_Départements_Villes_Adresses
ORDER BY
DEPARTEMENT ASC


REQ_EXTRAIRE_VILLE
SELECT DISTINCT
BD_Départements_Villes_Adresses.VILLE AS VILLE
FROM
BD_Départements_Villes_Adresses
WHERE
BD_Départements_Villes_Adresses.DEPARTEMENT = {pExtraitVille}
ORDER BY
VILLE ASC


REQ_EXTRAIRE_ADRESSE
SELECT DISTINCT
BD_Départements_Villes_Adresses.ADRESSE AS ADRESSE
FROM
BD_Départements_Villes_Adresses
WHERE
BD_Départements_Villes_Adresses.VILLE = {pExtraitAdresse}
ORDER BY
ADRESSE ASC
Message modifié, 24 janvier 2020 - 14:38
Membre enregistré
66 messages
Popularité : +0 (2 votes)
Posté le 24 janvier 2020 - 14:37


Membre enregistré
66 messages
Popularité : +0 (2 votes)
Posté le 25 janvier 2020 - 14:18
Bonjour Voroltinquo

J'ai regardé cette démo


Elle semble ressembler à ma demande et à ton explication !

Pour mon projet :

Je vais avoir qu'une dizaine de département et 3 ou 4 villes par département et 2 ou 3 adresses par ville.

Il faut donc que je commence par créer des fichiers reliés mais je ne vois pas qu'elles rubriques mettre et combien de fichiers.

Et si j'enlève certaines rubriques de mon fichier BD_Atelier, je vais perdre des informations déjà enregistrées (200) ?

Bref j'ose pas trop car j'ai peur de m'aventurer sur un terrain glissant !

Sinon actuellement tout fonctionne sauf l'affichage de la ville et Adresse en mode Modification à cause de la requête !

Merci de l'éclairage

David
Message modifié, 25 janvier 2020 - 14:19
Membre enregistré
66 messages
Popularité : +0 (2 votes)
Posté le 26 janvier 2020 - 19:25
Voroltinquo a écrit :
Dans un premier temps il n'y a pas de liaison, dans un deuxième temps il y a des redondances, l'adresse n'a rien faire dans la ville.
Si on a la ville, on a le département, mais ils ne doivent pas être dans la même table. Dans ta table Département, tu ne dois avoir que la colonne département ainsi que son n° qui pourra servir de PK. Dans au niveau de la ville tu dois avoir le nom de la ville et son CP, éventuellement relié au département, enfin au niveau de la table Atelier, la ville et le département sont inutiles, ils sont remplacés par la liaison Ville-Atelier








Bonjour

Toujours dans la panades avec ce sujet. J'essai plein de chose depuis 2 jours mais j'avance pas. Avec les liaisons ci-dessus, je démarre bien ?
Dans un premier temps, la finalité c'est de faire apparaître dans une Table à 4 colonnes, le nom de l'Atelier, le Département, la ville, l'adresse.

Si je peux avoir de l'aide, pas à pas !

Encore merci
David
Membre enregistré
3 845 messages
Popularité : +227 (347 votes)
Posté le 27 janvier 2020 - 00:33
Je ne comprend pas pourquoi 3 combos. En France, une fois qu'on a la ville on a le département. Quant au adresses, il va falloir répertorier toutes les adresses (certainement via le fichier FANTOIR https://www.collectivites-locales.gouv.fr/mise-a-disposition-gratuite-fichier-des-voies-et-des-lieux-dits-fantoir.)
A l'utilisation ça devient : Je sélectionne mon département qui fait une requête pour aliment la combo ville avec toutes les ville du département, je choisis ma ville qui effectue une requête pour trouver toutes les adresse de la ville. A programmer c'est simple, pour l'utilisateur un peu moins

En supposant que tu veuiiles quand même partir par là, Adresse n'a pas à être liée a département. Qui plus est, ville ne doit pas apparaître dans adresse, simplement la FK c'est le B.A BA des BDD ça.

--
Il y a peut être plus simple, mais, ça tourne
Message modifié, 27 janvier 2020 - 00:44
Membre enregistré
66 messages
Popularité : +0 (2 votes)
Posté le 27 janvier 2020 - 05:43
Bonjour. Merci de la réponse.

> Je ne comprend pas pourquoi 3 combos. En France, une fois qu'on a la ville on a le département.
L'utilisateur ne connaissant ni la ville, et encore moins l'adresse, il commencera par choisir le département dans Combo_Département, puis choisira la ville dans le Combo_Ville et choisira enfin l'adresse dans le Combo_Adresse. (Combos en cascade pour filtrer une table à 4 Colonnes)

Quant au adresses, il va falloir répertorier toutes les adresses via le fichier FANTOIR...

Il n'y aura que une ou deux adresses (3 maxi) dans chaque ville.

> A l'utilisation ça devient : Je sélectionne mon département qui fait une requête pour aliment la combo ville avec toutes les ville du département, je choisis ma ville qui effectue une requête pour trouver toutes les adresse de la ville. A programmer c'est simple, pour l'utilisateur un peu moins
J'ai réussi (avec bien du mal) à le programmer aussi bien en programmation qu'avec des requêtes. Justement je ne vois toujours pas qu'elle méthode je dois garder ! ??

En supposant que tu veuilles quand même partir par là, Adresse n'a pas à être liée a département. Qui plus est, ville ne doit pas apparaître dans adresse, simplement la FK c'est le B.A BA des BDD ça.

Je vais modifier mais si j'ai bien compris, les liaisons servent au moment des créations...Je ne peux pas créer une adresse si j'ai pas la ville. Je ne peux pas créer une ville, si j'ai pas le Département. Et à créer un FK.

Toujours est-il que je suis proche de résultat final puisque comme j'ai noté plus haut :
> Sinon actuellement tout fonctionne sauf l'affichage de la ville et Adresse en mode "MODIFICATION" à cause de la requête !
J'ai donc essayé la méthode par programmation, mais rien ni fait.
Membre enregistré
3 845 messages
Popularité : +227 (347 votes)
Posté le 27 janvier 2020 - 07:07
Détaille un peu le fonctionnement s'il te plait, je ne vois pas la logique.
Nous sommes bien dans une fenêtre de saisie d'information destinées à être enregistrées et non pas dans une fenêtre de recherche
Comment définis-tu une adresse ? Pour moi, c'est un nom de voie, un type de voie et le numéro de l'immeuble dans cette voie (e.g. 123 rue de l'église)
--
Il y a peut être plus simple, mais, ça tourne
Message modifié, 27 janvier 2020 - 07:34
Membre enregistré
66 messages
Popularité : +0 (2 votes)
Posté le 27 janvier 2020 - 15:31
Re

Détaille un peu le fonctionnement s'il te plait, je ne vois pas la logique.
Nous sommes bien dans une fenêtre de saisie d'information destinées à être enregistrées et non pas dans une fenêtre de recherche


Sur une Feuille, après avoir sélectionné un élément dans la Table et cliqué sur "Modifier" j'arrive dans une deuxième fenêtre de saisie avec Champs de saisie et Combos. Pour mon problème, en mode "Modification" les 3 combos devrait être déjà remplis mais l'utilisateur pourrait avoir le choix de sélectionner un autre Département==>Ville==>Adresse (Combo en cascade par requête) et clic sur bouton "modifié" et retour sur la fenêtre Table.

> Comment définis-tu une adresse ? Pour moi, c'est un nom de voie, un type de voie et le numéro de l'immeuble dans cette voie (e.g. 123 rue de l'église)
Une adresse simple : ex "12 rue de l'église"
Membre enregistré
66 messages
Popularité : +0 (2 votes)
Posté le 27 janvier 2020 - 15:39




J’obtiens ce résultat dans la fenêtre saisie. 2 combos ne sont pas remplis à cause des requêtes Combos en cascade je pense !
La fenêtre Table et le code sont sur un sujet plus haut

Merci beaucoup.
Membre enregistré
3 845 messages
Popularité : +227 (347 votes)
Posté le 31 janvier 2020 - 10:43
Ton problème d'affichage vient des liaisons entre tes champs et tes données.
Dans un premier temps revenons au MLD.



La table "Ville" (déjà remplie) peut être importée via l'exemple complet CRM. La clé étrangère ne figure pas dans la table de l'exemple, il est néanmoins aisé de compléter cette colonne via les codes suivants :
Procedure AffecterDpt_Batch()
POUR TOUTE Ville
SI PAS AffecterDpt(Vrai) ALORS
Erreur(HErreurInfo)
SINON
Info("L'affectation s'est bien déroulée")
FIN
FIN


// Résumé : Affecte à une ville son département d’appartenance
// Syntaxe :
//[ <Résultat> = ] AffecterDpt (<bBatch> est booléen)
//
// Paramètres :
// bBatch (booléen) : Vrai : L'affectation est en mode batch
// Faux : L'affectation se fait lors de la "création"" d'une nouvelle ville
// Valeur de retour :
// booléen : Faux : Une erreur est survenue
// Vrai : Tout s'est bien déroulé
FONCTION AffecterDpt(bBatch est un booléen) :booléen
sNoDpt est chaîne

sNoDpt=Gauche(Ville.NDX_CodePostal,2)
SI sNoDpt="97" ALORS //Cas des DOM
sNoDpt=Gauche(Ville.NDX_CodePostal,3)
FIN

//Le département doit exister
SI PAS HLitRecherchePremier(Departement,PK_NoDépartement,sNoDpt) ALORS
SI PAS HErreur() ALORS
HRAZ(Departement)
Departement.PK_NoDépartement=sNoDpt
SI PAS bBatch ALORS
Saisie("Quel est le nom du département?",Departement.AK_NomDepartement)
SINON
Departement.AK_NomDepartement="Département n° "+sNoDpt
FIN
SI PAS HAjoute(Departement) ALORS
RENVOYER Faux
FIN
SINON
RENVOYER Faux
FIN
FIN

//On affecte le n° de département
Ville.FK_Département=sNoDpt
SI HModifie(Ville) ALORS
RENVOYER Vrai
SINON
RENVOYER Faux
FIN


Passons maintenant aux liaisons.
Les valeurs mémorisées des combos sont les différentes PK.

Les combos "Ville" et "Adresse" seront reliés à leur FK dans la table "Localisation". En ce qui concerne le département, il faut utiliser l'option "Multi fichier"



1-Colonne à laquelle le champ est relié
2-3 Relation entre les 2 tables

Le code d'initialisation de la fenêtre est on ne peut plus classique
Procedure FEN_Atelier(gn8NoAtelier est entier sur 8=0)
ModeAffichageFenêtre(gn8NoAtelier)
FichierVersEcran()


Procedure ModeAffichageFenêtre(n8AtelierCherché est entier sur 8)
SI PAS HLitRecherchePremier(Atelier,PK_Atelier,n8AtelierCherché) ALORS
HRAZ(Atelier)
SI n8AtelierCherché<>0 ALORS
ToastAffiche("Atelier non trouvé"+CRLF+"Passage en mode création")
FIN
SINON
HLitRecherche(Localisation,PK_Localisation,Atelier.FK_Localisation)
FIN


Pour une ouverture en mode modification, il suffit de passer PK_Atelier en paramètre
--
Il y a peut être plus simple, mais, ça tourne
Message modifié, 31 janvier 2020 - 10:45
Membre enregistré
66 messages
Popularité : +0 (2 votes)
Posté le 31 janvier 2020 - 20:07
Bonjour Voroltinquo

Merci pour les explications bien détaillées. Je vais créer un nouveau projet pour essayer et comprendre !

David
Membre enregistré
3 845 messages
Popularité : +227 (347 votes)
Posté le 02 février 2020 - 11:44
En parlant de comprendre, je ne comprend toujours pas l'utilité de gérer les adresses. A moins d'avoir une dizaine d'ateliers par adresse ... et encore

--
Il y a peut être plus simple, mais, ça tourne
Membre enregistré
66 messages
Popularité : +0 (2 votes)
Posté le 02 février 2020 - 19:37
Bonjour
Il y a bien une dizaine d'Ateliers pour une même adresse.

Je n'ai pas encore eu le temps ce WE de créer un projet essai.
Je m'y met des que je peux
Merci
David