Skip to main content
Announcements
Qlik Connect 2024! Seize endless possibilities! LEARN MORE
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Comparação Períodos Atual e Anterior

Boa tarde;

Estou iniciando a construção de um Dashboard, e nessa não terei seleção alguma, todos os filtros deverão ser feito via setanalysis.

Tenho um determinado gráfico, que ira comparar as vendas do mês atual com o mês anterior.

Suponhamos que hoje é dia 10/08/2014.

Vendas Mes_Atual - com a expressão ele ira somar de 01/08/2014 a 10/08/2014:

SUM( {<ANO=Year(Today()), MES=Month(Today())>}   VENDA_LIQUIDA)

Vendas Mes_Anterior - com a expressão ele ira somar de 01/07/2014 a 31/07/2014:

SUM( {<ANO=Year(Today())-1, MES=Month(Today())-1>}   VENDA_LIQUIDA)

Como o Mes_Atual nunca estará "completo", preciso corrigir a expressão Mes_Anterior, para que some apenas o período correspondente, assim terei a comparação correta.

Qual seria a maneira mais simples de fazer isso ?

Labels (1)
30 Replies
offjunior
Creator
Creator

Bom dia!

Eu tentei exemplificar ao máximo como proceder para achar as datas máximas e mínimas de um período. Abra a aplicação, veja o objeto de texto, faça seleções e vá dando uma olhada para ver se é isso que você precisa. Depois é somente adaptar a sua necessidade real.

Abraço!

fernando_tonial
Partner - Specialist
Partner - Specialist

Olá Cleber,

Vamos tentar novamente.

Primeiro Crie um campo Flag em seu calendário.

Faça assim:


If(DATA<='$(vHoje)',1,0) AS FlgRealizado

E a variável vHoje é a data de referência

SET vHoje = Today();

Crie as seguintes variáveis através do Menu Configurações > Visão Geral das Variáveis:

vInicioYTDAtual: =YearStart(Max({<FlgRealizado={1}>} DATA)) //Inicio do Maior Ano

vFimYTDAtual: =Max({<FlgRealizado={1}>} DATA) //Hoje

vInicioYTDAnterior: =YearStart(AddYears(Max({<FlgRealizado={1}>} DATA),-1))//Inicio do Ano Anterior

vFimYTDAnterior: =AddYears(Max({<FlgRealizado={1}>} DATA),-1)//Mesma data de Hoje, mas no ano Anterior

vInicioMTDAtual: =MonthStart(Max({<FlgRealizado={1}>} DATA)) //Inicio do Mês Atual

vFimMTDAtual: =Max({<FlgRealizado={1}>} DATA) //Hoje

vInicioMTDAnterior: =MonthStart(AddYears(Max({<FlgRealizado={1}>} DATA),-1))//Inicio do mesmo mês no ano Anterior

vFimMTDAnterior: =AddYears(Max({<FlgRealizado={1}>} DATA),-1)//Mesma data de Hoje, mas no ano Anterior

Você pode fazer assim:

YTD Ano Atual - correspondente de 01/01/2014 a 01/09/2014

Sum({<DATA={">=$(vInicioYTDAtual)<=$(vFimYTDAtual)"}, MES=, ANO=>} VENDA_LIQUIDA)

YTD Ano Anteior - correspondente de 01/01/2013 a 01/09/2013

Sum({<DATA={">=$(vInicioYTDAnterior)<=$(vFimYTDAnterior)"}, MES=, ANO=>} VENDA_LIQUIDA)

MTD Ano Atual - correspondente de 01/09/2014 a 01/09/2014

Sum({<DATA={">=$(vInicioMTDAtual)<=$(vFimMTDAtual)"}, MES=, ANO=>} VENDA_LIQUIDA)

MTD Ano Anteior - correspondente de 01/09/2013 a 01/09/2013

Sum({<DATA={">=$(vInicioMTDAnterior)<=$(vFimMTDAnterior)"}, MES=, ANO=>} VENDA_LIQUIDA)

