Skip to main content
Announcements
Live today at 11 AM ET. Get your questions about Qlik Connect answered, or just listen in. SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
Anonymous
Not applicable

Como preencher dinamicamente o valor de saldo de uma tabela

Olá pessoal, boa tarde.

Tenho uma tabela chamada saldo_inicial_conta (xls), nesta tenho os campos:

Conta;

Data;

Valor;

Os dados que tenho nela são o apenas o saldo destas contas, na data de 31/12/2013, nenhum dia a mais (ou seja, este é o saldo inicial da conta)....

Ou seja, exemplo fictício:

Conta: 1343 - Data: 31/12/2013 - Valor: 1.000,00

Tenho uma outra tabela, Fato, onde tenho N informações sobre as contas, inclusive os campos Conta e Data...

Nesta tabela, tenho entradas e saídas de cada conta, de cada dia... mas não tenho saldo...

Poderia fazer esta matemática, no momento que quisesse ver o valor de saldo de uma determinada conta, mas como o valor inicial está apenas em 31/12/2013, teoricamente teria que fazer os cálculos desde esta data, mesmo que fosse apresentar o saldo de 16/09/2014....

Honestamente, não sei como fazer.

Pensei que concatenando esta tabela com a minha fato, teria agora, para estas contas, o campo valor de saldo...

Mas não sei como preencher este saldo dos demais dias, ou como fazer mesmo que não preencha fisicamente este campo, como fazer isso dinamicamente, quando a pessoa clicar numa data como 16/09/2014, já que tenho o saldo de apenas 31/12/2013...

Vocês poderiam me dar uma força nisso?

ANEXEI UM QVW PARA QUE POSSAM DAR UMA ANALISADA.

Obrigado desde já.

Marcos.

1 Solution

Accepted Solutions
Not applicable
Author

Bem, primeiro vamos acertar a Data do Saldo Inicial. Utilizei a função MakeDate para gerar uma data em 31/12/2013. Fica assim:

SALDO_ANTERIOR:

LOAD Empresa,

    ID_CONTA,

    [Saldo Atual] as SALDO_INICIAL,

    MakeDate(2013,12,31) as Data

FROM

Fonte\Financeiro\MOV_DIARIO\SALDO_ATUAL.qvd

(qvd);

Para as cargas das tabelas de Movimentacao_C e Movimentacao_D, coloquei um filtro para somente pegar os dados de 01/01/2014.

.

.

FROM

.\MOVIMENTO_C.qvd

(qvd)

Where Data >= MakeDate(2014,01,01);

Por ultimo modifiquei a formula do Saldo:

    RowNo() as OrdemLancamento,

    If( Peek('ID_CONTA') <> ID_CONTA, // SE MUDOU DE CONTA OU É A PRIMEIRA CONTA

    //Se a conta anterior for diferente da atual (andre)

    SALDO_INICIAL, // então pega o Saldo Inicial e define como saldo

    Peek('SALDO') + alt(Valor_C,0) - alt(Valor_D,0) ) as SALDO  // se não é a linha de saldo inicial (a primeira), pega o saldo anterior, soma o credito e subtrai o debito

Mantive a condição do If, se trocar de conta é um novo saldo. Alterei apenas o calculo do Saldo. O que estava dando errado é que você somava Valor_C e Valor_D que em alguns casos são nulos, resultando em nulo. Usei a função alt para resolver isso. Veja alt(Valor_C, 0), neste caso se Valor_C é nulo ele usa o Zero. Assim passou a calcular o Saldo Corretamente.

Aproveitei e criei uma coluna OrdemLancamento, que é um inteiro representando a ordem sequencial utilizada para o calculo de saldo dia a dia.

Vi que você também que utilizar o saldo em alguns gráficos (pivot e outros), mas não utilizou função nenhuma. Realmente não dá para usar Sum, nem Max, nem Min.... mas você pode usar a função de Agregação:

=FirstSortedValue( SALDO , -OrdemLancamento)

