Peek - Skriptfunktion
Peek() gibt den Wert eines Feldes in einer Tabelle für eine Zeile zurück, die bereits geladen wurde. Die Zeilennummer kann wie die Tabelle festgelegt werden. Wenn keine Zeilennummer angegeben ist, wird der letzte zuvor geladene Datensatz verwendet.
Die Funktion peek() wird am häufigsten verwendet, um die relevanten Grenzwerte in einer zuvor geladenen Tabelle zu finden, also den ersten Wert bzw. den letzten Wert eines bestimmten Feldes. In den meisten Fällen wird dieser Wert zur späteren Verwendung in einer Variablen gespeichert, beispielsweise als Bedingung in einer do-while-Schleife.
Syntax:
Peek(
field_name
[, row_no[, table_name ] ])
Rückgabe Datentyp: dual
Argumente:
Argument | Beschreibung |
---|---|
field_name | Name für das Feld, für das der Rückgabewert erforderlich ist.Eingabewert muss als String angegeben werden (zum Beispiel in einfachen Anführungszeichen). |
row_no |
Die Zeile in der Tabelle, die das erforderliche Feld enthält. Kann eine Formel sein, die aber eine ganze Zahl ergeben muss. 0 steht für den ersten Datensatz, 1 für den zweiten usw. Mithilfe von negativen Zahlen können die Datensätze vom unteren Ende der Tabelle aus gezählt werden. -1 bezeichnet den letzten gelesenen Datensatz. Fehlt row_no, wird -1 angenommen. |
table_name | Ein Tabellenname ohne abschließenden Doppelpunkt. Fehlt table_name, wird die aktuelle Tabelle verwendet. Wird die Funktion außerhalb des LOAD-Befehls verwendet oder bezieht sie sich auf eine andere Tabelle, muss table_nameexplizit angegeben werden. |
Beschränkungen:
Die Funktion kann nur Werte aus bereits geladenen Datensätzen zurückgeben. Das bedeutet, dass im ersten Datensatz einer Tabelle ein Aufruf, der -1 als row_no verwendet, NULL zurückgibt.
Beispiel 1
Fügen Sie Ihrer App ein Beispielskript hinzu und führen Sie dieses aus. Fügen Sie einem Arbeitsblatt in Ihrer App dann die Felder hinzu, die in der Ergebnisspalte aufgeführt sind, um das Ergebnis anzuzeigen.
Mitarbeitercode | StartDate | EndDate | FirstCode | LastCode |
---|---|---|---|---|
101 |
02/11/2010 | 23/06/2012 | 101 | 106 |
102 | 01/11/2011 | 30/11/2013 | 101 | 106 |
103 | 02/01/2012 | 101 | 106 | |
104 | 02/01/2012 | 31/03/2012 | 101 | 106 |
105 | 01/04/2012 | 31/01/2013 | 101 | 106 |
106 | 02/11/2013 | 101 | 106 |
FirstCode = 101, weil Peek('EmployeeCode',0, 'EmployeeDates') den ersten Wert von EmployeeCode in der Tabelle EmployeeDates liefert.
LastCode = 106, weil Peek('EmployeeCode',-1, 'EmployeeDates') den letzten Wert von EmployeeCode in der Tabelle EmployeeDates liefert.
Durch den Ersatz des Werts des Arguments row_no werden die Werte von anderen Zeilen in der Tabelle wie nachfolgend beschrieben ausgegeben:
Peek('EmployeeCode',2, 'EmployeeDates') liefert den dritten Wert (103) in der Tabelle als den FirstCode.
Beachten Sie jedoch, dass sich die Funktion ohne Festlegen der Tabelle als drittes Argument table_name in diesen Beispielen auf die aktuelle (in diesem Fall die interne) Tabelle bezieht.
Beispiel 2
Wenn Sie auf Daten weiter unten in einer Tabelle zugreifen möchten, müssen Sie zwei Schritte durchführen: Laden Sie zuerst die ganze Tabelle in eine temporäre Tabelle und sortieren Sie diese dann anhand von Peek() neu.
Fügen Sie Ihrer App ein Beispielskript hinzu und führen Sie dieses aus. Fügen Sie einem Arbeitsblatt in Ihrer App dann die Felder hinzu, die in der Ergebnisspalte aufgeführt sind, um das Ergebnis anzuzeigen.
Create a table in a sheet in your app with ID, List, and Value as the dimensions.
ID | Liste | Wert |
---|---|---|
1 | 3,4 | 4 |
1 | 3,4,6 | 6 |
1 | 3 | 3 |
2 | 1,11 | 11 |
2 | 1 | 1 |
3 | 7,8 | 8 |
3 | 7 | 7 |
5 | 2,78 | 78 |
5 | 2,78,13 | 13 |
5 | 2 | 2 |
Der Befehl IF() wird über die temporäre Tabelle T1 ausgeführt.
Peek('ID') bezieht sich auf das Feld ID in der vorhergehenden Zeile in der aktuellen Tabelle T2.
Peek('List') bezieht sich auf das Feld List in der vorhergehenden Zeile in der Tabelle T2, die derzeit erstellt wird, während die Formel überprüft wird.
Der Befehl liefert folgendes Ergebnis:
Wenn der aktuelle Wert von ID mit dem vorhergehenden Wert von ID übereinstimmt, wird der Wert von Peek('List') mit dem aktuellen Wert von Value zusammengefasst. Ansonsten wird nur der aktuelle Wert von Value geschrieben.
Enthält Peek('List') bereits ein zusammengefasstes Ergebnis, wird das neue Ergebnis von Peek('List') damit zusammengefasst.
Beispiel 3
Fügen Sie Ihrer App ein Beispielskript hinzu und führen Sie dieses aus. Fügen Sie einem Arbeitsblatt in Ihrer App dann die Felder hinzu, die in der Ergebnisspalte aufgeführt sind, um das Ergebnis anzuzeigen.
Amount | AmountMonthBefore | Monat |
---|---|---|
1 | 4 | 2022-06 |
2 | - | 2022-01 |
3 | 2 | 2022-02 |
4 | 9 | 2022-05 |
7 | 3 | 2022-03 |
9 | 7 | 2022-04 |
Das Feld AmountMonthBefore enthält den Betrag aus dem Vormonat.
Hier werden die Parameter row_no und table_name ausgelassen, sodass die Standardwerte verwendet werden. In diesem Beispiel sind die folgenden drei Funktionsaufrufe äquivalent.
- Peek(Amount)
- Peek(Amount,-1)
- Peek(Amount,-1,'Amounts')
Wenn -1 als row_no verwendet wird, bedeutet dies, dass der Wert aus der vorigen Zeile verwendet wird. Durch Ersetzen dieses Werts können Werte aus anderen Zeilen in der Tabelle abgerufen werden:
Peek(Amount,2) gibt den dritten Wert in der Tabelle zurück: 7.
Beispiel 4
Die Daten müssen korrekt sortiert sein, um das korrekte Ergebnis zu erhalten. Leider ist dies nicht immer der Fall. Zudem kann die Funktion Peek() nicht zum Verweisen auf noch nicht geladene Daten verwendet werden. Mit temporären Tabellen und der Ausführung mehrerer Durchläufe durch die Daten lassen sich derartige Probleme vermeiden.
Fügen Sie Ihrer App ein Beispielskript hinzu und führen Sie dieses aus. Fügen Sie einem Arbeitsblatt in Ihrer App dann die Felder hinzu, die in der Ergebnisspalte aufgeführt sind, um das Ergebnis anzuzeigen.
tmp1Amounts: Load * Inline [Month,Product,Amount 2022-01,B,3 2022-01,A,8 2022-02,B,4 2022-02,A,6 2022-03,B,1 2022-03,A,6 2022-04,A,5 2022-04,B,5 2022-05,B,6 2022-05,A,7 2022-06,A,4 2022-06,B,8]; tmp2Amounts: Load *, If(Product=Peek(Product),Peek(Amount)) as AmountMonthBefore Resident tmp1Amounts Order By Product, Month Asc; Drop Table tmp1Amounts; Amounts: Load *, If(Product=Peek(Product),Peek(Amount)) as AmountMonthAfter Resident tmp2Amounts Order By Product, Month Desc; Drop Table tmp2Amounts;
Erläuterung
Die anfängliche Tabelle ist nach Monat sortiert, was bedeutet, dass die Funktion peek() in vielen Fällen den Betrag für das falsche Produkt zurückgeben würde. Daher muss diese Tabelle neu sortiert werden. Das geschieht durch einen zweiten Durchlauf durch die Daten, mit dem eine neue Tabelle namens „tmp2Amounts“ erstellt wird. Beachten Sie die Bedingung „Order by“. Damit werden die Datensätze zuerst nach Produkt und dann nach Monat in aufsteigender Reihenfolge sortiert.
Die Funktion If() wird benötigt, da AmountMonthBefore nur berechnet werden sollte, wenn die vorherige Zeile die Daten für das gleiche Produkt, aber den Vormonat enthält. Durch Vergleichen des Produkts in der aktuellen Zeile mit dem Produkt in der vorherigen Zeile kann diese Bedingung validiert werden.
Wenn die zweite Tabelle erstellt wird, wird die erste Tabelle tmp1Amounts mit einem „Drop Table“-Befehl gelöscht.
Abschließend erfolgt ein dritter Durchlauf der Daten, aber jetzt werden die Monate in umgekehrter Reihenfolge sortiert. So kann auch AmountMonthAfter berechnet werden.
Ergebnis
Monat | Produkt | Amount | AmountMonthBefore | AmountMonthAfter |
---|---|---|---|---|
2022-01 | A | 8 | - | 6 |
2022-02 | B | 3 | - | 4 |
2022-03 | A | 6 | 8 | 6 |
2022-04 | B | 4 | 3 | 1 |
2022-05 | A | 6 | 6 | 5 |
2022-06 | B | 1 | 4 | 5 |
2022-01 | A | 5 | 6 | 7 |
2022-02 | B | 5 | 1 | 6 |
2022-03 | A | 7 | 5 | 4 |
2022-04 | B | 6 | 5 | 8 |
2022-05 | A | 4 | 7 | - |
2022-06 | B | 8 | 6 | - |
Beispiel 5
Fügen Sie Ihrer App ein Beispielskript hinzu und führen Sie dieses aus. Fügen Sie einem Arbeitsblatt in Ihrer App dann die Felder hinzu, die in der Ergebnisspalte aufgeführt sind, um das Ergebnis anzuzeigen.
Ergebnis
Quartal | SumVal | AccSumVal |
---|---|---|
2003q1 | 65000 | 65000 |
2003q2 | 132450 | 197450 |
2003q3 | 131840 | 329290 |
2003q4 | 9000 | 338290 |
2004q1 | 5250 | 343540 |
2004q2 | 24240 | 367780 |
2004q3 | 88150 | 455930 |
2004q4 | 220650 | 676580 |
Erläuterung
Die load-Anweisung Load *, rangesum(SumVal,peek('AccSumVal')) as AccSumVal umfasst einen rekursiven Aufruf, in dem vorherige Werte zum aktuellen Wert hinzugefügt werden. Dieser Vorgang wird verwendet, um eine Kumulierung von Werten im Skript zu berechnen.