Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Comment faire pour les paramètres d'une requete

3 réponses
Avatar
Roumegou Eric
J'ai une requete sur un fichier HF.
2 conditions passés en sélection avec des paramètres.
J'ai bien compris que si l'on initialise pas le paramètre, la condition
ne se joue pas et ça me convient tout à fait.
Mais j'ai besoin de cela en plus.

soit une zone DATLUE, je veux un sélecteur qui me permette de faire
- TOus
- que les lus donc DATLUE IS NOT NULL
- que les non lus DATLUE IS NULL

Voilà. Comment fait on lorsque l'on utilise une requete pour jouer sur
ces 3 possibilités ?

Peut-on rajouter la condition dynamiquement à la requete ?

Bien sûr je veux éviter un Hexecuterequetesql.

--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)

3 réponses

Avatar
Albert
Bonjour,

Personnellement, j'opterais pour la solution de construction du code de
la requête sur base des paramêtres actifs

Voici a titre d'exemple un code mis en place qui fonctionne
correctement < Recherche avancée > et qui me
semble correspondre a votre recherche

// Construction code de la reqête SQL dans une chaîne de caractères
// Renvoyer : CodeSQL

FONCTION sConstruitRequêteSQL()

LOCAL
sRubqRecherche, sCodeSQL, sCondition sont des chaînes
b_And est un booléen = Faux
i est un entier

// [< Conditions >]
sCodeSQL = "SELECT * FROM LigneMvt WHERE "

// [< Exercices >]
SI Taille(SAI_Exercice) = 4 ALORS
b_And = Vrai
sCodeSQL += ChaîneConstruit("LigneMvt.Exercice = '%1'", SAI_Exercice)
FIN

// [< Journal >]
SI Taille(SAI_Jnl) = 3 ALORS

SI (b_And = Vrai) ALORS sCodeSQL += " AND "

sCodeSQL += ChaîneConstruit("LigneMvt.IDJnl = '%1'", SAI_Jnl)
b_And = Vrai

FIN

// [< Rubrique >]
SI Taille(SAI_Compte) = 2 ALORS

SI (b_And = Vrai) ALORS sCodeSQL += " AND "

sCodeSQL += ChaîneConstruit("LigneMvt.IDCompte LIKE '%1%'",
SAI_Compte)
b_And = Vrai

FIN

// [< Compte >]
SI Taille(SAI_Compte) = 3 ALORS

SI (b_And = Vrai) ALORS sCodeSQL += " AND "

sCodeSQL += ChaîneConstruit("LigneMvt.IDCompte = '%1'", SAI_Compte)
b_And = Vrai

FIN

// [< Commentaire >]
SI Taille(SAI_Note) > 0 ALORS

gsOpérateurSQL = "LIKE12"
sRubqRecherche = "LigneMvt.Commentaire"
sCondition = sConstruitConditionSQL(sRubqRecherche, SAI_Note, EOT )

SI (b_And = Vrai) ALORS sCodeSQL += " AND "

sCodeSQL += sCondition
b_And = Vrai

FIN

// [< Dates >]
SI SAI_Date <> "" ALORS

SAI_Exercice = ""

sRubqRecherche = "LigneMvt.DateMvt"
setOpérateurSQL("ComboRechAvancéeTexte")

SI ChampExiste(gsNomChampDate2) ALORS
sCondition = sConstruitConditionSQL(sRubqRecherche,
{gsNomChampDate,indChamp}..Valeur,...

{gsNomChampDate2,indChamp}..Valeur)
SINON
sCondition = sConstruitConditionSQL(sRubqRecherche,
{gsNomChampDate,indChamp}..Valeur, EOT )
FIN

SI (b_And = Vrai) ALORS sCodeSQL += " AND "

sCodeSQL += sCondition
b_And = Vrai

FIN

// [< Montants >]
SI SAI_Montant > 0 ALORS

SELON SélectMvts
CAS 1 : sRubqRecherche = "LigneMvt.MvtDébit"
CAS 2 : sRubqRecherche = "LigneMvt.MvtCrédit"
FIN

