Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

 
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 02-11-2005
Carlos Hurtado Carlos Hurtado is offline
Miembro
 
Registrado: dic 2004
Posts: 30
Poder: 0
Carlos Hurtado Va por buen camino
Manejo de errores en Master Detail

Hola Amigos nuevemente estoy recurriendo a ustedes para que me ayuden a solucionar este problema:
Tengo Firebird 1.5 con Delphi 7
IbTransaction1. Params
read_commited
rec_version
nowait

La Tabla Detalle (ValesDetalle) proviene de un stringgrid y la Tabla Maestro(ValesMaestro) proviene de datos de cliente mas la suma del campo Total de ValesDetalle.

En las inserciones de la Tabla Maestro y la Tabla Detalle no tengo problemas, ellos estan cuando tengo que actualizar la Tabla StockMaestro del campo Cantidad de la Tabla Detalle.
Para esto lo hago con una Stored Procedure que debe manejar las stes. situaciones:
Si no hay stock debe hacer un rollback
Si hay un lock_conflict deberia repetir la procedure hasta hacer el update
Si hay cualquier otro error debe hacer un rollback.

La Procedure


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;
END
ELSE
EXCEPTION NO_STOCKDETALLE;
WHEN EXCEPTION NO_STOCKDETALLE DO
BEGIN
FLAG = 1;
END
WHEN GDSCODE lock_conflict DO
BEGIN
¡¡¡¡NO SE QUE HACER!!!
END
WHEN ANY DO
BEGIN
FLAG = 1;
END
END ^



Y el procedimiento en Delphi
///////
For a := 1 to stringGrid1.RowCount - 1 do
begin
with IbStoredProc1 do
begin
Close;
IbStoredProc1.StoredProcName := 'ACTUALIZA_VALESDETALLE';
ParamByName('VID_VALE').AsString := VCodigo;
ParamByName('VID_PRODUCTO').AsString := StringGrid1.Cells[4,a];
ParamByName('VCANTIDAD').AsFloat := StrToFloat(StringGrid1.Cells[0,a]);
ParamByName('VDESCRIPCION').AsString := StringGrid1.Cells[1,a];
ParamByName('VVALORUNITARIO').AsInteger := StrToInt(StringGrid1.Cells[2,a]);
ParamByName('VTOTAL').AsInteger := Total;
Prepare;
ExecProc;
VFlag := ParamByName('FLAG').AsInteger;
end;
if VFlag = 1 then
Break;
end;
Label6.Caption := IntToStr(VFlag);
if VFlag = 1 then
begin
IbTransaction1.RollBack;
s := StringGrid1.Cells[0,a] + ' ' + StringGrid1.Cells[1,a];
MessageDlg('Registro ' + s + ' no tiene stock suficiente',mtError,[mbOk], 0);
end
else
IbTransaction1.Commit;
end;
end;

En base a lo planteado, que debo hacer para manejar el lock_conflict


Muchas gracias.
Responder Con Cita
 



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 20:40:49.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi