Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
Not applicable

Acumular valores via Script

Pessoal, boa tarde!!!

Estou com uma dificuldade na criação de um campo acumulado com valores dos últimos 3 meses durante a carga.

Preciso ter a quantidade de uma determinada filial e produto dos últimos 3 meses, incluindo o mês atual, ou seja valores do Mês atual + 2 meses anteriores.

Hoje estes valores nos gráficos é tabelas do app eu consigo esta informações com set analysis, como os cálculos são complexos esta causando uma lentidão muito grande. Estou transformando todos os cálculos durante a carga e estou apanhando um pouco nesta parte.

Pra facilitar estou anexando um  QVW e o QVD.

Alguém pode me ajudar.

Grato,

Odair

Labels (1)
1 Solution

Accepted Solutions
nicolett_yuri

Segue um exemplo de acumulado, via script, utilizando a função peek

Peek:

LOAD * INLINE [

MES, VALOR, PRODUTO

1, 10, A

1, 20, A

1, 30, A

2, 10, A

2, 20, A

3, 10, A

4, 10, A

5, 10, A

6, 10, A

6, 20, A

7, 10, A

7, 20, A

8, 10, A

9, 10, A

9, 20, A

9, 30, A

10, 10, A

1, 11, B

1, 21, B

1, 31, B

2, 12, B

2, 22, B

3, 12, B

4, 12, B

5, 13, B

6, 13, B

6, 23, B

7, 13, B

7, 24, B

8, 14, B

9, 14, B

9, 24, B

9, 34, B

10, 14, B

1, 311, C

1, 321, C

1, 231, C

2, 212, C

2, 122, C

3, 112, C

4, 212, C

5, 213, C

6, 313, C

6, 323, C

7, 213, C

7, 224, C

8, 114, C

9, 114, C

9, 224, C

9, 234, C

10, 214, C

];

Acumulado:

LOAD

  MES,

  VALOR,

  if(

  MES <> Previous(MES),

  NumSum(VALOR),

  NumSum(Peek('ACUMULADO_POR_MES', -1)) + NumSum(VALOR)

  ) as ACUMULADO_POR_MES,

  

  RangeSum(Peek('ACUMULADO_TOTAL', -1)) + RangeSum(VALOR) as ACUMULADO_TOTAL

RESIDENT Peek

ORDER BY

  MES asc;

View solution in original post

7 Replies
aderlanrm
Partner - Specialist
Partner - Specialist

Olá Odair,

Tô meio corrido agora, mas esse exemplo da ajuda (F1) do QlikView pode lhe ser útil, abraço.

peek(nomedocampo [, linha [ , nomedatabela ] ] )

Retorna o conteúdo do nomedocampo no registro especificado por linha na tabela interna nomedatabela. Os dados são lidos da base de dados associada do QlikView.

O nomedocampo deve ser fornecido como string (por exemplo, um literal entre aspas).

Linha deve ser um inteiro. 0 indica o primeiro registro, 1 indica o segundo e assim por diante. Os números negativos indicam a ordem a partir do final da tabela. -1 indica o último registro lido.

Se nenhuma linha for definida, -1 será assumido.

Nomedatabela é um rótulo de tabela, consulte Rótulos da Tabela, sem os dois-pontos finais. Se nenhum nomedatabela for definido, a tabela atual será assumida. Se usado fora do comando load ou em referência a outra tabela, o nomedatabela deve ser incluído

Exemplos:

peek( 'Vendas' )
retorna o valor de Vendas na leitura do registro anterior (equivale a previous(Vendas)).

peek( 'Vendas', 2 )
retorna o valor de Vendas a partir do terceiro registro lido na tabela interna atual.

peek( 'Vendas', -2 )
retorna o valor de Vendas a partir do segundo registro lido na tabela interna atual.

peek( 'Vendas', 0, Tab1 )
retorna o valor de Vendas a partir do primeiro registro lido na tabela de entrada Tab1.

Load A, B, numsum( B, peek( 'Bsum' ) ) as Bsum...;
cria um acumulado de B em Bsum.

Aderlan Rodrigues
Analista, Arquiteto de Dados e Piloto Amador Drone FPV
 (41) 9 9917-0869  www.BIdeAZ.com.br  Youtube.com/bideaz  Instagram.com/bideaz.in

"Nada é tão inútil quanto fazer eficientemente o que não deveria ser feito." (Peter Drucker)
Anonymous
Not applicable
Author

Opa valeu amigão, eu também estou na correria por aqui, apanhando um pouco pra variar.. rsrsr , mais valeu pela ajuda a partir da próxima segunda-feira vou retornar a este item.

Abraços.

Odair

Not applicable
Author

Bom dia.

Também é possível criar o acumulador na SQL, já tentou ?

Anonymous
Not applicable
Author

Oi Carlos, não consigo fazer via SQL, pois antes de acumular  tenho tratamentos com estas informações que dependem de outras que não estão  na base de dados, se não fosse este detalhe com certeza seria mais fácil tratar na query.

Grato,

Odair

nicolett_yuri

Segue um exemplo de acumulado, via script, utilizando a função peek

Peek:

LOAD * INLINE [

MES, VALOR, PRODUTO

1, 10, A

1, 20, A

1, 30, A

2, 10, A

2, 20, A

3, 10, A

4, 10, A

5, 10, A

6, 10, A

6, 20, A

7, 10, A

7, 20, A

8, 10, A

9, 10, A

9, 20, A

9, 30, A

10, 10, A

1, 11, B

1, 21, B

1, 31, B

2, 12, B

2, 22, B

3, 12, B

4, 12, B

5, 13, B

6, 13, B

6, 23, B

7, 13, B

7, 24, B

8, 14, B

9, 14, B

9, 24, B

9, 34, B

10, 14, B

1, 311, C

1, 321, C

1, 231, C

2, 212, C

2, 122, C

3, 112, C

4, 212, C

5, 213, C

6, 313, C

6, 323, C

7, 213, C

7, 224, C

8, 114, C

9, 114, C

9, 224, C

9, 234, C

10, 214, C

];

Acumulado:

LOAD

  MES,

  VALOR,

  if(

  MES <> Previous(MES),

  NumSum(VALOR),

  NumSum(Peek('ACUMULADO_POR_MES', -1)) + NumSum(VALOR)

  ) as ACUMULADO_POR_MES,

  

  RangeSum(Peek('ACUMULADO_TOTAL', -1)) + RangeSum(VALOR) as ACUMULADO_TOTAL

RESIDENT Peek

ORDER BY

  MES asc;

lucianosv
Specialist
Specialist

Boa tarde.

Segue qvd com a solução.

O único detalhe é que os valores de mês anterior estão replicados em todas as linhas.

Caso haja mais de uma linha por mês, filial e produto, não podemos somar os valores.

lucianosv
Specialist
Specialist

Odair, a resposta anterior está incompleta.

Se houver furo nas informações no nível filial/produto/mês não irá funcionar. Além disso o if de quebra não está considerando filial e produto.