PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2025 → Requête Paramétrée variable
Requête Paramétrée variable
Débuté par Nolween LOPEZ, 16 juin 2016 16:50 - 11 réponses
Membre enregistré
27 messages
Posté le 16 juin 2016 - 16:50
Bonjour à tou(te)s,

Je viens vers vous car je suis coincé sur de l'exécution de requête à paramètres au nombre variable.

Je souhaite récupérer les valeurs d'une rubrique d'un tableau, pour m'en servir dans une requête d'affichage d'un autre tableau.

Par exemple, si j'ai 5 occurrences dans mon premier tableau, je souhaite récupérer les 5 valeurs d'une des rubriques , et les mettre en paramètre dans une requête.

Concrètement :

Pour la récupération des valeurs du premier tableau :

POUR TOUTE LIGNE i DE FenEditionAdherents.TABLE_SectionsSelectionnees
tabadh[i] = FenEditionAdherents.TABLE_SectionsSelectionnees.COL_codesection..Valeur
FIN

Je les ai mises dans un tableau mais ai-je bien fait?

Ce que je veux ensuite dans l'initialisation d'un tableau dans une autre fenêtre, c'est exécuter une requete avec les paramètres ques j'ai récupérés, mais le nombre ne paramètre n'est jamais le même !

HExécuteRequête(REQ_Marequete, tabadh[1],tabadh[2],...)

Mais je ne sais pas comment faire... Si j'avais un nombre de paramètre fixe pas de soucis mais là...


Merci d'avance pour vos lumières !
Membre enregistré
44 messages
Posté le 16 juin 2016 - 17:21
Je construirais la requête en SQL.
Comme ca, pas de contraite sur le nombre de paramètres
Membre enregistré
31 messages
Posté le 16 juin 2016 - 17:58
Bonjour,

Au lieu de faire une condition à chaque fois, tu peux utiliser une seule condition de type "est dans la liste fournie par le paramètre".
De cette manière tu peux passer ton tableau en paramètre de la requête et du coup peu importe le nombre d'éléments.



Message modifié, 16 juin 2016 - 18:00
Posté le 16 juin 2016 - 21:24
Bonjour,
Voici un exemple de requête SQL avec des paramètres variable.
Dans cette exemple. Les différents champs affine la recherche.
http://webmshare.com/play/6wwN1

Voici le code du bouton recherche :
gRequete_Recherche = ""
TableSupprimeTout(TABLEAU_Recherche)
LIB_Resultat_trouvé = ""
LIB_Resultat_trouvé..Visible = Vrai
SELON COMBO_Recherche_Mois
CAS 1 : gRequete_Recherche+=""
CAS 2 : gRequete_Recherche+="CJDATECR LIKE '____01__' AND "
CAS 3 : gRequete_Recherche+="CJDATECR LIKE '____02__' AND "
CAS 4 : gRequete_Recherche+="CJDATECR LIKE '____03__' AND "
CAS 5 : gRequete_Recherche+="CJDATECR LIKE '____04__' AND "
CAS 6 : gRequete_Recherche+="CJDATECR LIKE '____05__' AND "
CAS 7 : gRequete_Recherche+="CJDATECR LIKE '____06__' AND "
CAS 8 : gRequete_Recherche+="CJDATECR LIKE '____07__' AND "
CAS 9 : gRequete_Recherche+="CJDATECR LIKE '____08__' AND "
CAS 10 : gRequete_Recherche+="CJDATECR LIKE '____09__' AND "
CAS 11 : gRequete_Recherche+="CJDATECR LIKE '____10__' AND "
CAS 12 : gRequete_Recherche+="CJDATECR LIKE '____11__' AND "
CAS 13 : gRequete_Recherche+="CJDATECR LIKE '____12__' AND "
FIN
SELON COMBO_Recherche_Année
CAS 1 : gRequete_Recherche+=""
CAS 2 : gRequete_Recherche+="CJDATECR LIKE '2012____' AND "
CAS 3 : gRequete_Recherche+="CJDATECR LIKE '2013____' AND "
CAS 4 : gRequete_Recherche+="CJDATECR LIKE '2014____' AND "
CAS 5 : gRequete_Recherche+="CJDATECR LIKE '2015____' AND "
CAS 6 : gRequete_Recherche+="CJDATECR LIKE '2016____' AND "
CAS 7 : gRequete_Recherche+="CJDATECR LIKE '2017____' AND "
CAS 8 : gRequete_Recherche+="CJDATECR LIKE '2018____' AND "
FIN
SI COMBO_Recherche_Saisie_Par..ValeurAffichée <> "" ALORS
gRequete_Recherche+="CTUSER = '"+COMBO_Recherche_Saisie_Par..ValeurAffichée+"' AND "
SINON
gRequete_Recherche+=""
FIN
SI COMBO_Recherche_Status..ValeurAffichée <> "" ALORS
gRequete_Recherche+="CTSTATUS = '"+COMBO_Recherche_Status..ValeurAffichée+"' AND "
SINON
gRequete_Recherche+=""
FIN

