Peek - fonction de script
Peek() renvoie la valeur d'un champ dans une table pour une ligne qui a déjà été chargée. Il est possible de spécifier le numéro de ligne et la table. Si aucune ligne n'est spécifiée, le dernier enregistrement précédemment chargé sera utilisé.
La fonction peek() est le plus souvent utilisée pour rechercher les limites pertinentes d'une table précédemment chargée, à savoir, la première ou la dernière valeur d'un champ spécifique. Dans la plupart des cas, cette valeur est stockée dans une variable à des fins d'utilisation ultérieure, par exemple, comme condition dans une boucle do-while.
Peek(
field_name
[, row_no[, table_name ] ])
double
Argument | Description |
---|---|
field_name | Nom du champ pour lequel la valeur de renvoi est requise.La valeur saisie doit être une chaîne (par exemple, un littéral placé entre guillemets). |
row_no |
Ligne de la table indiquant le champ requis. Il peut s'agir d'une expression, mais le résultat doit correspondre à un entier. 0 renvoie au premier enregistrement, 1 au deuxième et ainsi de suite. Les nombres négatifs indiquent l'ordre des enregistrements à partir de la fin de la table. -1 renvoie ainsi au dernier enregistrement lu. Si aucun argument row_no n'est spécifié, -1 est utilisé. |
table_name | Étiquette de table sans les deux-points finaux. Si aucun argument table_name n'est spécifié, la table active est utilisée. En cas d'utilisation à l'extérieur de l'instruction LOAD ou pour faire référence à une autre table, l'argument table_name doit être inclus. |
Cette fonction peut uniquement renvoyer des valeurs d'enregistrements déjà chargés. Cela signifie que dans le premier enregistrement d'une table, un appel utilisant -1 comme row_no renverra NULL.
Exemple 1
Ajoutez l'exemple de script à votre application et exécutez-le. Pour afficher le résultat, ajoutez les champs répertoriés dans la colonne de résultats à une feuille de votre application.
Code d'employé | 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, car Peek('EmployeeCode',0, 'EmployeeDates') renvoie la première valeur de EmployeeCode de la table EmployeeDates.
LastCode = 106, car Peek('EmployeeCode',-1, 'EmployeeDates') renvoie la dernière valeur de EmployeeCode de la table EmployeeDates.
La substitution de la valeur de l'argument row_no renvoie les valeurs des autres lignes de la table, comme suit :
Peek('EmployeeCode',2, 'EmployeeDates') renvoie la troisième valeur, 103, de la table comme FirstCode.
Notez cependant que si vous ne spécifiez pas la table comme troisième argument table_name dans ces exemples, la fonction fait référence à la table active (dans ce cas, la table interne).
Exemple 2
Si vous souhaitez accéder aux données qui se trouvent plus bas dans un tableau, vous devez le faire en deux étapes : tout d'abord, vous devez charger le tableau complet dans un tableau temporaire, puis le retrier à l'aide de Peek().
Ajoutez l'exemple de script à votre application et exécutez-le. Pour afficher le résultat, ajoutez les champs répertoriés dans la colonne de résultats à une feuille de votre application.
Create a table in a sheet in your app with ID, List, and Value as the dimensions.
ID | Liste | Valeur |
---|---|---|
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 |
L'instruction IF() est créée à partir de la table temporaire T1.
Peek('ID') référence le champ ID de la ligne précédente dans la table active T2.
Peek('List') référence le champ List de la ligne précédente dans la table T2, en cours de création pendant l'évaluation de l'expression.
L'instruction est évaluée de la manière suivante :
Si la valeur active d'ID est identique à la valeur précédente d'ID, alors indiquez la valeur de Peek('List') concaténée avec la valeur active de Value. Sinon, indiquez uniquement la valeur active de Value.
Si Peek('List') contient déjà un résultat concaténé, le nouveau résultat de Peek('List') sera concaténé avec lui.
Exemple 3
Ajoutez l'exemple de script à votre application et exécutez-le. Pour afficher le résultat, ajoutez les champs répertoriés dans la colonne de résultats à une feuille de votre application.
Montant | 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 |
Le champ AmountMonthBefore contiendra le montant du mois précédent.
Ici, les paramètres row_no et table_name sont omis, c'est pourquoi les valeurs par défaut sont utilisées. Dans cet exemple, les trois appels de fonction suivants sont équivalents :
- Peek(Amount)
- Peek(Amount,-1)
- Peek(Amount,-1,'Amounts')
L'utilisation de -1 comme row_no signifie que la valeur de la ligne précédente sera utilisée. En substituant cette valeur, il est possible de récupérer les valeurs des autres lignes du tableau :
Peek(Amount,2) renvoie la troisième valeur du tableau : 7.
Exemple 4
Pour obtenir les résultats corrects, il convient de trier correctement les données, mais, malheureusement, cela n'est pas toujours le cas. De plus, la fonction Peek() ne peut pas être utilisée pour référencer des données qui n'ont pas encore été chargées. Si vous utilisez des tables temporaires et si vous passez plusieurs fois en revue les données, vous éviterez de tels problèmes.
Ajoutez l'exemple de script à votre application et exécutez-le. Pour afficher le résultat, ajoutez les champs répertoriés dans la colonne de résultats à une feuille de votre application.
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;
Explication
Le tableau initial est trié en fonction du mois, ce qui signifie que la fonction peek(), dans de nombreux cas, renverra le montant pour le mauvais produit. C'est pourquoi il convient de retrier ce tableau. Pour ce faire, repassez en revue les données une deuxième fois en créant un nouveau tableau intitulé tmp2Amounts. Notez la clause Order by. Elle commence par trier les enregistrements par produit, puis par mois dans l'ordre croissant.
La fonction If() est nécessaire, car AmountMonthBefore doit être calculé uniquement si la ligne précédente contient les données du même produit, mais pour le mois précédent. Si le produit de la ligne en cours est comparé au produit de la ligne précédente, il est possible de valider cette condition.
Lors de la création du deuxième tableau, le premier tableau tmp1Amounts est abandonné via une instruction Drop Table.
Pour finir, les données sont passées en revue une troisième fois, mais, cette fois-ci, avec les mois triés dans l'ordre inverse. Cela permet de calculer également AmountMonthAfter.
Résultat
Month | Product | Montant | 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 | - |
Exemple 5
Ajoutez l'exemple de script à votre application et exécutez-le. Pour afficher le résultat, ajoutez les champs répertoriés dans la colonne de résultats à une feuille de votre application.
Résultat
Trimestre | 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 |
Explication
L'instruction LOAD Load *, rangesum(SumVal,peek('AccSumVal')) as AccSumVal inclut un appel récursif dans lequel les valeurs précédentes sont ajoutées à la valeur actuelle. Cette opération est utilisée pour calculer une accumulation de valeurs dans le script.