Ho ricevuto il formula di cui voglio discutere quasi 3 anni fa da @txnelson , da allora non l'ho mai lasciato andare e ci ho pensato molte volte prima d'ora, arrivando lentamente un po' più seriamente alle prese con lo scripting. Nel frattempo, la formula mi ha salvato molto di tempo.
Nell'esempio seguente, la stessa formula viene aggiunta 3 volte, ogni volta con una piccola variazione. Il problema di cui voglio discutere sono i diversi messaggi di errore generati durante la copia e l'esecuzione dello script della tabella, comprese le colonne formula appena aggiunte.
Names Default To Here( 1 );
// first, we need an example table
dt = New Table( "ExampleTable",
Add Rows( 24 ),
New Column( "BatchId",
Character,
"Nominal",
Set Values(
{"A", "A", "A", "A", "A", "A", "B", "B", "B", "C", "C", "C", "D", "D",
"D", "E", "E", "E", "F", "F", "F", "G", "G", "G"}
)
),
New Column( "StorageCondition",
Character,
"Nominal",
Set Values(
{"25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "5°C", "5°C", "5°C",
"25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "25°C/60%RH",
"25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "25°C/60%RH",
"25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "25°C/60%RH", "25°C/60%RH",
"25°C/60%RH", "25°C/60%RH", "25°C/60%RH"}
)
),
New Column( "Time",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2, 0, 1, 2]
)
),
New Column( "QcParameter",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values(
[0.2, 0.3, 0.4, 0.2, 0.21, 0.22, 0.3, 0.9, 1.2, ., 0.2, 0.4, 0.1, ., 0.1,
0, 0, 0, 0.1, 0, 0, 0, 0.1, 0]
)
)
);
// adding formula column via approach nr. 1<BR />// this adds the formula alright, but when copying and executing the resulting table script will leave the formula column empty<BR />// no need to discuss this, because this obviously missing the 'eval(eval expr(expr()))' wrapping (see screenshot below)
dt << New Column( "QcParameter [% rel.]_1",
numeric,
formula(
curBatch = :BatchId;
curCondition = :StorageCondition;
theRows = dt << get rows where(
:BatchId == curBatch & :StorageCondition == curCondition & :Time == 0
);
d0Row = theRows[1];
d0Time = :QcParameter[d0Row];
(100 * :QcParameter / d0Time);
)
);
// adding formula column via approach nr. 2<BR />// this will fill the formula column as desired when copying and running the table script with the added formula columns<BR />// but it will also throw an error message when new rows are added to the table then (see screenshot below)
Eval(
Eval Expr(
dt << New Column( "QcParameter [% rel.]_2",
numeric,
formula(
curBatch = :BatchId;
curCondition = :StorageCondition;
theRows = Expr( dt ) << get rows where(
:BatchId == curBatch & :StorageCondition == curCondition & :Time == 0
);
d0Row = theRows[1]; // removed from approach nr. 3
d0Time = :QcParameter[d0Row];
(100 * :QcParameter / d0Time);
)
)
)
);
// adding formula column via approach nr. 3
// this will fill the formula column as desired when copying and running the table script with the added formula columns<BR />// and it will NOT throw an error message when new rows are added to the table then (see screenshot below)
Eval(
Eval Expr(
dt << New Column( "QcParameter [% rel.]_3",
numeric,
formula(
curBatch = :BatchId;
curCondition = :StorageCondition;
theRows = Expr( dt ) << get rows where(
:BatchId == curBatch & :StorageCondition == curCondition & :Time == 0
);
d0Time = :QcParameter[theRows];
(100 * :QcParameter) / d0Time;
)
)
)
);
Screenshot del messaggio di errore per la colonna formula "QcParameter [%r rel.]_1]" quando si esegue nuovamente lo script di tabella con colonne formula aggiuntive:

Screenshot del messaggio di errore per la colonna formula "QcParameter [%r rel.]_2]" quando si esegue nuovamente lo script di tabella con colonne formula aggiuntive:

Screenshot del messaggio di errore per la colonna formula "QcParameter [%r rel.]_3]" quando si esegue nuovamente lo script di tabella con colonne formula aggiuntive:

