fechaBuenos días a todos,
Tengo una base de datos como esta (este es un resumen aquí):

Esta base de datos proviene de un script que hasta ahora funciona bien, sin embargo la última columna permitiría calcular una última duración diferente de las demás.
Los valores de esta última columna representan OP que corresponden a objetos.
Por ejemplo para la 1ª línea: el valor 60 corresponde al objeto 2041, necesitaríamos una fórmula que permita duración 2041 = fecha de finalización 2041 - fecha de inicio 2041 y así sucesivamente para cada línea.
Cuando el valor es igual a 0 podríamos asignar el valor 0 a la duración 2041.
Asi enseguida..
Comencé con el siguiente guión:
Names Default To Here(1);
dt = current data table();
If( !Is Missing(:"valeur ST1-2"n),
For Each Row(
idx = dt[row(), :"valeur ST1-2"n]
dt[idx, durée[idx]] = dt[idx, date fin[idx]] - dt[idx, date début[idx]];
),
0
);
Acceso a los datosRe: fechaAquí está el script que usaría para lograr lo que deseas.
Names Default To Here( 1 );
dt = Current Data Table();
// Set the display format to a JMP Duration format
:"valeur ST1-2"n << format("hr:m:s");
// Loop through the rows and assign the new values
For Each Row(
If( :"valeur ST1-2"n != 0,
:"valeur ST1-2"n = :Date fin 2041 -
:Date début 2041,
:"valeur ST1-2"n = 0
)
);Re: fecha- ¿Cómo se sabe que un valor de 60 corresponde a 2041 y un valor de 82 corresponde a 2000?¿Y qué se hace con un valor ST1-2 de 68?
- La tabla de datos de ejemplo que se proporcionó no tiene una columna para la fecha 2000.
- El JSL se puede cambiar fácilmente para usar diferentes cálculos para diferentes valores del valor ST1-2, si las reglas para la decisión de qué columnas usar son discernibles o si se proporciona una lista del valor ST1-2, junto con el columnas que se utilizarán para los diferentes valores.
Re: fechaLa base de datos se reduce aquí, pero para cada valor en la columna de valores ST1-2, las columnas permiten establecer el vínculo entre el valor OP y cada objeto (en la base de datos reducida, estas son las columnas 711-2041-9916).
El valor 60 corresponde a 2041 porque en la 1ª línea:

Así sucesivamente para cada línea... para 82 que corresponde a 2000 es solo un ejemplo más pero esto significará que en la segunda línea la columna 2000 se llenaría con el valor 82.
Re: fechaGracias por su respuesta !
Esto funciona para la primera línea, pero luego los valores en la columna “Valor ST1-2” cambian y, por lo tanto, posteriormente no es la misma duración la que se debe volver a calcular.
Por ejemplo, para la tercera línea: valor ST1-2 = 82 y 82 corresponde al objeto 2000, por lo que debemos hacer que la duración sea 2000 = fecha de finalización 2000 - fecha de inicio 2000 para la tercera línea.
Este es el objetivo de tener aquí en la base de datos intermedia una visión general de la asignación del OP con cada objeto (columnas 711-2041-9916 dentro del OP correspondiente).
El objetivo es reemplazar las columnas de duración, la columna “Valor ST1-2” no se modificará.
mi script no funciona correctamente:
Names Default To Here(1);
dt14 = current data table();
dur_cols = Filter Each( {col_name}, dt14 << Get Column Names( "String", Continuous ),
Starts With( col_name, "Durée" )
);
fin_cols = Filter Each( {col_name}, dt14 << Get Column Names( "String", Continuous ),
Starts With( col_name, "Date fin" )
);
debut_cols = Filter Each( {col_name}, dt14 << Get Column Names( "String", Continuous ),
Starts With( col_name, "Date d" )
);
// for indexing later
num_colnr = Transform Each( {col_name}, dur_cols, Word( -1, col_name ) );
// Loop through the rows and assign the new values
For Each Row(
If( :"valeurs ST1-2"n != 0,
colidx = Loc(dt14[row(), num_colnr ] == :"valeurs ST1-2"n);
If( N items (colidx) > 0,
dt14[colidx,dur_cols] = Eval(dt14[colidx,fin_cols] - dt14[colidx,debut_cols]);
,
continue()
);
,
continue()
);
//show(colidx);
);
Re: fechaCreo que el siguiente script te proporciona lo que quieres, o al menos se acerca a ello.
Names Default To Here( 1 );
dt14 = Current Data Table();
Lookup = Filter Each( {col_name}, dt14 << Get Column Names( "String", Continuous ),
Num( col_name ) > 0
);
dtArray = dt14 << Stack(
invisible,
columns( Lookup ),
Source Label Column( "theKeys" ),
Stacked Data Column( "valeur ST1-2" ),
Drop All Other Columns( 1 ),
Output Table( "Untitled 45.jmp" )
);
dtArray << delete rows( dtArray << get rows where( Is Missing( :"valeur ST1-2"n ) ) );
theLookup = Associative Array(
dtArray:"valeur ST1-2"n << get values,
dtArray:theKeys << get values
);
Close( dtArray, nosave );
// Loop through the rows and assign the new values
For Each Row(
row = Row();
If( :"valeur ST1-2"n != 0,
lookup = theLookup[:"valeur ST1-2"n];
If( :"valeur ST1-2"n == As Column( lookup ),
As Column( "Durée " || theLookup[:"valeur ST1-2"n] ) =
Num(
As Column( "Date fin " || theLookup[:"valeur ST1-2"n] )
-As Column( "Date début " || theLookup[:"valeur ST1-2"n] )
);
Continue();
);
,
Continue()
);
);Re: fechaGracias por su respuesta !
Esto parece funcionar para las dos primeras líneas, pero cuando el valor ST1-2 cambia, hay un error.
Observamos que para la cuarta línea, la duración 2231 es cero, mientras que debería haber una diferencia entre la fecha de finalización 2231 y la fecha de inicio 2231 (porque en la cuarta línea el valor del valor ST1-2 es 82 y 82 corresponde al objeto 2231).

Aquí está el mensaje de error que recibo:

Quizás en la tabla "TheLookup" haya una inconsistencia, porque los objetos pueden asignarse a diferentes OP.
Por ejemplo a continuación: vemos que para "theKeys" = 2041 existe el valor "ST1-2 value" es igual a "60" y "47"

Re: fechaPara determinar las claves, se reúnen todas las columnas denominadas 2041, 711, 2231 y se crea una matriz asociativa que cuando se encuentra el número 60 en el valor de la columna ST1-2 buscará en la matriz asociativa y devolverá 2241. Si Si se ingresa un 47, también devolverá un 2241. Si se encuentra un 82, se devuelve un 2231.Supuse que los números que se encuentran en las columnas denominadas 2041, 711, 2231, etc. tienen los distintos números que se pueden encontrar en el valor ST1-2.
Si pudiera adjuntar la tabla de datos de muestra que está utilizando, intentaré resolver el problema que está viendo.