PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Union de plusieurs requêtes suivant conditions
Union de plusieurs requêtes suivant conditions
Débuté par beyly, 22 jan. 2025 16:26 - 1 réponse
Posté le 22 janvier 2025 - 16:26
Bonjour à tous,
j'ai quelques requêtes SQL HFSQL construites avec le générateur de requêtes de WINDEV. ces requêtes ont chacune 3 paramètres (identiques). Je souhaiterais suivant une condition, faire des jointures entres elles (UNION ALL) par exemple suivant une condition, jointure de la REQ1 avec REQ3 et REQ4 mais suivant une autre condition jointure entre REQ1 et REQ2.
Je ne peux donc pas utiliser le constructeur de requête option UNION puisque suivant une condition le code SQL total est différent. Comment puis je faire ?
j'ai essayé de déclaré :
MaRequeteTotale est une source de données
MaRequeteTotale.CodeSQL = Requete1.CodeSQL + " UNION ALL " + Requete2.CodeSQL
mais ça ne fonctionne pas. d'autre part comment déclarer les paramètres avant ?
Je ne vois pas comment je peux faire, une solution ?
j'espère que mon explication est assez claire.
Merci d'avance.
Posté le 22 janvier 2025 - 17:45
Bonjour

Sur ChatGPT, il y a une option Windev Expert

Pour m'amuser j'ai pose ta question, voila sa longue reponse

Votre problématique est claire : vous souhaitez générer dynamiquement une requête SQL composée de plusieurs requêtes HFSQL en fonction de conditions, et inclure les paramètres correspondants. Voici une solution détaillée pour résoudre votre problème.

Étape 1 : Construction dynamique du code SQL
En HFSQL, l'approche dynamique peut être réalisée en manipulant le code SQL de plusieurs sources de données et en les concaténant avec les clauses nécessaires (UNION ALL dans ce cas). Cependant, vous devez également gérer les paramètres pour éviter tout problème.

Voici les étapes à suivre :

1. Déclarer les paramètres
Vous devez définir des paramètres pour chaque requête incluse dans votre UNION ALL. Ces paramètres doivent être associés aux noms spécifiques des requêtes dans lesquelles ils sont utilisés.

2. Utilisation de SourceVersTable pour manipuler le SQL
La commande SourceVersTable permet d'exécuter un SQL dynamique avec des paramètres.

Exemple de code complet
windev
Copier
Modifier
// Déclaration des sources de données
REQ1 est une source de données
REQ2 est une source de données
REQ3 est une source de données
REQ4 est une source de données

// Déclaration des paramètres globaux
Param1 est une chaîne = "Valeur1"
Param2 est une chaîne = "Valeur2"
Param3 est une chaîne = "Valeur3"

// Chargement du code SQL des requêtes dans les sources
REQ1.CodeSQL = "SELECT Champ1, Champ2 FROM Table1 WHERE Champ3 = {Param1} AND Champ4 = {Param2}"
REQ2.CodeSQL = "SELECT Champ1, Champ2 FROM Table2 WHERE Champ3 = {Param1} AND Champ5 = {Param3}"
REQ3.CodeSQL = "SELECT Champ1, Champ2 FROM Table3 WHERE Champ3 = {Param1} AND Champ4 = {Param2}"
REQ4.CodeSQL = "SELECT Champ1, Champ2 FROM Table4 WHERE Champ3 = {Param1} AND Champ6 = {Param3}"

// Déclaration de la requête totale
MaRequeteTotale est une source de données

// Choix dynamique en fonction de la condition
Si Condition1 ALORS
// Jointure entre REQ1, REQ3 et REQ4
MaRequeteTotale.CodeSQL = REQ1.CodeSQL + " UNION ALL " + REQ3.CodeSQL + " UNION ALL " + REQ4.CodeSQL
SINON SI Condition2 ALORS
// Jointure entre REQ1 et REQ2
MaRequeteTotale.CodeSQL = REQ1.CodeSQL + " UNION ALL " + REQ2.CodeSQL
FIN

// Déclaration des paramètres dans la requête totale
MaRequeteTotale.Paramètre.Param1 = Param1
MaRequeteTotale.Paramètre.Param2 = Param2
MaRequeteTotale.Paramètre.Param3 = Param3

// Exécution de la requête
SI SourceVersTable(MaRequeteTotale, TableDestination) ALORS
Info("Requête exécutée avec succès")
SINON
Erreur("Erreur dans l'exécution de la requête : " + ErreurInfo())
FIN

Explications détaillées
Gestion des paramètres : Les paramètres {Param1}, {Param2} et {Param3} doivent être définis et associés aux valeurs souhaitées avant l'exécution de la requête. Les noms des paramètres doivent correspondre exactement à ceux définis dans les requêtes SQL.

Utilisation de SourceVersTable : Cette commande permet de charger les résultats de la requête dynamique dans une table mémoire ou un champ Table pour traitement ultérieur.

Concaténation avec UNION ALL : En fonction des conditions, le code SQL est construit dynamiquement en concaténant les requêtes avec UNION ALL.

Flexibilité : Si vous avez besoin d'autres conditions ou d'autres combinaisons de requêtes, il suffit d'ajouter des branches dans les conditions pour gérer les cas spécifiques.

Alternatives
Si cette méthode devient complexe à cause du nombre de combinaisons, une alternative serait d'utiliser une procédure stockée côté serveur (si possible avec HFSQL Client/Serveur). Cela permettrait de gérer la logique directement au niveau de la base de données.

Cordialement