cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
Check out the JMP® Marketplace featured Capability Explorer add-in
Choose Language Hide Translation Bar
hcarr01
Level VI

Calcul

 

Bonjour à tous,
 
Je cherche à construire une formule par rapport à plusieurs colonnes de ma base de données. Ce n’est pas si simple à comprendre, je vais expliquer mon objectif à l’aide d’un exemple :
 
hcarr01_0-1684745786420.png

 

L'étape 1 correspond au numéro 2100 mais ce numéro peut avoir une opération correspondante différente en fonction des objets ( Exemple : objet 1 --> numéro 2100 / opération 62 , objet 5 --> numéro 2100 / opération 74)

 

ETAPE 1 : correspond au numéro 2100

 

Partie grise :
 
Ici, voici 4 type d’objet différents (ENT1,..,ENT4). Chacun des objets est associé à un numéro d’avancement (colonne T), ces numéros sont eux reliés à des opérations bien définis.
 
Partie jaune :
 
Ces cellules montrent quels « numéros » vont subir chaque objet, et associe ce numéro à des opérations. Lorsque les cellules sont vides, cela veut dire que l’objet ne subira pas cette opération.
 
 
L’objectif est :
 
- Faire la somme des durées jusqu’à l’étape 1, sachant que l’objet a eu un avancement (Ex : l’objet ENT2 se situe au numéro 1749, donc ce qu’il a fait avant en 1500 ne nous intéresse pas) donc la durée jusqu’à l’étape 1 est seulement la durée de l’étape 1749 donc durée = 45
 
J’ai commencé avec ce code :
 
Names Default To Here( 1 );

dt = Current Data Table();
dur_cols = Filter Each({col_name}, dt << Get Column Names("String", Continuous),
	Starts With(col_name, "durée"));

// for indexing later
num_colnr = Transform Each({col_name}, dur_cols,Word(-1, col_name));

dt << New Column("DUREE ETAPE1", Numeric, Continuous, Format(":jou:hh:m",8), << Set Each Value(
	If( :"T"n < 2100 ,
		colidx = Loc(dt[Row(), num_colnr] > :"opé"n & (num_colnr < 2100 )  );
		If(N Items(colidx) > 0,
			val = Sum(dt[Row(), dur_cols[colidx]]);
			If(IsMissing(val),
				0
			,
				val
			);
		,
			0
		)
	,
		0
		)
	
));
 
 
 
Merci pour votre aide,
Cordialement
1 ACCEPTED SOLUTION

Accepted Solutions
hcarr01
Level VI

Re: Calcul

Oui votre raisonnement est correct !
Objet 5 représente quel objet on étudie, et en fonction des différents objets les opérations et les numéros ont des correspondances différentes.
 
Je pense que ce code peut fonctionner :
 
dt = Current Data Table();
dur_cols = Filter Each( {col_name}, dt << Get Column Names( "String", Continuous ), Starts With( col_name, "durée" ) ); num_opé = Filter Each( {col_name}, dt << Get Column Names( "String", Continuous ), Starts With( col_name, "opé" ) ); // for indexing later num_colnr = Transform Each( {col_name}, dur_cols, Word( -1, col_name ) ); // Add : Matrix of the index num_colnr_mt = Matrix( Transform Each( {col_name}, dur_cols, Num( Word( -1, col_name ) ) ) )`;
dt << New Column( "DUREE",
Numeric,
Continuous,
Format( ":jou:hh:m", 8 ),
<<Set Each Value(
If( dt[Row(), num_opé ] < :"2100"n,
//colidx = Loc(dt[Row(), num_colnr] > :"opé"n & (num_colnr < 2100 ) );
colidx = Loc( dt[Row(), num_colnr] >= :"opé"n & (dt[Row(), num_colnr] < :"2100"n) ); // Changed
If( N Items( colidx ) > 0,
val = Sum( dt[Row(), dur_cols[colidx]] );
If( Is Missing( val ),
0,
val
);
,
0
);
,
0
)
)
);

View solution in original post

5 REPLIES 5

Re: Calcul

Hi @hcarr01,

I'm not sure I understand your request correctly, but how about the following script?

Names Default To Here( 1 );

dt = Current Data Table();
dur_cols = Filter Each( {col_name}, dt << Get Column Names( "String", Continuous ),
	Starts With( col_name, "durée" )
);

