Re: CalculerSalut @hcarr01 ,
Je ne suis pas sûr de bien comprendre votre demande, mais qu'en est-il du script suivant ?
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=""> :"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
)
)
);
</SET>
Si vous souhaitez calculer le code suivant, vous devez utiliser matrix.
"num_colnr < 2100"
J'espère que cela aide.
Re: CalculMerci 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: CalculerSalut @ hcarr01 ,
Merci pour votre réponse.Puis-je vérifier ma compréhension ?
Exemple sur la deuxième ligne :
Opération en cours : 60 (numéro dans la colonne "opé")
Opération correspondant au numéro 2100 -> 62 (en variable T et opé)
Faites donc la somme du nombre correspondant à l'opération 60, donc le nombre 1749 (trouvez le nombre 60 dans la colonne 1500, 1749, 2100 ou 2500).
Donc "Durée de l'étape" = "Durée 1749" = 45
Exemple sur la troisième ligne :
Opération en cours : 62 (numéro dans la colonne "opé")
Opération correspondant au nombre 2100 -> 62
Faites donc la somme du nombre correspondant à l'opération 62, donc le nombre 2100.
Donc, "Durée de l'étape" = 0 (car l'opération en cours est supérieure ou égale à l'opération correspondant au numéro 2100).
Dans votre question, vous avez décrit ce qui suit.
"L'étape 1 correspond au numéro 2100, mais ce numéro peut avoir une opération correspondante différente selon les objets (exemple : objet 1 --> numéro 2100 / opération 62, objet 5 --> numéro 2100 / opération 74)".
A quoi ressemble l'objet 5 ? Pouvez-vous nous donner un exemple?
Si ma compréhension n'est pas correcte, veuillez me le faire savoir.
Re: CalculerJe suis content que vous ayez pu résoudre le problème vous-même.
Re: CalculOui 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();<BR />
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 ) ) ) )`;<BR />
dt << New Column( "DUREE",<BR />Numeric,<BR />Continuous,<BR />Format( ":jou:hh:m", 8 ),<BR /><<SET each="" value=""></SET>If( dt[Row(), num_opé ] < :"2100"n,<BR />//colidx = Loc(dt[Row(), num_colnr] > :"opé"n & (num_colnr < 2100 ) );<BR />colidx = Loc( dt[Row(), num_colnr] >= :"opé"n & (dt[Row(), num_colnr] < :"2100"n) ); // Changed<BR />If( N Items( colidx ) > 0,<BR />val = Sum( dt[Row(), dur_cols[colidx]] );<BR />If( Is Missing( val ),<BR />0,<BR />val<BR />);<BR />,<BR />0<BR />);<BR />,<BR />0<BR />)<BR />)<BR />);<BR /> 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 :

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
Content OrganizationData AccessQuality and Process Engineering