Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
Not applicable

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!!

7 Replies
Anonymous
Not applicable
Author

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_dimperio
Specialist II
Specialist II

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.

Anonymous
Not applicable
Author

Olá, Bruno!

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

Anonymous
Not applicable
Author

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.

Anonymous
Not applicable
Author

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_dimperio
Specialist II
Specialist II

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().

Anonymous
Not applicable
Author

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);