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 만들기@톰_피 , 여기서 명시적 범위 제어를 사용하여 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>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 드라이버 관리자] 잘못된 문자열 또는 버퍼 길이
두 번째 팝업: 실패한 SQL 문에 대한 로그 참조
로그 읽기:
code_1 = "그리고 '%AAA%'와 같은 회사)";
code_2 = "그리고 '%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^"