Re : Formule colonneUne question : pourquoi ENT4 contient-il la durée à partir de 2500 mais ENT2 ne contient-il pas la durée à partir de 1749 ?
Re: Formule colonneUne erreur dans la base de données, j'ai mis à jour la base !
Merci pour la remarque.
Re : Formule colonneVous pouvez le faire avec une formule, mais je le ferais avec un script. Vous trouverez ci-dessous un exemple qui fonctionne au moins avec vos données d'exemple
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
)
));Re: Formule colonneMerci 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".
Re : Formule colonneSi j'ai bien compris, ma solution devrait toujours fonctionner. Cela dépend uniquement du fait que les colonnes :1500, :1749,... sont dans le même ordre que les colonnes :duree 1500, :duree 1749,.... De plus, même si JMP vous montre des valeurs de durée proprement formatées en réalité (je pense), elles sont toujours en secondes (vous pouvez vérifier cela en changeant Format en Meilleur par exemple à partir des paramètres de colonne).
Re: Formule colonneJe 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 1749si 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…
Re : Formule colonneAlors change
colidx = Loc(num_colnr > :T);
pour
colidx = Loc(num_colnr > :"opé"n);
et apportez les modifications correspondantes à Loc (utilisez une ligne spécifique au lieu des noms de colonne) et num_colnr (pas besoin d'être des nombres)
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?
Re: Formule colonneJ'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".
Re : Formule colonneNames 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, Word(-1, col_name));
dt << New Column("DUREE TOT", Numeric, Continuous, << Set Each Value(
colidx = Loc(dt[Row(), num_colnr] > :"opé"n);
If(N Items(colidx) > 0,
val = Sum(dt[Row(), dur_cols[colidx]]);
If(IsMissing(val),
0
,
val
);
,
0
)
));
Abonnement aux tables de données
Re: Formule colonneSur ma base de données je dispose de 900 colonnes différentes (colonnes jaunes), cela veut dire que le nombre « num_colnr » est une liste avec beaucoup de nombres :

En exécutant le script JSL que vous m’avez partagé j’obtiens ce type d’erreur :

Alors que num_colnr comme sur la photo ci-dessus est une liste de nombre
Re: Formule colonneEt en rajoutant "Num" pour convertir en numérique :
num_colnr = Transform Each({col_name}, dur_cols, Num(Word(-1, col_name)));
show(num_colnr); j'obtiens ce type d'erreur :

Re : Formule colonneAvez-vous une colonne nommée "711" dans votre table de données ? Je ne comprends pas ce message d'erreur tel qu'il est en français et ma meilleure hypothèse est qu'il est identique à celui-ci
Expecting a number or list of numbers at row 1 in access or evaluation of 'dt[ /*###*/Row(),num_colnr]', <BR />Bad Argument("1500"), dt[/*###*/Row(), num_colnr]
at line 14 in C:\Users\jarmo\Documents\Script.jsl
ce qui pourrait signifier que la colonne nommée "711" est manquante.
Re: Formule colonne
Oui c'est ma première colonne (parmi toutes les colonnes de couleur jaune) :
Re : Formule colonneOk, peut-être indique-t-il alors qu'une (ou plusieurs) de ces colonnes est manquante et ne dit pas vraiment laquelle. Alors peut-être que ma logique comment j'obtiens ceux des colonnes duree est incorrecte
Re: Formule colonneOui vous avez surement raison, je vais chercher de mon côté.
Merci pour votre aide précieuse !
Formule colonneBonjour à 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 :

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
Automation and Scripting