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
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
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
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 :
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.
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 :
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.
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 :
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.