Esta função retorna o último valor de SALDO, ordenado por OrdemLancamento (por isso o sinal de negativo) .

Assim se quiser criar um gráfico de saldo por Data ele vai pegar o último da Data.

Veja o anexo

View solution in original post

10 Replies
Not applicable
Author

Oi Marcos,

O ideal seria você mandar com as fontes de dados, para que possamos alterar o script e mandar um reload, mas sem problemas.

Fiz um pequeno exemplo com dados fictícios utilizando duas tabelas: Saldo e Lançamentos.

Eu resolvi seu problema concatenando as duas tabelas em uma tabela temporária. Depois faço um load desta temporária ordenando por Conta e Data. Assim temos os registros na ordem em que eles ocorreram para cada conta.

Neste load utilizo a função Peek, que pega o valor do campo no registro anterior e calculo o saldo após este lançamento. Se for o primeiro registro da conta (neste caso 31/12/2013), o valor de lançamento é o próprio saldo, para os registros seguintes é o saldo anterior (peek) + lancamento.

Saldo em 31/12/2013 = 1000

Lancamento 1, 15/01/2014, +200, 1200

Lancamento 2, 20/01/2014, - 300, 900

Veja o exemplo. QQ dúvida é só falar!

lucianosv
Specialist
Specialist

A ideia do Wallace é boa. Nela você pode ter os lançamentos por conta/dia e o saldo atualizado.

Anonymous
Not applicable
Author

Wallace, obrigado por sua ajuda. Cara sou iniciante, tem umas coisas que ainda são difíceis de saber como fazer.

Anexei três arquivos que retratam perfeitamente meu cenário.

Um arquivo qvw

Um xls com dados das contas

Um xls com saldo inicial das contas

Usei seu exemplo e consegui fazer funcionar, mas se eu tivesse apenas uma coluna com entradas e saídas, mas como tenho dois, um para entrada e outro para saída, complicou.

Meu caro, se puder dar uma olhada, esse qvd é um retrato fiel da situação.

Desde já, muito obrigado por sua boa vontade.

Marcos.

Not applicable
Author

Tranquilo Marcos!

Bem, fiz exatamente como o anterior. O macete é concatenar as tabelas de saldo inicial e lançamento, do jeito que você fez. Depois é ordenar a tabela residente por conta e data e utilizar a função peek para pegar o valor da linha anterior.

Ao mudar de conta ou na primeira conta o Peek('ID_CONTA') <> ID_CONTA, ou seja, mudou de conta? Vai ser verdadeiro. Neste caso o registro tem o Saldo Inicial. Nos demais casos é só pegar o Saldo Anterior [ Peek('SALDO') ] e somar os créditos e depois subtrair os débitos.

Ta tudo ai no Rar. Espero que te ajude.

No final do mês vai rolar um treinamento no Centro do Rio. Não é porque eu sou o instrutor :-), mas o treinamento é muito bom! Dá uma olhada, as vezes te interessa http://www.mindtek.com.br/2014/09/treinamento-qlikview-designer-rj/.

Not applicable
Author

Oi Marcos, fucnionou?

Anonymous
Not applicable
Author

Wallace bom dia.

Obrigado por sua ajuda.

Desculpe demorar a responder, estes dias estive envolvido com outra tarefa, nem pude colocar a mão no qlik...

Meu amigo, desculpe incomodar tanto.

Bem, fiz os testes, e quando faço leitura que envolva a data inicial funciona, mas não entendi porque quando clico por exemplo numa data do meio do ano, ou ate do mesmo mês que inicia, aí os dados não aparecem..

Parece que se eu saio daquela data onde começa, perco a ação do script...

Eu vou anexar o painel com os dados reais, e os qvds, caso vc tenha uma oportunidade de dar uma olhada, se não der vou entender, vc já me ajudou bastante.

Tô tentando, rs.

Abraços,

Marcos.

Not applicable
Author

Marcos,