Qlikfique-se.

Tonial.

Don't Worry, be Qlik.
offjunior
Creator
Creator

Boa tarde!

E ai amigo, conseguiu resolver? Oque a comunidade te enviou ajudou?

Abraço!

Not applicable
Author

Bom dia Srs;

Desculpa a falta de agilidade, infelizmente não trabalho somente com o Qlik, tenho toda a estrutura de TI pra cuidar.

Bem, vamos lá...estou em dúvida em qual solução adotar, gostei desse exemplo de calendário que me passou, bem mais Clean do que o meu, que foi criado pela consultoria que desenvolveu a primeira aplicação aqui, tenho usado ele nas outras aplicações por estar na mesma nuvem de dados.

A solução do Tonial é bem legal também, será que o mais correto seria tentar substituir o meu calendário ajustando o nome dos campos com o que já tenho hoje para não perder as referências, ou aplicar a solução das variáveis, pro meu caso que não tenho muita experiência ?

obrigado pela ajuda

offjunior
Creator
Creator

Bom dia!

Bom, se você conseguiu o resultado esperado com os dois modelos que lhe foi passado, acho que vale mais aquele que lhe de menos trabalho, mas claro, também pensando a médio e longo prazo, vale analisar um possível retrabalho caso a escolha não tenha sido a correta. No meu caso, eu sempre opto por aquilo que não me dará retrabalho ou que eu não precise ficar escrevendo tudo sempre de novo, também prefiro a ideia de um script mais "complexo" talvez, para que me atenda o mais próximo possível sem precisar de muitos set analysis e muitas variáveis no layout.

Porem eu não tenho o seu cenário como um todo, talvez valha a pena pedir a opinião do Fernando Tonial, ele tem uma grande experiência.

Em fim que bom que pudemos ajudar você. Qualquer que seja a sua alternativa adotada, não deixe de marcar a resposta correta para que outros que passem pelo mesmo problema, possam utilizar-se da mesma solução.

Estou a disposição, abraço!

Not applicable
Author

Junior;

Meu calendário está lá no começo dos posts, você tinha pedido anteriormente. Como te falei, ele é bem mais longo que o seu, usa variáveis, fica mais confuso, o seu esta bem clean e gostaria de utiliza-lo.

Comentei o meu Calendario todo na minha aplicação e estou tentando ajustar o seu calendário com os meus nomes de campos utilizados na aplicação. Só não estou entendendo algumas coisas, tipo....o campo DATA.

Você usa ele logo no início em:

