SQL 쿼리를 빌드하는 데 도움이 되는 UI 만들기사용자가 실행할 프로그램을 선택하고 일부 데이터 필터 옵션을 SQL 쿼리의 끝 [where 문] 또는 중간 [from 문]에 추가하는 JMP UI를 만들려고 합니다.내 첫 번째 문제는 사용자가 입력/선택한 데이터를 새 변수에 잘못 할당하고 있다고 생각한다는 것입니다(행 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>데이터 접근품질 및 프로세스 엔지니어링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 만들기백만 ErraticAttach 감사합니다
내 공식 정보 중 일부를 다시 대체하면 몇 가지 오류 메시지가 표시됩니다.
실행을 누르고 UI가 팝업되면 포함된 로그에 다음이 표시됩니다.
사용자 정의 함수 "버튼 상자"가 JMP 함수 "버튼 상자"와 충돌합니다. 범위 참조(예: Global:Button Box 또는 Here:Button Box)를 사용하여 사용자 정의 함수를 호출합니다. 스크립트 소스에서 "버튼 상자"의 다른 사용은 계속해서 JMP 함수를 호출합니다.
사용자 정의 함수 "Combo Box"가 JMP 함수 "Combo Box"와 충돌합니다. 범위 참조(예: Global:Combo Box 또는 Here:Combo Box)를 사용하여 사용자 정의 함수를 호출합니다. 스크립트 소스에서 "콤보 상자"의 다른 용도는 JMP 함수를 계속 호출합니다.
사용자 정의 함수 "체크박스"가 JMP 함수 "체크박스"와 충돌합니다. 범위 참조(예: Global:Check Box 또는 Here:Check Box)를 사용하여 사용자 정의 함수를 호출합니다. 스크립트 소스에서 "확인란"의 다른 사용은 JMP 기능을 계속 호출합니다.
"#38"
그런 다음 프로그램 1을 선택하고 확인을 누르면 다음이 표시됩니다.
첫 번째 팝업: [Microsoft][ODBC 드라이버 관리자] 잘못된 문자열 또는 버퍼 길이
2차 팝업: 실패한 SQL 문에 대한 로그 참조
로그 읽기:
code_1 = "'%AAA%'와 같은 회사)";
code_2 = "그리고 '%Prod1%'와 같은 제품)";
sql_statement_1 = "";
잘못된 SQL 문:
{버튼( 1 )}
이 sql_statement 부족을 극복하는 방법에 대한 아이디어가 있습니까?
Re: SQL 쿼리 작성에 도움이 되는 UI 만들기@Tom_P , 여기에서 명시적 범위 제어를 사용하여 UI 요소를 추적하고 보다 간결한 콜백 메커니즘을 제공하는 샘플 스크립트를 만들었습니다.이것은 예제 스크립트이며 많은 상용구가 필요합니다.이 방법을 따르고 많은 대화형 UI 스크립트를 만드는 경우 상용구 코드를 자동으로 수행하는 라이브러리를 만드는 것이 좋습니다.
아래 방법은 콜백에 대한 보호뿐만 아니라 입력의 지속성을 허용합니다.
/* 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>