Créer une interface utilisateur pour aider à créer des requêtes sqlJe cherche à créer une interface utilisateur JMP dans laquelle un utilisateur sélectionne un programme à exécuter et ajoute des options de filtre de données à la fin [après l'instruction] ou au milieu [de l'instruction] d'une requête SQL.Mon premier problème est que je pense que j'affecte incorrectement les données saisies/sélectionnées par l'utilisateur à une nouvelle variable (voir la ligne 45 ---> DataParam_1).Ensuite, je ne sais pas comment attribuer les instructions de sélection de filtre ("AND ....") et fusionner le tout dans une instruction SQL de programme plus grande.J'ai essayé de prendre toutes les données saisies par l'utilisateur et de les renvoyer à une fonction appelée SUB_QUERY_1, de les manipuler là-bas et enfin de les transmettre à la fonction de requête finale SQL_Query_1, mais cela semble ne pas fonctionner.
Clear Log();
SUB_QUERY_1 = Function( {Company_1, Company_2, Product_1, Product_2, Program_1, Program_2},
//create query substatements for sql insertion after the main WHERE statement
code_1 = If(
(Company_1 != 0) & (Company_2 != 0), Eval Insert( "AND (COMPANY LIKE '%^Company_1^%' OR COMPANY LIKE '%^Company_2^%))" ),
(Company_1 != 0), Eval Insert( "AND COMPANY LIKE '%^Company_1^%')" )
);
code_2 = If(
(Product_1 != 0) & (Product_2 != 0), Eval Insert( "AND (PRODUCT LIKE '%^Product_1^%' OR PRODUCT LIKE '%^Product_2^%))" ),
(Product_1 != 0), Eval Insert( "AND PRODUCT LIKE '%^Product_1^%')" )
);
Show( code_1, code_2 );
//based on selected checkbox, run the query associated and insert code_1,code_2 at end of sql statement
If(
Program_1 != 0, SQL_Query_1( code_1, code_2 ),
Program_2 != 0, SQL_Query_2( code_1, code_2 )
);
);
//Final query to run based on altered info from user-interface & SUB_QUERY function
SQL_Query_1 = Function( {code_1, code_2},
sql_statement_1 = Eval Insert( "Select *
from TABLE.DATA
WHERE SCANDATETIME > (SYSDATE - 30)" + code_1 + code_2 );
Show( sql_statement_1 );
Open Database( "DSN=xxx;UID=xxx;PWD=xxx;", sql_statement_1, "Table1" );
);
//SQL_Query_2 will be copy of SQL_Query_1 with different sql statement
//ignore that it is missing for the moment
//user-interface
ww = New Window( "Epi JMP Data Query",
<<MODAL></MODAL>Accès aux donnéesIngénierie de la qualité et des procédésRe : Créer une interface utilisateur pour aider à créer des requêtes SQL@pmroz
Mes excuses
Cela a parfaitement fonctionné et j'ai cliqué sur les sélections mais je ne les ai pas déplacées vers les bonnes sections pour "choisir" leur valeur.
Désolé pour le message mitigé.
Une autre excellente solution!
Re : Créer une interface utilisateur pour aider à créer des requêtes SQL@pmroz
J'apprécie vraiment l'aide et j'aime beaucoup votre idée aussi
Lorsque j'exécute le script tel quel, le journal intégré ne récupère pas mes sélections et affiche à la place un vide même si j'ai fait des sélections
"Select *
from TABLE.DATA
WHERE SCANDATETIME > (SYSDATE - 30)
)
)"Comment remédier à cela ?
Re : Créer une interface utilisateur pour aider à créer des requêtes SQLOui, il fonctionne maintenant correctement avec
WHERE SCANDATETIME > (SYSDATE - 365)" || "^code_1^" || "^code_2^"
Re : Créer une interface utilisateur pour aider à créer des requêtes SQLJ'utilisais les fonctions telles que vous les aviez définies.Il semble que vous deviez concaténer les chaînes en remplaçant la ligne 195 par WHERE SCANDATETIME > (SYSDATE - 30) " || code_1 || " " || code_2 );
La fenêtre contextuelle se produit parce que la base de données contient des valeurs factices.
Le journal sur la redéfinition des fonctions intégrées se produit parce que les noms de fonction reflètent les fonctions intégrées.Vous pouvez modifier les noms des fonctions si vous ne voulez pas les messages du journal.
Re : Créer une interface utilisateur pour aider à créer des requêtes SQLCette approche est un peu plus simple du point de vue de l'interface utilisateur.Les fonctions sont utiles mais pour cet exemple, je ne pense pas que vous en ayez besoin.Voici la boîte de dialogue :

