Crea un'interfaccia utente per aiutare a creare query sqlSto cercando di creare un'interfaccia utente JMP in cui un utente seleziona un programma da eseguire e aggiunge alcune opzioni di filtro dati alla fine [istruzione after where] o centrale [from statement] di una query SQL.Il mio primo problema è che penso di assegnare i dati inseriti/selezionati dall'utente in modo errato a una nuova variabile (vedi riga 45 ---> DataParam_1).Quindi non sono sicuro di come assegnare le istruzioni di selezione del filtro ("AND ....") e unirle tutte in un'istruzione SQL del programma più grande.Ho provato a prendere tutti i dati inseriti dall'utente e restituirli a una funzione chiamata SUB_QUERY_1, manipolarli lì e infine passarli a una funzione di query finale SQL_Query_1 ma sembra che non funzioni.
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>Accesso ai datiQualità e ingegneria di processoRi: Creare un'interfaccia utente per aiutare a creare query sql@pmroz
Le mie scuse
Ha funzionato perfettamente e ho fatto clic sulle selezioni ma non le ho spostate nelle sezioni giuste per "scegliere" il loro valore.
Ci scusiamo per il messaggio misto.
Un'altra ottima soluzione!
Ri: Crea un'interfaccia utente per aiutare a creare query sql@pmroz
Apprezzo molto l'aiuto e mi piace molto anche la tua idea
Quando eseguo lo script così com'è, il registro incorporato non rileva le mie selezioni e invece mostra il vuoto anche se ho effettuato le selezioni
"Select *
from TABLE.DATA
WHERE SCANDATETIME > (SYSDATE - 30)
)
)"Come si può rimediare?
Ri: Crea un'interfaccia utente per aiutare a creare query sqlSì, ora funziona correttamente con
WHERE SCANDATETIME > (SYSDATE - 365)" || "^codice_1^" || "^codice_2^"
Ri: Creare un'interfaccia utente per aiutare a creare query sqlStavo usando le funzioni come le avevi definite.Sembra che tu debba concatenare le stringhe insieme sostituendo la riga 195 con WHERE SCANDATETIME > (SYSDATE - 30) " || codice_1 || " " || codice_2 );
Il popup si verifica perché il database ha valori fasulli.
Il registro sulla ridefinizione dei builtin avviene perché i nomi delle funzioni rispecchiano i builtin.È possibile modificare i nomi delle funzioni se non si desidera i messaggi di registro.
Ri: Creare un'interfaccia utente per aiutare a creare query sqlQuesto approccio è un po' più semplice dal punto di vista dell'interfaccia utente.Le funzioni sono utili ma per questo esempio non penso che tu ne abbia bisogno.Ecco la finestra di dialogo:

Si noti che la selezione del programma da eseguire ora è una casella radio.Quindi, invece di scegliere le opzioni per il programma 1 e le opzioni per il programma 2, ha uno scopo più singolare.
Ecco il codice:
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" );
);
Ri: Creare un'interfaccia utente per aiutare a creare query sqlGrazie mille ErraticAttach
Quando sostituisco alcune delle mie informazioni ufficiali, ricevo alcuni messaggi di errore:
Dopo aver premuto Esegui e viene visualizzata l'interfaccia utente, il registro incorporato mostra:
La funzione definita dall'utente "Button Box" è in conflitto con la funzione JMP "Button Box". Utilizzare un riferimento con ambito (ad esempio Global:Button Box o Here:Button Box) per chiamare la funzione definita dall'utente. Altri utilizzi di "Button Box" nella sorgente dello script continueranno a richiamare la funzione JMP.
La funzione definita dall'utente "Combo Box" è in conflitto con la funzione JMP "Combo Box". Utilizzare un riferimento con ambito (ad esempio Global:Combo Box o Here:Combo Box) per chiamare la funzione definita dall'utente. Altri usi di "Combo Box" nel codice sorgente dello script continueranno a richiamare la funzione JMP.
La funzione definita dall'utente "Check Box" è in conflitto con la funzione JMP "Check Box". Utilizzare un riferimento con ambito (ad esempio, Global:Check Box o Here:Check Box) per chiamare la funzione definita dall'utente. Altri usi di "Casella di controllo" nella sorgente dello script continueranno a richiamare la funzione JMP.
"#38"
Quindi ho selezionato il programma 1 e ho premuto OK e vedo:
1° pop-up: [Microsoft][ODBC Driver Manager] Stringa non valida o lunghezza del buffer
2a finestra a comparsa: consultare il registro per l'istruzione SQL non riuscita
Il registro recita:
code_1 = "E AZIENDA COME '%AAA%')";
code_2 = "E PRODOTTO COME '%Prod1%')";
sql_statement_1 = "";
Istruzione SQL non valida:
{Pulsante( 1 )}
Qualche idea su come superare questa mancanza di una dichiarazione sql?
Ri: Crea un'interfaccia utente per aiutare a creare query sql@Tom_P , qui ho creato uno script di esempio che utilizza il controllo dell'ambito esplicito per tenere traccia degli elementi dell'interfaccia utente e fornire un meccanismo di richiamata più conciso.Questo è uno script di esempio e ha bisogno di un sacco di boilerplate.Se ti ritrovi a seguire questo metodo e a creare molti script interattivi dell'interfaccia utente, ti consiglio di creare una libreria per eseguire automaticamente il codice standard (JSL ha una meravigliosa capacità di utilizzare la meta-programmazione per modificare gli script prima che vengano eseguiti).
Il metodo seguente consente la persistenza degli input e la protezione sui callback.
/* 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>