¿Cómo insertar un bucle en SQL que se usa en un script JSL?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Hola,
Tengo la necesidad de recopilar datos de prueba paramétricos a nivel de chip de los probadores finales para muchas obleas de producción.
Cada oblea tiene ~ 3000 chips y decenas de parámetros.
He creado un SQL ficticio para esta solicitud de asistencia:
SELECCIONAR
I.PRODUCTNR,
T.TESTUNITNR,
T.PUNTO DE MEDIDANR,
T. TIEMPO DE CREACIÓN,
T.RESULTADO_PARAM1,
T.RESULTADO_PARAM2.
.
.
.
DE
"ARTÍCULOS" D,
"RESULTADOS DE LA PRUEBA" T,
"TESTRESULTROWS" TRR,
"TESTROW" TR,
.
.
DONDE I.IDNR = T.IDNR
AND T.RESULTADOPRUEBA = TRR.RESULTADOPRUEBANR
Y TRR.TESTROWIDNR = TR.TESTROWIDNR
Y I.LOTIDNR = L.LOTIDNR
Y T.VALIDEZ = '1'
Y D.WAFERNR EN
(
'WAF43K309A',
'WAF43K310A',
'WAF43K311A',
'WAF43K312A',
'WAF43K313A',
'WAF43K314A',
., ., ., ., .,
'WAF43K315A',
'WAF43K316A',
'WAF43K317A',
'WAF43K319A',
'WAF43K320A',
'WAF43K321A'
)
Y (T.TESTUNITNR LIKE ('HENE%')
Y TR.NOMBREVARIABLE EN
('ACENO',
'OFFSET_X_DIFF',
'OFFSET_Y_DIFF',
......)
AGRUPAR POR ...
Si recopilo todos los datos de la primera oblea de la lista (WAF43K309A), el tiempo de recopilación/recuperación es de ~ 90 segundos.
Si recopilo todos los datos de las 2 primeras obleas enumeradas (WAF43K309A, WAF43K310A), el tiempo de recopilación/recuperación es de ~ 4 minutos
Si recopilo todos los datos de las primeras 3 obleas enumeradas (WAF43K309A, WAF43K310A, WAF43K311A), el tiempo de recopilación/recuperación es de ~ 7 minutos
Estoy seguro de que ve el problema, el tiempo de recolección/búsqueda crece exponencialmente con la cantidad de obleas.
En algún momento tengo que hacer esto durante el fin de semana!!
Usando el operador SQL "Unir todo" y recolectando datos para una oblea a la vez, puedo recuperar los datos usando aproximadamente la misma cantidad de tiempo para cada oblea.
Esto está bien si solo tengo unas pocas obleas en mi lista. Desafortunadamente, a menudo necesito recopilar datos de varias decenas de obleas, incluso cientos de obleas.
Usando una selección interna, podría hacer una lista de las obleas:
p.ej
.....
Y D.WAFERNR EN (
SELECCIONE WAFERNR de ARTÍCULO
DONDE FECHA DE PRUEBA > FECHA DEL SISTEMA-5)
la lista de obleas resultante sería:
WAF43K309A
WAF43K310A
WAF43K311A
WAF43K312A
WAF43K313A
WAF43K314A
WAF43K315A
WAF43K316A
WAF43K317A
WAF43K319A
WAF43K320A
WAF43K321A
¿Es posible, usando JSL, usar esta lista recorriendo la lista y recopilando datos para una oblea a la vez?
Esperamos ver qué soluciones creativas puede ofrecer la comunidad.
Una solución sería un gran regalo de Navidad.
Atentamente,
Felipe
Re: ¿Cómo insertar un bucle en SQL que se usa en un script JSL?Hola Yosef,
Gracias por su aporte.
Me gusta la forma en que creaste la lista para usarla en scripts SQL y estoy seguro de que puedo usarla cuando surja la necesidad.
En este caso particular, la idea es evitar el uso de una lista de obleas en el SQL, ya que ralentiza la adquisición de datos en comparación con el enfoque de una oblea a la vez.
Atentamente,
Felipe
Re: ¿Cómo insertar un bucle en SQL que se usa en un script JSL?Hola
uso el siguiente script para crear una línea que contiene una lista de lotes
lot_list = Columna ( 1 ) << Obtener valores ;
en lista = "('" || Artículos combinados ( lot_list , "','" ) || "')" ;
cadena_sql = "DONDE \!"MUCHO\!" EN " || en lista ;
// / Si quieres ver la cadena / / /
espectáculo ( cadena_sql ) ;
* si el número de lote tiene un espacio en algún lugar y necesita buscar "me gusta" '% número de lote'... no funciona en SQL. necesitarás crear un script diferente
Re: ¿Cómo insertar un bucle en SQL que se usa en un script JSL?Hola msharp,
Muchas gracias por tu comentario.
Ahora he combinado esta sección de "unión vertical" de la sección del guión en el guión principal y funciona de maravilla.
El tiempo requerido para la extracción de datos se ha reducido a una fracción de lo que era antes y la posibilidad de crear un script y automatizar todo el procedimiento me permite hacerlo durante la noche cuando nuestros servidores están bajo una carga más liviana.
Atentamente,
Felipe
Re: ¿Cómo insertar un bucle en SQL que se usa en un script JSL?Hay muchas maneras de abordar esta última pregunta.Probablemente la solución más directa y sencilla no sea muy intuitiva.Lo que desea hacer es crear una lista de tablas y luego insertar cada tabla de datos en la lista. Luego puede concatenar la lista a la vez.Aquí está el esquema:
misTablas = {} ;
Para ( i = 1...
dt = ejecutar sql ( ... ) ;
Insertar en ( misTablas , dt ) ;
) ;
dtTodos = Nueva tabla ( "Toda la información" ) ;
dtTodos << Concatenar (
evaluar ( misTablas ) ,
Tabla de salida ( "Toda la información" )
) ;
Re: ¿Cómo insertar un bucle en SQL que se usa en un script JSL?Hola PMroz,
Muchas gracias por su apoyo y su paciencia.
Basado en su entrada, así como la de erichill , Ron Horne y msharp Ahora puedo configurar la consulta SQL anidada como esperaba.
Este método es directamente transferible a la tarea de adquisición de datos más avanzada mencionada al comienzo de esta publicación y ahorrará muchas horas de espera para que los datos sean devueltos desde el servidor.
He aprendido mucho en este ejercicio y agradezco todos sus esfuerzos.
Una última pregunta....
Ahora que tengo todos los datos recopilados en tablas de datos separadas (hecho para acelerar la adquisición de datos), hay una manera, sin tener que guardar todas las tablas de datos, de realizar una concatenación en todas las tablas abiertas para que pueda realizar datos más fácilmente. análisis?
Ya puedo hacer esto guardando todas las tablas de datos y usando JSL para concatenarlas al volver a abrirlas, pero parece una tontería tener que hacerlo de esta manera.
Deseándoles a todos una Feliz Navidad,
Felipe
Re: ¿Cómo insertar un bucle en SQL que se usa en un script JSL?Creo que esto hará el truco:
// Tabla de ejemplo: no es necesario que realice este paso si la tabla ya existe. Pero debes crear
// una variable para señalarla.
oblea_dt = Nueva tabla ( "Números de oblea" ,
Agregar filas ( 9 ) ,
Nueva columna ( "Número de oblea" ,
Personaje ,
Nominal ,
Establecer valores (
{ "XC6A49L410.1" , "XC6A49L411.1" , "XC6A49L412.1" , "XC6A49L413.1" ,
"XC6A49L414.1" , "XC6A49L415.1" , "XC6A49L416.1" , "XC6A49L417.1" ,
"XC6A49L418.1" }
)
)
) ;
// Por ejemplo, si su tabla se llama Números de oblea, esta declaración asignará una variable a esa tabla
// wafer_dt = tabla de datos ("Números de oblea");
// Almacenar los números de oblea en una lista
lista_de_obleas = columna ( oblea_dt , "Número de oblea" ) << obtener valores ;
cadena_dsn = "DSN=MEASdatos;UID=USUARIO;PWD=CONTRASEÑA;DBQ=MDMANU.MUNDO;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T ;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD =0;AOD=F;TSZ=8192;" ;
// Cree una instrucción SQL donde el número de oblea sea una variable que se sustituirá durante el bucle
declaración_sql = Evalinsert (
"\[ SELECCIONE WaferNR, WIPSTATUS
DESDE "DISCO"
WHERE ObleaNR = '^una_oblea^']\" ) ;
// Crear una conexión a la base de datos
dbc = crear conexión de base de datos ( cadena_dsn ) ;
para ( i = 1 , i <= artículos ( lista_de_obleas ) , i ++,
una_oblea = lista_de_obleas [ i ] ;
// Nombra la mesa igual que la oblea.Cambie para adaptarse a sus necesidades
nombre_tbl = una_oblea ;
// Recuperar los datos de una oblea
dt = ejecutar sql ( dbc , declaración_sql , nombre_tbl ) ;
) ;
// Ahora que hemos terminado de recuperar todas las obleas en tablas separadas
// cerrar la conexión a la base de datos
cerrar la conexión a la base de datos ( dbc ) ;
Re: ¿Cómo insertar un bucle en SQL que se usa en un script JSL?Claramente te estás perdiendo el mensaje Y la intención de lo que dije.
De todos modos, no hay razón para que esta publicación del foro sea más larga que la publicación de Ron Horne, ya que se vincula a un foro donde ya resolví este problema paso a paso.
Re: ¿Cómo insertar un bucle en SQL que se usa en un script JSL?Mis disculpas, MSHARP, si lo ofendí de una forma u otra con mi solicitud directa de asistencia.
Como ya he dicho, lamentablemente no soy un experto en JSL pero he logrado hacer bastante en base a los contenidos que ofrece esta comunidad.
De hecho, asistí a una clase de JMP JSL de 2 días, pero desafortunadamente debido a que fue organizada por una oficina local en Europa para un profesor estadounidense con una clase muy internacional, hubo muchos problemas técnicos y se perdió mucho tiempo durante los 2 días. dejando buena parte del material y de los entrenamientos sin cubrir.
He recibido buenos comentarios hasta ahora de otros miembros de esta comunidad y, de hecho, estoy trabajando con JMP en un próximo tutorial basado en un área en la que tengo más conocimiento y experiencia.
En ninguna ocasión he reclamado la ayuda ofrecida por los compañeros como mi propio trabajo. He sido abierto al decir de dónde viene la ayuda y lo bien que se siente pertenecer a un grupo tan solidario donde es posible escalar la curva de aprendizaje más rápido y más lejos que en otras comunidades.
Solo puedo esperar que otros compartan mi sentimiento y continúen apoyando y enseñando a los menos capaces.
Atentamente,
Felipe
Re: ¿Cómo insertar un bucle en SQL que se usa en un script JSL?Lo tienes, ve a hacerlo.
Creo que tienes tu enfoque equivocado. Si necesita que la comunidad jmp le proporcione el código para el caso simple, no hay forma de que pueda implementarlo para el caso complicado. Parece que has asumido un proyecto muy por encima de tu cabeza.En cuyo caso, le recomiendo que lea la Guía de secuencias de comandos o tome una clase.
Realmente, para aprovechar al máximo una comunidad, primero debe desarrollar un código usted mismo; luego, cuando se atasca durante la depuración o la optimización, la comunidad puede ayudarlo a refactorizarlo mejor.Pedir el código directamente como este es poco más que plagio.
Re: ¿Cómo insertar un bucle en SQL que se usa en un script JSL?Hola Eric, Ron y PMroz,
Gracias por su aportación a todos ustedes.
Desafortunadamente, mi competencia en JSL no está a un nivel en el que pueda tomar todos sus aportes y crear un script de trabajo.
No he podido determinar la lógica y la secuencia de sus 3 entradas. Todavía estoy confundido, pero en un nivel superior.
Mis esfuerzos están devolviendo datos solo para la última oblea en mi lista "wafers.jmp".
Qué tal si pongo un ejemplo mucho más fácil para que, al menos, no me confunda.
Tengo una lista de obleas en un archivo llamado "wafers.jmp":
XC6A49L410.1
XC6A49L411.1
XC6A49L412.1
XC6A49L413.1
XC6A49L414.1
XC6A49L415.1
XC6A49L416.1
XC6A49L417.1
XC6A49L418.1
Necesito recolectar el WIPSTATUS de las obleas enumeradas usando el SQL apropiado:
SELECCIONE WaferNR, WIPSTATUS
DESDE "DISCO"
DONDE WaferNR = (todas las obleas en la lista anterior)
Para hacer esto, necesito configurar la cadena de conexión:
"DSN=MEASdatos;UID=USUARIO;PWD=CONTRASEÑA;DBQ=MDMANU.MUNDO;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T ;RST=T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD =0;AOD=F;TSZ=8192;"
Necesito establecer la variable "wafer_id" '^WAFER_ID^' .........
configure un ciclo para construir el SQL requerido que recolectará los datos requeridos, una oblea a la vez ........
abre la conexión a la base de datos...
ejecutar el SQL "munged" ........
recoger todos los datos en una tabla de datos . ........
desconectarse de la base de datos??
Usando el ejemplo simple anterior, ¿podrían ayudarme a construir un script que pueda probarse para que yo mismo pueda intentar trabajar en el caso más avanzado?
Atentamente,
Felipe
PD Tenga en cuenta que este es solo un ejemplo simple de lo que quiero hacer. Esta adquisición de datos toma milisegundos, mientras que el caso avanzado actualmente toma de muchas horas a posiblemente días, ya que no tengo la posibilidad de extraer datos para "una oblea a la vez". tiempo".
Re: ¿Cómo insertar un bucle en SQL que se usa en un script JSL?Gracias Jeff por tus buenos consejos.
Esta adquisición de datos en particular es bastante desafiante y requiere una planificación cuidadosa, ya que los datos se recuperan de muchas tablas de bases de datos que contienen muchos TB de datos.
3 administradores de BD propios así como 2 empresas externas han trabajado en su optimización.
De ahí la razón para buscar este enfoque de "una oblea a la vez".
Este enfoque se demostró con éxito recientemente, utilizando el mismo SQL de Denodo, pero por el momento aún no tenemos disponible el software de Denodo.
Atentamente,
Felipe
Re: ¿Cómo insertar un bucle en SQL que se usa en un script JSL?Si está ejecutando muchas declaraciones SQL en un bucle, debe adoptar un enfoque diferente:
dbc = conexión de base de datos abierta ( "" ) ;
por cada fila (
sql = ...
ejecutar sql ( dbc , sql ) ;
) ;
cerrar la conexión a la base de datos ( dbc ) ;
De esta manera, solo se conecta a la base de datos una vez, lo que puede ahorrarle un poco de tiempo.
Re: ¿Cómo insertar un bucle en SQL que se usa en un script JSL?También sugeriría, respetuosamente, que se asegure de que su SQL esté optimizado adecuadamente.
Como erichill señala que una consulta sin JOIN generalmente da como resultado un producto cartesiano que hace coincidir cada fila de cada tabla con cada fila de cualquier otra tabla. Esto puede requerir mucho tiempo y recursos. El código de ejemplo que proporcionó no tiene un JOIN. Si eso es representativo de su código real, puede valer la pena investigar si puede mejorar tanto el SQL como el JSL.
-Jeff
Re: ¿Cómo insertar un bucle en SQL que se usa en un script JSL?Hola Eric,
Gracias por el script que he intentado modificar para el SQL original.
La cadena SQL larga se crea a partir de la lista de obleas en wafers.jmp pero, por alguna razón u otra, solo obtengo resultados de una oblea.
Incluso si duplico la ID de una oblea varias veces, solo obtengo el valor de una oblea o los resultados de las pruebas.
Espero que mi entendimiento sea correcto...
Primero configuré la plantilla, según su ejemplo....
Luego configuré el directorio predeterminado donde se almacena "wafers.jmp" .....
Pon el bucle en marcha.....
por cada fila(
oblea_id = :ObleaID;
sql = Insertar evaluación (plantilla sql);
Imprimir (sql);
);
Conéctese a la base de datos y ejecute el sql ???
Abrir base de datos (
"DSN=PRUEBA;UID=tepo;PWD=contraseña;DBQ=Producción;DBA=W;APA=T;EXC=F;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST =T;BTD=F;BNF=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=F;CSR=F;FWC=F;FBS=64000;TLO=O;MLD=0 ;AOD=F;TSZ=8192;",
Insertar evaluación (sql)
);
;
Es esta última parte de la que no estoy seguro.
Cualquier idea, sugerencia.
Parece que estamos bastante cerca....
Atentamente,
Felipe
Re: ¿Cómo insertar un bucle en SQL que se usa en un script JSL?Gracias Ron por el enlace.
Como recién llegado a JMP y las secuencias de comandos, aún no entiendo la lógica por completo, pero intentaré resolverlo.
Atentamente,
Felipe
Re: ¿Cómo insertar un bucle en SQL que se usa en un script JSL?Gracias por el consejo, Ron, eso me ahorró algo de tiempo.Entonces, usando el ejemplo que señaló Ron, puse las ID de oblea de interés en una tabla de datos llamada wafers.jmp, y luego escribí este script:
plantilla sql = "\[
SELECCIONAR
I.PRODUCTNR,
T.TESTUNITNR,
T.PUNTO DE MEDIDANR,
T. TIEMPO DE CREACIÓN,
T.RESULTADO_PARAM1,
T.RESULTADO_PARAM2
DE
"ARTÍCULOS" D,
"RESULTADOS DE LA PRUEBA" T,
"TESTRESULTROWS" TRR,
"TESTROW" TR,
DONDE I.IDNR = T.IDNR
AND T.RESULTADOPRUEBA = TRR.RESULTADOPRUEBANR
Y TRR.TESTROWIDNR = TR.TESTROWIDNR
Y I.LOTIDNR = L.LOTIDNR
Y T.VALIDEZ = '1'
Y D.WAFERNR = '^wafer_id^'
Y (T.TESTUNITNR LIKE ('HENE%')
Y TR.NOMBREVARIABLE EN
('ACENO',
'OFFSET_X_DIFF',
'OFFSET_Y_DIFF' )
;
]\" ;
abierto ( "obleas.jmp" ) ;
por cada fila (
oblea_id = : ID de oblea ;
sql = Insertar evaluación (plantilla sql) ;
Imprimir (sql) ;
) ;
Eso solo imprime el SQL muged, por supuesto; puede agregar código para enviar el SQL a su base de datos.
HH,
eric
Re: ¿Cómo insertar un bucle en SQL que se usa en un script JSL?Hola jpol ,
Tal vez este ejemplo puede ser útil:
https://community.jmp.com/message/223900#223900
Ron
Re: ¿Cómo insertar un bucle en SQL que se usa en un script JSL?hola felipe
Vale, lo siento, sólo quería asegurarme.Trabajaré en un ejemplo de bucle.
eric
Re: ¿Cómo insertar un bucle en SQL que se usa en un script JSL?Hola Eric.
Gracias por su preocupación.
Como se indicó, este es un Sql ficticio que es mucho más corto que el original.
Esperaba presentar el caso desde una perspectiva JSL en lugar de SQL.
Rgds
Felipe
Re: ¿Cómo insertar un bucle en SQL que se usa en un script JSL?hola felipe
El bucle es ciertamente posible, pero lo primero es lo primero: tal como está escrito, su instrucción SQL genera un producto cartesiano, lo que podría explicar el aumento de tamaño exponencial.¿Es eso necesario?
eric