locked
Composição de Saldo [SQL 2000] RRS feed

  • Pergunta

  • Pessoal,

    Estou montando um tipo de extrato de conta corrente. Numa das colunas eu tenho o Valor e na outra, o Saldo, que é composto por cada movimento da conta corrente. Quando selecionei os registros, criei uma tabela temporária, sendo que a coluna de Saldo deixei nula.

    Para montar o saldo, eu costumo criar um cursor e somando o valor de cada linha e atualizando o saldo a cada movimento.

    Minha pergunta é: tem um jeito de montar esse saldo através de um único select, sem precisar fazer um cursor e somar linha por linha?

     

    Obrigado,

     

    Jorge Pregnolato Filho.

     

     

    sexta-feira, 2 de fevereiro de 2007 18:44

Todas as Respostas

  • Boa tarde Jorge

    Você pode enviar um exemplo ?

     

     

    Abs

    sexta-feira, 2 de fevereiro de 2007 18:52
  • Jorge,

    Em um sistema que eu desenvolvi aqui na empresa, temos um relatório(ficha de movimentação) que trabalhar como se fosse um extrato, colunas de entrada, colunas de saída, saldo diário, saldo final.

    Será que é mais ou menos isso que você precisa?

    sexta-feira, 2 de fevereiro de 2007 19:00
  • Boa tarde Jorge, consegui implementar da seguinte forma, dá uma olhada e vê se isso te ajuda.

     

    Declare @Tabela Table(Item int identity(1,1),Valor decimal(15,2),Saldo Decimal(15,2))
    Declare @Tabela_Saida Table(Item int identity(1,1),Valor decimal(15,2),Saldo Decimal(15,2))

    INSERT INTO @Tabela Values(0,Null)
    INSERT INTO @Tabela Values(10,Null)
    INSERT INTO @Tabela Values(20,Null)
    INSERT INTO @Tabela Values(30,Null)
    INSERT INTO @Tabela Values(40,Null)
    INSERT INTO @Tabela Values(50,Null)
    INSERT INTO @Tabela Values(60,Null)
    INSERT INTO @Tabela Values(70,Null)
    INSERT INTO @Tabela Values(80,Null)
    INSERT INTO @Tabela Values(90,Null)

    Insert into @Tabela_Saida Select valor,saldo From @Tabela

    Declare @Qtd int,
            @Reg int,
            @Saldo decimal(15,2)

    Select @Qtd = Count(*) From @Tabela
    Select @Reg = 1

    Select @Saldo = 0

    While @Reg <= @Qtd
    begin
       Update @Tabela_Saida Set Saldo=Valor+ @Saldo where item=@Reg

       Set @Saldo = (Select Valor+@Saldo From @Tabela Where item=@Reg)
       Set @Reg = @Reg + 1
    end

    Select * from @Tabela_Saida

    Espero ter ajudado

    sexta-feira, 2 de fevereiro de 2007 19:10
  • Jorge, completando o raciocínio:

     

    Antes do SELECT final do exemplo que te passei vc poderia Truncar a tabela e atualizar os valores com os dados da tabela de saída.

    sexta-feira, 2 de fevereiro de 2007 19:21
  • Anderson,

    É justamente a utilização do While que eu quero evitar. Eu gostaria de compor o saldo através de um único select. Mas, acho que não deve ser possível, pois teriamos que gerar uma acumulação numa variável, dentro de um select e ainda por cima gravar o que encontrou.

    Obrigado,

    Jorge.

     

    sexta-feira, 2 de fevereiro de 2007 19:28
  • Junior,

     

    É isso mesmo. Eu também já fiz relatórios desse tipo, mas usei um while end para acumular o saldo. É isso que eu gostaria de evitar, se fosse possível,

     

    Jorge.

    sexta-feira, 2 de fevereiro de 2007 19:29
  • Bom dia Jorge,

    Creio que ainda dá para dar uma enxugada neste exemplo que te passei, mas apesar do While, não existe cursor.

     

    Espero ter ajudado

    Abraços

    segunda-feira, 5 de fevereiro de 2007 10:24
  • Olá Jorge.

    Dá uma olhada no código abaixo, e ve se te ajuda..

    Qualquer coisa escreve de novo.

    create table tbl_creditos(
     data datetime
    ,nome varchar(20)
    ,conta int
    ,qtd int)

    insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Ze',001,10)
    insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Ze',001,12)
    insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Ze',001,7)
    insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Ze',001,-5)
    insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Ze',001,2)
    insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Fulano',002,10)
    insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Fulano',002,5)
    insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Fulano',002,7)

    if(object_id('tempdb..#tbl')is not null)
     drop table #tbl

    select *, idrow=identity(int,1,1) into #tbl
    from tbl_creditos

    select nome, qtd, saldo=(select sum(p.qtd) from #tbl p
                 where p.idrow <= q.idrow and q.nome = p.nome)
    from #tbl q
    group by nome, q.idrow, qtd

    quarta-feira, 7 de fevereiro de 2007 01:16
  • Olá pessoal. Estou com uma dúvida referente a essa questão de saldo e gostaria de compartilhar com vocês para saber se alguém pode me auxiliar a resolver.

    Eu criei uma procedure para retornar um extrato da conta "corrente" e 2 saldos...  Eu usei o union all, assim dessa forma o saldo que está numa tabela de saldo somente será mostrado na primeira linha... as demais linha eu preciso trazer o saldo de acordo com a transação, Crédito ou Débito da conta... ou seja um valor de saldo acumulado.
    Exemplo:            (DESCRIÇÃO)                             VR_MOVIMENTO       SALDO1             SALDO2     
    LINHA 1:       SALDO ANTERIOR                                          -               10000,00           5000,00

    LINHA 2:      PAGAMENTO DE ENERGIA                        100,00                9900,00            4900,00

    LINHA 3: RECEBIMENTO DE VENDA                             500,00               10400,00           5400,00     

    Esses saldos 1 e 2 são acumulativos...

    Vocês têm alguma idéia de como resolver esse problema dentro do SQL Server modificando minha procedure?
    A solução mais próxima que encontrei foi a seguinte...
    TENHO 2 VARIÁVEIS @SALDO1 E @SALDO2
    Que jogo nelas através de um select esses saldo anteriors...
    As demais linhas deveriam ser: SALDO1 = SALDO1 + VR_MOVIMENTO (EM CASO DE CRÉDITO) E EM CÁSO DE DÉBITO SALDO1=SALDO1+VR_MOVIMENTO.

    Se alguém puder me ajudar ficaria grato.
    Att
    Charles


    Olá Jorge.

    Dá uma olhada no código abaixo, e ve se te ajuda..

    Qualquer coisa escreve de novo.

    create table tbl_creditos(
     data datetime
    ,nome varchar(20)
    ,conta int
    ,qtd int)

    insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Ze',001,10)
    insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Ze',001,12)
    insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Ze',001,7)
    insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Ze',001,-5)
    insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Ze',001,2)
    insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Fulano',002,10)
    insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Fulano',002,5)
    insert tbl_creditos(data, nome, conta, qtd) values ('20060615','Fulano',002,7)

    if(object_id('tempdb..#tbl')is not null)
     drop table #tbl

    select *, idrow=identity(int,1,1) into #tbl
    from tbl_creditos

    select nome, qtd, saldo=(select sum(p.qtd) from #tbl p
                 where p.idrow <= q.idrow and q.nome = p.nome)
    from #tbl q
    group by nome, q.idrow, qtd



    Charles Tempo Rocha
    sexta-feira, 18 de setembro de 2009 14:53