PC SOFT

GRUPOS DE DISCUSSÃO PROFISSIONAL
WINDEVWEBDEV e WINDEV Mobile

Inicio → WINDEV 2024 → source de données paramétrée avec des variables de type VARIANT !!!
source de données paramétrée avec des variables de type VARIANT !!!
Iniciado por l.emeline, set., 21 2005 4:52 PM - 7 respostas
Publicado em setembro, 21 2005 - 4:52 PM
Bonjour,

j'ai écrit une requête avec l'éditeur d'états avec 2 paramètres. Cette requête me permet de lister tous les animaux du troupeau et du lot sélectionnés par l'utilisateur. Mais celui-ci n'est pas obligé de choisir un troupeau et un lot, il peut choisir "Tous". Lorsque j'appelle cette requete, j'utilise une variable de type Variant pour chaque paramètre. Soit je laisse cette variable à Null si l'utilisateur a laissé "Tous" dans la combo, soit j'initialise ma variable avec la clé du troupeau choisi. Ainsi, lorsque la requête s'exécute, si mon variant est à Null, la condition de sélection est ignorée. Ce qui est parfait!

J'ai voulu faire pareil avec une source de données. Je déclare ma source de données, j'utilise la fonction HExecuteRequeteSQL(source,"Code SQL de ma requête") avec de la même façon, les deux conditions ...AND troupeau = '" + variant_troupeau + "' AND lot = '" + variant_lot + "'". Or quand je lance ma requête si je choisis pas de troupeau ou de lot, la requête ne renvoit aucun résultat! J'ai l'impression que la condition n'est pas ignorée alors même que le variant = null !

Comment faire ? Suis-je obligée de passer par une requête enregistré avec l'éditeur d'état (parce que j'ai vraiment bcp de requêtes à réaliser de ce type là et qui ne sont utilisées qu'à cet endroit) ? Est-ce que cette fonctionnalité existe ?
Publicado em setembro, 21 2005 - 7:46 PM
Pourquoi ne pas utiliser la fonction hfiltre
avec des filtre selon ta condiiton

