none
Cursor com update RRS feed

  • Pergunta

  • Olá,

    criei uma tabela física na qual adiciono valores a partir
    de um SELECT, e preciso agora calcular o saldo bancário do período
    consultado.

    Estou tentando fazer isso por meio de um cursor, mas não estou conseguindo.

    Segue abaixo o código:


    DECLARE @DT_INICIAL AS DATETIME, @DT_FINAL AS DATETIME SET @DT_INICIAL = '09-01-2009' SET @DT_FINAL = '09-02-2009' DECLARE @BANCO AS NVARCHAR(15),@CONTA AS NVARCHAR(15) SET @BANCO = '341' SET @CONTA = 'XXXX' DELETE FROM [@SYSTSALDO] INSERT INTO [@SYSTSALDO] ([BANCO] ,[AGENCIA] ,[CONTA] ,[CREDITO] ,[DEBITO] ,[PRV_REC] ,[PRV_BOL] ,[LIM_CHEQUE] ,[LIM_BOL] ,[LIM_BOL_UTIL] ,[DATA] ,[TOTAL] ,[SALDO]) --\\AQUI EXECUTO UMA CONSULTA SQL --\\INICIO DO CURSOR DECLARE TEMP_CURSOR CURSOR FOR --\\CONSULTA OS VALORES DA TABELA [@SYSTSALDO] SELECT [BANCO] ,[AGENCIA] ,[CONTA] ,[CREDITO] ,[DEBITO] ,[PRV_REC] ,[PRV_BOL] ,[LIM_CHEQUE] ,[LIM_BOL] ,[LIM_BOL_UTIL] ,[DATA] ,[TOTAL] ,[SALDO] FROM [@SYSTSALDO] DECLARE @BANCO1 AS NVARCHAR(50), @CONTA1 AS NVARCHAR(50), @DATA_SALDO AS DATETIME, @VAL AS NUMERIC(19,6), @VALOR AS NUMERIC(19,6), @VALOR_LINHA AS NUMERIC(19,6), @DATA_LINHA AS NVARCHAR(15) --\\ATRIBUI VALORES DA TABELA ÀS VARIÁVEIS E OBTENHO A DATA ANTERIOR P/ CALCULAR O SALDO SELECT @BANCO1 = BANCO ,@CONTA1 = CONTA ,@DATA_SALDO = DATA - 1 ,@DATA_LINHA = DATA ,@VALOR_LINHA = TOTAL FROM [@SYSTSALDO] WHERE DATA = @DATA_SALDO AND BANCO = @BANCO1 AND CONTA = @CONTA1 GROUP BY BANCO,CONTA,DATA,TOTAL --\\OBTEM O TOTAL DE CADA LINHA SELECT @VALOR = SUM(T0.Credit) - SUM(T0.Debit) FROM JDT1 T0 LEFT JOIN OJDT T1 ON T1.TransID = T0.TransID LEFT JOIN OACT T2 ON T2.AcctCode = T0.ContraAct LEFT JOIN DSC1 T4 ON T4.GLAccount = T2.AcctCode WHERE T0.DueDate = @DATA_LINHA AND T4.BankCode = @BANCO1 AND T4.Account = @CONTA1 OPEN TEMP_CURSOR FETCH NEXT FROM TEMP_CURSOR WHILE @@FETCH_STATUS = 0 BEGIN SET @VAL = @VALOR - @VALOR_LINHA UPDATE [@SYSTSALDO] SET [SALDO] = @VAL WHERE [BANCO] = @BANCO1 AND [CONTA] = @CONTA1 FETCH NEXT FROM TEMP_CURSOR END CLOSE TEMP_CURSOR DEALLOCATE TEMP_CURSOR


    quarta-feira, 23 de setembro de 2009 17:41

Todas as Respostas

  • Gustavo,

    Você deseja inserir os dados que estão sendo tratados no cursor na SYSTSALDO?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    quinta-feira, 24 de setembro de 2009 19:57
  • ...após o INSERT INTO [@SYSTSALDO] declaro um cursor, consulto os dados inseridos na tabela @SYSTSALDO e em outra consulta obtenho o saldo bancário no período desejado.
    Dentro do cursor preciso atualizar os campos TOTAL e SALDO, da tabela @ SYSTSALDO.

    O problema é que só consigo o saldo bancário do último dia do período. EX: 01/09 e 02/09, me traz apenas o saldo do dia 02/09.


    DECLARE TEMP_CURSOR CURSOR
    FOR

        --\\CONSULTA OS DADOS DA TABELA
        SELECT BANCO
              ,CONTA
              ,DATA
              ,TOTAL
              ,SALDO
        FROM [@SYSTSALDO] 

        --\\OBTEM O SALDO BANCÁRIO
            SELECT @DATA = SYST.DATA
                ,@VALOR = SUM(SYST.TOTAL)
                ,@SALDO = (SELECT SUM(T0.Credit) - SUM(T0.Debit)
                    FROM SYSTEMPLAN_09.DBO.JDT1 T0
                        LEFT JOIN SYSTEMPLAN_09.DBO.OACT T2 ON T2.AcctCode = T0.ContraAct
                        LEFT JOIN SYSTEMPLAN_09.DBO.DSC1 T4 ON T4.GLAccount = T2.AcctCode
                    WHERE T0.DueDate >= @DT_CALCULO AND T0.DueDate <= SYST.DATA
                        AND T4.BankCode = @BANCO AND T4.Account = @CONTA--'341' AND T4.Account = '62532'
                        )    
            FROM [@SYSTSALDO] SYST
            GROUP BY SYST.DATA
            ORDER BY SYST.DATA           
     
    OPEN TEMP_CURSOR
                
    FETCH NEXT FROM TEMP_CURSOR
           
        WHILE @@FETCH_STATUS = 0
        BEGIN
                   
               UPDATE [SYSTSAPB1].[dbo].[@SYSTSALDO]
               SET [SALDO] = @SALDO, [TOTAL] = @VALOR
               WHERE [DATA] = @DATA_LINHA
                    AND [BANCO] = @BANCO
                    AND [CONTA] = @CONTA
               
    FETCH NEXT FROM TEMP_CURSOR

    END

    CLOSE TEMP_CURSOR
    DEALLOCATE TEMP_CURSOR
    segunda-feira, 28 de setembro de 2009 20:06
  • Gustavo,

    Não tem nenhum campo que você possa utilizar como ID para selecionar individualmente os registro dentro período que você deseja ler?
    Pedro Antonio Galvão Junior - MVP - Windows Server System - SQL Server/Coordenador de Projetos/DBA
    segunda-feira, 28 de setembro de 2009 23:44
  • tenho somente os campos: Banco, Conta e Data para validar...
    terça-feira, 29 de setembro de 2009 13:06