Hola amigos he intentado resolver el problema de poder definir que tipo de error ha ocurrido y he fracasado. he seguido las directivas del libro 'The Firebird Book' y no he podido obtener resultados.
Esta es la procedure:
Código SQL
[-]
SET TERM ^;
CREATE PROCEDURE ACTUALIZA_VALESDETALLE(
VID_VALE VARCHAR(12),
VID_PRODUCTO VARCHAR(12),
VCANTIDAD DECIMAL(7,2),
VDESCRIPCION VARCHAR(40),
VVALORUNITARIO NUMERIC,
VTOTAL NUMERIC)
RETURNS (
FLAG SMALLINT)
AS
DECLARE VARIABLE V_STOCK DECIMAL(7,2);
BEGIN
INSERT INTO VALESDETALLE
(
ID_VALE,
ID_PRODUCTO,
CANTIDAD,
DESCRIPCION,
VALORUNITARIO,
TOTAL
)
VALUES
(
:VID_VALE,
:VID_PRODUCTO,
:VCANTIDAD,
:VDESCRIPCION,
:VVALORUNITARIO,
:VTOTAL
);
SELECT EXISTENCIA FROM STOCKMAESTRO WHERE ID_PRODUCTO = :VID_PRODUCTO
INTO :V_STOCK;
IF (:V_STOCK >= :VCANTIDAD) THEN
BEGIN
UPDATE STOCKMAESTRO
SET EXISTENCIA = :V_STOCK - :VCANTIDAD
WHERE ID_PRODUCTO = :VID_PRODUCTO;
FLAG = 0;
WHEN GDSCODE lock_conflict DO
BEGIN
FLAG = 2;
EXIT;
END
WHEN ANY DO
FLAG = 3;
END
ELSE
EXCEPTION NO_STOCKDETALLE;
WHEN EXCEPTION NO_STOCKDETALLE DO
FLAG = 1;
END ^
Como pueden ver establezco 3 alternativas de error.
Cuando es un error de stock(Flag=1) funciona bien.
Pero cuando es un error 'lock_conflict' la SP me devuelve FLAG=3, o sea que el error se va por el camino 'WHEN ANY DO'.
Que puedo hacer para que cuando sea un error de 'lock_conflict' este se vaya por el lado de FLAG=2.
Gracias.