SI SAI_Recherche_Code_Client <> "" ALORS
gRequete_Recherche+="CTCODECL = '"+SAI_Recherche_Code_Client+"' AND "
SINON
gRequete_Recherche+=""
FIN
SI SAI_Recherche_Num_Cde <> "" ALORS
gRequete_Recherche+="KTNUMCDE = '"+SAI_Recherche_Num_Cde+"' AND "
SINON
gRequete_Recherche+=""
FIN
SI SAI_Recherche_Num_Cde_SAV <> "" ALORS
gRequete_Recherche+="CTNUMCDR = '"+SAI_Recherche_Num_Cde_SAV+"' AND "
SINON
gRequete_Recherche+=""
FIN
SI SAI_Recherche_Num_Facture <> "" ALORS
gRequete_Recherche+="CTNUMFACT = '"+SAI_Recherche_Num_Facture+"' AND "
SINON
gRequete_Recherche+=""
FIN
SI SAI_Recherche_Num_Facture_SAV <> "" ALORS
gRequete_Recherche+="CTNUMFAR = '"+SAI_Recherche_Num_Facture_SAV+"' AND "
SINON
gRequete_Recherche+=""
FIN
SI SAI_Recherche_Nom_Client <> "" ALORS
gRequete_Recherche+="CTNOMCLT LIKE '%"+Remplace(SAI_Recherche_Nom_Client,"*","%")+"%' AND "
SINON
gRequete_Recherche+=""
FIN
SI SAI_Recherche_Code_article <> "" ALORS
gRequete_Recherche+="CTCODEAR LIKE '%"+Remplace(SAI_Recherche_Code_article,"*","%")+"%' AND "
SINON
gRequete_Recherche+=""
FIN
SI SAI_Recherche_Lib1_Lib2 <> "" ALORS
gRequete_Recherche+="CTLIB1 LIKE '%"+Remplace(SAI_Recherche_Lib1_Lib2,"*","%")+"%' OR CTLIB2 LIKE '%"+Remplace(SAI_Recherche_Lib1_Lib2,"*","%")+"%' AND "
SINON
gRequete_Recherche+=""
FIN

SI Droite(gRequete_Recherche,4) = "AND " ALORS
gRequete_Recherche = Gauche(gRequete_Recherche,Taille(gRequete_Recherche)-4)
FIN
REQ est une Source de Données
REQ_OK est un booléen = HExécuteRequêteSQL(REQ,"SELECT * FROM SAVTL WHERE "+gRequete_Recherche+"ORDER BY CJDATECR DESC, CTUSER")
SI REQ_OK = Faux ALORS
Erreur("Erreur d'execution de la requete.")
RETOUR
FIN
LIB_Resultat_trouvé = HNbEnr(REQ)+" SAV trouvé"
HLitPremier(REQ)
TANTQUE PAS HEnDehors(REQ)
SI TableCherche(COL_SAV,REQ.KTNUMSAV,Vrai,1) = -1 ALORS
TableAjouteLigne(TABLEAU_Recherche,REQ.KTNUMSAV,REQ.KTNUMCDE,REQ.CTNUMFAC,REQ.CJDATECR,REQ.CTNOMCLT,REQ.CTCODECL,REQ.CTSTATUS,REQ.CTNUMCDR,REQ.CTNUMFAR,REQ.CTUSER,REQ.CTADRLIV,REQ.CTTRANSI)
FIN
HLitSuivant(REQ)
FIN
HAnnuleDéclaration(REQ)
Membre enregistré
261 messages
Posté le 16 juin 2016 - 21:27
Bonjour,

