Qlik Community

Qlik Brasil

Group community for Brazil users. discussion only in Portuguese.

Highlighted
pamelastephanie
New Contributor II

Calcular IFs e AGGR no Script

Pessoal, boa tarde!

Tenho uma aplicação com N regras de negócio e por conta disso tive que acabar criando vários IFs e AGGR na camada de aplicação, pois muitos deles usam o valor inserido pelo usuário para o cálculo. Porém, com estas expressões complexas e volumetria, minha app está praticamente "inavegável" de tão lenta, zero de performance.

Gostaria de realizar algumas expressões no script mas estou com certa dificuldade.

Variantes da aplicação: os valore são calculados considerando o mês/ano selecionado pelo usuário e os valores inseridos por ele

Exemplo de um IF:

if(

(Date(addmonths(Max(TEMPO_MES_ANO), -0)) - Date(min(DTPRIMENTRADA))) < Date(addmonths(Max(TEMPO_MES_ANO), -0)) - Date(addmonths(Max(TEMPO_MES_ANO), -3)) and (Date(addmonths(Max(TEMPO_MES_ANO), -0)) - Date(min(DTPRIMENTRADA))) > 0,

Date(addmonths(Max(TEMPO_MES_ANO), -0)) - Date(min(DTPRIMENTRADA)),

if((Date(addmonths(Max(TEMPO_MES_ANO), -0)) - Date(min(DTPRIMENTRADA))) < 0,

0

,

if((Date(addmonths(Max(TEMPO_MES_ANO), -0)) - Date(min(DTPRIMENTRADA))) > Date(addmonths(Max(TEMPO_MES_ANO), -0)) - Date(addmonths(Max(TEMPO_MES_ANO), -3)),

Date(addmonths(Max(TEMPO_MES_ANO), -0)) - Date(addmonths(Max(TEMPO_MES_ANO), -3))

)

)

)

Exemplo de um AGGR (que tbm tem IF dentro dele):

=sum(

aggr(

((AVG(AGGR(SUM({<PRODUTO_STATUS-={'Descontinuado', 'Desativado'},FILIAL_NOME-={},PRODUTO_NOME-={}, TEMPO_MES_ANO={">=$(=Date(addmonths(Max(TEMPO_MES_ANO), -3))) <$(=Date(addmonths(Max(TEMPO_MES_ANO), -0)))"}>}DIAS_RUPTURA), FILIAL_NOME, PRODUTO_NOME)))

*

(

$(vVenda3MesesExcetoDesativadoDescontinuado)

/

(

(Date(addmonths(Max(TEMPO_MES_ANO), -0)) - Date(addmonths(Max(TEMPO_MES_ANO), -3)))

-

(AVG(AGGR(SUM({<PRODUTO_STATUS-={'Descontinuado', 'Desativado'},FILIAL_NOME-={},PRODUTO_NOME-={}, TEMPO_MES_ANO={">=$(=Date(addmonths(Max(TEMPO_MES_ANO), -3))) <$(=Date(addmonths(Max(TEMPO_MES_ANO), -0)))"}>}DIAS_RUPTURA), FILIAL_NOME, PRODUTO_NOME)))

)

)

*

avg({<TEMPO_MES_ANO=, FILIAL_NOME=>}VALOR_VENDA))

, PRODUTO_NOME, FILIAL_NOME)

)

Poderiam me ajudar a otimizar essa aplicação?

Segue app em anexo com todas as minhas expressões

Obrigada!!

Tags (1)
7 Replies
brunoaquino
New Contributor

Re: Calcular IFs e AGGR no Script

Pamela,

Boa tarde.

Veja se ajustando o Set Analysis de Tempo consegue alguma melhora.

Sum({<TEMPO_MES_ANO={">=$(=Max([TEMPO_MES_ANO],3))"}>}DIAS_RUPTURA)

Essa expression irá retornar os dados dos últimos três meses, mas sem consumir memoria de calculo com função de Date e Addmonths.

eduardo_dimperi
Valued Contributor II

Re: Calcular IFs e AGGR no Script

Oi Pamela tudo joia?


Olha, voce pode começar criando uma tabela  ou variaveis com os dados que vc usa no seu IF, isso ja ajuda muito na visualização.

pamelastephanie
New Contributor II

Re: Calcular IFs e AGGR no Script

Olá, Bruno!

Tentei usar essa expressão mas ela não está me trazendo resultado, tá me trazendo 0.

pamelastephanie
New Contributor II

Re: Calcular IFs e AGGR no Script

Olá, Eduardo!

Como seria essa tabela?

Sobre usar variáveis, em algumas expressões já utilizo. Melhora significativamente a performance?

Vou tentar aplicar nas demais.

pamelastephanie
New Contributor II

Re: Calcular IFs e AGGR no Script

Bruno,

alterei o 3 por -3 e me trouxe resultado, porém, me trouxe as vendas do mês selecionado e não as vendas dos 3 meses anteriores ao mês selecionado, que é o comportamento esperado.

eduardo_dimperi
Valued Contributor II

Re: Calcular IFs e AGGR no Script

O que melhora a performance é evitar contas como o Bruno recomendou ou ainda evitar alguns tipos de relacionamentos entre tabelas, eu particularmente evito deixar pro Set Analysis fazer o trabalho e coloca o maximo de seleçoes e contas no Script. Sugeri criar tabelas porque fica mais facil de se trabalhar (alem de diminuir o tempo de carga). Quanto a como seria essa tabela, ela deve conter os campos que voce esta criando com o addMonth e os Max() e Min().

brunoaquino
New Contributor

Re: Calcular IFs e AGGR no Script

Pamela,

Acredito que não funcionou por causa do formato do seu campo de AnoMes.

CapturarAnomes.PNG

Na expressão que passei ira funcionar bem se criar o campo do AnoMês no seu modelo conforme formato abaixo:

dim_Tempo:

LOAD %ID_TEMPO,

     TEMPO_MES_ANO,

     YEAR(TEMPO_MES_ANO)*100+MONTH(TEMPO_MES_ANO) AS AnoMes

FROM

$(vQVD.Transformacao)dim_Calendario.qvd

(qvd);