dateBonjour à tous,
Je dispose d’une base de données comme ceci (il s’agit d’un résumé ici) :

Cette base de données est issue d’un script qui fonctionne bien jusqu’ici, cependant la dernière colonne permettrait de calculer une dernière durée différente des autres.
Les valeurs dans cette dernière colonne représentent des OP qui correspondent à des objets.
Par exemple pour la 1ère ligne : la valeur 60 correspond à l’objet 2041, il nous faudrait une formule permettant de faire durée 2041 = date fin 2041 - date début 2041 ainsi de suite pour chaque ligne.
Quand la valeur est égale à 0 nous pourrions affecter la valeur 0 à durée 2041.
Ainsi de suite..
J’ai commencé avec le script ci-dessous :
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
);
Data AccessRe : dateVoici le script que j'utiliserais pour accomplir ce que vous voulez.
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 : date- Comment sait-on qu’une valeur de 60 correspond à 2041 et qu’une valeur de 82 correspond à 2000 ?Et que fait-on avec une valeur ST1-2 de 68 ?
- L'exemple de tableau de données fourni ne comporte pas de colonne pour une date 2000.
- Le JSL peut facilement être modifié pour utiliser différents calculs pour différentes valeurs de la valeur ST1-2, si soit les règles pour décider quelles colonnes utiliser sont discernables, soit si une liste de la valeur ST1-2 est fournie, ainsi que les colonnes à utiliser pour les différentes valeurs.
Re: dateLa base de données est ici réduite, mais pour chaque valeur dans la colonne valeurs ST1-2 des colonnes permettent de faire le lien entre la valeur OP et chaque objet (dans la base de données réduite il s'agit des colonnes 711-2041-9916).
La valeur 60 correspond à 2041 car dans la 1ère ligne :

Ainsi de suite pour chaque ligne… pour 82 qui correspond à 2000 c'est juste un exemple de plus mais cela voudra dire que sur la seconde ligne la colonne 2000 serait rempli par la valeur 82.
Re: dateMerci pour votre réponse !
Cela fonctionne pour la 1ère ligne mais en suite les valeurs dans la colonne "valeur ST1-2" changent et donc par la suite ce n'est pas la même durée qu'il faut recalculer.
Par exemple pour la 3ème ligne : valeur ST1-2 = 82 et 82 correspond à l'objet 2000 donc il faudrait faire durée 2000 = date fin 2000 - date début 2000 pour la 3ème ligne
C'est le but d'avoir ici dans la base de données intermédiaire un aperçu de l'affectation de l'OP avec chaque objet (colonnes 711-2041-9916 à l'interieur l'OP correspondante).
Le but est de remplacer les colonnes durées, la colonne "valeur ST1-2" ne sera pas modifié.
mon script ne fonctionne pas correctement :
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 : dateJe pense que le script ci-dessous vous donne ce que vous voulez, ou du moins s'en rapproche
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: dateMerci pour votre réponse !
Cela semble fonctionner pour les deux premières lignes, mais lorsque la valeur de valeur ST1-2 change il y a une erreur.
Nous remarquons que pour la 4ème ligne, la durée 2231 est nulle alors qu'il devrait y avoir la différence date fin 2231 - date début 2231 (car sur la 4ème ligne la valeur de valeur ST1-2 est 82 et 82 correspond à l'objet 2231).

Voici le message d'erreur que j'obtiens :

Peut-être dans la table "TheLookup" il y a une incohérence, car les objets peuvent être affectés à diffrents OP.
Par exemple ci-dessous : on voit que pour "theKeys" = 2041 il y a la valeur "valeur ST1-2" est égale à "60" et "47"

Re : datePour déterminer les clés, toutes les colonnes nommées 2041, 711, 2231 sont rassemblées et un tableau associatif est créé. Lorsque le numéro 60 est trouvé dans la colonne valeur ST1-2, il recherchera dans le tableau associatif et renverra 2241. Si un 47 a été saisi, il renverra également un 2241. Si un 82 est trouvé, un 2231 est renvoyé.J'ai fait l'hypothèse que les nombres trouvés dans les colonnes appelées 2041, 711, 2231, etc. ont les différents nombres que l'on pourrait trouver dans la valeur ST1-2.
Si vous pouviez joindre l'exemple de tableau de données que vous utilisez, j'essaierai de comprendre le problème que vous rencontrez.