|
| 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]) HLitPremier(REQ_Liste_Adhérents_Sections) SI PAS HEnDehors(REQ_Liste_Adhérents_Sections) Info("J'aime les bonne grosses frites !") FIN HAnnuleDéclaration(REQ_Liste_Adhérents_Sections) FIN
-- Baptiste CLOART Consultant b.cloart@blv-tech.com 06.88.74.80.65 www.linkedin.com/in/cloart www.blv-tech.comMessage 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
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.comMessage modifié, 17 juin 2016 - 15:17 |
| |
| |
| | | |
|
| | | | |
| | |
|