創建 UI 以幫助構建 sql 查詢我希望創建一個 JMP UI,用戶可以在其中選擇要運行的程序並將一些數據過濾器選項添加到 SQL 查詢的末尾 [where 語句之後] 或中間 [from 語句]。我的第一個問題是我認為我將用戶輸入/選擇的數據錯誤地分配給了一個新變量(參見第 45 行--->DataParam_1)。然後我不確定如何分配過濾器選擇語句(“AND ....”)並將它們全部合併回一個更大的程序 SQL 語句。我試圖獲取所有用戶輸入的數據並將其傳遞回名為 SUB_QUERY_1 的函數,在那裡對其進行操作,最後將其傳遞給最終查詢函數 SQL_Query_1,但這似乎不起作用。
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>腳本編寫回复:創建 UI 以幫助構建 sql 查詢@湯姆_P ,我在這裡創建了一個示例腳本,它使用顯式範圍控制來跟踪 UI 元素並提供更簡潔的回調機制。這是一個示例腳本,需要一堆樣板。如果您發現自己遵循這種方法並製作了許多交互式 UI 腳本,我建議您創建一個庫來自動執行樣板代碼(JSL 具有在腳本運行之前使用元編程來修改腳本的出色能力)。
下面的方法允許輸入的持久性以及回調的保護。
/* 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>回复:創建 UI 以幫助構建 sql 查詢感謝一百萬 ErraticAttach
當我替換回我的一些官方信息時,我收到一些錯誤消息:
點擊運行並彈出 UI 後,嵌入的日誌顯示:
用戶定義函數“按鈕框”與 JMP 函數“按鈕框”衝突。 使用作用域引用(例如,Global:Button Box 或 Here:Button Box)來調用您的用戶定義函數。 腳本源中“按鈕框”的其他用途將繼續調用 JMP 函數。
用戶定義函數“組合框”與 JMP 函數“組合框”衝突。 使用作用域引用(例如,Global:Combo Box 或 Here:Combo Box)來調用用戶定義的函數。 腳本源中“組合框”的其他用途將繼續調用 JMP 函數。
用戶定義函數“複選框”與 JMP 函數“複選框”衝突。 使用作用域引用(例如,Global:Check Box 或 Here:Check Box)來調用您的用戶定義函數。 腳本源中“複選框”的其他用途將繼續調用 JMP 函數。
“#38”
然後我選擇了程序 1 並點擊確定,我看到:
第一個彈出窗口:[Microsoft][ODBC 驅動程序管理器] 無效的字符串或緩衝區長度
第二彈:查詢失敗的SQL語句的日誌
日誌寫道:
code_1 = "AND COMPANY LIKE '%AAA%')";
code_2 = "AND PRODUCT LIKE '%Prod1%')";
sql_statement_1 = "";
無效的 SQL 語句:
{按鈕(1)}
關於如何克服缺乏 sql_statement 的任何想法?
回复:創建 UI 以幫助構建 sql 查詢從 UI 的角度來看,這種方法更簡單一些。函數很有用,但對於這個例子,我認為你不需要它們。這是對話框:

請注意,選擇要運行的程序現在是一個單選框。因此,它不是為程序 1 選擇選項和為程序 2 選擇選項,而是服務於一個更單一的目的。
這是代碼:
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" );
);
回复:創建 UI 以幫助構建 sql 查詢我正在使用您定義的函數。看起來您需要通過將第 195 行替換為將字符串連接在一起WHERE SCANDATETIME > (SYSDATE - 30) " || code_1 || " " || code_2 );
彈出是因為數據庫有假值。
關於重新定義內置函數的日誌發生是因為函數名稱反映了內置函數。如果您不想要日誌消息,您可以更改函數名稱。
Re: 創建 UI 以幫助構建 sql 查詢是的,它現在可以正常運行
WHERE SCANDATETIME > (SYSDATE - 365)" || "^code_1^" || "^code_2^"