Notez que la sélection du programme à exécuter est maintenant une boîte radio.Ainsi, au lieu de choisir des options pour le programme 1 et des options pour le programme 2, il sert un objectif plus singulier.
Voici le code :
program_list = {"Option 1", "Option 2"};
company_list = {"AAA", "BBB", "CCC"};
product_list = {"Product 1", "Product 2"};
nw = new window("Option 1", << modal,
panel box("Select Program to run:",
program_rb = radio box(program_list),
),
panel box("Select Company",
hlistbox(
comp_lb = list box(company_list),
vlistbox(
comp_right_bb = button box("", << set icon("Next"),
<< set function(
function({this},
comp_selected_lb << append(comp_lb << get selected);
),
),
),
comp_left_bb = button box("", << set icon("Prev"),
<< set function(
function({this},
comp_selected_lb << remove selected;
),
),
),
),
comp_selected_lb = list box({}),
),
),
panel box("Select Product",
hlistbox(
prod_lb = list box(product_list),
vlistbox(
prod_right_bb = button box("", << set icon("Next"),
<< set function(
function({this},
prod_selected_lb << append(prod_lb << get selected);
),
),
),
prod_left_bb = button box("", << set icon("Prev"),
<< set function(
function({this},
prod_selected_lb << remove selected;
),
),
),
),
prod_selected_lb = list box({}),
),
),
panel box("Actions",
hlistbox(
button box("OK",
continue_flag = 1;
selected_company_list = comp_selected_lb << get items;
selected_product_list = prod_selected_lb << get items;
),
button box("Cancel", continue_flag = 0),
),
),
);
if (continue_flag,
// print(selected_company_list);
// print(selected_product_list);
company_sql = "";
for (i = 1, i <= nitems(selected_company_list), i++,
one_company = selected_company_list[i];
if (i == 1,
company_sql = evalinsert(" AND (COMPANY LIKE '%^one_company^%'");
,
// else
company_sql = company_sql || evalinsert(" OR COMPANY LIKE '%^one_company^%'");
);
);
company_sql = company_sql || ")";
// print(company_sql);
product_sql = "";
for (i = 1, i <= nitems(selected_product_list), i++,
one_product = selected_product_list[i];
if (i == 1,
product_sql = evalinsert(" AND (PRODUCT LIKE '%^one_product^%'");
,
// else
product_sql = product_sql || evalinsert(" OR PRODUCT LIKE '%^one_product^%'");
);
);
product_sql = product_sql || ")";
// print(product_sql);
sql_statement = Eval Insert(
"Select *
from TABLE.DATA
WHERE SCANDATETIME > (SYSDATE - 30)
^company_sql^
^product_sql");
print( sql_statement );
// Open Database( "DSN=xxx;UID=xxx;PWD=xxx;", sql_statement_1, "Table1" );
);
Re : Créer une interface utilisateur pour aider à créer des requêtes SQLMerci mille fois ErraticAttach
Lorsque je remplace certaines de mes informations officielles, j'obtiens quelques messages d'erreur :
Lorsque vous cliquez sur Exécuter et que l'interface utilisateur s'affiche, le journal intégré affiche :
La fonction définie par l'utilisateur "Button Box" est en conflit avec la fonction JMP "Button Box". Utilisez une référence délimitée (par exemple, Global:Button Box ou Here:Button Box) pour appeler votre fonction définie par l'utilisateur. Les autres utilisations de "Button Box" dans votre source de script continueront d'appeler la fonction JMP.
La fonction définie par l'utilisateur "Combo Box" est en conflit avec la fonction JMP "Combo Box". Utilisez une référence délimitée (par exemple, Global:Combo Box ou Here:Combo Box) pour appeler votre fonction définie par l'utilisateur. Les autres utilisations de "Combo Box" dans votre source de script continueront d'appeler la fonction JMP.
La fonction définie par l'utilisateur « Case à cocher » est en conflit avec la fonction JMP « Case à cocher ». Utilisez une référence délimitée (par exemple, Global:Check Box ou Here:Check Box) pour appeler votre fonction définie par l'utilisateur. Les autres utilisations de "Check Box" dans votre source de script continueront d'appeler la fonction JMP.
"#38"
Ensuite, j'ai sélectionné le programme 1 et appuyé sur OK et je vois :
1ère fenêtre contextuelle : [Microsoft][ODBC Driver Manager] Chaîne ou longueur de tampon non valide
2ème pop-up : consultez le journal de l'instruction SQL qui a échoué
Le journal indique :
code_1 = "ET ENTREPRISE COMME '%AAA%')" ;
code_2 = "ET PRODUIT COMME '%Prod1%')" ;
sql_statement_1 = "" ;
Instruction SQL non valide :
{Bouton( 1 )}
Des idées sur la façon de surmonter ce manque de sql_statement?
Re : Créer une interface utilisateur pour aider à créer des requêtes SQL@Tom_P , j'ai créé ici un exemple de script qui utilise un contrôle de portée explicite pour suivre les éléments de l'interface utilisateur et fournir un mécanisme de rappel plus succinct.Ceci est un exemple de script et a besoin d'un tas de passe-partout.Si vous vous retrouvez à suivre cette méthode et à créer de nombreux scripts d'interface utilisateur interactifs, je vous conseille de créer une bibliothèque pour exécuter automatiquement le code standard (JSL a une merveilleuse capacité à utiliser la méta-programmation pour modifier les scripts avant qu'ils ne soient exécutés).
La méthode ci-dessous permet la persistance des entrées ainsi que la protection sur les rappels.
/* SQL Query */
self = New Namespace();
self:tool name = "SQL Setup";
Eval( Eval Expr(
self:initialize = Function( {},
self = Namespace( Expr( self << Get Name ) );
If( File Exists( "$TEMP/SQL_Setup.jsl" ),
self:settings = Include( "$TEMP/SQL_Setup.jsl" );
,
self:settings = [=>];
);
self:available companies = {"", "AAA", "BBB", "CCC"};
self:available products = {"", "Prod1", "Prod2"};
1
);
self:content = Function( {},
V List Box(
H List Box(
Panel Box( "Select Program to Run:",
V List Box(
self:DataParam 1 = self:Check Box( {"Option_1"}, "dataparam 1", "single select(this, 1)" )
,
self:DataParam 2 = self:Check Box( {"Option_2"}, "dataparam 2", "single select(this, 2)" )
)
)
,
Panel Box( "Data Filter",
Lineup Box( N Col( 3 ), Spacing( 3 ),
V List Box( Align( "Right" ), Text Box( "Company:" ) )
,
self:company 1 = self:Combo Box( self:available companies, "company 1" )
,
self:company 2 = self:Combo Box( self:available companies, "company 2" )
,
V List Box( Align( "Right" ), Text Box( "Customer:" ) )
,
self:product 1 = self:Combo Box( self:available products, "product 1" )
,
self:product 2 = self:Combo Box( self:available products, "product 2" )
)
)
)
,
H List Box(
self:Button Box( "OK", "run sql" )
,
Spacer Box( <<SET auto="" stretching=""> (SYSDATE - 30)" + code_1 + code_2 );
Show( sql_statement_1 );
Open Database( "DSN=xxx;UID=xxx;PWD=xxx;", sql_statement_1, "Table1" );
);
) );
Eval( Eval Expr(
self:initialize();
New Window( self:tool name,
<<MODAL></MODAL></SET>