[firebase-br] Ajuda com Procedure - Calculo + Atualização.

Diego Maccari diegomaccari em ig.com.br
Ter Jun 21 09:30:12 -03 2011


Bom dia Pessoal

Ainda sou novato em SQL e FB estou tentando criar uma SP para atualizar 
alguns compos de uma tabela esta atualização requer um calculo de 
proporcionalização de creditos de PIS/COFINS
Quando executo a SP ela calcula o valor do creditos e atualiza todos os 
registros com base no calculo realizado na 1º linha. Alguém poderia me dar 
uma dica de onde estou errando.

Segue DDL.

SET TERM ^ ;

CREATE OR ALTER PROCEDURE PROPORCIONA_PISCOFINS_4105 (
    PCNPJ VARCHAR(18),
    PMES VARCHAR(10),
    PANO INTEGER,
    PCST_PIS VARCHAR(2),
    PCST_COFINS VARCHAR(2),
    PPERCENT_EX DECIMAL(18,4) = 0.0000,
    PPERCENT_MI DECIMAL(18,4) = 0.0000,
    PPERCENT_NT DECIMAL(18,4) = 0.0000)
AS
DECLARE VARIABLE PIS DECIMAL(18,2);
DECLARE VARIABLE PIS_EX DECIMAL(18,2);
DECLARE VARIABLE PIS_MI DECIMAL(18,2);
DECLARE VARIABLE PIS_NT DECIMAL(18,2);
DECLARE VARIABLE COFINS DECIMAL(18,2);
DECLARE VARIABLE COFINS_EX DECIMAL(18,2);
DECLARE VARIABLE COFINS_MI DECIMAL(18,2);
DECLARE VARIABLE COFINS_NT DECIMAL(18,2);
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE BASE_CALCULO_PIS DECIMAL(18,3);
DECLARE VARIABLE ALIQUOTA_PIS DECIMAL(18,4);
DECLARE VARIABLE VALOR_PIS DECIMAL(18,2);
DECLARE VARIABLE VALOR_PIS_EXPORTACAO DECIMAL(18,2);
DECLARE VARIABLE VALOR_PIS_MERC_INTERNO DECIMAL(18,2);
DECLARE VARIABLE VALOR_PIS_N_TRIB_INTERNO DECIMAL(18,2);
DECLARE VARIABLE BASE_CALCULO_COFINS DECIMAL(18,3);
DECLARE VARIABLE ALIQUOTA_COFINS DECIMAL(18,4);
DECLARE VARIABLE VALOR_COFINS DECIMAL(18,2);
DECLARE VARIABLE VALOR_COFINS_EXPORTACAO DECIMAL(18,2);
DECLARE VARIABLE VALOR_COFINS_MERC_INTERNO DECIMAL(18,2);
DECLARE VARIABLE VALOR_COFINS_N_TRIB_INTERNO DECIMAL(18,2);
begin
FOR
  SELECT
    ID, BASE_CALCULO_PIS, ALIQUOTA_PIS, VALOR_PIS, VALOR_PIS_EXPORTACAO,
    VALOR_PIS_MERC_INTERNO, VALOR_PIS_N_TRIB_INTERNO, BASE_CALCULO_COFINS,
    ALIQUOTA_COFINS, VALOR_COFINS, VALOR_COFINS_EXPORTACAO, 
VALOR_COFINS_MERC_INTERNO,
    VALOR_COFINS_N_TRIB_INTERNO
  FROM
    TB_IN_981_4105
  WHERE
    CNPJ = :PCNPJ AND MES = :PMES AND ANO = :PANO AND
    CODIGO_SIT_TRIBUTARIA_PIS = :PCST_PIS AND CODIGO_SIT_TRIBUTARIA_COFINS = 
:PCST_COFINS
INTO
  :ID, :BASE_CALCULO_PIS, :ALIQUOTA_PIS, :VALOR_PIS, :VALOR_PIS_EXPORTACAO,
  :VALOR_PIS_MERC_INTERNO, :VALOR_PIS_N_TRIB_INTERNO, :BASE_CALCULO_COFINS,
  :ALIQUOTA_COFINS, :VALOR_COFINS, :VALOR_COFINS_EXPORTACAO, 
:VALOR_COFINS_MERC_INTERNO,
  :VALOR_COFINS_N_TRIB_INTERNO
DO
  PIS = (BASE_CALCULO_PIS / 100) * ALIQUOTA_PIS;
  PIS_EX = (PIS / 100) * :PPERCENT_EX;
  PIS_MI = (PIS / 100) * :PPERCENT_MI;
  PIS_NT = (PIS / 100) * :PPERCENT_NT;

  COFINS = (BASE_CALCULO_COFINS / 100) * ALIQUOTA_COFINS;
  COFINS_EX = (COFINS / 100) * :PPERCENT_EX;
  COFINS_MI = (COFINS / 100) * :PPERCENT_MI;
  COFINS_NT = (COFINS / 100) * :PPERCENT_NT;

  IF (PIS_EX > 0.0000 AND PIS_EX < 0.0100) THEN
    PIS_EX = 0.0100;

  IF (PIS_MI > 0.0000 AND PIS_MI < 0.0100) THEN
    PIS_MI = 0.0100;

  IF (PIS_NT > 0.0000 AND PIS_NT < 0.0100) THEN
    PIS_NT = 0.0100;

  IF (COFINS_EX > 0.0000 AND COFINS_EX < 0.0100) THEN
    COFINS_EX = 0.0100;

  IF (COFINS_MI > 0.0000 AND COFINS_MI < 0.0100) THEN
    COFINS_MI = 0.0100;

  IF (COFINS_NT > 0.0000 AND COFINS_NT < 0.0100) THEN
    COFINS_NT = 0.0100;

  UPDATE TB_IN_981_4105
    SET
      VALOR_PIS = :PIS,
      VALOR_PIS_EXPORTACAO = :PIS_EX,
      VALOR_PIS_MERC_INTERNO = :PIS_MI,
      VALOR_PIS_N_TRIB_INTERNO = :PIS_NT,

      VALOR_COFINS = :COFINS,
      VALOR_COFINS_EXPORTACAO = :COFINS_EX,
      VALOR_COFINS_MERC_INTERNO = :COFINS_MI,
      VALOR_COFINS_N_TRIB_INTERNO = :COFINS_NT
    WHERE
      CNPJ = :PCNPJ AND MES = :PMES AND ANO = :PANO AND
      CODIGO_SIT_TRIBUTARIA_PIS = :PCST_PIS AND CODIGO_SIT_TRIBUTARIA_COFINS 
= :PCST_COFINS;

     SUSPEND;
end^

SET TERM ; ^

GRANT SELECT,UPDATE ON TB_IN_981_4105 TO PROCEDURE 
PROPORCIONA_PISCOFINS_4105;

GRANT EXECUTE ON PROCEDURE PROPORCIONA_PISCOFINS_4105 TO SYSDBA; 





Mais detalhes sobre a lista de discussão lista