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 |