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 où] ou au milieu [à partir de l'instruction] d'une requête SQL.Mon premier problème est que je pense que j'affecte les données saisies/sélectionnées par l'utilisateur de manière incorrecte à une nouvelle variable (voir la ligne 45--->DataParam_1).Ensuite, je ne sais pas comment attribuer les instructions de sélection de filtre ("ET ....") et fusionner le tout dans une instruction SQL de programme plus large.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>ScriptRe: 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 nécessite 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 passe-partout (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 qu'une 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>Re: Créer une interface utilisateur pour aider à créer des requêtes SQLMerci un million d'ErraticAttach
Lorsque je remplace certaines de mes informations officielles, je reçois quelques messages d'erreur :
Lorsque vous appuyez 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 étendue (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 étendue (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 "Check Box" est en conflit avec la fonction JMP "Check Box". Utilisez une référence étendue (par exemple, Global:Check Box ou Here:Check Box) pour appeler votre fonction définie par l'utilisateur. D'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 j'ai appuyé sur OK et je vois :
1ère fenêtre contextuelle : [Microsoft][ODBC Driver Manager] Chaîne ou longueur de tampon non valide
2e pop-up : consultez le journal de l'instruction SQL qui a échoué
Le journal lit :
code_1 = "ET ENTREPRISE COMME '%AAA%')" ;
code_2 = "ET UN PRODUIT COMME '%Prod1%')" ;
sql_statement_1 = "";
Instruction SQL non valide :
{Bouton ( 1 )}
Des idées sur la façon de surmonter ce manque d'instruction sql_?
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 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 );
Le popup se produit parce que la base de données a des valeurs fausses.
Le journal sur la redéfinition des fonctions intégrées se produit car les noms de fonction reflètent les fonctions intégrées.Vous pouvez modifier les noms des fonctions si vous ne souhaitez pas recevoir les messages du journal.
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^"