PDA

Ver la Versión Completa : actualizar un campo de una tabla en sql desde delphi


josi
10-03-2008, 23:28:22
tengo un campo que se llama exsistencia de una tabla ARTICULOS como hacer para que en el campo exsistencia se le vaya sumando las cantidades de entradas de la tabla ENTRADA D ARTICULOS.

mamaro
10-03-2008, 23:43:59
Yo normalmente utilizo Firebird, y en estos casos incluyo un disparador en la tabla Entradas, como te lo detallo:

Tabla Articulo:
Ident integer (clave primaria)
Nombre varchar(30)
Existencia integer

Tabla Entrada:
ident integer (clave primaria)
Fecha timestamp
Articulo integer (clave foránea a tabla Articulo)
Cantidad integer

Agrego el siguiente disparador para ésta última tabla en el evento AFTERINSERT:
begin
update ARTICULO
set existencia=existencia+new.cantidad;
end

.. y si se permiten modificar las entradas se puede crear éste disparador en el evento AFTERUPDATE:
begin
update ARTICULO
set existencia=existencia+(new.cantidad-old.cantidad);
end

.. y si se permite eliminar entradas, en el evento BEFOREDELETE:
begin
update ARTICULO
set existencia=existencia-old.cantidad;
end

Yo normalmente pongo en la base de datos todo aquel código que representa una "regla del negocio" (eso que nunca cambia y que probablemente lo voy a utilizar desde varios lugares).

Bueno saludos y espero te sirva. :)

josi
11-03-2008, 00:00:01
este cod es en delphi?
lo que pasa es soy un bebe en esto escusame

jachguate
11-03-2008, 05:37:20
El código es SQL y mamaro sugería que usaras triggers.

Si queres hacerlo desde delphi, podrías poner un componente TQuery (o el equivalente de la capa de acceso a datos que uses, por ejemplo TADOQuery si conectas con ADO) y poner en su propiedad SQL:


update articulo
set existencia = existencia + :delta
where IdArticulo = :id


Y ejecutarlo cada vez que te sea necesario con delphi así:


procedure TdmInventario.ActualizaExistencias(AIDArticulo: Integer; ADelta: Double);
begin
qActualizaExistencia.ParamByName('id').AsInteger := AIDArticulo;
qActualizaExistencia.ParamByName('delta').AsFloat := ADelta;
qActualizaExistencia.ExecSQL;
end;


Algunas bibliotecas no publican un método ParamByName en el query directamente, sino dentro de su propiedad Params.

Hasta luego.

;)