Qlik Community

Qlik Brasil

Group community for Brazil users. discussion only in Portuguese.

Highlighted
dairan73
New Contributor III

Criar registros diários

Tenho a tabela a seguir mas preciso criar um QVD histórico para saber se em determinado dia o título (ChaveTitulo) estava inadimplente ou não.

O problema é que teria que criar dia a dia a partir da DataEmissao um registro até a data de hoje ou até que o Saldo ficasse 0.

   

ChaveTituloDataEmissaoDataVencimentoDataMovimentacaoValorMovimentacaoAcumulado Valor MovValor Original TituloSaldo
111AAA01/01/201610/01/201604/01/20162000200030001000
111AAA01/01/201610/01/201607/01/201610021003000900
222BBB05/02/201722/02/201720/02/20175005001000500
222BBB05/02/201722/02/201722/02/20172507501000250
222BBB05/02/201722/02/201724/02/2017250100010000

Por exemplo:

Título 111AAA teve seu último pagamento em 07/01/2016, então assim que passou o vencimento em 10/01/2016 deveria criar um registro por dia (até hoje ou até ficar com saldo 0) informando que o titulo está inadimplente e o saldo devedor.

Título 222BBB deveria criar um registro somente do dia 23/02/17 que foi o dia que ficou inadimplente.

É viável fazer esta criação diária ? Alguma ideia de como fazer o código ?

Tags (1)
1 Solution

Accepted Solutions
mario_sergio_ti
Valued Contributor

Re: Criar registros diários

Amigo, algo errado no resultado do seu Left Join (temp_Extrato)

Fiz um teste aqui e deu certo, veja só

temp_Extrato:

//Preenchendo_Intervalos_Datas

LOAD

  ChaveTitulo,  DataEmissao,  DataVencimento,  TotalValorMovimentacao,

  [Valor Original Titulo],

  IterNo() As 'Dia',

  Date(DataEmissao + IterNo() - 1,'DD/MM/YYYY') As 'Data'

While DataEmissao + IterNo() - 1 <= If(MaxDataMov<=DataVencimento, DataVencimento,

  If(TotalValorMovimentacao<[Valor Original Titulo], Today(), MaxDataMov));

//Agrupamento

LOAD

  ChaveTitulo,

  Only(DataEmissao) As 'DataEmissao',

  Only(DataVencimento) As 'DataVencimento',

  Max(DataMovimentacao) As 'MaxDataMov',

  Sum(ValorMovimentacao) As 'TotalValorMovimentacao',

  Only([Valor Original Titulo]) As [Valor Original Titulo]

Group By ChaveTitulo;

//Dados da fonte

LOAD * Inline [

ChaveTitulo DataEmissao DataVencimento DataMovimentacao ValorMovimentacao 'Valor Original Titulo'

111AAA 18/03/2017 20/03/2017 19/03/2017 2000 3000

111AAA 18/03/2017 20/03/2017 21/03/2017 100 3000

222BBB 18/03/2017 20/03/2017 18/03/2017 500 750

222BBB 18/03/2017 20/03/2017 19/03/2017 250 750

333CCC 18/03/2017 20/03/2017 19/03/2017 500 1000

333CCC 18/03/2017 20/03/2017 20/03/2017 250 1000

333CCC 18/03/2017 20/03/2017 21/03/2017 250 1000

444DDD 18/03/2017 20/03/2017 19/03/2017 500 1000

444DDD 18/03/2017 20/03/2017 20/03/2017 250 1000

444DDD 18/03/2017 20/03/2017 21/03/2017 100 1000

] (Delimiter Is ' ');

Left Join (temp_Extrato)

//Dados da fonte

Load

  ChaveTitulo,

  DataMovimentacao As Data,

  ValorMovimentacao;

LOAD * Inline [

ChaveTitulo DataMovimentacao ValorMovimentacao

111AAA 19/03/2017 2000

111AAA 21/03/2017 100

222BBB 18/03/2017 500

222BBB 19/03/2017 250

333CCC 19/03/2017 500

333CCC 20/03/2017 250

333CCC 21/03/2017 250

444DDD 19/03/2017 500

444DDD 20/03/2017 250

444DDD 21/03/2017 100

] (Delimiter Is ' ');

Tab_MovimentacaoDiaria:

