JSL falla en la versión 19 pero funciona en la 17.Acabo de actualizar de JMP 17 a JMP 19. Tengo una rutina larga y compleja que funciona bien en JMP 17, pero falla en la versión 19. Puede que haya más fallos, pero el primero que encuentro está relacionado con la selección de filas para modificar y corregir errores conocidos en los datos importados. Al depurar, veo que el comando "Obtener filas donde" devuelve una matriz vacía. Confirmé que la fila objetivo está en la tabla de datos y puedo forzar al programa a seleccionarla introduciendo los criterios en las ventanas del menú.
row_to_update = newContrib << Get Rows Where(:"request_id" == 263496 & :"line_no" == 0);
El comando subsiguiente no logra realizar la corrección deseada en esa fila porque row_to_update devuelve esto: [](0, 1)
newContrib se definió anteriormente como una tabla de datos. Al pasar el cursor sobre el nombre de la variable, aparece la tabla correcta en la ventana emergente.
Según la documentación, intenté modificar la línea para usar Where en su lugar, pero fallé de la misma manera.
row_to_update = newContrib[Where(:"request_id" == 263496 & :"line_no" == 0)];
No encontré nada en las notas de la versión. Según los manuales de ayuda, la sintaxis parece ser correcta.
¿Podría alguien explicar qué ha cambiado para que esto ya no funcione y, si es posible, cómo solucionarlo?
¡Muchas gracias!
Nancy
Automatización y secuencias de comandosRe: JSL falla en la versión 19 pero funciona en la 17.<< Obtener filas donde todavía funciona de esa manera en JMP 19. Tu segundo comando (usando Where()) debería cambiar un poco.
Names Default To Here( 1 );
dt= Open( "$SAMPLE_DATA/Big Class.jmp" );
row_to_update = dt<< Get Rows Where( :"name" == "JANE" & :"age" == 12 ); //[3]
row_to_update2 = Where( dt, :name == "JANE" & :age == 12 ); //[3]
row_to_update = Where( newContrib, :request_id == 263496 & :line_no == 0 );
¿Cuál podría ser el problema? Verifique que los tipos de datos sean correctos. ¿JMP 19 importa esas columnas como caracteres, mientras que JMP 17 lo hacía como numéricos? Probablemente sea algo tan simple como eso, ya que la sintaxis de << Get Rows Where no ha cambiado.
Re: JSL falla en la versión 19 pero funciona en la 17.Hola Nancy,
El [](0,1) significa que row_to_update es una lista vacía, por lo que no hay filas coincidentes en la tabla de datos. Dado que Get Rows Where() devuelve una lista, es posible que le convenga más el enfoque diferente que se muestra en el script a continuación:
names default to here (1);
newContrib = New Table( "newContrib",
Add Rows( 3 ),
New Column( "request_id",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [263496, 263496, 263496] )
),
New Column( "line_no",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [0, 0, 1] )
)
);
row_to_update = newContrib << Get Rows Where(:"request_id" == 263496 & :"line_no" == 0);
//row_to_update is [1,2]
row_to_update = newContrib << Get Rows Where(:"request_id" == 263497 & :"line_no" == 0);
//row_to_update is empty: [](0, 1)
row_to_update = (newContrib << Get Rows Where(:"request_id" == 263496 & :"line_no" == 0))[1];
//row_to_update is 1
//a different approach:
rows_to_update = newContrib << Get Rows Where(:"request_id" == 263496 & :"line_no" == 0);
if (n items(rows_to_update) > 0, row_to_update = rows_to_update[1]);
Re: JSL falla en la versión 19 pero funciona en la 17.Gracias por la explicación sobre la sintaxis correcta de Where, por confirmar que la sintaxis de Get Rows Where no había cambiado y, sobre todo, por sugerirme que revisara los tipos de datos. Ese era precisamente el problema (los enteros se importaban como caracteres). De hecho, ahora todos mis datos en una docena de hojas se importan como caracteres, cuando antes se reconocían automáticamente como distintos tipos. Es un cambio tan fundamental en el comportamiento de importación que nunca se me ocurrió comprobarlo, así que agradezco mucho que me hayas recordado que olvidé repasar lo básico. Además, añadir líneas para cambiar los tipos de datos de las columnas o revisar la configuración de mi comando de apertura es una solución mucho más sencilla que cambiar la sintaxis de los cientos de líneas de código que utilizan "Get Rows Where".
Muchas gracias,
Nancy
Re: JSL falla en la versión 19 pero funciona en la 17.Me alegra que te esté funcionando. Una cosa que añadiría es que quizás te convenga actualizar tu script para usar Where(). La mejora del rendimiento es bastante significativa. Por ejemplo, ejecuté este código en una tabla con un millón de filas. Where() fue aproximadamente un orden de magnitud más rápido que <
Names Default to Here( 1 );
dt = Current Data Table();
now = HP Time();
row_to_update = dt << Get Rows Where( :request_id == 220681 & :line_no == 70 );
then = HP Time();
elapsed = then - now;
Show( elapsed ); //119053
Wait( 2 );
now = HP Time();
row_to_update = Where( dt, :request_id == 220681 & :line_no == 70 );
then = HP Time();
elapsed = then - now;
Show( elapsed ); //11777