dataBuongiorno a tutti,
Ho un database come questo (questo è un riepilogo qui):

Questo database proviene da uno script che finora funziona bene, tuttavia l'ultima colonna consentirebbe di calcolare una durata ultima diversa dalle altre.
I valori in quest'ultima colonna rappresentano gli OP che corrispondono agli oggetti.
Ad esempio per la 1a riga: il valore 60 corrisponde all'oggetto 2041, ci servirebbe una formula che permetta durata 2041 = data fine 2041 - data inizio 2041 e così via per ogni riga.
Quando il valore è uguale a 0 potremmo assegnare il valore 0 alla durata 2041.
E così via..
Ho iniziato con lo script seguente:
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
);
Accesso ai datiRi: dataEcco lo script che utilizzerei per realizzare ciò che desideri.
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
)
);Ri: data- Come si fa a sapere che un valore 60 corrisponde a 2041 e un valore 82 corrisponde a 2000?E cosa si fa con un valore ST1-2 di 68?
- La tabella dati di esempio fornita non dispone di una colonna per la data 2000.
- Il JSL può essere facilmente modificato per utilizzare calcoli diversi per diversi valori del valore ST1-2, se le regole per la decisione su quali colonne utilizzare sono distinguibili o se viene fornito un elenco del valore ST1-2, insieme al valore colonne da utilizzare per i diversi valori.
Ri: dataIl database qui è ridotto, ma per ogni valore della colonna ST1-2 le colonne valori permettono di effettuare il collegamento tra il valore OP e ciascun oggetto (nel database ridotto si tratta delle colonne 711-2041-9916).
Il valore 60 corrisponde a 2041 perché nella 1a riga:

E così via per ogni riga... per 82 che corrisponde a 2000 è solo un esempio in più ma questo significherà che sulla seconda riga la colonna 2000 verrebbe riempita con il valore 82.
Ri: dataGrazie per la risposta !
Questo funziona per la 1° riga ma poi cambiano i valori nella colonna “Valore ST1-2” e quindi successivamente non è la stessa durata che deve essere ricalcolata.
Ad esempio per la terza riga: valore ST1-2 = 82 e 82 corrisponde all'oggetto 2000 quindi dovremmo impostare la durata 2000 = data di fine 2000 - data di inizio 2000 per la terza riga
Questo è lo scopo di avere qui nel database intermedio una panoramica dell'assegnazione dell'OP con ciascun oggetto (colonne 711-2041-9916 all'interno dell'OP corrispondente).
L'obiettivo è sostituire le colonne della durata, la colonna "Valore ST1-2" non verrà modificata.
il mio script non funziona correttamente:
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);
);
Ri: dataPenso che lo script seguente ti dia ciò che desideri, o almeno si avvicina ad esso
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()
);
);Ri: dataGrazie per la risposta !
Sembra funzionare per le prime due righe, ma quando il valore del valore ST1-2 cambia si verifica un errore.
Notiamo che per la 4a riga la durata 2231 è zero mentre dovrebbe esserci la differenza data fine 2231 - data inizio 2231 (perché sulla 4a riga il valore del valore ST1-2 è 82 e 82 corrisponde all'oggetto 2231).

Ecco il messaggio di errore che ricevo:

Forse nella tabella "TheLookup" c'è un'incoerenza, perché gli oggetti possono essere assegnati a OP diversi.
Esempio sotto: vediamo che per "theKeys" = 2041 c'è il valore "ST1-2 value" è uguale a "60" e "47"

Ri: dataPer determinare le chiavi, tutte le colonne denominate 2041, 711, 2231 vengono riunite e viene creato un array associativo che quando si trova il numero 60 nella colonna valore ST1-2 cercherà nell'array associativo e restituirà 2241. Se se fosse stato inserito un 47, restituirebbe anche un 2241. Se viene trovato un 82, verrà restituito un 2231.Ho fatto il presupposto che i numeri che si trovano nelle colonne chiamate 2041, 711, 2231, ecc. abbiano i vari numeri che si possono trovare in valeur ST1-2.
Se potessi allegare la tabella dei dati di esempio che stai utilizzando, proverò a capire il problema riscontrato.