Erstellen Sie eine Benutzeroberfläche, um die Erstellung von SQL-Abfragen zu unterstützenIch möchte eine JMP-Benutzeroberfläche erstellen, in der ein Benutzer ein auszuführendes Programm auswählt und einige Datenfilteroptionen am Ende [nach der Where-Anweisung] 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 zuordne (siehe Zeile 45--->DataParam_1).Dann bin ich mir nicht sicher, wie ich die Filterauswahlanweisungen („AND ...“) zuweisen und alles wieder in einer größeren Programm-SQL-Anweisung zusammenführen soll.Ich habe versucht, alle vom Benutzer eingegebenen Daten an eine Funktion namens SUB_QUERY_1 zurückzugeben, sie dort zu manipulieren und sie schließlich an die endgültige Abfragefunktion SQL_Query_1 zu übergeben, aber das 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>DatenzugriffQualitäts- und VerfahrenstechnikBetreff: Erstellen Sie eine Benutzeroberfläche, um beim Erstellen von SQL-Abfragen zu helfen@pmroz
Entschuldigen Sie
Das hat perfekt funktioniert und ich habe auf die Auswahl geklickt, sie aber nicht in die richtigen Abschnitte verschoben, um ihren Wert „auszuwählen“.
Entschuldigung für die gemischte Nachricht.
Eine weitere tolle Lösung!
Betreff: Erstellen Sie eine Benutzeroberfläche, um beim Erstellen von SQL-Abfragen zu helfen@pmroz
Ich schätze die Hilfe sehr und auch Ihre Idee gefällt mir sehr gut
Wenn ich das Skript unverändert ausführe, erfasst das eingebettete Protokoll meine Auswahl nicht und zeigt stattdessen Leere an, obwohl ich eine Auswahl getroffen habe
"Select *
from TABLE.DATA
WHERE SCANDATETIME > (SYSDATE - 30)
)
)"Wie lässt sich das beheben?
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^"
Betreff: Erstellen Sie eine Benutzeroberfläche, um beim Erstellen von SQL-Abfragen zu helfenIch habe die Funktionen so verwendet, wie Sie sie definiert haben.Es sieht so aus, als müssten Sie die Zeichenfolgen zusammenfassen, indem Sie Zeile 195 durch ersetzen WHERE SCANDATETIME > (SYSDATE - 30) " || code_1 || " " || code_2 );
Das Popup wird angezeigt, weil die Datenbank falsche Werte enthält.
Das Protokoll über die Neudefinition der integrierten Funktionen erfolgt, weil die Funktionsnamen die integrierten Funktionen 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 helfenDieser Ansatz ist aus Sicht der Benutzeroberfläche etwas einfacher.Funktionen sind nützlich, aber für dieses Beispiel glaube ich nicht, dass Sie sie benötigen.Hier ist das Dialogfeld:

Beachten Sie, dass die Auswahl des auszuführenden Programms jetzt ein Optionsfeld ist.Anstatt also Optionen für Programm 1 und Optionen für Programm 2 auszuwählen, dient es einem einzigartigeren 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: Erstellen Sie eine Benutzeroberfläche, um beim Erstellen von SQL-Abfragen zu helfenTausend 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 im eingebetteten Protokoll Folgendes angezeigt:
Die benutzerdefinierte Funktion „Button Box“ steht im 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. Bei anderen Verwendungen von „Button Box“ in Ihrer Skriptquelle wird weiterhin die JMP-Funktion aufgerufen.
Die benutzerdefinierte Funktion „Combo Box“ steht im 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. Bei anderen Verwendungen von „Combo Box“ in Ihrer Skriptquelle wird weiterhin die JMP-Funktion aufgerufen.
Die benutzerdefinierte Funktion „Check Box“ steht im 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. Bei anderen Verwendungen von „Kontrollkästchen“ in Ihrer Skriptquelle wird weiterhin die JMP-Funktion aufgerufen.
„#38“
Dann habe ich Programm 1 ausgewählt und auf OK geklickt und sehe:
1. Popup: [Microsoft][ODBC Driver Manager] Ungültige Zeichenfolge oder Pufferlänge
Zweites Pop-up: Suchen Sie im Protokoll nach der fehlgeschlagenen SQL-Anweisung
Protokoll lautet:
code_1 = „UND FIRMA 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 beheben kann?
Betreff: Erstellen Sie eine Benutzeroberfläche, um beim Erstellen von SQL-Abfragen zu helfen@Tom_P , habe ich hier ein Beispielskript erstellt, das eine explizite Bereichskontrolle verwendet, um UI-Elemente zu verfolgen und einen prägnanteren Rückrufmechanismus bereitzustellen.Dies ist ein Beispielskript und erfordert eine Reihe von Grundkenntnissen.Wenn Sie dieser Methode folgen und viele interaktive UI-Skripte erstellen, empfehle ich Ihnen, eine Bibliothek zu erstellen, um den Boiler-Plate-Code automatisch auszuführen (JSL verfügt über eine wunderbare Fähigkeit, Metaprogrammierung zu verwenden, um Skripte vor ihrer Ausführung zu ändern).
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>