cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Choose Language Hide Translation Bar
hcarr01
Level VI

date

Bonjour à tous,

 

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

 

hcarr01_0-1695041743424.png

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
);
7 REPLIES 7
txnelson
Super User

Re: date

Here is the script that I would use to accomplish what you want.

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
	)
);
Jim
hcarr01
Level VI

Re: date

Merci 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);
);

 

txnelson
Super User

Re: date

  1. How does one know that a value of 60 corresponds to 2041 and a value of 82 corresponds to 2000?  And what is done with a valeur ST1-2 value of 68?
  2. The example data table that was provided does not have a column for a 2000 date.
  3. The JSL can easily be changed to use different calculations for different values of valeur ST1-2, if either the rules for the decision of which columns to use is discernable, or if a list of the valeur ST1-2 is provided, along with the columns to use for the different values.
Jim
hcarr01
Level VI

Re: date

La 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 :

hcarr01_0-1695106134768.png

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.

txnelson
Super User

Re: date

I think the below script gets you what you want, or at least close to it

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()
	);
);
Jim
hcarr01
Level VI

Re: date

Merci 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).

 

hcarr01_0-1695218865350.png

 

Voici le message d'erreur que j'obtiens :

 

hcarr01_1-1695218893800.png

 

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"

 

hcarr01_0-1695219492131.png

 

txnelson
Super User

Re: date

To determine the keys, all of the columns named 2041, 711, 2231 are brought together and an Associative Array is created that when number 60 is found in column valeur ST1-2 it will lookup in the Associative Array and it will return 2241.  If a 47 was entered, it would also return a 2241.  If an 82 is found, a 2231 is returned.  I made an assumption that the numbers found in the columns called 2041, 711, 2231, etc. have the various numbers that could be found in valeur ST1-2.

 

If you could attach the sample data table that you are using, I will try to figure out the issue you are seeing.

 

 

Jim