PDA

Ver la Versión Completa : Update Con For


kainchu3102
11-11-2022, 05:35:00
Buenas gente estoy trabajando de hacer un delete con a dos tablas Venta y detalle_venta, pero a las vez en detalle_venta necesito que me devuelva los produtos en stock, intenten hacer con ciclo por pero parece que no pego una, por favor necesitaria que me orienten un poco desde ya muy agradecido
with MDATOS_SAGA.FDQSEL_ABM_VEN2 Do
Begin
SQL.Clear;
SQL.Add('SELECT * FROM det_venta WHERE id_ven_detven = :ID_DETVEN');
ParamByName('ID_DETVEN').AsInteger := ID_VENTA;
open;
C := MDATOS_SAGA.FDQSEL_ABM_VEN2.Fields.FieldByName('can_detven').AsInteger;
end;

With MDATOS_SAGA.FDQABM_DET_VENTA do
Begin
SQL.Clear;
SQL.Add ('DELETE FROM det_venta WHERE id_ven_detven = :ID_DETVENE');
Params.ParamByName('ID_DETVENE').AsInteger := ID_VENTA;
ExecSQL
end;

I:= MDATOS_SAGA.FDQSEL_ABM_VEN2.Fields.FieldByName('id_pro_detven').AsInteger;

for I :=0 to DBGDET_VENTA.SelectedRows.Count -1 do

begin
with MDATOS_SAGA.FDQACTUAL_STOCK do
begin
SQL.Clear;
SQL.Add('UPDATE producto SET producto.sto_prod = producto.sto_prod + :CANT1 WHERE producto.id_prod = :PROD');
Params.ParamByName('CANT1').AsInteger := C;
Params.ParamByName('PROD').AsInteger := I;
ExecSQL;
end;
end;

MDATOS_SAGA.FDTDET_VENTA.Refresh;
FORMABMVENTA.DBGABMVENTA.DataSource.DataSet.Refresh;

ID_VENTA := 0;

MessageDlg('SU REGISTRO FUE ELIMINADO CON EXITO!.', mtInformation,[mbOk], 0, mbOk);
end; }

mRoman
11-11-2022, 16:48:06
Hola que tal.

Para poderte orientar mejor, comentanos que B.D. estas usando y que componentes.

Por lo pronto, te diré que deberias aprovechar las virtudes de las bases de datos SQL (Firebird, SQL Server, etc), ya que puedes utilizar los triggers que ejecutan instrucciones SQL cada vez que insertas, borras o modificas.

Asi que yo lo resolvería usando trigger y procedimientos almacenados.

Saludos.

kainchu3102
11-11-2022, 17:29:53
Hola mucho gusto, estoy usando Mysql Worbench, y ese procendimiento lo desde un Boton.Click pense con el for se podia recorrer todas las ID que se eliminan y devolver la cantidad de producto de una venta anulada. pero no me sale. muchas gracias por tu respuesta

cloayza
11-11-2022, 19:34:42
Estimado kainchu3102,debe ser mas claro en la explicación de su duda o problema. Como le indica el colega mRoman, esto podria ser implementado con triggers (Disparadores) en la base de datos.

A continuación le propongo una opción de acuerdo a lo que creo comprender de su problema...

{1: Recuperar registro de ventas}
QVenta.Sql.Clear;
QVenta.Sql.Add('Select id_venta ');
QVenta.Sql.Add('from Ventas');
QVenta.Sql.Add('where id_venta=:id_Venta');
QVenta.ParamByName('id_venta').AsInteger:=Id_Venta;
QVenta.Open;