Voici un exemple de requête SQL soumis a des variables qui change ( nombre et/ou valeur ) suivant les champs remplis par l'utilisateur.
Cela permet d’affiné les recherches.

http://webmshare.com/play/6wwN1

Code du bouton "Recherche" :

gRequete_Recherche = ""
TableSupprimeTout(TABLEAU_Recherche)
LIB_Resultat_trouvé = ""
LIB_Resultat_trouvé..Visible = Vrai
SELON COMBO_Recherche_Mois
CAS 1 : gRequete_Recherche+=""
CAS 2 : gRequete_Recherche+="CJDATECR LIKE '____01__' AND "
CAS 3 : gRequete_Recherche+="CJDATECR LIKE '____02__' AND "
CAS 4 : gRequete_Recherche+="CJDATECR LIKE '____03__' AND "
CAS 5 : gRequete_Recherche+="CJDATECR LIKE '____04__' AND "
CAS 6 : gRequete_Recherche+="CJDATECR LIKE '____05__' AND "
CAS 7 : gRequete_Recherche+="CJDATECR LIKE '____06__' AND "
CAS 8 : gRequete_Recherche+="CJDATECR LIKE '____07__' AND "
CAS 9 : gRequete_Recherche+="CJDATECR LIKE '____08__' AND "
CAS 10 : gRequete_Recherche+="CJDATECR LIKE '____09__' AND "
CAS 11 : gRequete_Recherche+="CJDATECR LIKE '____10__' AND "
CAS 12 : gRequete_Recherche+="CJDATECR LIKE '____11__' AND "
CAS 13 : gRequete_Recherche+="CJDATECR LIKE '____12__' AND "
FIN
SELON COMBO_Recherche_Année
CAS 1 : gRequete_Recherche+=""
CAS 2 : gRequete_Recherche+="CJDATECR LIKE '2012____' AND "
CAS 3 : gRequete_Recherche+="CJDATECR LIKE '2013____' AND "
CAS 4 : gRequete_Recherche+="CJDATECR LIKE '2014____' AND "
CAS 5 : gRequete_Recherche+="CJDATECR LIKE '2015____' AND "
CAS 6 : gRequete_Recherche+="CJDATECR LIKE '2016____' AND "
CAS 7 : gRequete_Recherche+="CJDATECR LIKE '2017____' AND "
CAS 8 : gRequete_Recherche+="CJDATECR LIKE '2018____' AND "
FIN
SI COMBO_Recherche_Saisie_Par..ValeurAffichée <> "" ALORS
gRequete_Recherche+="CTUSER = '"+COMBO_Recherche_Saisie_Par..ValeurAffichée+"' AND "
SINON
gRequete_Recherche+=""
FIN
SI COMBO_Recherche_Status..ValeurAffichée <> "" ALORS
gRequete_Recherche+="CTSTATUS = '"+COMBO_Recherche_Status..ValeurAffichée+"' AND "
SINON
gRequete_Recherche+=""
FIN

