PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Combo en cascade avec mise à jour bdd
Combo en cascade avec mise à jour bdd
Débuté par Juju, 19 jan. 2018 09:12 - 5 réponses
Membre enregistré
87 messages
Popularité : +4 (4 votes)
Posté le 19 janvier 2018 - 09:12
Bonjour,

J'ai une table principale TABLE1 qui contient ma catégorie et ma sousCatégorie. J'ai une table paramètre à côté de mes catégories.

T_PRINCIPAL
Id
Categorie
SousCategorie
...

T_CATEGORIE
Categorie
CorrespondanceCateg
SousCategorie
CorrespondanceSsCateg.

Exemple de contenu de t_CATEGORIE
Categorie : PC / PC...
Correspondance : Desktop / Laptop...
SousCategorie : Micro / ePc...
Correspondance : MicroDesktop / ePc...

Dans mon programme j'ai ma combo1 qui est liée (onglet Liaison) à mon champ T_PRINCIPAL.Categorie.
Et son contenu (onglet Contenu) parcours ma requête qui sélectionne toutes les valeurs de T_CATEGORIE en faisant un distinct dessus. La rubrique affichée est Categorie et la rubrique mémorisée est la CorrespondanceCateg.

Jusque là tout va bien.

Donc si je sélectionne PC en bdd dans T_PRINCIPAL.Categorie j'ai Desktop qui s'enregistre.

Je veux que lorsque je sélectionne ma valeur dans la Combo1, les valeurs possibles s'affichent dans la combo 2. Donc si je sélectionne PC, j'ai Micro et ePc qui s'affichent.
Mais également si en base de données j'ai une valeur de renseignée pour la fiche que j'ouvre que les combo se remplissent tout seul avec les valeurs bdd.

Mon combo est donc lié (onglet Liaison) à T_PRINCIPALE.SousCategorie et je le rempli par programmation mais c'est là que cela ne fonctionne pas, voici ce que je fais :

HExécuteRequête(REQ_SsCategorie,hRequêteDéfaut,T_PRINCIPALE..AN_CATEGORIE)
ListeSupprimeTout(FEN_Fiche.COMBO_ssCateg)
POUR TOUT REQ_SsCategorie
ListeAjoute(FEN_Fiche.COMBO_ssCateg,gLien(T_CATEGORIE.CA_CorrespondanceSsCateg)+ T_CATEGORIE.CA_SousCategorie)
FIN


C'est ma procédure que j'appelle à l'initialisation de la Fiche et lorsque il y a une modification dans le Combo1.

ça ne fonctionne pas ma combo2 reste vide...

J'espère que je suis assez claire ... merci d'avance
Membre enregistré
948 messages
Popularité : +30 (92 votes)
Posté le 19 janvier 2018 - 17:13
Coucou,

Tu ne pas utiliser ..Filtre ?

La propriété ..Filtre permet de connaître et de modifier le filtre utilisé pour l'affichage des enregistrements dans :
    les champs Combo fichier,

http://doc.pcsoft.fr/?2510042

// -- Code à chaque modification d'une combo
// Mise à jour des éléments de la combo en fonction
// des lettres saisies dans la combo
COMBO_Elément..Filtre = COMBO_Elément


--
In üs we trust - Autopsie Volume 1 disponible le 01-23 au dépôt de ton armurier.
Membre enregistré
2 571 messages
Popularité : +222 (260 votes)
Posté le 20 janvier 2018 - 05:18
Bonjour,

Ton explication est vraiment très peu claire et à la lecture de ton code, je crois comprendre que tu ne sais pas vraiment ce que tu fais. Je t'engage vivement à suivre l'auto-formation qui te donnera des bases.

Juste pour exemple, tu exécutes une requête, tu parcours son résultat, et tu ajoutes des données provenant d'un fichier de donnée au lieu d'ajouter l'enregistrement que tu viens,de lire. Tu mélanges tout et honnêtement, je ne pense pas que tu puisses y arriver comme ça.

Si j'ai bien compris, ta combo2 doit afficher les enregistrements de la requête "REQ_SsCategorie" et se positionner sur le bon enregistrement s'il existe.

Comme pour la combo1, dans l'onglet contenu tu mets:
Fichier Parcouru = REQ_SsCategorie
Rubrique affichée = REQ_SsCategorie.SousCategorie
Rubrique mémorisée = REQ_SsCategorie.SousCategorie

--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Membre enregistré
87 messages
Popularité : +4 (4 votes)
Posté le 22 janvier 2018 - 08:57
Non tu m'as mal comprise.

SI HLitRecherchePremier(T_ANNONCE,AN_NUM_LP,gnNumLP) ALORS
SI T_ANNONCE.AN_CATEGORIE <> "" ALORS

// A mettre en procédure
//AffichageSsCategorie(T_ANNONCE.AN_CATEGORIE)
HExécuteRequête(REQ_SsCategorie,hRequêteDéfaut,T_ANNONCE.AN_CATEGORIE)
ListeSupprimeTout(FEN_FicheVehicule.COMBO_ssCateg)
POUR TOUT REQ_SsCategorie
ListeAjoute(FEN_FicheVehicule.COMBO_ssCateg,gLien(T_CATEGORIE.CA_SS_TYPE_V_MOBILE)+ T_CATEGORIE.CA_SS_TYPE_VEHICULE)
//ListeAjoute(FEN_FicheVehicule.COMBO_ssCateg,glien(REQ_SsCategorie.CA_SS_TYPE_V_MOBILE)+REQ_SsCategorie.CA_SS_TYPE_VEHICULE)
FIN


