Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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!!
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.
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.
Olá, Bruno!
Tentei usar essa expressão mas ela não está me trazendo resultado, tá me trazendo 0.
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.
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.
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().
Pamela,
Acredito que não funcionou por causa do formato do seu campo de AnoMes.
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);