SI SAI_Recherche_Code_Client <> "" ALORS
gRequete_Recherche+="CTCODECL = '"+SAI_Recherche_Code_Client+"' AND "
SINON
gRequete_Recherche+=""
FIN
SI SAI_Recherche_Num_Cde <> "" ALORS
gRequete_Recherche+="KTNUMCDE = '"+SAI_Recherche_Num_Cde+"' AND "
SINON
gRequete_Recherche+=""
FIN
SI SAI_Recherche_Num_Cde_SAV <> "" ALORS
gRequete_Recherche+="CTNUMCDR = '"+SAI_Recherche_Num_Cde_SAV+"' AND "
SINON
gRequete_Recherche+=""
FIN
SI SAI_Recherche_Num_Facture <> "" ALORS
gRequete_Recherche+="CTNUMFACT = '"+SAI_Recherche_Num_Facture+"' AND "
SINON
gRequete_Recherche+=""
FIN
SI SAI_Recherche_Num_Facture_SAV <> "" ALORS
gRequete_Recherche+="CTNUMFAR = '"+SAI_Recherche_Num_Facture_SAV+"' AND "
SINON
gRequete_Recherche+=""
FIN
SI SAI_Recherche_Nom_Client <> "" ALORS
gRequete_Recherche+="CTNOMCLT LIKE '%"+Remplace(SAI_Recherche_Nom_Client,"*","%")+"%' AND "
SINON
gRequete_Recherche+=""
FIN
SI SAI_Recherche_Code_article <> "" ALORS
gRequete_Recherche+="CTCODEAR LIKE '%"+Remplace(SAI_Recherche_Code_article,"*","%")+"%' AND "
SINON
gRequete_Recherche+=""
FIN
SI SAI_Recherche_Lib1_Lib2 <> "" ALORS
gRequete_Recherche+="CTLIB1 LIKE '%"+Remplace(SAI_Recherche_Lib1_Lib2,"*","%")+"%' OR CTLIB2 LIKE '%"+Remplace(SAI_Recherche_Lib1_Lib2,"*","%")+"%' AND "
SINON
gRequete_Recherche+=""
FIN

SI Droite(gRequete_Recherche,4) = "AND " ALORS
gRequete_Recherche = Gauche(gRequete_Recherche,Taille(gRequete_Recherche)-4)
FIN
REQ est une Source de Données
REQ_OK est un booléen = HExécuteRequêteSQL(REQ,"SELECT * FROM SAVTL WHERE "+gRequete_Recherche+"ORDER BY CJDATECR DESC, CTUSER")
SI REQ_OK = Faux ALORS
Erreur("Erreur d'execution de la requete.")
RETOUR
FIN
LIB_Resultat_trouvé = HNbEnr(REQ)+" SAV trouvé"
HLitPremier(REQ)
TANTQUE PAS HEnDehors(REQ)
SI TableCherche(COL_SAV,REQ.KTNUMSAV,Vrai,1) = -1 ALORS
TableAjouteLigne(TABLEAU_Recherche,REQ.KTNUMSAV,REQ.KTNUMCDE,REQ.CTNUMFAC,REQ.CJDATECR,REQ.CTNOMCLT,REQ.CTCODECL,REQ.CTSTATUS,REQ.CTNUMCDR,REQ.CTNUMFAR,REQ.CTUSER,REQ.CTADRLIV,REQ.CTTRANSI)
FIN
HLitSuivant(REQ)
FIN
HAnnuleDéclaration(REQ)


--
Baptiste CLOART
Consultant
b.cloart@blv-tech.com
06.88.74.80.65
www.linkedin.com/in/cloart
Membre enregistré
27 messages
Posté le 17 juin 2016 - 10:04
Bonjour,

Merci pour vos efforts, c'est appréciable de voir une communauté prête à l'entraide !

Pour le SQL pur ça ne m'arrange pas dans la mesure ça fait beaucoup de ligne de code. L'utilisateur doit ajouter des codes de section dans une liste de plus de 100 codes, il peut en sélectionner 1 à la totalité des codes section, qui deviennent de plus en plus nombreux. Je ne peux pas me permettre de faire ce que Baptiste me propose, mais merci pour le coup de main !

