10 Replies Latest reply: Oct 27, 2014 6:50 AM by Marcos Ferreira RSS

    Como preencher dinamicamente o valor de saldo de uma tabela

    Marcos Ferreira

      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.

        • Re: Como preencher dinamicamente o valor de saldo de uma tabela
          wallace prado

          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!

            • Re: Como preencher dinamicamente o valor de saldo de uma tabela
              Luciano Vasconcelos

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

              • Re: Re: Como preencher dinamicamente o valor de saldo de uma tabela
                Marcos Ferreira

                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.

                  • Re: Re: Re: Como preencher dinamicamente o valor de saldo de uma tabela
                    wallace prado

                    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/.

                        • Re: Re: Re: Re: Como preencher dinamicamente o valor de saldo de uma tabela
                          Marcos Ferreira

                          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.

                            • Re: Como preencher dinamicamente o valor de saldo de uma tabela
                              wallace prado

                              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.

                                • Re: Como preencher dinamicamente o valor de saldo de uma tabela
                                  Marcos Ferreira

                                  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.

                                    • Re: Re: Como preencher dinamicamente o valor de saldo de uma tabela
                                      wallace prado

                                      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