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

Formule colonne

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_1-1683891973873.png

 

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, 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)
 
- Prenons l’objet ENT2, il faudrait faire la somme de la durée 2100 et la durée 2500 car il s’agit des numéros que doit subir cet objet là.
 
 
Merci pour votre aide,
Cordialement
16 REPLIES 16
jthi
Super User

Re: Formule colonne

One question: Why does ENT4 contain duration from 2500 but ENT2 doesn't contain the duration from 1749?

-Jarmo
hcarr01
Level VI

Re: Formule colonne

Une erreur dans la base de données, j'ai mis à jour la base !
Merci pour la remarque.
 
hcarr01_0-1683893071657.png

 

jthi
Super User

Re: Formule colonne

You can do this with a formula, but I would do this with scripting. Below is one example which does at least work with your example data

Names Default To Here(1);

dt = Open("$DOWNLOADS/Test(1).jmp");

// get duration columns
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, Output("Matrix"), Num(Word(-1, col_name)));

dt << New Column("DUREE TOT", Numeric, Continuous, << Set Each Value(
	colidx = Loc(num_colnr > :T); // indices of num colums larger than :T value
	If(N Items(colidx) > 0,
		val = Sum(dt[Row(), dur_cols[colidx]]);
		If(IsMissing(val),
			0
		,
			val
		);
	,
		0
	)
));
-Jarmo
hcarr01
Level VI

Re: Formule colonne

Merci pour votre réponse.
J'ai une remarque, il me semble que dans votre code vous comparez avec les éléments de la colonne T, cependant j'ai oublié de préciser que les valeurs de T peuvent être dans n'importe quel ordre (pas forcement croissant), alors que les valeurs des opérations sont rangés dans l'ordre croissant d'avancement.
 
Par exemple :
T = 690 / opé = 47
T = 550 / opé = 55
Et l'avancement suit l'ordre des opérations !
 
Deuxième remarque, dans ma base de données je dispose des valeurs numériques en format de durée pour les durée T, avec le format "h:m:s".
 
hcarr01_0-1683894114592.png

 

jthi
Super User

Re: Formule colonne

If I understand correctly, my solution should still work. It is only reliant on the fact that :1500, :1749,... columns are in same order as :duree 1500, :duree 1749,... columns. Also even if JMP does show you cleanly formatted duration values in reality (I think) they are still seconds (you can check this by changing Format to Best for example from column settings).

-Jarmo
hcarr01
Level VI

Re: Formule colonne

Je suppose qu'il y a un problème dans le code.
 
Le problème serait ici dans l'affectation de la variable "colidx" : on ne compare pas les nombres de la variable T mais les opérations correspondant à ces nombres (ici les colonnes jaunes).
 
Dans l'exemple ci-dessus pour la première ligne ça serait :
 
si première ligne ":1500" > première ligne ":opé" -> ajouter durée 1500
si première ligne ":1749" > première ligne ":opé" -> ajouter durée 1749
si première ligne ":2100" > première ligne ":opé" -> ajouter durée 2100
si première ligne ":2500" > première ligne ":opé" -> ajouter durée 2500
 
et faire cela pour chaque ligne…
jthi
Super User

Re: Formule colonne

So change

colidx = Loc(num_colnr > :T);

to 

colidx = Loc(num_colnr > :"opé"n);

and make corresponding changes to Loc (use specific row instead of column names) and num_colnr (no need to be numbers)

 

-Jarmo
hcarr01
Level VI

Re: Formule colonne

 

Merci pour votre réponse, j'ai déjà modifié l'affectation de "colidx" comme vous l'avez indiqué.
 
Cependant, je vois pas quelles modifications je devrais faire à propos de :"et apporter les modifications correspondantes à Loc (utiliser des noms de lignes spécifiques au lieu de noms de colonnes) et à num_colnr (pas besoin de nombres)."
 
Pouvez-vous m'indiquer plus en détail svp?
hcarr01
Level VI

Re: Formule colonne

J'ai modifié la valeur de num_colnr avec ce code pour sélectionner les colonnes nécessaires pour la suite :
 
 
SNames = dt << Get Column Names( String, "Nominal" );
 
For(i=1, i <= N Items(Snames), i++,
sclmn = Column(Snames[i]);
show(sclmn);
);
 
Ce code me permet d'obtenir toutes les colonnes correspondantes à la partie jaune de la base de données.
 
Cependant, je n'arrive pas à faire les changements correspondants pour le "Loc".