// for indexing later 
num_colnr = Transform Each( {col_name}, dur_cols, Word( -1, col_name ) );
// Add : Matrix of the index
num_colnr_mt = Matrix( Transform Each( {col_name}, dur_cols, Num( Word( -1, col_name ) ) ) )`;

dt << New Column( "DUREE ETAPE1",
	Numeric,
	Continuous,
	Format( ":jou:hh:m", 8 ),
	<<Set Each Value(
		If( :"T"n < 2100,
			//colidx = Loc(dt[Row(), num_colnr] > :"opé"n & (num_colnr < 2100 )  );
			colidx = Loc( dt[Row(), num_colnr] >= :"opé"n & (num_colnr_mt < 2100) ); // Changed
			If( N Items( colidx ) > 0,
				val = Sum( dt[Row(), dur_cols[colidx]] );
				If( Is Missing( val ),
					0,
					val
				);
			,
				0
			);
		,
			0
		)
	)
);


If you want to calculate the following code, you need to use matrix.

 "num_colnr < 2100"

I hope it helps.

hcarr01
Level VI

Re: Calcul

Merci pour votre aide, le code marche correctement mais il y a un problème.
le but est de ne pas utiliser les nombres de la variable T tels que T < 2100 car pour chaque objet ce numéro possède une opération correspondante différente.
 
Il faudrait faire une affectation où pour chaque objet on cherche l'opération correspondante au numéro 2100 (dans la variable T).
 
Pour chaque ligne, ça serait : 
 
Si l'opération en cours est inférieur ou égal à l'opération correspondante au numéro 2100 alors faire la somme jusqu'à l'opération correspondante au numéro 2100.
 
Exemple sur la première ligne :
 
Opération en cours : 55
Opération correspondante au numéro 2100 -> 62
Donc faire la somme du numéro correspondant à l'opération 55 donc numéro 1500.
D'où "durée etape" = "durée 1500" = 30
 
Sauf que les numéros ne sont pas rangés dans l'ordre croissant forcement.

Re: Calcul

Hi @hcarr01 ,

Thank you for your response. Can I check my understanding?

 

Example on the second line:

Operation in progress: 60 (number in column "opé")
Operation corresponding to number 2100 -> 62 (in variable T and opé)
So make the sum of the number corresponding to operation 60, therefore number 1749 (find number 60 in column 1500, 1749, 2100 or 2500).
Therefore "Duration of step" = "Durée 1749" = 45

Example on the third row:

Operation in progress: 62 (number in the "opé" column)
Operation corresponding to the number 2100 -> 62
So make the sum of the number corresponding to operation 62, therefore number 2100.
Therefore, "Step duration" = 0 (because the current operation is greater than or equal to the operation corresponding to number 2100).

In your question you described as follows.

"Step 1 corresponds to number 2100, but this number can have a different corresponding operation depending on the objects (example: object 1 --> number 2100 / operation 62, object 5 --> number 2100 / operation 74)".

What does object 5 look like? Can you give us an example?

If my understanding is not correct, please let me know.

hcarr01
Level VI

Re: Calcul

Oui votre raisonnement est correct !
Objet 5 représente quel objet on étudie, et en fonction des différents objets les opérations et les numéros ont des correspondances différentes.
 
Je pense que ce code peut fonctionner :
 
dt = Current Data Table();
dur_cols = Filter Each( {col_name}, dt << Get Column Names( "String", Continuous ), Starts With( col_name, "durée" ) ); num_opé = Filter Each( {col_name}, dt << Get Column Names( "String", Continuous ), Starts With( col_name, "opé" ) ); // for indexing later num_colnr = Transform Each( {col_name}, dur_cols, Word( -1, col_name ) ); // Add : Matrix of the index num_colnr_mt = Matrix( Transform Each( {col_name}, dur_cols, Num( Word( -1, col_name ) ) ) )`;
dt << New Column( "DUREE",
Numeric,
Continuous,
Format( ":jou:hh:m", 8 ),
<<Set Each Value(
If( dt[Row(), num_opé ] < :"2100"n,
//colidx = Loc(dt[Row(), num_colnr] > :"opé"n & (num_colnr < 2100 ) );
colidx = Loc( dt[Row(), num_colnr] >= :"opé"n & (dt[Row(), num_colnr] < :"2100"n) ); // Changed
If( N Items( colidx ) > 0,
val = Sum( dt[Row(), dur_cols[colidx]] );
If( Is Missing( val ),
0,
val
);
,
0
);
,
0
)
)
);

Re: Calcul

I'm glad you were able to solve the problem yourself.