Re: CalcoloCIAO @hcarr01 ,
Non sono sicuro di aver compreso correttamente la tua richiesta, ma che ne dici del seguente 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=""> :"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>
Se vuoi calcolare il seguente codice, devi usare matrix.
"num_colnr < 2100"
Spero possa essere d'aiuto.
RicalcoloGrazie per il tuo aiuto, il codice funziona bene ma c'è un problema.
l'obiettivo non è usare i numeri della variabile T tali che T < 2100 perché per ogni oggetto questo numero ha una diversa operazione corrispondente.
Bisognerebbe fare un'assegnazione dove per ogni oggetto cerchiamo l'operazione corrispondente al numero 2100 (nella variabile T).
Per ogni riga, sarebbe:
Se l'operazione corrente è minore o uguale all'operazione corrispondente al numero 2100, sommare all'operazione corrispondente al numero 2100.
Esempio sulla prima riga:
Operazione in corso: 55
Operazione corrispondente al numero 2100 -> 62
Quindi fai la somma del numero corrispondente all'operazione 55 quindi il numero 1500.
Quindi "durata passo" = "durata 1500" = 30
Tranne che i numeri non sono necessariamente disposti in ordine crescente.
Re: CalcoloCIAO @hcarr01 ,
Grazie per la vostra risposta.Posso controllare la mia comprensione?
Esempio sulla seconda riga:
Operazione in corso: 60 (numero nella colonna "opé")
Operazione corrispondente al numero 2100 -> 62 (in variabile T e opé)
Fate quindi la somma del numero corrispondente all'operazione 60, quindi numero 1749 (trovate il numero 60 nella colonna 1500, 1749, 2100 o 2500).
Pertanto "Durata del passo" = "Durée 1749" = 45
Esempio sulla terza riga:
Operazione in corso: 62 (numero nella colonna "opé")
Operazione corrispondente al numero 2100 -> 62
Quindi fai la somma del numero corrispondente all'operazione 62, quindi il numero 2100.
Pertanto, "Durata passo" = 0 (perché l'operazione corrente è maggiore o uguale all'operazione corrispondente al numero 2100).
Nella tua domanda hai descritto quanto segue.
"Il passo 1 corrisponde al numero 2100, ma a questo numero può corrispondere un'operazione diversa a seconda degli oggetti (esempio: oggetto 1 --> numero 2100 / operazione 62, oggetto 5 --> numero 2100 / operazione 74)".
Che aspetto ha l'oggetto 5? Puoi farci un esempio?
Se la mia comprensione non è corretta, per favore fatemelo sapere.
Re: CalcoloSono contento che tu sia riuscito a risolvere il problema da solo.
RicalcoloSì, il tuo ragionamento è corretto!
L'oggetto 5 rappresenta quale oggetto stiamo studiando, ea seconda dei diversi oggetti le operazioni ei numeri hanno corrispondenze diverse.
Penso che questo codice potrebbe funzionare:
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 /> Calcolo
Buongiorno a tutti,
Sto cercando di creare una formula su diverse colonne nel mio database. Non è così facile da capire, spiegherò il mio obiettivo usando un esempio:

Il passo 1 corrisponde al numero 2100 ma questo numero può avere un'operazione corrispondente diversa a seconda degli oggetti (Esempio: oggetto 1 --> numero 2100 / operazione 62, oggetto 5 --> numero 2100 / operazione 74)
PASSO 1: corrisponde al numero 2100
Parte grigia:
Ecco, ecco 4 diversi tipi di oggetto (ENT1,..,ENT4). Ad ognuno degli oggetti è associato un numero di avanzamento (colonna T), tali numeri sono legati ad operazioni ben definite.
Parte gialla:
Queste celle mostrano a quali “numeri” sarà sottoposto ciascun oggetto e associano questo numero alle operazioni. Quando le celle sono vuote significa che l'oggetto non subirà questa operazione.
L'obiettivo è:
- Sommare le durate fino allo step 1, sapendo che l'oggetto ha fatto progressi (Es: l'oggetto ENT2 si trova al numero 1749, quindi quello che faceva prima nel 1500 non ci interessa) quindi la durata fino allo step 1 è solo la durata del passo 1749 quindi durata = 45
Ho iniziato con questo codice:
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
)
));
Grazie per l'aiuto,
Cordiali saluti
Organizzazione dei contenutiAccesso ai datiIngegneria della qualità e dei processi