FIN
FichierVersEcran(FEN_FicheVehicule,T_ANNONCE)
FIN


D'abord je vérifie en base de données si j'ai un enregistrement ou non pour le véhicule demandé. Si j'ai une catégorie de renseignée pour mon véhicule j'exécute ma requête et j'ajoute les champs correspondants dans mon combo2.

Par contre si je n'ai rien en base de données (la fiche véhicule n'a pas encore été renseignée) mon combo est vide il ne se remplira avec les sous catégories de véhicule que lorsque l'utilisateur aura sélectionné la catégorie principale (moto, voiture) dans le combo1.

C'est pour cela que je n'ai pas fait de contenu sur ma combo2 j'ai juste fait la liaison car si ma fiche est renseignée j'utilise une requête et sinon j'utilise les valeurs de ma table...

Est ce que je suis plus claire ?
Membre enregistré
2 571 messages
Popularité : +222 (260 votes)
Posté le 22 janvier 2018 - 11:01
Bonjour,

Rien ne t'empêche de faire 2 requêtes et d'affecter l'une ou l'autre selon tes conditions par programmation avec la propriété ..FichierParcouru.

Cependant je persiste en disant que faire l'affection au contenu dès le départ est plus rapide.
Imaginons que ma combo sous-catégorie soit reliée, tu te retrouverais avec quelque chose comme ça:
SI HLitRecherchePremier(T_ANNONCE,AN_NUM_LP,gnNumLP) ALORS
SI T_ANNONCE.AN_CATEGORIE <> "" ALORS

// A mettre en procédure
//AffichageSsCategorie(T_ANNONCE.AN_CATEGORIE)
HExécuteRequête(REQ_SsCategorie,hRequêteDéfaut,T_ANNONCE.AN_CATEGORIE)
SINON
//On met une valeur improbable afin que la requête ne renvoie aucun enregistrement
HExécuteRequête(REQ_SsCategorie,hRequêteDéfaut,"@@__@@")
FIN
FIN
//On affiche la combo et selon le cas elle sera vide ou remplie
ListeAffiche(COMBO_ssCateg)
FichierVersEcran(FEN_FicheVehicule,T_ANNONCE)
FIN


Dans le code la combo catégorie on a
HExécuteRequête(REQ_SsCategorie,hRequêteDéfaut,MoiMême)
ListeAffiche(COMBO_ssCateg)


--
Cordialement,

Philippe SAINT-BERTIN
Géode Informatique
Membre enregistré
87 messages
Popularité : +4 (4 votes)
Posté le 22 janvier 2018 - 15:04
Super ça fonctionne :merci:, c'est à dire que grâce à la deuxième partie :

// Sélection d'une ligne de Combo_CategVehicule

HExécuteRequête(REQ_SsCategorie,hRequêteDéfaut,COMBO_CategVehicule..ValeurAffichée)
ListeAffiche(COMBO_ssCateg)


En fonction de la sélection dans la combo 1, les données s'affichent dans le combo2.

Et ici :

SI HLitRecherchePremier(T_ANNONCE,AN_NUM_LP,gnNumLP)ALORS
SI T_ANNONCE.AN_CATEGORIE<>""ALORS
HExécuteRequête(REQ_SsCategorie,hRequêteDéfaut,T_ANNONCE.AN_CATEGORIE)
SINON
// Pas de valeurs, on passe en paramètre une valeur improblable
HExécuteRequête(REQ_SsCategorie,hRequêteDéfaut,"@@__@@")
FIN
FIN
// Affichage de la combo
ListeAffiche(COMBO_ssCateg)
FichierVersEcran(FEN_FicheVehicule,T_ANNONCE)


Si j'ai une valeur sauvegardée en base de données cela m'affiche bien cette valeur :)

Avec ma requête :

SELECT
T_CATEGORIE.CA_SS_TYPE_VEHICULE AS CA_SS_TYPE_VEHICULE,
T_CATEGORIE.CA_SS_TYPE_V_MOBILE AS CA_SS_TYPE_V_MOBILE
FROM
T_CATEGORIE
WHERE
T_CATEGORIE.CA_TYPE_VEHICULE = {pTypeVehicule}
OR T_CATEGORIE.CA_TYPE_V_MOBILE = {pTypeVehicule}


Ce qui me posait problème c'est que en fonction de la valeur choisie dans les listes déroulantes, j'enregistre en base une correspondance (ex : voiture => je sauvegarde Car en bdd).
Donc quand il s'agit d'afficher en fonction de la sélection dans la combo1 mon paramètre doit être égal à mon CA_TYPE_VEHICULE. Néanmoins lorsque je lis le résultat dans ma base le paramètre doit être égal au CA_TYPE_V_MOBILE.

Merci encore pour ton aide