{2: Recuperar detalle de la venta}
QVentaDet.Sql.Clear;
QVentaDet.Sql.Add('Select id_pro_detven, can_detven)'
QVentaDet.Sql.Add('From det_venta)'
QVentaDet.Sql.Add('Where id_ven_detven = :id_Venta)';
QVentaDet.ParamByName('id_venta').AsInteger:=Id_Venta;
QVentaDet.Open;

{3: Ciclo para recorrer detalle de ventas y Reversar stock a tabla Productos}

QReversaStock.SQL.Clear;
QReversaStock.SQL.Add('Update Producto');
QReversaStock.SQL.Add('SET producto.sto_prod = producto.sto_prod + :CANT1');
QReversaStock.SQL.Add('Where producto.id_prod = :PROD');

While not QVentaDet.Eof Do
begin
QReversaStock.Params.ParamByName('CANT1').AsInteger := QVentaDet.FieldByName('CAN_DETVEN').AsInteger;
QReversaStock.Params.ParamByName('PROD').AsInteger := QVentaDet.FieldByName('ID_PRO_DETVEN').AsInteger;
QReversaStock.ExecSQL;

QVentaDet.Next;
end;

{5: Eliminar Detalle de venta}
QDelete.Sql.Clear;
QDelete.Sql.Add('Delete From Det_venta');
QDelete.Sql.Add('Where id_ven_detven = :ID_DETVENE');
QDelete.ParamByName('ID_DETVENE').AsInteger:=Id_Venta;
QDelete.ExecSQL;

{6: Eliminar venta}
QDelete.Sql.Clear;
QDelete.Sql.Add('Delete From Ventas');
QDelete.Sql.Add('Where id_venta = :ID_Venta');
QDelete.ParamByName('id_venta').AsInteger:=Id_Venta;
QDelete.ExecSQL;


Espero le ayude...Saludos cordiales

kainchu3102
11-11-2022, 20:50:24
Nose como agradecerte me sirvio de mucho, siempre entro y cunsulta alguna veces son buenas otras no, pero creo que deberían premiar a los que ayudamos o ponemos el granito de arena, o el club tambien deberia pedir una cuenta bancaria aparte de otros datos para que gentilmente se pueda cobrar una consulta, porque alguna veces vale la pena ayudar o viceversa. gracias nuevamente.

kainchu3102
11-11-2022, 22:56:06
procedure TFORMVENTA.Eliminar1Click(Sender: TObject);

begin
if ID_VENTA <> 0 then
begin
if MessageDlg('SU REGISTRO SERA ELIMINADO, ¿REALMENTE DESEA ELIMINAR REGISTRO?',mtConfirmation,mbOKCancel,0) <> idOk then
begin
ID_VENTA := 0;
abort
end
else
begin
with MDATOS_SAGA.FDQSEL_ABM_VEN2 Do
Begin
SQL.Clear;
SQL.Add('SELECT id_pro_detven, can_detven FROM det_venta WHERE id_ven_detven = :ID_DETVEN');
ParamByName('ID_DETVEN').AsInteger := ID_VENTA;
open;
end;

with MDATOS_SAGA.FDQACTUAL_STOCK do
begin
SQL.Clear;
SQL.Add('UPDATE producto SET producto.sto_prod = producto.sto_prod + :CANT1 WHERE producto.id_prod = :PROD');
While not MDATOS_SAGA.FDQSEL_ABM_VEN2.Eof Do
begin
Params.ParamByName('CANT1').AsInteger := MDATOS_SAGA.FDQSEL_ABM_VEN2.FieldByName('CAN_DETVEN').AsInteger;
Params.ParamByName('PROD').AsInteger := MDATOS_SAGA.FDQSEL_ABM_VEN2.FieldByName('ID_PRO_DETVEN').AsInteger;
ExecSQL;
MDATOS_SAGA.FDQSEL_ABM_VEN2.Next;
end;
end;

With MDATOS_SAGA.FDQABM_VENTA do
Begin
SQL.Clear;
SQL.Add ('DELETE FROM venta WHERE id_ven = :ID_VENE');
Params.ParamByName('ID_VENE').AsInteger := ID_VENTA;
ExecSQL;
if RowsAffected = 1 then


With MDATOS_SAGA.FDQABM_DET_VENTA do
Begin
SQL.Clear;
SQL.Add ('DELETE FROM det_venta WHERE id_ven_detven = :ID_DETVENE');
Params.ParamByName('ID_DETVENE').AsInteger := ID_VENTA;
ExecSQL;


end;
MDATOS_SAGA.FDTVENTA.Refresh;
DBGVENTA.DataSource.DataSet.Refresh;

MDATOS_SAGA.FDTDET_VENTA.Refresh;
DBGDET_VENTA.DataSource.DataSet.Refresh;
end;
end;
end
else
begin
ShowMessage('DEBE SELECCIONAR UN REGISTRO DE LA GRILLA PARA ELIMINAR, VERIFICAR');
end;
end;

Asi quedo :)

cloayza
12-11-2022, 00:11:57
Que bien...me alegra el haber aportado...

Casimiro Notevi
12-11-2022, 07:34:50
Nose como agradecerte me sirvio de mucho, siempre entro y cunsulta alguna veces son buenas otras no, pero creo que deberían premiar a los que ayudamos o ponemos el granito de arena, o el club tambien deberia pedir una cuenta bancaria aparte de otros datos para que gentilmente se pueda cobrar una consulta, porque alguna veces vale la pena ayudar o viceversa. gracias nuevamente.

Arriba del todo tienes un par de enlaces por si quieres colaborar: teaming.net (https://www.teaming.net/teamingclubdelphi) si estás en España y paypal (https://www.paypal.com/donate/?hosted_button_id=GRFZEVRFMU3VE) para cualquier lugar del mundo.
Saludos.
:)