Nachfolgende Zeilen sind von anderen Spalten als den vorherigen Zeilen abhängigHallo – ich arbeite mit einer Reihe von Experimenten, bei denen einige Experimente von früheren Experimenten abhängen (dh ich mische Lösungen, die ich zuvor erstellt habe, um neue zu erstellen). Ich versuche, eine Funktion zu erstellen, die eine Spalte liest, um den Namen der vorherigen Lösung zu erhalten, eine zweite Spalte durchsucht, um die Zeile mit diesem Namen zu finden, und dann den Wert in einer Zelle mit dieser Zeile und einer dritten Spalte übernimmt. Match scheint dies irgendwie zu tun, aber ich kann es nicht zum Laufen bringen, und ich denke, das liegt zum Teil daran, dass match eine explizit angegebene Ebene der Suchspalte erwartet, und vielleicht noch andere Dinge, die mir nicht klar sind. Ich habe überhaupt keine Erfahrung mit JSL und würde so etwas wie eine Match-Spalten-Funktion bevorzugen, aber wenn JSL das ist, was dafür nötig ist, dann ist das völlig in Ordnung.
Ich habe eine Dummy-Tabelle angehängt, die den Punkt verdeutlichen soll, ohne alle meine überflüssigen anderen Spalten zu sehen. Die letzte Spalte enthält die Formel, die fehlschlägt. Hier ist ein Screenshot