affiche la table , l'etat est simple dans ce cas
Publicado em setembro, 22 2005 - 8:50 AM
Le problème c'est que ma requête utilise différents fichiers (.FIC) et que donc la fonction Hfiltre est inutilisable ! En plus ma requête déclarée grâce à la fonction HExecuteRequeteSQL marche très bien dès lors que je spécifie tous les paramètres !
Du coup, il faudrait (si je veux tjrs utiliser ce système de source de données et non déclarer ma requête directement dans l'éditeur !) que selon la valeur de mon paramètre, je lance une requête différente :

-si variant_troupeau = Null _et_ variant_lot = Null alors
hExecuteRequeteSQL(...)
-sinon si ...
...
-sinon
...
-fin

Ce qui va être super long car vu que souvent j'ai plusieurs paramètres qui peuvent prendre des valeurs nulles, je vais devoir effectuer des combinaisons !
Publicado em setembro, 22 2005 - 10:26 AM
Bonjour,

Je n'ai aucun problème avec une rquête utilisant un choix de 6 paramètres possibles
avec < La case NULL si vide > cochée au niveau de la description du champ de saisie du paramêtre

sReqSQL est une chaîne

// [< Code de la requête >]
sReqSQL = [
SELECT Contact.IDContact, Contact.Nom, Contact.Adresse, Contact.CodePostal, Contact.Ville, Contact.NomContact, Contact.Activité
FROM Contact
WHERE Contact.Nom LIKE '%1%'
AND Contact.Adresse LIKE '%%%2%%'
AND Contact.CodePostal LIKE '%3%%'
AND Contact.Ville LIKE '%%%4%%'
AND Contact.Activité LIKE '%%%5%%'
AND Contact.NomContact LIKE '%%%6%%'
ORDER by Nom Asc
]

// [< Construire requêtes >]
sReqSQL = ChaîneConstruit(sReqSQL, RNom, RAdresse, RCpostal, RVille, RActivité, RContact)

SI PAS HExécuteRequêteSQL(SrcReq, sReqSQL) ALORS ...

Cordialement

Albert
Publicado em setembro, 22 2005 - 10:55 AM
Merci, je vais essayer, le problème est que j'utilise une combo rattachée à un fichier (par exemple troupeau.fic) et j'ajoute à cette combo la ligne "Tous" ! Donc ma combo n'est jamais nulle ! Mais je vais essayer cette solution en gardant les variants !
Publicado em setembro, 22 2005 - 11:28 AM
Je viens d'essayer la solution proposée, mais j'ai toujours le même problème !
J'essaie ma requête dans l'éditeur d'état, je passe mes paramètres avec des variants :
hExecuteRequete(maReq,variant_troupeau,variant_lot, sortie...) et ça marche très bien même si les variants sont à Null.
Dès que je veux écrire directement la requête dans le code
sReq est une chaine =[select...]
sReq = chaineConstruit(sreq, variant_troupeau,variant_lot...)
hExecuteRequeteSQL(source,sreq)
La requête s'exécute bien mais si je choisis pas de troupeau et/ou pas de lot, la requête ne renvoit aucun résultat comme si la condition devenait troupeau = 0 au lieu d'être ignorée (troupeau = <NULL>)

PS: Une autre question : dans la réponse que vous m'avez proposé,
NOM LIKE '%%1%'
il faut mettre combien de '%' et où ??? Car je comprends pas trop, il n'y en a jamais le même nombre !
Publicado em setembro, 22 2005 - 6:14 PM
Bonjour,

L'opérateur LIKE permet de sélectionner des enregistrements dont la valeur d'une rubrique correspond à une valeur spécifiée (avec des caractères génériques).

Les caractères génériques autorisés sont les suivants :

'%' : représente zéro, un ou plusieurs caractères.

'_' : représente un caractère unique.

Ces caractères génériques peuvent être combinés.

Donc variable en fonction de la recherche souhaitée

Consultez les explications ainsi que les exemples de l'aide en ligne

Attention au placement des [ ]

sReq est une chaine

sReq = [
SELECT ...


]

et non

sReq est une chaine = [ select ... ]

Vous devriez effectuer des tests avec des champs de saisie en cochant la case < NULL si vide >

Cordialement

Albert
Publicado em setembro, 23 2005 - 9:31 AM
Votre réponse ne fonctionnait toujours pas dans mon cas ! J'ai donc envoyé une requête au Support Technique Gratuit. Je vous fais part de leur réponse :

****************************************************
"Un paramètre peut effectivement être ignoré avec un variant "NULL"
lorsque la requête est exécutée avec la fonction "HExecuteRequete()". Il
s'agit des requêtes créées à partir de l'éditeur de requêtes de WINDEV.

Lorsque la requête est exécutée via la fonction "HExecuteRequêteSQL()",
il revient à la charge du développeur de préparer le code SQL de la
requête. Voici un exemple de ce qui est couramment utilisé :

sCodeSQL est une chaîne = "SELECT * FROM ANIMAUX WHERE %1"
sWHERE est une chaîne

SI CHAMP_TROUPEAU <> "" ALORS
// Si le "troupeau" est précisé il est pris dans la condition
sWHERE = "troupeau = '" + CHAMP_TROUPEAU + "' AND lot = '" + CHAMP_LOT
+ "'"
SINON
// Pas de troupeau précisé, condition uniquement sur le "lot"
sWHERE = "lot = '" + CHAMP_LOT + "'"
FIN

HExécuteRequêteSQL(Req, ChaîneConstruit(sCodeSQL, sWHERE))

******************************************************

Donc je vais tester cette solution !

Merci beaucoup à tous ceux qui m'ont répondu !