NoConcatenate Load

  ChaveTitulo,

  DataEmissao,

  DataVencimento,

  TotalValorMovimentacao,

  [Valor Original Titulo],

  Dia,

  Data,

  ValorMovimentacao,

  Rangesum(

      If(ChaveTitulo = Previous(ChaveTitulo),

      rangesum(ValorMovimentacao, Peek(ValorMovAcumulado))

        , ValorMovimentacao)

  ) As 'ValorMovAcumulado',

  [Valor Original Titulo]-Rangesum(

      If(ChaveTitulo = Previous(ChaveTitulo),

      Rangesum(ValorMovimentacao, Peek(ValorMovAcumulado))

        , ValorMovimentacao)

  ) As 'SaldoDevedor',

   

  If(

      Rangesum(

          if(ChaveTitulo = Previous(ChaveTitulo),

              Rangesum(ValorMovimentacao, Peek(ValorMovAcumulado))

          , ValorMovimentacao)

      )

        < [Valor Original Titulo],

    'Devedor',

    'Não Devedor'

  ) As 'SituacaoCliente'   

Resident temp_Extrato Order By ChaveTitulo, Data Asc;

Drop Table temp_Extrato;

Você modificou algo a mais do que o endereço dos dados?

5 Replies
mario_sergio_ti
Valued Contributor

Re: Criar registros diários

Amigo, segue;

temp_Extrato:

//Preenchendo_Intervalos_Datas

LOAD

  ChaveTitulo,  DataEmissao,  DataVencimento,  TotalValorMovimentacao,

  [Valor Original Titulo],

  IterNo() As 'Dia',

  Date(DataEmissao + IterNo() - 1,'DD/MM/YYYY') As 'Data'

While DataEmissao + IterNo() - 1 <= If(MaxDataMov<=DataVencimento, DataVencimento,

  If(TotalValorMovimentacao<[Valor Original Titulo], Today(), MaxDataMov));

//Agrupamento

LOAD

  ChaveTitulo,

  Only(DataEmissao) As 'DataEmissao',

  Only(DataVencimento) As 'DataVencimento',

  Max(DataMovimentacao) As 'MaxDataMov',

  Sum(ValorMovimentacao) As 'TotalValorMovimentacao',

  Only([Valor Original Titulo]) As [Valor Original Titulo]

Group By ChaveTitulo;

//Dados da fonte

LOAD ChaveTitulo, DataEmissao, DataVencimento, DataMovimentacao, ValorMovimentacao, [Valor Original Titulo]

