Re: DuréeForse qualcosa del genere:
For(k=1, k<=6, k++,
StartValue = Column(k+2)[1];
For(i=1, i<=6, i++,
If(num(Column(i+8)[1])>StartValue,break())
);
If(i<7, Write(Column("Date début "||(Column(i+8)<<GET name=""></GET>Re: DurataGrazie per la risposta @pauldeen ma questo è un database di prova, questo script dovrebbe funzionare per più di 700 colonne.
Re: DurèUna soluzione un po' pigra, ma potrebbe funzionare
Names Default To Here(1);
dt = Open("$DOWNLOADS/AAAA.jmp");
// would get only numeric columns, but the provided example table is broken...
all_cols = dt << Get Column Names(/*Numeric, */"String");
// so first we have to fix the datatable
Remove From(all_cols, 1, 2);
For Each({col_name}, all_cols,
Column(dt, col_name) << Set Data Type("Numeric");
Column(dt, col_name) << Set Modeling Type("Continuous");
);
// create list of duration columns
// same amount of columns AND in same order for "number" and duration
date_cols = {};
some_cols = {};
For Each({col_name}, all_cols,
If(Starts With(lowercase(col_name), "date d"),
Insert Into(date_cols, col_name);
, !IsMissing(Regex(col_name, "^\d+$")),
Insert Into(some_cols, col_name);
,
show(col_name);
);
);
If(N Items(date_cols) != N Items(some_cols),
Throw("Column mismatch");
);
// create new columns
dur_cols = {};
For Each({some_col}, some_cols,
new_col = dt << New Column("duration " || some_col, Numeric, Continuous);
Insert Into(dur_cols, new_col << get name);
);
// calculation
For Each Row(
For Each({date_col, idx}, date_cols,
datesomething = dt[Row(), some_cols[idx]];
datesomethingvals = dt[Row(), some_cols];
// to make comparison easier
datesomethingvals[idx] = .;
datesomethingvals[Loc(datesomethingvals < datesomething)] = .; // lazy handling
idx_of_interest = Loc Min(Abs(datesomethingvals - datesomething));
If(idx_of_interest == 0,
continue();
);
val_of_interest = dt[Row(), date_cols[idx_of_interest]];
dt[Row(), dur_cols[idx]] = Abs(val_of_interest - dt[Row(), date_col]); // not sure if Abs is correct here
);
);
// durations for 900 and 4500 for some reason missing from demo dataRe: DurataGrazie per la risposta @jthi !
Durata
Buongiorno a tutti,
Ho un database come di seguito,

Nel fumetto le celle verdi sono i risultati che vorremmo ottenere.
Vorrei creare uno script per calcolare le durate.
Ho colonne "data di inizio" e poi ho una colonna "numero" che indica l'ordine di esecuzione.
L'obiettivo sarebbe calcolare "data di inizio y - data di inizio x" in base ai numeri.
Lasciatemi spiegare un esempio con i fumetti:
1a riga : Notiamo che la colonna "720" ha il numero 12 nella cella, quindi stiamo cercando tra tutte le colonne "numero" la prima maggiore di 12 (qui la colonna "740" con il valore 21)
Quindi la durata 720 sarebbe durata 720 = data di inizio 740 - data di inizio 720.
Quindi per durata 740 sarebbe durata 740 = data inizio 9801 - data inizio 740 con lo stesso principio
Ecco la sceneggiatura che ho iniziato a scrivere:
dt = Current Data Table();
dur_cols = Filter Each( {col_name}, dt << Get Column Names( "String", Continuous ),
Starts With( col_name, "Date début" )
);
num_colnr = Transform Each( {col_name}, dur_cols, Word( -1, col_name ) );
char_cols = dt << Get Column Names ("string", Character);
wait(1);
N_taches = N Items(dur_cols);
for (i = 1, i <= N_taches, i++,
Eval(
Eval Expr(
col = dt << New Column ( "durée" || num_colnr[i], Numeric, "Continuous", Format(":jou:hh:m",8));
col << Formula(
colidx = Loc(dt[row(), char_cols] > Eval(num_colnr[i]))[1];
If ( N Items(colidx) > 0,
val = dur_cols[colidx] - Eval(dur_cols[i]);
If(IsMissing(val),
0
,
val
);
,
0
);
);
)));Grazie per l'aiuto !
Consumatori e ricerche di mercatoQualità e ingegneria di processoRe: DuréeCOSÌ? Appena sopra il numero di conteggio del ciclo For. Oppure rendilo dinamico includendo N cols() come limite superiore.
Se hai già risolto, contrassegna questo argomento come risolto?