[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