lucasarts_18
06-09-2006, 04:33:35
Hola compañeros del club:
Estoy realizando mantenciones a un sistema hecho en Delphi 4 y SQL Server 2000, y necesito cambiar algo de caracter importantísimo.
En primer lugar las transacciones están aisladas, ¿que quiero decir con esto?, pues que cada procedimiento almacenado de la base de datos contiene commit y rollback, siendo esto último no un problema para los mantenedores simples, por ejemplos productos, clientes, bodegas, etc...
Mi problema radica es que los modulos de ventas por ejemplo el de factura, al momento de grabar llama a varios SP (Ingresa Factura, Detalle Factura, Cta Corriente del cliente, Actualiza Stock, Etc....) lo cual al momento de producirse un fallo en el segundo u tercero.... SP me deja incosistencias en la BD ya que se produce un commit en cada procedimiento.
Sin lugar a dudas en estos casos lo mejor es controlarlo desde el programa todo lo referente a los commit y rollback, pero aquí yace mi gran duda...
Creo que con el código se entenderá un poco mejor:
if combo_vendedor.text ='' then
begin
MessageDlg('Ingrese el Código Vendedor', mtWarning, [mbOk],0);
combo_vendedor.Setfocus;
exit;
end;
if (edt_totalguia.Text ='') then
begin
MessageDlg('Debe Calcular el Valor Total de la Factura',mtWarning,[mbOk],0);
btn_Calculo.SetFocus;
exit;
end;
if Ingresar then
begin
Msg :='¿Desea Grabar el Ingreso de la Guía?';
if MessageDlg(Msg, mtConfirmation,[mbyes, mbNo],0) = mrYes then
begin
if (opcion_pago.ItemIndex in [0]) then
begin
Msg :='Favor, confirmar la opción de Pago con el CLIENTE'+ #13 + '< CONTADO >'+ #13 +'Si está correcto oprima [Ok], de lo contrario presione [Cancel]';
if MessageDlg(Msg, mtConfirmation,[mbOK, mbCancel],0) = mrCancel then
Exit;
end
else
begin
Msg :='Favor, confirmar la opción de Pago con el CLIENTE '+ #13 + '< CRÉDITO >'+ #13 +'Si está correcto oprima [Ok], de lo contrario presione [Cancel]';
if MessageDlg(Msg, mtConfirmation,[mbOK, mbCancel],0) = mrCancel then
Exit;
end;
IngresarGuia;
IngresarCorrelativo;
lv_i := 1;
while (lv_i <= grd_Detalle.RowCount -1) do
begin
IngresarDetalleGuia;
ActualizarStockProducto;
lv_i :=lv_i+1;
end;
MessageDlg('Guía de Despacho Ingresada Exitosamente.'+#13+'Ahora Deberá Imprimir.',mtInformation,[mbOk],0);
btn_buscarguia.Enabled := False;
btn_Nuevo.Enabled := False;
btn_Imprimir.Enabled := True;
btn_Grabar.Enabled := False;
btn_calculo.Enabled := False;
btn_Salir.Enabled := False;
PrecioNormal := 0;
PrecioOferta := 0;
end;
end;
end;
Supongamos IngresarGuia, IngresarCorrelativo son procedimientos delphi que a la vez llaman a procedimientos de SQL Server que contiene commit, mi idea es quitar los commit y en caso de error capturar el código error devuelto por la BD y este asignarlo a una variable pública del formulario para controlar el error, pero no se me ocurre muy bien como implementarlo, según ustedes ¿qué opción me recomendarían ?
Esperando que toda esta parafernalía se entienda :p
Hasta Luego -
Estoy realizando mantenciones a un sistema hecho en Delphi 4 y SQL Server 2000, y necesito cambiar algo de caracter importantísimo.
En primer lugar las transacciones están aisladas, ¿que quiero decir con esto?, pues que cada procedimiento almacenado de la base de datos contiene commit y rollback, siendo esto último no un problema para los mantenedores simples, por ejemplos productos, clientes, bodegas, etc...
Mi problema radica es que los modulos de ventas por ejemplo el de factura, al momento de grabar llama a varios SP (Ingresa Factura, Detalle Factura, Cta Corriente del cliente, Actualiza Stock, Etc....) lo cual al momento de producirse un fallo en el segundo u tercero.... SP me deja incosistencias en la BD ya que se produce un commit en cada procedimiento.
Sin lugar a dudas en estos casos lo mejor es controlarlo desde el programa todo lo referente a los commit y rollback, pero aquí yace mi gran duda...
Creo que con el código se entenderá un poco mejor:
if combo_vendedor.text ='' then
begin
MessageDlg('Ingrese el Código Vendedor', mtWarning, [mbOk],0);
combo_vendedor.Setfocus;
exit;
end;
if (edt_totalguia.Text ='') then
begin
MessageDlg('Debe Calcular el Valor Total de la Factura',mtWarning,[mbOk],0);
btn_Calculo.SetFocus;
exit;
end;
if Ingresar then
begin
Msg :='¿Desea Grabar el Ingreso de la Guía?';
if MessageDlg(Msg, mtConfirmation,[mbyes, mbNo],0) = mrYes then
begin
if (opcion_pago.ItemIndex in [0]) then
begin
Msg :='Favor, confirmar la opción de Pago con el CLIENTE'+ #13 + '< CONTADO >'+ #13 +'Si está correcto oprima [Ok], de lo contrario presione [Cancel]';
if MessageDlg(Msg, mtConfirmation,[mbOK, mbCancel],0) = mrCancel then
Exit;
end
else
begin
Msg :='Favor, confirmar la opción de Pago con el CLIENTE '+ #13 + '< CRÉDITO >'+ #13 +'Si está correcto oprima [Ok], de lo contrario presione [Cancel]';
if MessageDlg(Msg, mtConfirmation,[mbOK, mbCancel],0) = mrCancel then
Exit;
end;
IngresarGuia;
IngresarCorrelativo;
lv_i := 1;
while (lv_i <= grd_Detalle.RowCount -1) do
begin
IngresarDetalleGuia;
ActualizarStockProducto;
lv_i :=lv_i+1;
end;
MessageDlg('Guía de Despacho Ingresada Exitosamente.'+#13+'Ahora Deberá Imprimir.',mtInformation,[mbOk],0);
btn_buscarguia.Enabled := False;
btn_Nuevo.Enabled := False;
btn_Imprimir.Enabled := True;
btn_Grabar.Enabled := False;
btn_calculo.Enabled := False;
btn_Salir.Enabled := False;
PrecioNormal := 0;
PrecioOferta := 0;
end;
end;
end;
Supongamos IngresarGuia, IngresarCorrelativo son procedimientos delphi que a la vez llaman a procedimientos de SQL Server que contiene commit, mi idea es quitar los commit y en caso de error capturar el código error devuelto por la BD y este asignarlo a una variable pública del formulario para controlar el error, pero no se me ocurre muy bien como implementarlo, según ustedes ¿qué opción me recomendarían ?
Esperando que toda esta parafernalía se entienda :p
Hasta Luego -