Crear interfaz de usuario para ayudar a crear consultas sqlEstoy buscando crear una interfaz de usuario de JMP donde un usuario selecciona un programa para ejecutar y agrega algunas opciones de filtro de datos al final [después de la instrucción where] o en el medio [instrucción from] de una consulta SQL.Mi primer problema es que creo que estoy asignando los datos ingresados/seleccionados por el usuario incorrectamente a una nueva variable (ver fila 45--->DataParam_1).Entonces no estoy seguro de cómo asignar las declaraciones de selección de filtro ("Y ....") y fusionarlo todo nuevamente en una declaración SQL de programa más grande.Traté de 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 parece que esto no funciona.
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>Acceso a los datosIngeniería de Calidad y ProcesosRe: Crear interfaz de usuario para ayudar a crear consultas sql@pmroz
Mis disculpas
Esto funcionó perfectamente e hice clic en las selecciones pero no las moví a las secciones correctas para "elegir" su valor.
Lo siento por el mensaje mixto.
¡Otra gran solución!
Re: Crear interfaz de usuario para ayudar a crear consultas sql@pmroz
Realmente aprecio la ayuda y me gusta mucho tu idea también.
Cuando ejecuto el script tal como está, el registro incrustado no detecta mis selecciones y, en cambio, muestra vacío a pesar de que hice selecciones.
"Select *
from TABLE.DATA
WHERE SCANDATETIME > (SYSDATE - 30)
)
)"¿Cómo puede ser remediada?
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^"
Re: Crear interfaz de usuario para ayudar a crear consultas sqlEstaba usando las funciones como las definiste.Parece que necesita unir las cadenas reemplazando la línea 195 con WHERE 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 funciones integradas ocurre porque los nombres de las funciones reflejan las funciones integradas.Puede cambiar los nombres de las funciones si no desea los mensajes de registro.
Re: Crear interfaz de usuario para ayudar a crear 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 necesites.Aquí está el cuadro de diálogo:

Tenga en cuenta que la selección de qué programa ejecutar ahora es un cuadro 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 interfaz de usuario para ayudar a crear consultas sqlUn millón de gracias ErraticAttach
Cuando sustituyo parte de mi información oficial, recibo algunos mensajes de error:
Al pulsar ejecutar y aparece la interfaz de usuario, el registro incrustado muestra:
La función definida por el usuario "Cuadro de botones" entra en conflicto con la función JMP "Cuadro de botones". Utilice una referencia con ámbito (por ejemplo, Global:Button Box o Here:Button Box) para llamar a su función definida por el usuario. Otros usos de "Cuadro de botones" en su código fuente seguirá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 con ámbito (por ejemplo, Global:Combo Box o Here:Combo Box) para llamar a su función definida por el usuario. Otros usos de "Cuadro combinado" en su código fuente seguirá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 JMP "Casilla de verificación". Utilice una referencia con ámbito (por ejemplo, Global:Check Box o Here:Check Box) para llamar a su función definida por el usuario. Otros usos de "Casilla de verificación" en su código fuente seguirán llamando a la función JMP.
"#38"
Luego seleccioné el Programa 1 y presioné OK y veo:
Primera ventana emergente: [Microsoft][Administrador de controladores ODBC] Cadena o longitud de búfer no válida
Segunda ventana emergente: consulte el registro de la instrucción SQL que falló
El registro dice:
code_1 = "Y EMPRESA COMO '%AAA%')";
code_2 = "Y PRODUCTO COMO '%Prod1%')";
sql_statement_1 = "";
Sentencia SQL no válida:
{Botón 1 )}
¿Alguna idea sobre cómo superar esta falta de sql_statement?
Re: Crear interfaz de usuario para ayudar a crear consultas sql@Tom_P , he creado una secuencia de comandos de muestra aquí que usa 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 breve.Este es un script de ejemplo y necesita un montón de repeticiones.Si se encuentra siguiendo este método y creando muchos scripts de interfaz de usuario interactivos, le aconsejo que cree una biblioteca para ejecutar el código estándar automáticamente (JSL tiene una maravillosa capacidad para usar la 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 de 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>