LOAD Date(num(trim(DATE#(DATA, 'DD/MM/YYYY')))) as CAL_DATA,

porém ele só é criado no LOAD que esta lá embaixo:

LOAD Date(Date#('31/12/' & Year(Today()), 'DD/MM/YYYY')) - RecNo() as DATA

offjunior
Creator
Creator

Então, vamos lá!

Esse meu calendário é gerado sempre do primeiro dia do ano de 3 anos atrás até o ultimo dia do ano atual.

Ele não é gerado a partir de uma data de alguma carga sua, como por exemplo carga de Faturamento, que poderia-se usar a data da Nota Fiscal como base para a geração desse calendário.

Para vincular o calendário a sua data, basta fazer o seguinte:


CAL_CALENDARIO:

LOAD *

WHERE CAL_DATA <= TODAY();

LOAD Date(num(trim(DATE#(DATA, 'DD/MM/YYYY')))) as CAL_DATA,

    Day(DATA)                                  as CAL_DIA,

    Month(DATA)                                as CAL_MÊS,

    Year(DATA)                                  as CAL_ANO,

    DayNumberOfQuarter(DATA)                  as CAL_DIA_TRIMESTRE,

    DayNumberOfYear(DATA)                      as CAL_DIA_ANO,

    MonthName(DATA)                            as CAL_MÊS_ANO,

    QuarterName(DATA)                          as CAL_QUARTER,

    Week(DATA)                                as CAL_SEMANA,

    ceil(Month(DATA)/3)&'º Trim'              as CAL_TRIMESTRE,

    WeekDay(DATA)                              as CAL_DIA_SEMANA;

  

LOAD Date(Date#('31/12/' & Year(Today()), 'DD/MM/YYYY')) - RecNo() as DATA

AUTOGENERATE Date(Date#('31/12/' & Year(Today()), 'DD/MM/YYYY')) - Date(Date#('01/01/' & Text(Year(Today())-3), 'DD/MM/YYYY'));



Crie um novo campo data com o nome referente a qual campo você quer ligar, exemplo se você tiver uma tabela "Nota_Fiscal" com o campo "NF_DAT_EMISSÃO" então o calendário ficaria assim:


CAL_CALENDARIO:

LOAD *

WHERE CAL_DATA <= TODAY();

LOAD Date(num(trim(DATE#(DATA, 'DD/MM/YYYY')))) as NF_DAT_EMISSÃO, //chave de ligação com o campo data de emissão de nota

    Date(num(trim(DATE#(DATA, 'DD/MM/YYYY')))) as CAL_DATA,

    Day(DATA)                                  as CAL_DIA,

    Month(DATA)                                as CAL_MÊS,

    Year(DATA)                                  as CAL_ANO,

    DayNumberOfQuarter(DATA)                  as CAL_DIA_TRIMESTRE,

    DayNumberOfYear(DATA)                      as CAL_DIA_ANO,

    MonthName(DATA)                            as CAL_MÊS_ANO,

    QuarterName(DATA)                          as CAL_QUARTER,

    Week(DATA)                                as CAL_SEMANA,

    ceil(Month(DATA)/3)&'º Trim'              as CAL_TRIMESTRE,

    WeekDay(DATA)                              as CAL_DIA_SEMANA;

  

LOAD Date(Date#('31/12/' & Year(Today()), 'DD/MM/YYYY')) - RecNo() as DATA

AUTOGENERATE Date(Date#('31/12/' & Year(Today()), 'DD/MM/YYYY')) - Date(Date#('01/01/' & Text(Year(Today())-3), 'DD/MM/YYYY'));


Caso eu não tenha conseguido ser claro, podes me enviar eu calendário com o nome dos campos que devem ser ligados que eu faço um exemplo pra você.


Abraço!

Not applicable
Author

Consegui aqui, ficou assim:

CALENDARIO:

LOAD *

WHERE DATA <= TODAY();

LOAD Date(num(trim(DATE#(DATA_TEMP, 'DD/MM/YYYY')))) as DATA,

     Day(DATA_TEMP)                             as DIA,

     Month(DATA_TEMP)                           as MES,

     Year(DATA_TEMP)                            as ANO,

     DayNumberOfQuarter(DATA_TEMP)              as DIA_TRIMESTRE,

     DayNumberOfYear(DATA_TEMP)                 as DIA_ANO,

     MonthName(DATA_TEMP)                       as MESANO,

     QuarterName(DATA_TEMP)                     as QUARTER,

     Week(DATA_TEMP)                            as SEMANA,

     ceil(Month(DATA_TEMP)/3)&'º Trim'          as TRIMESTRE,

     WeekDay(DATA_TEMP)                         as DIA_SEMANA,

     WeekName(DATA_TEMP)                        as SEMANA_ANO;

    

LOAD Date(Date#('31/12/' & Year(Today()), 'DD/MM/YYYY')) - RecNo() as DATA_TEMP

AUTOGENERATE Date(Date#('31/12/' & Year(Today()), 'DD/MM/YYYY')) - Date(Date#('01/01/' & Text(Year(Today())-3), 'DD/MM/YYYY'));

Conferi aba a aba, planilha a planilha com a anterior, fiz alguns ajustes e esta ok !

Agora vou partir pros finalmente, o problema original do post...ja te falo.

vlw !

Not applicable
Author

Muito agradecido pela ajuda senhores, consegui fazer o que precisava e de quebra estou com um calendário menos confuso.

offjunior
Creator
Creator

Maravilha!

Abraço!