Erstellen Sie eine Benutzeroberfläche, um SQL-Abfragen zu erstellenIch möchte eine JMP-Benutzeroberfläche erstellen, in der ein Benutzer ein auszuführendes Programm auswählt und einige Datenfilteroptionen am Ende [nach der Anweisung von wo] oder in der Mitte [von der Anweisung] einer SQL-Abfrage hinzufügt.Mein erstes Problem ist, dass ich glaube, dass ich die vom Benutzer eingegebenen/ausgewählten Daten falsch einer neuen Variablen zuweist (siehe Zeile 45 ---> DataParam_1).Dann bin ich mir nicht sicher, wie ich die Filterauswahlanweisungen ("AND ....") zuordnen und alles wieder in eine größere Programm-SQL-Anweisung zusammenführen soll.Ich habe versucht, alle vom Benutzer eingegebenen Daten zu nehmen und an eine Funktion namens SUB_QUERY_1 zurückzugeben, sie dort zu manipulieren und schließlich an die letzte Abfragefunktion SQL_Query_1 zu übergeben, aber dies scheint nicht zu funktionieren.
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>SkriptingBetreff: Benutzeroberfläche erstellen, um SQL-Abfragen zu erstellen@Tom_P , habe ich hier ein Beispielskript erstellt, das eine explizite Bereichssteuerung verwendet, um Benutzeroberflächenelemente zu verfolgen und einen prägnanteren Rückrufmechanismus bereitzustellen.Dies ist ein Beispielskript und benötigt eine Menge Boiler-Plate.Wenn Sie dieser Methode folgen und viele interaktive UI-Skripte erstellen, empfehle ich, eine Bibliothek zu erstellen, um den Boiler-Plate-Code automatisch auszuführen (JSL hat eine wunderbare Fähigkeit, Meta-Programmierung zu verwenden, um Skripte zu ändern, bevor sie ausgeführt werden).
Die folgende Methode ermöglicht die Persistenz der Eingaben sowie den Schutz der Rückrufe.
/* 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>Betreff: Benutzeroberfläche erstellen, um SQL-Abfragen zu erstellenTausend Dank ErraticAttach
Wenn ich einige meiner offiziellen Informationen wieder einsetze, erhalte ich einige Fehlermeldungen:
Wenn Sie auf Ausführen klicken und die Benutzeroberfläche angezeigt wird, wird das eingebettete Protokoll angezeigt:
Die benutzerdefinierte Funktion "Button Box" steht in Konflikt mit der JMP-Funktion "Button Box". Verwenden Sie eine bereichsbezogene Referenz (z. B. Global:Button Box oder Here:Button Box), um Ihre benutzerdefinierte Funktion aufzurufen. Andere Verwendungen von "Button Box" in Ihrer Skriptquelle werden weiterhin die JMP-Funktion aufrufen.
Die benutzerdefinierte Funktion "Combo Box" steht in Konflikt mit der JMP-Funktion "Combo Box". Verwenden Sie eine bereichsbezogene Referenz (z. B. Global:Combo Box oder Here:Combo Box), um Ihre benutzerdefinierte Funktion aufzurufen. Andere Verwendungen von "Combo Box" in Ihrer Skriptquelle rufen weiterhin die JMP-Funktion auf.
Die benutzerdefinierte Funktion "Check Box" steht in Konflikt mit der JMP-Funktion "Check Box". Verwenden Sie eine bereichsbezogene Referenz (z. B. Global:Check Box oder Here:Check Box), um Ihre benutzerdefinierte Funktion aufzurufen. Andere Verwendungen von "Check Box" in Ihrer Skriptquelle werden weiterhin die JMP-Funktion aufrufen.
"#38"
Dann habe ich Programm 1 ausgewählt und auf OK geklickt und ich sehe:
1. Popup: [Microsoft][ODBC Driver Manager] Ungültige Zeichenfolge oder Pufferlänge
2. Popup: Suchen Sie im Protokoll nach der fehlgeschlagenen SQL-Anweisung
Protokoll lautet:
code_1 = "UND UNTERNEHMEN WIE '%AAA%')";
code_2 = "UND PRODUKT WIE '%Prod1%')";
sql_statement_1 = "";
Ungültige SQL-Anweisung:
{Knopf 1 )}
Irgendwelche Ideen, wie man dieses Fehlen einer sql_statement überwindet?
Betreff: Benutzeroberfläche erstellen, um SQL-Abfragen zu erstellenDieser Ansatz ist aus Sicht der Benutzeroberfläche etwas einfacher.Funktionen sind nützlich, aber für dieses Beispiel glaube ich nicht, dass Sie sie brauchen.Hier ist das Dialogfeld:

Beachten Sie, dass die Auswahl des auszuführenden Programms jetzt ein Radiofeld ist.Anstatt also Optionen für Programm 1 und Optionen für Programm 2 zu wählen, dient es einem einzelnen Zweck.
Hier ist der 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" );
);
Betreff: Benutzeroberfläche erstellen, um SQL-Abfragen zu erstellenIch habe die Funktionen so verwendet, wie Sie sie definiert haben.Es sieht so aus, als ob Sie die Strings zusammenfügen müssen, indem Sie die Zeile 195 durch ersetzen WHERE SCANDATETIME > (SYSDATE - 30) " || code_1 || " " || code_2 );
Das Popup tritt auf, weil die Datenbank falsche Werte enthält.
Das Protokoll über die Neudefinition der Built-Ins erfolgt, weil die Funktionsnamen die Built-Ins widerspiegeln.Sie können die Funktionsnamen ändern, wenn Sie die Protokollmeldungen nicht möchten.
Betreff: Erstellen Sie eine Benutzeroberfläche, um beim Erstellen von SQL-Abfragen zu helfenJa es läuft jetzt einwandfrei mit
WHERE SCANDATETIME > (SYSDATE - 365)" || "^code_1^" || "^code_2^"