CREATE OR REPLACE PROCEDURE SALDO_FINAL_PERIODO(
	P_CDEMPRESA  IN EMPRESA.CDEMPRESA%TYPE,
      P_DTFINALANC IN CONTOPECTBL.DTFINALANC%TYPE,
      P_IDSALDEMPR IN CONTOPECTBL.IDSALDEMPR%TYPE)
IS

DATA_SALDO DATE;
V_VERSAO     VARCHAR2(1);

BEGIN 
    SELECT MAX(SUBSTR(BANNER,7,1)) INTO V_VERSAO FROM V$VERSION
    WHERE BANNER LIKE 'Orac%';

    IF V_VERSAO <> '9' THEN
       COMMIT;
       SET TRANSACTION USE ROLLBACK SEGMENT RBS_TECNISA;
    END IF;

	FOR ATUALIZA IN (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) LOOP
          
           DATA_SALDO := ADD_MONTHS(ATUALIZA.MAIOR_DATA,1);

           WHILE (DATA_SALDO <= P_DTFINALANC) LOOP
		
                 INSERT INTO SALDEMPR
	                  (CDEMPRESA, CDCONTCTBL, DTSALDEMPR, VRSALDEMPR)
	                  (SELECT P_CDEMPRESA, ATUALIZA.CDCONTCTBL, DATA_SALDO, VRSALDEMPR
                                FROM SALDEMPR
                                WHERE (SALDEMPR.CDEMPRESA  = P_CDEMPRESA) AND
                                      (SALDEMPR.CDCONTCTBL = ATUALIZA.CDCONTCTBL) AND
                                      (SALDEMPR.DTSALDEMPR = ATUALIZA.MAIOR_DATA));

                  DATA_SALDO := ADD_MONTHS(DATA_SALDO,1);
  
		END LOOP;
	
	END LOOP;

      
	FOR ATUALIZAGER IN (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) LOOP
          
         DATA_SALDO := ADD_MONTHS(ATUALIZAGER.MAIOR_DATA,1);

         WHILE (DATA_SALDO <= P_DTFINALANC) LOOP
		
            INSERT INTO SALDCCUS
	         (CDEMPRESA,  CDFILIAL,   CDCENTCUST, 
                CDCONTCTBL, DTSALDCCUS, VRSALDCCUS)
	         (SELECT P_CDEMPRESA, ATUALIZAGER.CDFILIAL, ATUALIZAGER.CDCENTCUST, 
                       ATUALIZAGER.CDCONTCTBL, DATA_SALDO, VRSALDCCUS
                FROM SALDCCUS
                WHERE (SALDCCUS.CDEMPRESA  = P_CDEMPRESA)            AND
                      (SALDCCUS.CDCONTCTBL = ATUALIZAGER.CDCONTCTBL) AND
                      (SALDCCUS.CDFILIAL   = ATUALIZAGER.CDFILIAL)   AND 
                      (SALDCCUS.CDCENTCUST = ATUALIZAGER.CDCENTCUST) AND 
                      (SALDCCUS.DTSALDCCUS = ATUALIZAGER.MAIOR_DATA));

            DATA_SALDO := ADD_MONTHS(DATA_SALDO,1);
  
	   END LOOP;
	
	END LOOP;

      COMMIT;
      EXCEPTION
	      WHEN OTHERS THEN
      		ROLLBACK;
			RAISE;

END;
/


-- VERSAO --
BEGIN ATUVEROBJ('SALDO_FINAL_PERIODO','4.09.090'); END;
/