setOpérateurSQL("ComboRechAvancéeNumérique")

SI ChampExiste(gsNomChampMontant2) ALORS
sCondition = sConstruitConditionSQL(sRubqRecherche,
{gsNomChampMontant,indChamp}..Valeur,...

{gsNomChampMontant2,indChamp}..Valeur)
SINON
sCondition = sConstruitConditionSQL(sRubqRecherche,
{gsNomChampMontant,indChamp}..Valeur, EOT )
FIN

SI (b_And = Vrai) ALORS sCodeSQL += " AND "

sCodeSQL += sCondition

FIN

// [< Tri sur date Mouvts >]
sCodeSQL += " ORDER BY DateMvt ASC"

RENVOYER sCodeSQL

Cordialement

Albert
Avatar
Roumegou Eric
Albert a pensé très fort :
Bonjour,

Personnellement, j'opterais pour la solution de construction du code de
la requête sur base des paramêtres actifs



Merci de ta réponse. C'est comme cela que je procède en sql natif et
avec les accès alternatifs. Long à coder la première fois mais
évolutivité garantie.
Mais je cherche sur certain traitement à utiliser HF et son tout
automatique afin de gagner du temps. Désespérement et opiniatrement,
j'y vais, j'y retourne, je m'acharne en me disant que ce n'est pas
normal que 99.99 % et des brouettes des dev utilisent HF ... et pas moi
??????

Donc je suis partie en WB10 d'une table liée à une requete (pas une
requete intégrée, ça je sais que y'a des pb).
Bon super, ça marche. Ah oui mais il y a encore le bug sur la réglette
qui fait que l'on obtient jamais la fin des enreg à moins de cliquer
plusieurs fois sur >> donc c'est inutilisable. Je l'avais oublié ce
problème qui m'avait fait abandonner cette solution la derniere fois.

Donc je désolidarise la table et la requete et je fais un chargement
par boucle de lecture.

Et là, pour ce dernier cas de critères paramétrables, il faudrait que
j'abandonne le principe de la requete ? (contre un Hexecuterequetesql)

Vraiment frustrant.



Voici a titre d'exemple un code mis en place qui fonctionne
correctement < Recherche avancée > et qui me
semble correspondre a votre recherche

// Construction code de la reqête SQL dans une chaîne de caractères
// Renvoyer : CodeSQL

FONCTION sConstruitRequêteSQL()

LOCAL
sRubqRecherche, sCodeSQL, sCondition sont des chaînes
b_And est un booléen = Faux
i est un entier

// [< Conditions >]
sCodeSQL = "SELECT * FROM LigneMvt WHERE "

// [< Exercices >]
SI Taille(SAI_Exercice) = 4 ALORS
b_And = Vrai
sCodeSQL += ChaîneConstruit("LigneMvt.Exercice = '%1'", SAI_Exercice)
FIN

// [< Journal >]
SI Taille(SAI_Jnl) = 3 ALORS

SI (b_And = Vrai) ALORS sCodeSQL += " AND "

sCodeSQL += ChaîneConstruit("LigneMvt.IDJnl = '%1'", SAI_Jnl)
b_And = Vrai

FIN

// [< Rubrique >]
SI Taille(SAI_Compte) = 2 ALORS

SI (b_And = Vrai) ALORS sCodeSQL += " AND "

sCodeSQL += ChaîneConstruit("LigneMvt.IDCompte LIKE '%1%'",
SAI_Compte)
b_And = Vrai

FIN

// [< Compte >]
SI Taille(SAI_Compte) = 3 ALORS

SI (b_And = Vrai) ALORS sCodeSQL += " AND "

sCodeSQL += ChaîneConstruit("LigneMvt.IDCompte = '%1'", SAI_Compte)
b_And = Vrai

FIN

// [< Commentaire >]
SI Taille(SAI_Note) > 0 ALORS

