Cree una interfaz de usuario para ayudar a construir consultas SQLEstoy buscando crear una interfaz de usuario de JMP en la que un usuario seleccione un programa para ejecutar y agregue algunas opciones de filtro de datos al final [después de la declaración where] o en el medio [de la declaración from] de una consulta SQL.Mi primer problema es que creo que estoy asignando incorrectamente los datos ingresados / seleccionados por el usuario a una nueva variable (ver fila 45 ---> DataParam_1).Entonces no estoy seguro de cómo asignar las instrucciones de selección de filtro ("Y ....") y fusionarlo todo en una instrucción SQL de programa más grande.Intenté tomar todos los datos ingresados por el usuario y devolverlos a una función llamada SUB_QUERY_1, manipularlos allí y finalmente pasarlos a la función de consulta final SQL_Query_1, pero esto parece no funcionar.
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>ScriptingRe: crear UI para ayudar a construir consultas SQL@Tom_P , He creado una secuencia de comandos de muestra aquí que utiliza un control de alcance explícito para realizar un seguimiento de los elementos de la interfaz de usuario y proporcionar un mecanismo de devolución de llamada más sucinto.Este es un script de ejemplo y necesita un montón de calderas.Si sigue este método y crea muchos scripts de IU interactivos, le aconsejo que cree una biblioteca para realizar el código de la placa de caldera automáticamente (JSL tiene una capacidad maravillosa para usar metaprogramación para modificar los scripts antes de que se ejecuten).
El siguiente método permite la persistencia de las entradas, así como la protección en las devoluciones de llamada.
/* 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: crear UI para ayudar a construir consultas SQLUn millón de gracias ErraticAttach
Cuando sustituyo parte de mi información oficial, recibo algunos mensajes de error:
Al presionar ejecutar y aparece la interfaz de usuario, el registro incrustado muestra:
La función definida por el usuario "Caja de botones" entra en conflicto con la función "Caja de botones" de JMP. Utilice una referencia de ámbito (por ejemplo, Global: Cuadro de botones o Aquí: Cuadro de botones) para llamar a su función definida por el usuario. Otros usos de "Button Box" en su fuente de script continuarán llamando a la función JMP.
La función definida por el usuario "Combo Box" entra en conflicto con la función JMP "Combo Box". Utilice una referencia de ámbito (por ejemplo, Global: Cuadro combinado o Aquí: Cuadro combinado) para llamar a su función definida por el usuario. Otros usos de "Combo Box" en su fuente de script continuarán llamando a la función JMP.
La función definida por el usuario "Casilla de verificación" entra en conflicto con la función "Casilla de verificación" de JMP. Utilice una referencia con ámbito (por ejemplo, Global: casilla de verificación o Aquí: casilla de verificación) para llamar a su función definida por el usuario. Otros usos de "Casilla de verificación" en la fuente de la secuencia de comandos continuarán llamando a la función JMP.
"# 38"
Luego seleccioné el Programa 1 y presioné OK y veo:
Primera ventana emergente: [Microsoft] [ODBC Driver Manager] Cadena o longitud de búfer no válida
Segunda ventana emergente: consulte el registro de la declaración SQL que falló
El registro lee:
code_1 = "Y COMPAÑÍA COMO '% AAA%')";
code_2 = "Y PRODUCTO COMO '% Prod1%')";
sql_statement_1 = "";
Declaración SQL no válida:
{Botón 1 )}
¿Alguna idea sobre cómo superar esta falta de sql_statement?
Re: crear UI para ayudar a construir consultas SQLEste enfoque es un poco más simple desde el punto de vista de la interfaz de usuario.Las funciones son útiles, pero para este ejemplo no creo que las necesite.Aquí está el cuadro de diálogo:

Tenga en cuenta que la selección de qué programa ejecutar ahora es una caja de radio.Entonces, en lugar de elegir opciones para el programa 1 y opciones para el programa 2, tiene un propósito más singular.
Aquí está el código:
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: crear UI para ayudar a construir consultas SQLEstaba usando las funciones como las habías definido.Parece que necesita combinar las cadenas reemplazando la línea 195 con DONDE SCANDATETIME> (SYSDATE - 30) "|| código_1 ||" "|| código_2);
La ventana emergente ocurre porque la base de datos tiene valores falsos.
El registro sobre la redefinición de las incorporaciones ocurre porque los nombres de las funciones reflejan las incorporaciones.Puede cambiar los nombres de las funciones si no desea los mensajes de registro.
Re: Crear interfaz de usuario para ayudar a crear consultas sqlSí, ahora funciona correctamente con
WHERE SCANDATETIME > (SYSDATE - 365)" || "^código_1^" || "^código_2^"