Peek - función de script
Peek() devuelve el valor de un campo en una tabla para una fila que ya se ha cargado o que existe en la memoria interna. El número de fila se puede especificar, así como la tabla. Si no se especifica un número de fila, se utilizará el último registro cargado anteriormente.
La función peek() se utiliza con mayor frecuencia para encontrar los límites relevantes en una tabla previamente cargada, es decir, el primer valor o el último valor de un determinado campo. En la mayoría de los casos, este valor se almacena en una variable para su uso posterior, por ejemplo, como una condición en un bucle do-while.
Sintaxis:
Peek(
field_name
[, row_no[, table_name ] ])
Tipo de datos que devuelve: dual
Argumentos:
Argumento | Descripción |
---|---|
nombre_campo | Nombre del campo para el que se requiere el valor devuelto.El valor de entrada debe suministrarse como una cadena (por ejemplo, literales entrecomillados). |
row_no |
La fila de la tabla que especifica el campo requerido. Puede ser una expresión, pero debe resolverse en un entero. 0 denota el primer registro, 1 el segundo, y así sucesivamente. Los números negativos indican el orden desde el final de la tabla. -1 denota el último registro leído. Si no se especifica row_no, se presupone -1. |
table_name | Una etiqueta de tabla que no finaliza en dos puntos. Si no se especifica table_name, se presupone la tabla actual. Si se usa fuera de la sentencia LOAD o se refiere a otra tabla, debe incluirse table_name. |
Limitaciones:
La función solo puede devolver valores de registros ya cargados. Esto significa que en el primer registro de una tabla, una llamada que use -1 como row_no devolverá NULL.
Ejemplo 1
Agregue el script de ejemplo en su app y ejecútelo. Para ver el resultado, agregue los campos enumerados en la columna de resultados a una hoja de su app.
Código de empleado | 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 porque Peek('EmployeeCode',0, 'EmployeeDates') devuelve el primer valor de EmployeeCode en la tabla EmployeeDates.
LastCode = 106 porque Peek('EmployeeCode',-1, 'EmployeeDates') devuelve el último valor de EmployeeCode en la tabla EmployeeDates.
Al sustituir el valor del argumento row_no, devuelve los valores de otras filas de la tabla, del siguiente modo:
Peek('EmployeeCode',2, 'EmployeeDates') devuelve el tercer valor, 103, de la tabla, como el primer FirstCode.
No obstante, tenga en cuenta que sin especificar la tabla como tercer argumento table_name en estos ejemplos, la función hace referencia a la tabla actual (en este caso, tabla interna).
Ejemplo 2
Si desea acceder a los datos más inferiores de una tabla, debe hacerlo en dos pasos: primero, cargue toda la tabla en una tabla temporal y luego vuelva a ordenarla cuando use Peek().
Agregue el script de ejemplo en su app y ejecútelo. Para ver el resultado, agregue los campos enumerados en la columna de resultados a una hoja de su app.
Create a table in a sheet in your app with ID, List, and Value as the dimensions.
ID | Lista | Valor |
---|---|---|
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 |
La sentencia IF() se crea desde la tabla temporal T1.
Peek('ID') hace referencia al campo ID en la fila anterior en la tabla actual T2.
Peek('List') hace referencia al campo List en la fila anterior de la tabla T2, que se está construyendo a medida que se evalúa la expresión.
La sentencia se evalúa de la siguiente manera:
Si el valor actual de ID es el mismo que el valor anterior de ID, entonces escriba el valor de Peek('List') concatenado con el valor actual de Value. Si no, escriba el valor actual de Value solo.
Si Peek('List') ya contiene un resultado concatenado, el nuevo resultado de Peek('List') se le concatenará.
Ejemplo 3
Agregue el script de ejemplo en su app y ejecútelo. Para ver el resultado, agregue los campos enumerados en la columna de resultados a una hoja de su app.
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 |
El campo AmountMonthBefore retendrá el importe del mes anterior.
Aquí, se omiten los parámetros row_no y table_name, por lo que se utilizan los valores predeterminados. En este ejemplo, las siguientes tres llamadas a funciones son equivalentes:
- Peek(Amount)
- Peek(Amount,-1)
- Peek(Amount,-1,'Amounts')
Usar -1 como row_no significa que se usará el valor de la fila anterior. Al sustituir este valor, se pueden recuperar los valores de otras filas de la tabla:
Peek(Amount,2) devuelve el tercer valor de la tabla: 7.
Ejemplo 4
Los datos deben ordenarse correctamente para obtener los resultados correctos pero, desafortunadamente, no siempre es así. Además, la función Peek() no se puede utilizar para hacer referencia a datos que aún no se han cargado. Mediante el uso de tablas temporales y desplazándose varias veces por los datos, se pueden evitar estos problemas.
Agregue el script de ejemplo en su app y ejecútelo. Para ver el resultado, agregue los campos enumerados en la columna de resultados a una hoja de su app.
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;
Explicación
La tabla inicial está ordenada según el mes, lo que significa que la función peek() en muchos casos devolvería la cantidad del producto incorrecto. De ahí que se deba reordenar esta tabla. Esto se hace en un segundo paso en los datos creando una nueva tabla tmp2Amounts. Observe la cláusula Order by. Ordena los registros primero por producto, luego por mes, en orden ascendente.
La función If() es necesaria ya que AmountMonthBefore solo debe calcularse si la fila anterior contiene los datos del mismo producto pero para el mes anterior. Al comparar el producto de la fila actual con el producto de la fila anterior, se puede validar esta condición.
Cuando se crea la segunda tabla, la primera tabla tmp1Amounts se elimina mediante una instrucción Drop Table.
Finalmente, se realiza una tercera pasada por los datos, pero ahora con los meses ordenados por orden inverso. De esta forma, también se puede calcular AmountMonthAfter.
Resultado
Month | Producto | 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 | - |
Ejemplo 5
Agregue el script de ejemplo en su app y ejecútelo. Para ver el resultado, agregue los campos enumerados en la columna de resultados a una hoja de su app.
Resultado
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 |
Explicación
La sentencia de carga Load *, rangesum(SumVal,peek('AccSumVal')) as AccSumVal incluye una llamada recursiva donde los valores anteriores se suman al valor actual. Esta operación sirve para calcular una acumulación de valores en el script.