und den Code für das, was nicht funktioniert, falls das einfacher zu handhaben ist:
Match( :Lösungsname, :Verwendete Lösung zur Verdünnung, :Gegebene Konzentration) /
:Verdünnungsfaktor
Dank im Voraus.
Automatisierung und SkripterstellungWindowsBetreff: Nachfolgende Zeilen sind von anderen Spalten als den vorherigen Zeilen abhängigEine Möglichkeit besteht darin, so etwas zu verwenden, um den Index abzurufen
row_idx = Loc(:Letters << Get Values, :Used solution for dilution);
If(N Items(row_idx) < 1,
.,
row_idx[1]
);
dann kannst du es verwenden Abonnieren der Datentabelle um auf den Wert in der zeilenspezifischen Zeile zuzugreifen. Die endgültige Formel sieht also etwa so aus
row_idx = Loc(:Letters << Get Values, :Used solution for dilution);
If(N Items(row_idx) < 1,
.,
:Given Concentration[row_idx[1]] / :Dilution Factor
);
Betreff: Nachfolgende Zeilen sind von anderen Spalten als den vorherigen Zeilen abhängigHier ist die Formel, die ich mir ausgedacht habe.Es kann vielleicht vereinfacht werden, aber in der aktuellen Form scheint es zu funktionieren.
x = .;
If( :Used solution for dilution[Row()] != "",
curRow = Row();
targetRow = (Current Data Table() << get rows where(
:Letters == :Used solution for dilution[curRow]
))[1];
x = :Given Concentration[targetRow] / :Dilution Factor[curRow];
);
x;
Betreff: Nachfolgende Zeilen sind von anderen Spalten als den vorherigen Zeilen abhängigHey @jthi - Das hat funktioniert! Nur damit ich die Logik verstehe, da dies das erste Mal ist, dass ich mich mit JSL beschäftige, und ich möchte lieber nicht vollständig daraus schließen, was vor sich geht:
1. „:Column1 << Get Values“ erstellt eine temporäre Liste, die in Inhalt und Reihenfolge mit „:Column1“ identisch ist.
2. Loc(:Column2 << Get Values, :Column2) gibt dann eine geordnete Liste aller Zeilennummern aus, wobei :Column1 mit dem Inhalt jeder Zeile in :Column2 übereinstimmt. Wir weisen das row_idx zu.
Innerhalb der if-Anweisung
3. N Items( row_idx ) < 1 besagt, dass wir, wenn die Liste null ist (dh es gibt keine Übereinstimmungen), sie leer machen, indem wir ein „.“ einfügen. In,
4. Wenn es in der row_idx-Liste mehr als oder gleich 1 Eintrag gibt, ist :Column3[row_idx[1]] ein Index eines Index, wobei wir den ersten Eintrag in der row_idx-Liste nehmen und diesen Eintrag als n-ten Eintrag verwenden von :Spalte3.
Ist das der Kern davon?
Vielen Dank, dass Sie daran gearbeitet haben!
Betreff: Nachfolgende Zeilen sind von anderen Spalten als den vorherigen Zeilen abhängig@txnelson Danke für den Code; Bei dir hat es auch funktioniert! Ich habe keine Erfahrung mit JSL, alle haben nur mit VBA und Matlab gearbeitet, also gerne mit @jthi , Ich will verstehen. Also um sicherzustellen, dass ich es verstehe
1. x=. definiert lediglich eine leere Variable x.
2. Wenn Zellen aus „Verwendete Verdünnungslösung“ in derselben Zeile wie die ausgewertete vorhanden sind, die nicht leer sind =>
3. curRow = Row() definiert curRow als die aktuelle Zeilennummer
4. Holen Sie sich Zeilen wo(
:Lösungsname == :Verwendete Lösung zur Verdünnung[curRow]
))[1]
Erfasst den Wert der :Verwendeten Verdünnungslösungen für die aktuelle Zeile, indem er diesen als Index verwendet, und „ruft[s] Zeile[zahlen] ab, wobei diese Werte mit denen in :Lösung identisch sind.
5. targetRow = (Current Data Table() << get rows where(... erstellt dann eine Matrix aus den in Schritt 3 ermittelten Zeilen, der Index 1 greift den ersten Eintrag in dieser Matrix, .
6. Abschließend wird x gefüllt, indem die Zeile der „Gegebenen Konzentration“, die wir in 4 angegeben haben, durch den „Verdünnungsfaktor“ in der aktuellen Zeile, angegeben in 3, dividiert wird.
7. Wir geben „x“ in die Zelle zurück.
Meine einzige Frage stammt aus Schritt 5: Ich denke, dass targetRow eine Liste aller Einträge in der gewünschten Zeile ist, aber damit Schritt sechs funktioniert, muss die tatsächliche Zeilennummer zurückgegeben werden. Ich glaube, ich verstehe falsch, wie die aktuelle Datentabelle () << Zeilen abruft, wo(... funktioniert. Könnten Sie das näher erläutern?
Nochmals vielen Dank, dass Sie sich die Zeit genommen haben!
Betreff: Nachfolgende Zeilen sind von anderen Spalten als den vorherigen Zeilen abhängig<< Get Rows Where() gibt eine Matrix der Zeilen zurück, die den an die Funktion übergebenen Auswahlkriterien entsprechen.
Wenn also festgestellt wird, dass in einer Zeile ein Wert für die Spalte „Verwendete Lösung zur Verdünnung“ vorhanden ist, der nicht leer ist/fehlt,
- Die Speichervariable curRow wird auf die aktuelle Zeile Row() gesetzt, die verarbeitet wird.In diesem Fall wird curRow auf 6 gesetzt.
- targetRow muss auf die Zeile festgelegt werden, die die „Gegebene Konzentration“ aus der Zeile enthält, die in der Spalte „Buchstaben“ einen übereinstimmenden Wert mit dem aktuellen Zeilenwert für „Verwendete Lösung zur Verdünnung“ aufweist.
- Beim Parsen lautet Get Rows Where:
<< get rows where(:Letters == :"C"])
Die Funktion ermöglicht die Rückgabe mehrerer Zeilen und gibt daher eine Matrix aller Zeilennummern zurück, die den Auswahlkriterien entsprechen.In unserem Fall wird eine Einzelelementmatrix zurückgegeben, und wir möchten den Wert des ersten Elements, der 3 ist, die Zeilennummer für die Zeile, wobei die Spalte „Buchstaben“ gleich „C“ ist.
Betreff: Nachfolgende Zeilen sind von anderen Spalten als den vorherigen Zeilen abhängig<< Werte abrufen wird verwendet, um die Werte aus einer Spalte in eine Liste oder Matrix abzurufen (abhängig vom Datentyp).
Loc() kann verwendet werden, um die Indizes aus der Matrix/Liste abzurufen, die mit dem von uns bereitgestellten Element übereinstimmen, ODER um Indizes nicht fehlender Werte zurückzugeben (meiner Meinung nach eine sehr gute Funktion).
Loc gibt eine Matrix zurück, daher verwenden wir N Items(), um zu prüfen, ob Indizes gefunden wurden, um Probleme beim Zugriff auf die Indizes zu vermeiden. Wenn kein Index gefunden wird, setzen wir den Wert für diese Zeilen auf „fehlend“.
Basierend auf den bereitgestellten Daten habe ich mich dafür entschieden, immer den ersten Index der Indizes zu verwenden. Es ist möglich, alle davon zu verwenden, wenn bei mehreren Übereinstimmungen kompliziertere Berechnungen erforderlich sind.
Nachfolgend finden Sie die Formelerstellung mit einigen Kommentaren
Names Default To Here(1);
dt = New Table("Calculated concentration - Dummy table",
Add Rows(6),
Compress File When Saved(1),
New Column("Given Concentration", Numeric, "Continuous", Format("Best", 12), Set Property("Units", "ppm"), Set Values([12, 50, 23, 14, 2, .])),
New Column("Letters", Character(1), "Nominal", Set Values({"A", "B", "C", "D", "E", "F"}), Set Display Width(38)),
New Column("Used solution for dilution", Character, "Nominal", Set Values({"", "", "", "", "", "C"})),
New Column("Dilution Factor", Numeric, "Continuous", Format("Best", 12), Set Values([., ., ., ., ., 2.29837984]))
);
dt << New Column("Calculated Concentration (ppm)", Numeric, Continuous, Formula(
// use As Constant to evaluate this only once (should make it more efficient if you have lots of data)
As Constant(all_letters = :Letters << get values); // << get values gets values from column into a matrix or list
idx_for_letter = Loc(all_letters, :Used solution for dilution); // Loc can be used to return indices of matches in matrix but it has many other uses
If(N Items(idx_for_letter) == 0, // to avoid issues when trying to access incorrect indices, check for empty matrix
. // set missing value to column IF no indices found
,
:Given Concentration[idx_for_letter[1]] / :Dilution Factor // perform calculation using first index found from idx_for_letter
);
));
Um Erklärungen zu verwendeten Funktionen zu erhalten, würde ich vorschlagen, zunächst mit Scripting Index nach der Funktion zu suchen und dann auf „Themenhilfe“ zu klicken, um zur Hilfeseite zu gelangen. Suchen Sie zum Beispiel nach „wie konstant“

und klicken Sie auf Hilfe zum Thema, um diese Seite zu öffnen Als Konstante(expr)