[firebase-br] Erro no Update

bvrenato bvrenato em click21.com.br
Seg Jun 1 00:54:23 -03 2009


Ai pessoal, desculpem eu esta abusando em mandar esse código todo ai. Mas será
que algum filho de Deus pode dar uma analisada e ver onde estou errando?
O problema é o seguinte: eu tenho que varrer o arquivo de itens e recalcular o
valor dos itens de acordo com determinado parametro da tabela de preços.
Porém está dando um erro de dedlock quando faço o update e dá uma mensagem de
acesso concorrente (alguma coisa assim).
Eu já exclui todas as minhas triggers do banco (FB 2.1) mas nao adiantou nada.

obrigado !

Renato


CREATE PROCEDURE SP_CALCULAR_MIX (
    IPREVENDA INTEGER,
    IFABRICANTE INTEGER,
    IDESCMIXGERAL NUMERIC(5,2), --percentual de desconto
    IVOLUMEMIXGERAL INTEGER)  --volume de itens para obtenção de desconto
AS
DECLARE VARIABLE VID INTEGER;
DECLARE VARIABLE VQUANTIDADE NUMERIC(10,2);
DECLARE VARIABLE VCANALVENDA NUMERIC(8,2);
DECLARE VARIABLE VALIQICMS NUMERIC(5,2);
DECLARE VARIABLE VALIQIPI NUMERIC(5,2);
DECLARE VARIABLE VCODLINHA INTEGER;
DECLARE VARIABLE VCMSREPRESENTANTE NUMERIC(5,2);
DECLARE VARIABLE VCMSVENDEDOR NUMERIC(5,2);
DECLARE VARIABLE VPRECO NUMERIC(14,4);
DECLARE VARIABLE VPARAMETRO INTEGER;
DECLARE VARIABLE VPRECOFINAL NUMERIC(14,4);
BEGIN

      --APURA O VOLUME DE ITENS DO PEDIDO
      SELECT SUM(PVI.PVIQUANTIDADE)
      FROM PREVENDA_ITENS PVI
      WHERE PVI.PVENUMERO = :iPREVENDA AND
            PVI.REPCODIGO = :iFABRICANTE
      INTO :vQUANTIDADE;

      --VERIFICA SE O VOLUME OBTEM BENEFÍCIO
      IF (:vQUANTIDADE >= iVOLUMEMIXGERAL) THEN
         BEGIN

            --VARRE O ARQUIVO DE ITENS DO PEDIDO
            FOR SELECT
                      PVI.PRDID,
                      PVI.PVIQUANTIDADE,
                      PVI.PVIVALORPRATICADO,
                      PVF.PVFALIQICMS,
                      PRD.PRDALIQIPI,
                      PRD.PRDCOMISSAOREPRESENTACAO,
                      PRD.PRDCOMISSAOVENDEDOR,
                      PRD.LINCODIGO,
                      CAC.CNVCODIGO
                FROM
                    PREVENDA_ITENS PVI
                    JOIN PREVENDA PVE ON (PVE.PVENUMERO = PVI.PVENUMERO)
                    JOIN PREVENDA_FORNECEDOR  PVF ON (PVF.PVENUMERO =
                                                        PVI.PVENUMERO) AND
                                                        (PVF.REPCODIGO =
PVI.REPCODIGO)
                    JOIN PRODUTOPRD ON PRD.PRDID     = PVI.PRDID
                    JOIN CADCREDITO_REPRESENTADA CRE ON CRE.REPCODIGO =
                                                                   PVI.REPCODIGO
AND
                                                                   CRE.CLICODIGO
