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

Fasystem - Listas listas em fasystem.com.br
Ter Jun 21 10:46:43 -03 2011


Creio que você já descobriu o que está errado.
Você atualiza a tabela com as mesmas informações do where do select.
Creio que você precisa de um where baseado no id da linha a ser atualizada.
Outra coisa: muito cuidado com valores null nos teus cálculos. Pois se isso
acontecer não será calculado nada.
Eu sempre uso o coalesce para garantir que haverá o cálculo.

[ ]'s
Jose

-----Mensagem original-----
De: Diego Maccari [mailto:diegomaccari em ig.com.br] 
Enviada em: terça-feira, 21 de junho de 2011 10:36
Para: Fasystem - Listas
Assunto: Re: [firebase-br] Ajuda com Procedure - Calculo + Atualização.


JOSÉ bom dia

Muito Obrigado por ter respondido.

retirei o Suspend mas mesmo assim não deu o resultado desejado a ideia é 
atualizar os valores dos créditos de cada um dos registros com base no 
calculo da SP

o que está acontecendo é que no momento em que a SP atualiza os rgistros ela

atualiza o valor calculado no ultimo registro para todos os demais, onde 
deveria ser individualizado

acredito que o erro esta no UPDATE mas ainda não entendi por que, o WHERE do

UPDATE é o mesmo que uso pra selecionar os dados no SELECT do FOR talvez 
seja por isso

a atualização esta sendo feito em todos os registro quando deveria ser feito

um de cada vez.

Alguma DICA ??


-----Mensagem Original----- 
From: Fasystem - Listas
Sent: Tuesday, June 21, 2011 10:00 AM
To: 'Diego Maccari' ; 'FireBase'
Subject: RES: [firebase-br] Ajuda com Procedure - Calculo + Atualização.

Se não vai retornar nada não precisa do suspend;
Voce não informou o erro. Pelo menos eu não entendi.

Jose

-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Diego Maccari
Enviada em: terça-feira, 21 de junho de 2011 09:30
Para: FireBase
Assunto: [firebase-br] Ajuda com Procedure - Calculo + Atualização.


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;


______________________________________________
FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
Para saber como gerenciar/excluir seu cadastro na lista, use:
http://www.firebase.com.br/fb/artigo.php?id=1107
Para consultar mensagens antigas: http://firebase.com.br/pesquisa







Mais detalhes sobre a lista de discussão lista