SQLクエリの作成に役立つUIを作成するユーザーが実行するプログラムを選択し、SQLクエリの最後[whereステートメントの後]または中央[fromステートメント]にいくつかのデータフィルターオプションを追加するJMPUIを作成しようとしています。私の最初の問題は、ユーザーが入力/選択したデータを新しい変数に誤って割り当てていると思うことです(行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を作成する@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>Re:SQLクエリの作成に役立つUIを作成する百万に感謝ErraticAttach
公式情報の一部を元に戻すと、いくつかのエラーメッセージが表示されます。
runを押して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]をクリックすると、次のように表示されます。
最初のポップアップ:[Microsoft] [ODBC DriverManager]無効な文字列またはバッファ長
2番目のポップアップ:失敗したSQLステートメントのログを参照してください
ログの読み取り:
code_1 = "AND COMPANY LIKE '%AAA%')";
code_2 = "AND PRODUCT LIKE '%Prod1%')";
sql_statement_1 = "";
無効なSQLステートメント:
{ボタン(1)}
このsql_statementの欠如を克服する方法についてのアイデアはありますか?
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を作成する私はあなたがそれらを定義したように関数を使用していました。195行目を次のように置き換えて文字列を連結する必要があるようです。 WHERE SCANDATETIME>(SYSDATE-30) "|| code_1 ||" "|| code_2);
データベースに偽の値があるため、ポップアップが発生します。
ビルトインの再定義に関するログは、関数名がビルトインを反映しているために発生します。ログメッセージが必要ない場合は、関数名を変更できます。
Re:SQLクエリの作成に役立つUIを作成するはい、正しく動作するようになりました
WHERE SCANDATETIME>(SYSDATE --365) "||" ^ code_1 ^ "||" ^ code_2 ^ "