Ich habe das erhalten Formel, die ich besprechen möchte vor fast 3 Jahren von @txnelson Ich habe es seitdem nicht mehr losgelassen und habe schon oft darüber nachgedacht, um mich langsam etwas ernsthafter mit dem Schreiben von Skripten auseinanderzusetzen. In der Zwischenzeit hat mich die Formel gerettet eine Menge von Zeit.
Im folgenden Beispiel wird dieselbe Formel dreimal hinzugefügt, jedes Mal mit ein wenig Variation. Das Problem, das ich diskutieren möchte, sind die verschiedenen Fehlermeldungen, die beim Kopieren und Ausführen des Tabellenskripts der Tabelle einschließlich der neu hinzugefügten Formelspalten ausgegeben werden.
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 der Fehlermeldung für die Formelspalte „QcParameter [%r rel.]_1]“ beim erneuten Ausführen des Tabellenskripts mit zusätzlichen Formelspalten:

Screenshot der Fehlermeldung für die Formelspalte „QcParameter [%r rel.]_2]“ beim erneuten Ausführen des Tabellenskripts mit zusätzlichen Formelspalten:

Screenshot der Fehlermeldung für die Formelspalte „QcParameter [%r rel.]_3]“ beim erneuten Ausführen des Tabellenskripts mit zusätzlichen Formelspalten:

Der Grund, warum ich diese lange Frage stelle, ist, dass ich davon ausgehe Es muss einen Grund geben, warum die Variable „d0Row“ in Ansatz Nr. verwendet wird. 2, nein?Für Anfahrtsnr. 3 Ich habe diese Variable einfach gelöscht (siehe Screenshot unten) und die Formel verhält sich dadurch „viel angenehmer“, d. h. es gibt keine Fehlermeldung, wenn neue Zeilen ad hoc per Point & Click zur Datentabelle hinzugefügt werden.

Meine Frage ist daher, ob ich etwas falsch mache, indem ich die Variable „d0Row“ lösche. Im wirklichen Leben arbeite ich mit größeren Datentabellen und kann nicht jede Zeile einzeln auf ihre Richtigkeit überprüfen.
Ich bin mir nicht ganz sicher, ob ich Ihr Problem verfolge, aber ich sehe, dass Ihr Verweis auf dt fehlt, wenn Sie Formel 1 kopieren.In den Beispielen 2 und 3 erhalten Sie am Ende einen Datentabellenverweis, der auf die Datentabelle „ExampleTable“ verweist, und Ihr Datentabellenname lautet, wie gezeigt, „Example Table 2“.Auch hier gilt: Wenn ich Ihr Problem verstehe, denke ich, dass Sie das Problem mithilfe von „Current Daa Table()“ lösen können.
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;
Danke! Ich versuche es noch einmal zusammenzufassen:
- Wenn Sie der Beispieltabelle zuvor ohne Formelspalten die drei Formelspalten hinzufügen und dann das resultierende Tabellenskript der Tabelle, die jetzt die drei Formelspalten enthält, kopieren und ausführen, füllen nur die Beispiele 2 und 3 die entsprechenden Formelspalten mit den erwarteten relativen Werten . Die erste Formelspalte bleibt leer.
- Darüber hinaus wird beim Hinzufügen neuer Zeilen zu der unter 1. erstellten endgültigen Tabelle Folgendes angezeigt: (also aus dem Tabellenskript, das jetzt alle 3 Formelspalten enthält), nur das dritte Beispiel gibt beim Hinzufügen neuer, leerer Zeilen keine Fehlermeldung aus.
Aufgrund dieser Beobachtung habe ich im Rahmen von Beispiel 3 die Variable „d0Row“ entfernt. Anschließend wird beim Hinzufügen neuer Zeilen zur Tabelle keine Fehlermeldung angezeigt und die relativen Daten werden wie erwartet reproduziert. Die Frage ist daher, ob „d0Row“ überhaupt erforderlich ist . Ich habe Beispiel 3 speziell erstellt, um diese Hypothese zu testen. (Durch das Entfernen von „d0Row“ wird die Formel kürzer, aber ich mache mir Sorgen, dass diese Variable wichtig ist oder dass ich etwas übersehe. Bin ich?
Ich bin mir nicht sicher, ob dies mit der Verwendung oder Nichtverwendung von „aktuelle Datentabelle()“ in der Formel zusammenhängt. Ich verwende „aktuelle Datentabelle()“ schon seit langem als Workaround. Dies führt immer noch zu Fehlermeldungen beim Hinzufügen neuer Zeilen zu einer Tabelle, aber ich möchte trotzdem in der Lage sein, neue Zeilen zu einer Tabelle hinzuzufügen, ohne ständig Fehlermeldungen für jede relative Spalte in einer Tabelle bestätigen zu müssen, wenn eine neue Zeile hinzugefügt wird. Sie enthalten Dutzende relativer Spalten und es kostet Zeit, diesen Vorgang zu wiederholen. Natürlich ist es möglich, die Auswertung zu unterdrücken, aber das kostet auch Zeit. Es tut mir leid, wenn dieses Beispiel nicht klar ist, aber ich bin bereit, es näher zu erläutern.)
Hat nicht genau mit dieser Frage zu tun, aber Sie können die Formel mit einigen Col-Funktions-Magien „vereinfachen“. Diese Vorschläge sollten funktionieren, Sie sollten sie jedoch überprüfen, bevor Sie die alte Arbeitsformel ersetzen
dt << New Column("FormulaA", Numeric, Continuous, Formula(
100 * :QcParameter / Col Sum(If(:Time == 0, :QcParameter, .),:BatchID, :StorageCondition)
));
Wenn die Daten so sortiert sind, dass die Zeit 0 für die Gruppe immer an erster Stelle steht, können Sie sie (vielleicht) noch verständlicher machen.
dt << New Column("FormulaB", Numeric, Continuous, Formula(
100 * :QcParameter / QcParameter[Col Min(Row(), :BatchID, :StorageCondition)]
));