gsOpérateurSQL = "LIKE12"
sRubqRecherche = "LigneMvt.Commentaire"
sCondition = sConstruitConditionSQL(sRubqRecherche, SAI_Note, EOT )

SI (b_And = Vrai) ALORS sCodeSQL += " AND "

sCodeSQL += sCondition
b_And = Vrai

FIN

// [< Dates >]
SI SAI_Date <> "" ALORS

SAI_Exercice = ""

sRubqRecherche = "LigneMvt.DateMvt"
setOpérateurSQL("ComboRechAvancéeTexte")

SI ChampExiste(gsNomChampDate2) ALORS
sCondition = sConstruitConditionSQL(sRubqRecherche,
{gsNomChampDate,indChamp}..Valeur,...

{gsNomChampDate2,indChamp}..Valeur)
SINON
sCondition = sConstruitConditionSQL(sRubqRecherche,
{gsNomChampDate,indChamp}..Valeur, EOT )
FIN

SI (b_And = Vrai) ALORS sCodeSQL += " AND "

sCodeSQL += sCondition
b_And = Vrai

FIN

// [< Montants >]
SI SAI_Montant > 0 ALORS

SELON SélectMvts
CAS 1 : sRubqRecherche = "LigneMvt.MvtDébit"
CAS 2 : sRubqRecherche = "LigneMvt.MvtCrédit"
FIN

setOpérateurSQL("ComboRechAvancéeNumérique")

SI ChampExiste(gsNomChampMontant2) ALORS
sCondition = sConstruitConditionSQL(sRubqRecherche,
{gsNomChampMontant,indChamp}..Valeur,...

{gsNomChampMontant2,indChamp}..Valeur)
SINON
sCondition = sConstruitConditionSQL(sRubqRecherche,
{gsNomChampMontant,indChamp}..Valeur, EOT )
FIN

SI (b_And = Vrai) ALORS sCodeSQL += " AND "

sCodeSQL += sCondition

FIN

// [< Tri sur date Mouvts >]
sCodeSQL += " ORDER BY DateMvt ASC"

RENVOYER sCodeSQL

Cordialement

Albert



--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)
Avatar
Roumegou Eric
Après mûre réflexion, Gilles a écrit :
Roumegou Eric avait écrit le 10/12/2006 :
J'ai une requete sur un fichier HF.
2 conditions passés en sélection avec des paramètres.
soit une zone DATLUE, je veux un sélecteur qui me permette de faire
- TOus
- que les lus donc DATLUE IS NOT NULL
- que les non lus DATLUE IS NULL
Voilà. Comment fait on lorsque l'on utilise une requete pour jouer sur ces
3 possibilités ?
Peut-on rajouter la condition dynamiquement à la requete ?




Non je ne crois pas en revanche on doit pouvoir ruser :


Merci de ta réponse.
effectivement on peut la jouer comme ça.
Mais j'ai toujours considéré qu'un code "rusé", "malin" avec des
astuces devait absolument être évité pour assurer sa perrenité et sa
maintenabilité.




Where (tout ce que tu veux)
AND
(
(DATLUE IS NOT NULL AND 1={%param1}) OR (DATLUE IS NULL AND 1={%param2}) OR
(1={%param3})
)

comme ça tu restes dans la requête paramétrée bien pratique :

Et tu joues sur les paramètres à passer

Si tu veux le cas DATLUE is not NULL
Tu passes commes paramètres :
Param1=1
Param2=0
Param3=0

Si tu veux le cas DATLUE is NULL
Tu passes commes paramètres :
Param1=0
Param2=1
Param3=0

Si tu veux tout :
Tu passes commes paramètres :
Param1=0
Param2=0
Param3=1


Ca devrait marcher ;)
(On devrait logiquement pouvoir se passer du cas 3, mais comme je ne sais pas
ce que donnerait un AND avec aucune condition vérifiée dedans, faut que tu
testes.



--
Eric Roumégou
Webmaster des wtablettes
http://cerbermail.com/?qE7t4Qvilo
(cliquez sur le lien ci-dessus pour me contacter en privé)