SQL クエリの構築に役立つ UI を作成するユーザーが実行するプログラムを選択し、SQL クエリの最後 [where ステートメントの後] または中間 [from ステートメント] にいくつかのデータ フィルター オプションを追加する JMP UI を作成しようとしています。私の最初の問題は、ユーザーが入力/選択したデータを新しい変数に間違って割り当てていると思われることです(行45--->DataParam_1を参照)。次に、フィルター選択ステートメント (「AND ....」) を割り当てて、それをすべて 1 つの大きなプログラム 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>データアクセス品質およびプロセスエンジニアリングRe: SQL クエリの構築に役立つ UI を作成する@pmroz
謝罪いたします
これは完璧に機能し、選択項目をクリックしましたが、値を「選択」するための正しいセクションに移動しませんでした。
雑多なメッセージで申し訳ありません。
もう一つの素晴らしい解決策です!
Re: SQL クエリの構築に役立つ UI を作成する@pmroz
助けてくれて本当に感謝しています、そしてあなたのアイデアもとても気に入りました
スクリプトをそのまま実行すると、埋め込みログは選択内容を認識せず、選択を行ったにもかかわらず空が表示されます。
"Select *
from TABLE.DATA
WHERE SCANDATETIME > (SYSDATE - 30)
)
)"これはどうすれば解決できますか?
Re: SQL クエリの構築に役立つ UI を作成するはい、現在は正常に動作しています
WHERE SCANDATETIME > (SYSDATE - 365)" || "^code_1^" || "^code_2^"
Re: SQL クエリの構築に役立つ UI を作成する私はあなたが定義したとおりに関数を使用していました。195行目を次のように置き換えて文字列を連結する必要があるようです。 WHERE SCANDATETIME > (SYSDATE - 30) " || code_1 || " " || code_2 );
このポップアップは、データベースに偽の値が含まれているために発生します。
組み込み関数の再定義に関するログは、関数名が組み込み関数を反映しているために発生します。ログ メッセージが不要な場合は、関数名を変更できます。
Re: SQL クエリの構築に役立つ UI を作成するこのアプローチは、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" );
);
Re: SQL クエリの構築に役立つ UI を作成する100 万ありがとう
公式情報の一部を元に戻すと、いくつかのエラー メッセージが表示されます。
「実行」をクリックすると 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 を選択して OK をクリックすると、次のように表示されます。
1 番目のポップアップ: [Microsoft][ODBC Driver Manager] 無効な文字列またはバッファ長です
2 番目のポップアップ: 失敗した SQL ステートメントのログを参照してください。
ログには次の内容が記録されます:
code_1 = "そして会社のような '%AAA%')";
code_2 = "および「%Prod1%」のような製品)";
sql_statement_1 = "";
無効な SQL ステートメント:
{ボタン( 1 )}
この sql_statement の欠如を克服する方法について何かアイデアはありますか?
Re: SQL クエリの構築に役立つ UI を作成する@Tom_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>