Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
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.
ChaveTitulo | DataEmissao | DataVencimento | DataMovimentacao | ValorMovimentacao | Acumulado Valor Mov | Valor Original Titulo | Saldo |
111AAA | 01/01/2016 | 10/01/2016 | 04/01/2016 | 2000 | 2000 | 3000 | 1000 |
111AAA | 01/01/2016 | 10/01/2016 | 07/01/2016 | 100 | 2100 | 3000 | 900 |
222BBB | 05/02/2017 | 22/02/2017 | 20/02/2017 | 500 | 500 | 1000 | 500 |
222BBB | 05/02/2017 | 22/02/2017 | 22/02/2017 | 250 | 750 | 1000 | 250 |
222BBB | 05/02/2017 | 22/02/2017 | 24/02/2017 | 250 | 1000 | 1000 | 0 |
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 ?
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?
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.
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
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.
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?
Realmente funcionou.
Peguei este código e substituí apenas teu LOAD INLINE pela minha tabela e deu certo.
Muito obrigado!
Gostei deste desafio rsrs.
Abraço, sucesso!