Je vais me pencher sur le paramètre en liste que je n'avais pas vu et je vous tiens au courant.
Membre enregistré
27 messages
Posté le 17 juin 2016 - 11:45
Francois LAGACHE a écrit :
Bonjour,

Au lieu de faire une condition à chaque fois, tu peux utiliser une seule condition de type "est dans la liste fournie par le paramètre".
De cette manière tu peux passer ton tableau en paramètre de la requête et du coup peu importe le nombre d'éléments.



Message modifié, 16 juin 2016 - 18:00


Je souhaiterais opter pour cette solution mais je coince...

J'ai défini un param1 que je souhaite définir dans mon code, mais j'ai soit mal raisonné, soit fait une erreur, voici ce que j'ai fait :

tabadh est une Liste de chaînes

SupprimeTout(tabadh)

POUR TOUTE LIGNE i DE FenEditionAdherents.TABLE_SectionsSelectionnees
Ajoute(tabadh,FenEditionAdherents.TABLE_SectionsSelectionnees.COL_codesection..Valeur)

FIN



REQ_Liste_Adhérents_Sections.Param1 = tabadh

HExécuteRequête(REQ_Liste_Adhérents_Sections,hRequêteDéfaut, REQ_Liste_Adhérents_Sections.Param1)



Qu'en pensez vous?

Merci encore pour votre aide
Membre enregistré
348 messages
Posté le 17 juin 2016 - 12:11
Bonjour
Tu mélanges deux syntaxes de HExécuteRequête

Il faut faire :
REQ_Liste_Adhérents_Sections.Param1 = tabadh
HExécuteRequête(REQ_Liste_Adhérents_Sections, hRequêteDéfaut)


ou :
HExécuteRequête(REQ_Liste_Adhérents_Sections, hRequêteDéfaut, tabadh)


--
Pascal H. http://phapps.e-monsite.com
Membre enregistré
261 messages
Posté le 17 juin 2016 - 12:12
Hello,

tabadh est une Liste de chaînes
SupprimeTout(tabadh)
POUR TOUTE LIGNE i DE FenEditionAdherents.TABLE_SectionsSelectionnees
Ajoute(tabadh,FenEditionAdherents.TABLE_SectionsSelectionnees.COL_codesection..Valeur)
HExécuteRequête(REQ_Liste_Adhérents_Sections,hRequêteDéfaut,tabadh[i]) // Execution de ta requete avec l'info en cours de traitement de ta table tabadh
HLitPremier(REQ_Liste_Adhérents_Sections) // Lit le 1er enregistrement de la requete
SI PAS HEnDehors(REQ_Liste_Adhérents_Sections) // Si Au moins un resutat est trouver alors traitment.
Info("J'aime les bonne grosses frites !")
FIN
HAnnuleDéclaration(REQ_Liste_Adhérents_Sections) // Libere l'enregistrement pour l’exécution suivante
FIN


--
Baptiste CLOART
Consultant
b.cloart@blv-tech.com
06.88.74.80.65
www.linkedin.com/in/cloart
www.blv-tech.com
Message modifié, 17 juin 2016 - 12:15
Membre enregistré
27 messages
Posté le 17 juin 2016 - 14:41
Re par ici,

J'ai fait quelques test. En ce qui concerne la réponse de Pascal, j'avais oublié de faire la modification, mais je l'ai faite juste après mon post, mais pareil, ça n'était pas bon.

En revanche, ta réponse m'a bien aidée Baptiste, voici ce que j'ai fait, je suis retournée sur une requête à un seul paramètre, que j'ai lancé plusieurs fois, à chaque fois que j'ai une occurence dans mon premier tableau.

Voici mon code :

// On déclare dans cette variable une chaine qui contiendra le code de section
sectionadh est une chaîne = ""

// On parcourt les résultats mis dans la table des sections trouvées
POUR TOUTE LIGNE i DE FenEditionAdherents.TABLE_SectionsSelectionnees