FROM [lib://QLIK_SUPORTE/SUATABELA.QVD];

Left Join (temp_Extrato)

//Dados da fonte

Load

  ChaveTitulo,

  DataMovimentacao As Data,

  ValorMovimentacao;

LOAD ChaveTitulo, DataMovimentacao, ValorMovimentacao

FROM [lib://QLIK_SUPORTE/SUATABELA.QVD];

Tab_MovimentacaoDiaria:

NoConcatenate Load

  ChaveTitulo,

  DataEmissao,

  DataVencimento,

  TotalValorMovimentacao,

  [Valor Original Titulo],

  Dia,

  Data,

  ValorMovimentacao,

  Rangesum(

      If(ChaveTitulo = Previous(ChaveTitulo),

      rangesum(ValorMovimentacao, Peek(ValorMovAcumulado))

        , ValorMovimentacao)

  ) As 'ValorMovAcumulado',

  [Valor Original Titulo]-Rangesum(

      If(ChaveTitulo = Previous(ChaveTitulo),

      Rangesum(ValorMovimentacao, Peek(ValorMovAcumulado))

        , ValorMovimentacao)

  ) As 'SaldoDevedor',

    

  If(

      Rangesum(

          if(ChaveTitulo = Previous(ChaveTitulo),

              Rangesum(ValorMovimentacao, Peek(ValorMovAcumulado))

          , ValorMovimentacao)

      )

        < [Valor Original Titulo],

    'Devedor',

    'Não Devedor'

  ) As 'SituacaoCliente' 

Resident temp_Extrato Order By ChaveTitulo, Data Asc;

Drop Table temp_Extrato;

Substitua FROM [lib://QLIK_SUPORTE/SUATABELA.QVD] para o endereço correto dos dados.

dairan73
New Contributor III

Re: Criar registros diários

Mario,

Obrigado pela ajuda, mas não funcionou.

Peguei um título que o vencimento foi 18/01/2015 e ele teve 3 movimentações:

20/01/2015 = 1.000

22/01/2015 = 385,85

22/01/2015 = 1656

2017-03-22 - 001.png

O valor do título é 2270,15 e a soma dos valores de movimentação da o total de 3041,85. Ou seja, no dia 22/01 o valor ultrapassou o valor do título, sendo assim está quitado.

Neste exemplo o script deveria criar as seguintes linhas:

DATA           MOVIMENTACAO      SALDO      SITUAÇÃO

19/01/2015     0                               2270,15      Devedor

20/01/2015     1.000                        1270,15       Devedor

21/01/2015      0                              1270,15      Devedor

A linha do dia 22/01 não é preciso criar pois o saldo fica menor que 0 (-771,70), assim informando que o cliente já pagou mais do que o valor total da fatura.

mario_sergio_ti
Valued Contributor

Re: Criar registros diários

Amigo, algo errado no resultado do seu Left Join (temp_Extrato)

Fiz um teste aqui e deu certo, veja só

temp_Extrato:

//Preenchendo_Intervalos_Datas

LOAD

  ChaveTitulo,  DataEmissao,  DataVencimento,  TotalValorMovimentacao,

  [Valor Original Titulo],

  IterNo() As 'Dia',

  Date(DataEmissao + IterNo() - 1,'DD/MM/YYYY') As 'Data'

While DataEmissao + IterNo() - 1 <= If(MaxDataMov<=DataVencimento, DataVencimento,

  If(TotalValorMovimentacao<[Valor Original Titulo], Today(), MaxDataMov));

//Agrupamento

LOAD

  ChaveTitulo,

  Only(DataEmissao) As 'DataEmissao',

  Only(DataVencimento) As 'DataVencimento',

  Max(DataMovimentacao) As 'MaxDataMov',

  Sum(ValorMovimentacao) As 'TotalValorMovimentacao',

  Only([Valor Original Titulo]) As [Valor Original Titulo]

Group By ChaveTitulo;

//Dados da fonte

LOAD * Inline [

ChaveTitulo DataEmissao DataVencimento DataMovimentacao ValorMovimentacao 'Valor Original Titulo'

111AAA 18/03/2017 20/03/2017 19/03/2017 2000 3000

111AAA 18/03/2017 20/03/2017 21/03/2017 100 3000

222BBB 18/03/2017 20/03/2017 18/03/2017 500 750

222BBB 18/03/2017 20/03/2017 19/03/2017 250 750

333CCC 18/03/2017 20/03/2017 19/03/2017 500 1000

333CCC 18/03/2017 20/03/2017 20/03/2017 250 1000

333CCC 18/03/2017 20/03/2017 21/03/2017 250 1000

444DDD 18/03/2017 20/03/2017 19/03/2017 500 1000

444DDD 18/03/2017 20/03/2017 20/03/2017 250 1000

444DDD 18/03/2017 20/03/2017 21/03/2017 100 1000

] (Delimiter Is ' ');

Left Join (temp_Extrato)

//Dados da fonte

Load

  ChaveTitulo,

  DataMovimentacao As Data,

  ValorMovimentacao;

LOAD * Inline [

ChaveTitulo DataMovimentacao ValorMovimentacao

111AAA 19/03/2017 2000

111AAA 21/03/2017 100

222BBB 18/03/2017 500

222BBB 19/03/2017 250

333CCC 19/03/2017 500

333CCC 20/03/2017 250

333CCC 21/03/2017 250

444DDD 19/03/2017 500

444DDD 20/03/2017 250

444DDD 21/03/2017 100

] (Delimiter Is ' ');

Tab_MovimentacaoDiaria:

NoConcatenate Load

  ChaveTitulo,

  DataEmissao,

  DataVencimento,

  TotalValorMovimentacao,

  [Valor Original Titulo],

  Dia,

  Data,

  ValorMovimentacao,

  Rangesum(

      If(ChaveTitulo = Previous(ChaveTitulo),

      rangesum(ValorMovimentacao, Peek(ValorMovAcumulado))

        , ValorMovimentacao)

  ) As 'ValorMovAcumulado',

  [Valor Original Titulo]-Rangesum(

      If(ChaveTitulo = Previous(ChaveTitulo),

      Rangesum(ValorMovimentacao, Peek(ValorMovAcumulado))

        , ValorMovimentacao)

  ) As 'SaldoDevedor',

   

  If(

      Rangesum(

          if(ChaveTitulo = Previous(ChaveTitulo),

              Rangesum(ValorMovimentacao, Peek(ValorMovAcumulado))

          , ValorMovimentacao)

      )

        < [Valor Original Titulo],

    'Devedor',

    'Não Devedor'

  ) As 'SituacaoCliente'   

Resident temp_Extrato Order By ChaveTitulo, Data Asc;

Drop Table temp_Extrato;

Você modificou algo a mais do que o endereço dos dados?

dairan73
New Contributor III

Re: Criar registros diários

Realmente funcionou.

Peguei este código e substituí apenas teu LOAD INLINE pela minha tabela e deu certo.

Muito obrigado!

mario_sergio_ti
Valued Contributor

Re: Criar registros diários

Gostei deste desafio rsrs.

Abraço, sucesso!