= PVE.CLICODIGO
                    JOIN CADASTRO_CREDITO  CAC ON CAC.CCRCODIGO =
                                                              CRE.CCRCODIGO
                WHERE
                    PVI.PVENUMERO = :iPREVENDA AND
                    PVI.REPCODIGO = :iFABRICANTE
                ORDER BY
                        PVI.PVENUMERO, PVI.REPCODIGO, PVI.PRDID
            INTO
                :vID,
                :vQUANTIDADE,
                :vPRECOFINAL,
                :vALIQICMS,
                :vALIQIPI,
                :vCMSREPRESENTANTE,
                :vCMSVENDEDOR,
                :vCODLINHA,
                :vCANALVENDA
            DO

            --EXECUTA ESTE PROCEDIMENTO PARA CADA ITEM DA PREVENDA
            BEGIN

                   --VERIFICA COMISSOES NA LINHA
                   IF ((COALESCE(vCMSREPRESENTANTE,0) = 0) AND (COALESCE
                         (vCMSVENDEDOR,0) = 0)) THEN
                      BEGIN
                          SELECT
                                LIN.LINCOMISSAOREPRESENTANTE,
                                LIN.LINCOMISSAOVENDEDOR
                          FROM
                              LINHA LIN
                          WHERE
                               LIN.LINCODIGO = :vCODLINHA
                          INTO
                              :vCMSREPRESENTANTE,
                              :vCMSVENDEDOR;

                          --VERIFICA COMISSOES DO FABRICANTE
                          IF ((COALESCE(vCMSREPRESENTANTE,0) = 0) AND (COALESCE
                              (vCMSVENDEDOR,0) = 0)) THEN
                             BEGIN
                                 SELECT
                                      REP.REPCOMISSAOREPRESENTACAO,
                                      REP.REPCOMISSAOVENDEDOR
                                 FROM
                                     REPRESENTADA REP
                                 WHERE
                                      REP.REPCODIGO = :iFABRICANTE
                                 INTO
                                     :vCMSREPRESENTANTE,
                                     :vCMSVENDEDOR;
                             END

                      END


                    FOR SELECT
                             TAB.TABPRECO,
                             GRU.TPGVALORPARAMETRO
                       FROM
                           TABELA_PRECO TAB
                           JOIN TABPRECO_GRUPOS GRU  ON GRU.TPGPOSICAO =
                                   TAB.TPGPOSICAO
                           JOIN GRUPO_CANALVENDA GCV ON GCV.GCVCODIGO  =
                                   TAB.GCVCODIGO
                       WHERE
                           TAB.PRDID     = :vID AND
                           TAB.REPCODIGO = :iFABRICANTE AND
                           GCV.CNVCODIGO = :vCANALVENDA
                       ORDER BY
                               GRU.TPGVALORPARAMETRO ASC
                   INTO
                       :vPRECO,
                       :vPARAMETRO
                   DO
                   BEGIN
                        --OBTÉM O PREÇO A SER PRATICADO
                        IF (vPARAMETRO < :iVOLUMEMIXGERAL) THEN
                           vPRECOFINAL = (:vPRECO - ((:vPRECO
                                                      * :iDESCMIXGERAL)/100));
                   END


                   --EFETUA A GRAVAÇÃO DOS VALORES

                   UPDATE PREVENDA_ITENS MIX SET MIX.PVICOMISSAOREPRESENTANTE =
((:vPRECOFINAL * :vQUANTIDADE) * :vCMSREPRESENTANTE)/100,
                                                 MIX.PVICOMISSAOVENDEDOR      =
((:vPRECOFINAL * :vQUANTIDADE) * :vCMSVENDEDOR)/100,
                                                 MIX.PVIVALORPRATICADO        =
:vPRECOFINAL
                                                 MIX.PVIVALORTOTAL            =
(:vPRECOFINAL * :vQUANTIDADE),
                                                 MIX.PVIVALORICMS             =
((:vPRECOFINAL * :vQUANTIDADE) * :vALIQICMS)/100,
                                                 MIX.PVIVALORIPI              =
((:vPRECOFINAL * :vQUANTIDADE) * :vALIQIPI)/100
                                    WHERE MIX.PVENUMERO = :iPREVENDA AND
                                          MIX.REPCODIGO = :iFABRICANTE AND
                                          MIX.PRDID     = :vID;
                    EXIT;
            END
         END
END


___________________________________________________________________________________
Para fazer uma ligação DDD pra perto ou pra longe, faz um 21. A Embratel tem
tarifas muito baratas esperando por você. Aproveite!





Mais detalhes sobre a lista de discussão lista