O problema está na Data do Saldo Inicial. Para a conta 1343 o Saldo Inicial está com Data de 1/1/2014, mas tem lançamentos antes disso. Você tem certeza que o Saldo Inicial é sempre o saldo inicial da Conta, independente da Data que você colocou no arquivo SALDO_ATUAL.qvd?

Me responde se é este o caso para eu poder propor uma solução mais adequada. Ah, e anexa o arquivo empresa.qvd que está faltando.

Anonymous
Not applicable
Author

Wallace, bom dia

Na verdade a situação é a seguinte, cada conta tem uma saldo inicial, que necessariamente NÃO estão na mesma data.

O que eu fiz...

Fui dia 31/12/2013 (exemplo), e vi qual o saldo do final do dia, e usei para cada conta este saldo para esta data.

Na verdade não é este o saldo inicial real, vc acha que se eu pegasse o saldo incial real seria melhor, independente de sua data de inicialização?

Fiz isso, porque na verdade, não me interessa, ter movimento antes de 2014, mas se for melhor pegar a data inicial e saldo inicial real, posso fazer.

Não sei porque, mas quando dou um select no banco (oracle), via qualquer ferramenta, para buscar apartir de uma data qualquer, consigo o resultado desejado, mas não sei porque, no qlikview, ele não atende a esta condição. O Where DT_INICIAL > '31/12/2013'; é ignorado, e ele pega tudo que existe.

Mas voltando ao assunto anterior, vc acha melhor que eu pegue a data e saldo iniciais reais?

O que vc sugere?

Att, Marcos.

Not applicable
Author

Bem, primeiro vamos acertar a Data do Saldo Inicial. Utilizei a função MakeDate para gerar uma data em 31/12/2013. Fica assim:

SALDO_ANTERIOR:

LOAD Empresa,

    ID_CONTA,

    [Saldo Atual] as SALDO_INICIAL,

    MakeDate(2013,12,31) as Data

FROM

Fonte\Financeiro\MOV_DIARIO\SALDO_ATUAL.qvd

(qvd);

Para as cargas das tabelas de Movimentacao_C e Movimentacao_D, coloquei um filtro para somente pegar os dados de 01/01/2014.

.

.

FROM

.\MOVIMENTO_C.qvd

(qvd)

Where Data >= MakeDate(2014,01,01);

Por ultimo modifiquei a formula do Saldo:

    RowNo() as OrdemLancamento,

    If( Peek('ID_CONTA') <> ID_CONTA, // SE MUDOU DE CONTA OU É A PRIMEIRA CONTA

    //Se a conta anterior for diferente da atual (andre)

    SALDO_INICIAL, // então pega o Saldo Inicial e define como saldo

    Peek('SALDO') + alt(Valor_C,0) - alt(Valor_D,0) ) as SALDO  // se não é a linha de saldo inicial (a primeira), pega o saldo anterior, soma o credito e subtrai o debito

Mantive a condição do If, se trocar de conta é um novo saldo. Alterei apenas o calculo do Saldo. O que estava dando errado é que você somava Valor_C e Valor_D que em alguns casos são nulos, resultando em nulo. Usei a função alt para resolver isso. Veja alt(Valor_C, 0), neste caso se Valor_C é nulo ele usa o Zero. Assim passou a calcular o Saldo Corretamente.

Aproveitei e criei uma coluna OrdemLancamento, que é um inteiro representando a ordem sequencial utilizada para o calculo de saldo dia a dia.

Vi que você também que utilizar o saldo em alguns gráficos (pivot e outros), mas não utilizou função nenhuma. Realmente não dá para usar Sum, nem Max, nem Min.... mas você pode usar a função de Agregação:

=FirstSortedValue( SALDO , -OrdemLancamento)

Esta função retorna o último valor de SALDO, ordenado por OrdemLancamento (por isso o sinal de negativo) .

Assim se quiser criar um gráfico de saldo por Data ele vai pegar o último da Data.

Veja o anexo