Peek - scriptfunctie
Peek() retourneert de waarde van een veld in een tabel voor een rij die al is geladen. Het rijnummer kan worden opgegeven, net als de tabel. Als er geen rijnummer is opgegeven, wordt het laatst geladen record gebruikt.
De functie peek() wordt het vaakst gebruikt om relevante grenzen in een eerder geladen tabel te vinden, oftewel de eerste waarde of laatste waarde van een specifiek veld. In de meeste gevallen wordt deze waarde opgeslagen in een variabele voor later gebruik, bijvoorbeeld als een voorwaarde in een do-while loop.
Syntaxis:
Peek(
field_name
[, row_no[, table_name ] ])
Retourgegevenstypen: dual
Argumenten:
Argument | Beschrijving |
---|---|
field_name | Naam van het veld waarvoor de retourwaarde is vereist.De invoerwaarde moet worden aangegeven als een tekenreeks (bijvoorbeeld literal tussen aanhalingstekens). |
row_no |
De rij in de tabel die het vereiste veld aangeeft. Kan een uitdrukking zijn, maar moet worden herleid tot een geheel getal. 0 geeft de eerste record aan, 1 de tweede, enzovoort. Negatieve nummers geven de volgorde vanaf het eind van de tabel aan. -1 geeft de laatste gelezen record aan. Als geen row_no wordt aangegeven, wordt -1 verondersteld. |
table_name | Een label voor een tabel zonder dubbele punt aan het eind. Als geen table_name wordt vermeld, wordt de huidige tabel verondersteld. Als de tabelnaam buiten de LOAD-opdracht wordt gebruikt of als de tabelnaam verwijst naar een andere tabel, moet de table_name worden opgenomen. |
Beperkingen:
De functie kan alleen waarden van reeds geladen records retourneren. Dit betekent dat in de eerste record van een tabel een aanroep die -1 als row_no gebruikt NULL zal retourneren.
Voorbeeld 1
Voeg het voorbeeldscript toe aan uw app en voer het uit. Voeg vervolgens de velden die in de resultatenkolom staan toe aan een werkblad in uw app om het resultaat te bekijken.
Employee code | 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 omdat Peek('EmployeeCode',0, 'EmployeeDates') de eerste waarde retourneert van EmployeeCode in de tabel EmployeeDates.
LastCode = 106 omdat Peek('EmployeeCode',-1, 'EmployeeDates') de laatste waarde retourneert van EmployeeCode in de tabel EmployeeDates.
Als de waarde van het argument row_no wordt vervangen, worden de waarden van de andere rijen in de tabel als volgt geretourneerd:
Peek('EmployeeCode',2, 'EmployeeDates') retourneert de derde waarde, 103, in de tabel als de FirstCode.
Houd er echter rekening mee dat als in deze voorbeelden de tabel niet wordt opgegeven als het derde argument table_name, de functie verwijst naar de huidige (in dit geval interne) tabel.
Voorbeeld 2
Als u gegevens wilt bekijken die zich lager in een tabel bevinden, moet u dit in twee stappen doen: eerst laadt u de volledige tabel als een tijdelijke tabel en vervolgens sorteert u deze opnieuw met behulp van Peek().
Voeg het voorbeeldscript toe aan uw app en voer het uit. Voeg vervolgens de velden die in de resultatenkolom staan toe aan een werkblad in uw app om het resultaat te bekijken.
Create a table in a sheet in your app with ID, List, and Value as the dimensions.
ID | Lijst | Value |
---|---|---|
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 |
De opdracht IF() is samengesteld op basis van de tijdelijke tabel T1.
Peek('ID') verwijst naar het veld ID in de vorige rij in de huidige tabel T2.
Peek('List') verwijst naar het veld List in de vorige rij in de tabel T2, die momenteel wordt samengesteld terwijl de uitdrukking wordt geëvalueerd.
De opdracht wordt als volgt geëvalueerd:
Als de huidige waarde van ID gelijk is aan de vorige waarde van ID, wordt de waarde van Peek('List') aaneengeschakeld met de huidige waarde van Value weggeschreven. Anders wordt alleen de huidige waarde van Value weggeschreven.
Als Peek('List') al een aaneengeschakeld resultaat bevat, wordt het nieuwe resultaat van Peek('List') hier eveneens mee aaneengeschakeld.
Voorbeeld 3
Voeg het voorbeeldscript toe aan uw app en voer het uit. Voeg vervolgens de velden die in de resultatenkolom staan toe aan een werkblad in uw app om het resultaat te bekijken.
Amount | AmountMonthBefore | Month |
---|---|---|
1 | 4 | 2022-06 |
2 | - | 2022-01 |
3 | 2 | 2022-02 |
4 | 9 | 2022-05 |
7 | 3 | 2022-03 |
9 | 7 | 2022-04 |
Het veld AmountMonthBefore bevat het aantal van de vorige maand.
Hier worden de parameters voor row_no en table_name weggelaten en worden de standaardwaarden gebruikt. In dit voorbeeld zijn de volgende functieaanroepen gelijk:
- Peek(Amount)
- Peek(Amount,-1)
- Peek(Amount,-1,'Amounts')
Als u -1 gebruikt als row_no, wordt de waarde van de vorige rij gebruikt. Door deze waarde te vervangen, kunnen waarden van andere rijen in de tabel worden opgehaald:
Peek(Amount,2) retourneert de derde waarde in de tabel: 7.
Voorbeeld 4
Gegevens moeten correct worden gesorteerd om de correcte resultaten te krijgen, maar helaas is dit niet altijd het geval. Bovendien kan de functie Peek() niet worden gebruikt om te verwijzen naar gegevens die nog niet zijn geladen. Door tijdelijke tabellen te gebruiken en gegevens door meerdere lagen te leiden, kunt u dergelijke problemen vermijden.
Voeg het voorbeeldscript toe aan uw app en voer het uit. Voeg vervolgens de velden die in de resultatenkolom staan toe aan een werkblad in uw app om het resultaat te bekijken.
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;
Uitleg
De initiële tabel wordt gesorteerd op maand, wat betekent dat de functie peek() in de meeste gevallen het aantal voor het verkeerde product retourneert. Daarom moet deze tabel opnieuw worden gestorteerd. Dit doet u door de gegevens door een tweede laag te leiden en een nieuwe tabel tmp2Amounts te maken. Let op de Order by-clausule. De records worden eerst gesorteerd op product, vervolgens op maand in oplopende volgorde.
De functie If() is vereist omdat AmountMonthBefore alleen moet worden berekend als de vorige rij de gegevens bevat voor hetzelfde product, maar dan van de vorige maand. Door het product van de huidige rij te vergelijken met het product van de vorige rij, kan deze voorwaarde worden gevalideerd.
Wanneer de tweede tabel wordt gemaakt, wordt de eerste tabel tmp1Amounts verwijderd met de opdracht Drop Table.
Tot slot gaan de gegevens door een derde laag, maar nu worden de maanden in omgekeerde volgorde gesorteerd. Op deze manier kan AmountMonthAfter ook worden berekend.
Resultaat
Month | Product | 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 | - |
Voorbeeld 5
Voeg het voorbeeldscript toe aan uw app en voer het uit. Voeg vervolgens de velden die in de resultatenkolom staan toe aan een werkblad in uw app om het resultaat te bekijken.
Resultaat
Kwartaal | 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 |
Uitleg
De LOAD-instructie Load *, rangesum(SumVal,peek('AccSumVal')) as AccSumVal bevat een recursieve aanroep waarbij de vorige waarden worden toegevoegd aan de huidige waarde. Deze bewerking wordt gebruikt om een samenvoeging van waarden in het script te berekenen.