Il motivo per cui sto ponendo questa lunga domanda è che presumo ci deve essere qualche motivo per cui la variabile "d0Row" viene utilizzata nell'approccio n. 2, no?Per l'avvicinamento n. 3 Ho semplicemente eliminato questa variabile (vedi screenshot sotto) e di conseguenza la formula si comporta "molto più bene", ovvero non viene visualizzato alcun messaggio di errore quando nuove righe vengono aggiunte ad hoc puntando e facendo clic sulla tabella dati.

La mia domanda è quindi se sto facendo qualcosa di sbagliato eliminando la variabile "d0Row". Nella vita reale sto lavorando con tabelle di dati più grandi e non sarò in grado di controllare l'accuratezza di ogni riga individualmente.
Non sono completamente sicuro di seguire il tuo problema, ma quello che vedo è che il tuo riferimento a dt è quando copi la formula 1, manca il riferimento a dt.Negli esempi 2 e 3, il riferimento alla tabella dati punta alla tabella dati "ExampleTable" e il nome della tabella dati, come mostrato, è "Example Table 2".Ancora una volta, se ho capito il tuo problema, penso che tu possa risolverlo utilizzando "Current Daa Table()".
curBatch = :BatchId;
curCondition = :StorageCondition;
theRows = Current Data Table() << get rows where(
:BatchId == curBatch & :StorageCondition == curCondition & :Time == 0
);
d0Row = theRows[1];
d0Time = :QcParameter[d0Row];
If( Row() == 11,
Show( therows, d0Time )
);
(100 * :QcParameter) / d0Time;
Grazie! Provo a riassumere ancora:
- Quando si aggiungono le tre colonne formula alla tabella di esempio precedentemente priva di colonne formula, quindi si copia e si esegue lo script della tabella risultante della tabella che ora contiene le tre colonne formula, solo gli esempi 2 e 3 popoleranno le colonne formula corrispondenti con i valori relativi previsti . La prima colonna della formula rimane vuota.
- Inoltre, quando si aggiungono nuove righe alla tabella finale creata al punto 1. (ovvero dallo script della tabella contenente ora tutte e 3 le colonne della formula), solo il terzo esempio non genererà un messaggio di errore quando si aggiungono nuove righe vuote.
A causa di questa osservazione ho rimosso la variabile "d0Row" come parte dell'esempio 3. Successivamente non appare alcun messaggio di errore quando si aggiungono nuove righe alla tabella e vengono riprodotti i relativi dati come previsto. La domanda quindi è se "d0Row" sia affatto richiesto . Ho creato l'esempio 3 appositamente per testare questa ipotesi. (La rimozione di "d0Row" rende la formula più breve, ma la mia preoccupazione è che questa variabile sia essenziale o che sto trascurando qualcosa. Lo sono?
Non sono sicuro che ciò sia correlato all'utilizzo o al mancato utilizzo di "tabella dati corrente()" nella formula. Utilizzo "current data table()" come soluzione alternativa ormai da molto tempo. Ciò comporterà comunque messaggi di errore quando si aggiungono nuove righe a una tabella, ma voglio comunque essere in grado di aggiungere nuove righe a una tabella senza dover confermare costantemente i messaggi di errore per ogni colonna relativa in una tabella quando viene aggiunta una nuova riga. Ci sono dozzine di colonne relative al loro interno e ripetere questa operazione costa tempo. Naturalmente è possibile sopprimere la valutazione, ma anche questo richiede tempo. Mi scuso se questo esempio non è chiaro, ma sono disposto a spiegare ulteriormente.)
Non esattamente correlato a questa domanda, ma puoi "semplificare" la formula con alcune magie della funzione Col. Questi suggerimenti dovrebbero funzionare, ma dovresti verificarli prima di sostituire la vecchia formula funzionante
dt << New Column("FormulaA", Numeric, Continuous, Formula(
100 * :QcParameter / Col Sum(If(:Time == 0, :QcParameter, .),:BatchID, :StorageCondition)
));
Se i dati sono ordinati in modo tale che il Tempo 0 sia sempre il primo per il gruppo, puoi renderli ancora più facili da capire (forse)
dt << New Column("FormulaB", Numeric, Continuous, Formula(
100 * :QcParameter / QcParameter[Col Min(Row(), :BatchID, :StorageCondition)]
));