//on donne à sectionadh la valeur du code de section actuel
sectionadh = FenEditionAdherents.TABLE_SectionsSelectionnees.COL_codesection
// On exécute la requête avec comme paramètre le code section trouvé
// On exécute la requête avec comme paramètre le code section actuel
HExécuteRequête(REQ_Liste_Adhérents_Sections,hRequêteDéfaut,sectionadh)
// lecture du 1er enregistrement de la requête
HLitPremier(REQ_Liste_Adhérents_Sections)
// On boucle en parcourant les résultats de la requête
TANTQUE PAS HEnDehors(REQ_Liste_Adhérents_Sections)

// On ajoute une ligne dans la nouvelle table avec toutes les infos recueillies
TableAjouteLigne(TABLE_FI_Liste_AdhérentSection,REQ_Liste_Adhérents_Sections.codesection,REQ_Liste_Adhérents_Sections.nomadh,REQ_Liste_Adhérents_Sections.PRENOM,REQ_Liste_Adhérents_Sections.codeadh, REQ_Liste_Adhérents_Sections.VILLE,REQ_Liste_Adhérents_Sections.codepost)
// lecture du résultat suivant
HLitSuivant(REQ_Liste_Adhérents_Sections)
FIN
HAnnuleDéclaration(REQ_Liste_Adhérents_Sections) // Libère l'enregistrement pour l’exécution suivante
FIN


J'espère que cela sera utile à d'autres personnes qui débutent comme moi dans Windev !

Encore un grand merci à tous pour votre aide.
Membre enregistré
31 messages
Posté le 17 juin 2016 - 15:09
Au niveau de la requète, tu as deux choix pour passer des paramètres soit:
REQ_Liste_Adhérents_Sections.param_1=sectionadh
HExécuteRequête(REQ_Liste_Adhérents_Sections,hRequêteDéfaut)

ou
HExécuteRequête(REQ_Liste_Adhérents_Sections,hRequêteDéfaut,sectionadh)

La première syntaxe est à mon sens plus lisible surtout quand tu as plusieurs paramètres.

Pour le parcours de la requète je prefère personnellement ceci:
HExécuteRequête(REQ_Liste_Adhérents_Sections,hRequêteDéfaut,sectionadh)
POUR TOUT REQ_Liste_Adhérents_Sections
//Traitement
FIN
HAnnuleDéclaration(REQ_Liste_Adhérents_Sections)
Message modifié, 17 juin 2016 - 15:10
Membre enregistré
261 messages
Posté le 17 juin 2016 - 15:15
RE,

Vu que tu débute, je te conseil d'utilisé des nom de Requête,Champs,Fenêtres,etc.. court et/ou simple a lire.Sinon ton code va vitre être une usine a gaz....
Voici le genre de syntaxe que j'utilise :





Aussi, Voici ton code optimisé au maximum :
POUR TOUTE LIGNE DE FenEditionAdherents.TABLE_SectionsSelectionnees
HExécuteRequête(REQ_Liste_Adhérents_Sections,hRequêteDéfaut,FenEditionAdherents.TABLE_SectionsSelectionnees.COL_codesection)
HLitPremier(REQ_Liste_Adhérents_Sections)
POUR TOUT REQ_Liste_Adhérents_Sections
TableAjouteLigne(TABLE_FI_Liste_AdhérentSection,REQ_Liste_Adhérents_Sections.codesection,REQ_Liste_Adhérents_Sections.nomadh,REQ_Liste_Adhérents_Sections.PRENOM,REQ_Liste_Adhérents_Sections.codeadh, REQ_Liste_Adhérents_Sections.VILLE,REQ_Liste_Adhérents_Sections.codepost)
FIN
HAnnuleDéclaration(REQ_Liste_Adhérents_Sections)
FIN


Bon Dev'

--
Baptiste CLOART
Consultant
b.cloart@blv-tech.com
06.88.74.80.65
www.linkedin.com/in/cloart
www.blv-tech.com
Message modifié, 17 juin 2016 - 15:17