IF EXISTS(SELECT name FROM sysobjects
          WHERE name = 'SALDO_FINAL_PERIODO' AND type = 'P')
  DROP PROCEDURE SALDO_FINAL_PERIODO
  GO

CREATE PROCEDURE SALDO_FINAL_PERIODO @P_CDEMPRESA  VARCHAR(2),
                                     @P_DTFINALANC DATETIME,
                                     @P_IDSALDEMPR VARCHAR(1)

AS

DECLARE @DATA_SALDO   DATETIME;
DECLARE @V_MAIOR_DATA DATETIME;

DECLARE @V_CDCONTCTBL VARCHAR(20);
DECLARE @V_CDCENTCUST VARCHAR(04);
DECLARE @V_CDFILIAL   VARCHAR(04);




BEGIN

      -- SET TRANSACTION USE ROLLBACK SEGMENT RBS_TECNISA;

   DECLARE ATUALIZA CURSOR FOR
   SELECT SALDEMPR.CDCONTCTBL, MAX(DTSALDEMPR) AS MAIOR_DATA
   FROM SALDEMPR, CONTCTBL
	WHERE (SALDEMPR.CDEMPRESA = @P_CDEMPRESA) AND 
              (SALDEMPR.CDCONTCTBL = CONTCTBL.CDCONTCTBL) AND
              (CONTCTBL.IDCONTCCUS <> 'R')
        GROUP BY SALDEMPR.CDCONTCTBL;

   OPEN ATUALIZA;

   FETCH NEXT FROM ATUALIZA INTO @V_CDCONTCTBL, @V_MAIOR_DATA;

      WHILE (@@FETCH_STATUS = 0)
      BEGIN
                             
        SET @DATA_SALDO = @V_MAIOR_DATA;
                             
        IF (@P_IDSALDEMPR = 'M')
        BEGIN
            SET @DATA_SALDO = DATEADD(MM, 1, @DATA_SALDO);
        END
        ELSE
        BEGIN
            SET @DATA_SALDO = @DATA_SALDO + 1;
        END;
                             
        WHILE (@DATA_SALDO <= @P_DTFINALANC)
        BEGIN
           INSERT INTO SALDEMPR
                 (CDEMPRESA, CDCONTCTBL, DTSALDEMPR, VRSALDEMPR)
              (SELECT @P_CDEMPRESA, @V_CDCONTCTBL, @DATA_SALDO, VRSALDEMPR
                 FROM SALDEMPR
                WHERE (SALDEMPR.CDEMPRESA  = @P_CDEMPRESA) AND
                      (SALDEMPR.CDCONTCTBL = @V_CDCONTCTBL) AND
                      (SALDEMPR.DTSALDEMPR = @V_MAIOR_DATA));
                                                
           IF (@P_IDSALDEMPR = 'M')
           BEGIN
               SET @DATA_SALDO = DATEADD(MM, 1, @DATA_SALDO);
           END
           ELSE
           BEGIN
              SET @DATA_SALDO = @DATA_SALDO + 1;
           END;
        END;
                               
        FETCH NEXT FROM ATUALIZA INTO @V_CDCONTCTBL, @V_MAIOR_DATA;
      END;

   CLOSE ATUALIZA;
   DEALLOCATE ATUALIZA;

   DECLARE ATUALIZAGER CURSOR FOR
   SELECT SALDCCUS.CDFILIAL, SALDCCUS.CDCENTCUST, SALDCCUS.CDCONTCTBL, MAX(SALDCCUS.DTSALDCCUS) AS MAIOR_DATA
     FROM SALDCCUS, CONTCTBL
    WHERE (SALDCCUS.CDEMPRESA  = @P_CDEMPRESA)        AND
          (SALDCCUS.CDCONTCTBL = CONTCTBL.CDCONTCTBL) AND
          (CONTCTBL.IDCONTCCUS <> 'R')
    GROUP BY SALDCCUS.CDFILIAL, SALDCCUS.CDCENTCUST, SALDCCUS.CDCONTCTBL;
                                                                          
   OPEN ATUALIZAGER;
                                                  
   FETCH NEXT FROM ATUALIZAGER INTO @V_CDFILIAL, @V_CDCENTCUST, @V_CDCONTCTBL, @V_MAIOR_DATA;
                             
   WHILE (@@FETCH_STATUS = 0) BEGIN
                                       
         SET @DATA_SALDO = TEKNISA.ADD_MONTHS(@V_MAIOR_DATA, 1);
                             
         WHILE (@DATA_SALDO <= @P_DTFINALANC) BEGIN
                             	                             
            INSERT INTO SALDCCUS
                     (CDEMPRESA,  CDFILIAL,   CDCENTCUST, CDCONTCTBL, DTSALDCCUS, VRSALDCCUS)
               (SELECT @P_CDEMPRESA, @V_CDFILIAL, @V_CDCENTCUST, 
                       @V_CDCONTCTBL, @DATA_SALDO, VRSALDCCUS
                FROM SALDCCUS
                WHERE (SALDCCUS.CDEMPRESA  = @P_CDEMPRESA)           AND
                      (SALDCCUS.CDCONTCTBL = @V_CDCONTCTBL) AND
                      (SALDCCUS.CDFILIAL   = @V_CDFILIAL)   AND 
                      (SALDCCUS.CDCENTCUST = @V_CDCENTCUST) AND 
                      (SALDCCUS.DTSALDCCUS = @V_MAIOR_DATA));
                             
            SET @DATA_SALDO = TEKNISA.ADD_MONTHS (@DATA_SALDO, 1);
                               
         END;
                             
         FETCH NEXT FROM ATUALIZAGER INTO @V_CDFILIAL, @V_CDCENTCUST, @V_CDCONTCTBL, @V_MAIOR_DATA;
   END;
   CLOSE ATUALIZAGER;
   DEALLOCATE ATUALIZAGER;

      /*COMMIT;
      EXCEPTION
	      WHEN OTHERS THEN
      		ROLLBACK;
			RAISE;*/
END
GO
