Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Como descontar cantidad de stock en tabla de Articulos. (https://www.clubdelphi.com/foros/showthread.php?t=76824)

ilchicho 29-11-2011 19:42:51

Como descontar cantidad de stock en tabla de Articulos.
 
Hola disculpen la molestia soy nuevo en esto,
tengo una tabla articulos y una tabla presupuestos
quiero que cada ves que un articulo participe de un presupuesto
se decremente a la cantidad del stock actual
y si decido cancelar el presupuesto que me lo incremente al stock actual

Desde ya muchas Gracias

Alejandro

BlueSteel 29-11-2011 19:52:27

Hola ilchicho, Bienvenido.

Primero que nada te sugiero que leas la guia de estilo

Referente a tu consulta, falta más información como Version de Delphi, Base


Bueno, existen varias formas....

Supongamos las tablas:

Articulo
-id_Cod (codigo articulo)
-Detalle (detalle, nombre)
-Valor (valor, costo, precio)
-Stock (stock, cantidad existente)

Presupuesto (Aqui se asume que un presupuesto, puede tener varios Articulos)
-id_Pre (codigo presupuesto)
-Fecha (fecha del presupuesto)
-Estado (estado, Vigente, Nulo, Etc)

Det_Presupuesto (Aqui pueden haber tantos registros como tenga el presupuesto - Maestro Detalle)
-id_DPre (codigo Detalle_Presupuesto)
-Id_Pre (Codigo presupuesto - Vincula a Tabla Presupuesto)
-Id_Cod (codigo articulo)
-Ctd (cantidad a utilizar, Si Presupuesto.Estado = Vigente, se descuenta del Stock, de lo contrario se resta)


El codigo lo busco y lo dejo en un rato más.....

Salu2:D:p

guillotmarc 29-11-2011 20:15:50

Cita:

Empezado por ilchicho (Mensaje 419876)
Hola disculpen la molestia soy nuevo en esto,
tengo una tabla articulos y una tabla presupuestos
quiero que cada ves que un articulo participe de un presupuesto
se decremente a la cantidad del stock actual
y si decido cancelar el presupuesto que me lo incremente al stock actual

Desde ya muchas Gracias

Alejandro

¿ Como gestionas el incremento/decremento de stock ocasionado por los albaranes de compra, albaranes de venta, etc. ... ?. Pues con los presupuestos hazlo igual (lo más ortodoxo suele ser programar un trigger en la tabla de líneas de presupuestos).

Saludos.

ilchicho 29-11-2011 20:17:25

Como descontar cantidad de stock en tabla de Articulos.
 
Perdonen ahora me pongo a leer la condiciones.
me recomendaron este foro y de uan ansioso me largue.

Uso Delphi 7 con SQL Manager for InterBase & Firebird y estoy haciendo un
pequeño sistema con ABM Articulos, ABM Clientes, Agenda y Presupuesto.

Articulo
-id_Articulo
-Codigo
-Nombre
-Stock
-Stock_Minimo
-Estado_Articulo
-Porcentaje
-Precio
-Precio_Venta


Presupuesto
-ID-presupuesto
-Nro_Presupuesto
-Tipo_venta
-Codigo_Cliente
-Nombre_Cliente
-Apellido_Cliente
-Tel_Cliente
-CNI_Cliente
-Importe_total
-Observacion
-Fecha


Detalle
-ID_Detalle_P
-Codigo
-Nombre_Articulo
-Cantidad_Articulo
-Precio_Articulo
-Total
-Presupuesto


Hasta ahora llevo bien como agregar los articulos y como sacarlos y me calcula,
quiero que cada ves que un articulo participe de un presupuesto
se decremente a la cantidad del stock actual
y si decido cancelar el presupuesto que me lo incremente al stock actual

//*** Me dijeron que lo haga en el trigger de la BD, otro en el guardar ****//

En fin estoy en sus manos porque me lleno el vaso hasta donde yo se.

Gracias

Casimiro Notevi 29-11-2011 21:34:27

Un presupuesto no debe descontar stock. No hemos vendido nada, sólo hemos indicado a un posible cliente lo que costaría el artículo.

ilchicho 29-11-2011 22:16:33

Como descontar cantidad de stock en tabla de Articulos.
 
En principio es un Presupuesto que a Futuro sera Facturacion,
El tema es que como soy nuevo en esto, poco a poco me voy
dando idea de como hacerlo.

En este momento tenia que hacer un ABM de clientes o articulos para el terciario
y no queria quedarme en solo eso hasta el año que biene, entonces estoy tratando de profundizar mas.

Disculpen la molestia si por ahy pregunto cosas que podrian ser obvias.

Gracias

Casimiro Notevi 29-11-2011 22:23:18

Cada empresa trabaja de una forma distinta, pero lo habitual es presupuesto->pedido->albarán->factura. Se puede empezar en cualquiera de ellos y debe terminar en factura.
El presupuesto no debe descontar stock porque no hemos vendido nada. El pedido ya sí debe descontar stock porque si alguien hace otro pedido hay que tener en cuenta las cantidades que van en otros pedidos. Albaranes y facturas hacen igual, descuenta stock.
Aunque he visto empresas que tampoco descuentan stock en pedidos, sólo lo hacen en albaranes y facturas.
Y he visto otras que sólo lo hacen en albaranes porque la factura es un documento legal que siempre proviene de un albarán.
En fin, que aunque existe una forma correcta y legal de hacer las cosas, al final es cada empresa la que hace las cosas a su manera.

Neftali [Germán.Estévez] 30-11-2011 11:18:25

Cita:

Empezado por ilchicho (Mensaje 419876)
Como descontar cantidad de stock en tabla de Articulos...

Con mucho cuidado, sobre todo con muuuuuuucho cuidado... ;- (lo siento, no lo he podido evitar).

En mi caso yo para presupuestos no descontaría, pero como han comentado, cada empresa puede trabajar diferente.
Puedes hacer los cambios desde programa o desde Base de Datos (utilizando triggers) como te han comentado. Tal vez desde programa te sea más sencillo, desde Base de Datos, a priori es más seguro (si alguien cambia un dato directamente en B.D. seguirá actualizando correctamente).

Si lo haces desde programa, obligatorio revisar bien las transacciones en ese bloque para que no te queden datos incoherentes.

ilchicho 30-11-2011 12:13:00

Como descontar cantidad de stock en tabla de Articulos.
 
Quiero intentar hacerlo desde el SQL Manager en el trigger.
Sabiendo que uso Delphi 7 con SQL Manager for InterBase & Firebird
en el datamodule utilizo aparte de la database, dataset con su datasource y los query con su datasource.
en los foirmularios utilizo los componentes de data controls como son dbedit, dbgrid y dbcombobox, etc.
y mis bases de datos tienen los siguientes atributos:

Tabla Articulo
-id_Articulo
-Codigo
-Nombre
-Stock
-Stock_Minimo
-Estado_Articulo
-Porcentaje
-Precio
-Precio_Venta


Supongamos que esta tabla en ves de ser Presupuesto es Facturacion, que no lo es eso entiendo:
Tabla Presupuesto
-ID-presupuesto
-Nro_Presupuesto
-Tipo_venta
-Codigo_Cliente
-Nombre_Cliente
-Apellido_Cliente
-Tel_Cliente
-CNI_Cliente
-Importe_total
-Observacion
-Fecha


Tabla Detalle P
-ID_Detalle_P
-Codigo
-Nombre_Articulo
-Cantidad_Articulo
-Precio_Articulo
-Total
-Presupuesto_ID

Suponiendo que es un negocio pequeño y que el usuario no quiere facturar solo quiere presupuestar
y cada ves que vende un articulo desea que se decremente su stock y a su ves cuando decide sacar un articulo del presupuesto que ese stock
se vuelva a incrementar.
Como Puedo Hacer para programarlo en los triggers, ya que nunca lo hice y no me doy cuenta, apesar de que creia que me defendia bastante bien aqui me llego el agua al cuello como dicen jajaja.

desde ya muchas gracias.

guillotmarc 30-11-2011 18:15:58

Hola.

Te recomiendo que leas este libro (ya tiene unos buenos años, para la utilización de las bases de datos ha cambiado poco desde entonces).

http://www.marteens.com/pdfs/TheDarkSideOfDelphi6.pdf

Aquí también encontrarás mucha información de interés.

http://www.firebird.com.mx

en concreto deberías leer este artículo

http://www.firebird.com.mx/modules/A...php?storyid=28

Respecto a tu trigger, va a ser algo de este estilo :

Código SQL [-]
SET TERM ^ ;

CREATE TRIGGER RECALCULAR_STOCK for DETALLE_P
active after insert or update or delete position 0
AS
declare variable ID_ARTICULO integer;
begin

  IF (deleting) THEN ID_ARTICULO = old.CODIGO;
  ELSE ID_ARTICULO = new.CODIGO;

  UPDATE ARTICULO SET STOCK = -1 * (SELECT SUM(CANTIDAD_ARTICULO) FROM DETALLE_P WHERE CODIGO = :ID_ARTICULO)
  WHERE ID_ARTICULO = (:ID_ARTICULO);
end
^

SET TERM ; ^



Saludos

AzidRain 30-11-2011 23:04:33

ME adhiero a Casimiro, un presupuesto nunca debe descontar stock pues no es mas que un estimado de lo que costará al cliente en caso de que quiera fincar el pedido. Luego viene el pedido, el cual tampoco debe descontar directamente de stock sino "apartar" únicamente las unidades de cada artículo de manera que si haces un inventario físico te cuadre lo que dice el sistema con lo que hay en documentos pues la regla dice:

inventario físico= stock en sistema + pedidos pendientes de surtir.

El pedido al convertirse el "albarán" como dicen en España o "remisión" como decimos en México entonces sí descuenta permanentemente del stock. Ya la factura es mero trámite fiscal pues no todos los clientes, al menos en el caso de México, requerirán de la misma.

Me parece que falta que definas muy bien las reglas de negocio antes de dar el primer teclazo.

ilchicho 01-12-2011 19:46:09

Como descontar cantidad de stock en tabla de Articulos.
 
desde ya muchas gracias a todos por los aportes, estoy empezando a morar desde otro punto de vista.
a interpretar como son los pasos en los cuales se tendría que mover una empresa.

guillotmarc me marca error en el codigo: IF (deleting) THEN
Precompiler Error: Syntax error - ).

cree el trigger ta como me indicaste y cuando compilo me marca en rojo esa porcion de codigo
es que como en el deleting tengo que darle una opcion??
IF (deleting ( ) ) THEN

Hace tiempo vi algo en java donde programamos mas o menos de esta forma pero busque y no me doy cuenta que puede ser.

Gracias Guillot

guillotmarc 01-12-2011 21:00:20

Hola.

¿ Que versión de Firebird utilizas ?. Ese condicional está escrito utilizando una variable disponible desde Firebird 2.0 en adelante.

Si aún utilizas Firebird 1.0 o 1.5, probablemente ya sea hora de que hagas el cambio, estas versiones son muy antiguas.

Un trigger alternativo, sin usar esa variable, sería :

Código SQL [-]
SET TERM ^ ;

CREATE TRIGGER RECALCULAR_STOCK for DETALLE_P
active after insert or update or delete position 0
AS
begin

  UPDATE ARTICULO SET STOCK = -1 * (SELECT SUM(CANTIDAD_ARTICULO) FROM DETALLE_P WHERE CODIGO = coalesce(new.CODIGO, old.CODIGO))
  WHERE ID_ARTICULO = coalesce(new.CODIGO, old.CODIGO);
end
^

SET TERM ; ^

NOTA: Ese condicional está para solventar el problema de que en un Trigger AFTER DELETE, las variables NEW no tienen valor, y hay que consultar el valor OLD del código de artículo (mientras que en un Trigger AFTER INSERT ocurre exactamente lo contrario). En la segunda propuesta, se solventa el problema mediante el uso de la función COALESCE.

Saludos.

guillotmarc 01-12-2011 21:07:27

Eliminado por código SQL mal formateado.

Corrección posteada en un nuevo mensaje.

guillotmarc 01-12-2011 21:08:22

Finalmente, la opción que va a funcionar en cualquier versión de Interbase o Firebird, por antigua que sea (ya que utilizamos la sintaxis más básica y común) es crear tres triggers, uno para cada operación que se puede hacer en la tabla:

Código SQL [-]
SET TERM ^ ;

CREATE TRIGGER RECALCULAR_STOCK_AI for DETALLE_P
active after insert position 0
AS
begin

  UPDATE ARTICULO SET STOCK = -1 * (SELECT SUM(CANTIDAD_ARTICULO) FROM DETALLE_P WHERE CODIGO = new.CODIGO)
  WHERE ID_ARTICULO = new.CODIGO, old.CODIGO;
end
^

CREATE TRIGGER RECALCULAR_STOCK_AU for DETALLE_P
active after update position 0
AS
begin

  UPDATE ARTICULO SET STOCK = -1 * (SELECT SUM(CANTIDAD_ARTICULO) FROM DETALLE_P WHERE CODIGO = new.CODIGO)
  WHERE ID_ARTICULO = new.CODIGO;


  UPDATE ARTICULO SET STOCK = -1 * (SELECT SUM(CANTIDAD_ARTICULO) FROM DETALLE_P WHERE CODIGO = old.CODIGO)
  WHERE ID_ARTICULO = old.CODIGO;
end
^

CREATE TRIGGER RECALCULAR_STOCK_AD for DETALLE_P
active after delete position 0
AS
begin

  UPDATE ARTICULO SET STOCK = -1 * (SELECT SUM(CANTIDAD_ARTICULO) FROM DETALLE_P WHERE CODIGO = old.CODIGO)
  WHERE ID_ARTICULO = old.CODIGO;
end
^

SET TERM ; ^

Saludos.

José Luis Garcí 02-12-2011 09:20:09

Hola ilchicho, lo que tu quieres hacer de regular Stock en presupuestos o pedidos, es una reserva o retención de mercancía, esto se hace de la siguiente manera, debes crear una nueva tabla, con el campo común del Código del producto, el del Cliente, el Tipo de Documento y número de este, además debes de añadir el campo reserva de Stock y fecha de la reserva. esto en cuanto a la tabla, se puede añadir un campo más que sería el de días de reserva, pero este último puedes controlarlo por código o tenerlo incluido en la tabla de Configuración.

Por código cuando controlas el Stock debes de añadir dos labels donde marque el Stock reservado y el Stock actual-el reservado (teniendo en cuenta siempre que sólo contaría el que este dentro del plazo dado (fecha actual esta dentro de la fecha de reserva + el número de días de la reserva)), sería bueno que eliminases las reservas ya caducadas o añadir otro campo indicando que están caducadas.

Espero te sirva el planteamiento.

ilchicho 03-12-2011 03:51:19

Como descontar cantidad de stock en tabla de Articulos.
 
ante todo sigo agradeciendo, muchas gracias,
les comento como estoy haciendo lo del codigo por que parece que algo estoy haciendo mal porque no he notado nada.
desde SQL Manager for InterBase & Firebird sobre trigger hago clic con el boton derecho y cree como me indico GUILLOT en un primer momento el primer trigger no notando ningun cambio, y asi probando con los otros trigger y no noto que se modifique, tengo una mercaderia XX que tiene un stock de 15 entonces en el presupuesto tomo 5 articulos XX, y segun me dijo un amigo solo se tendria que modificar el stock de ese articulo a 10.
consulte con otros amigos por el codigo y me dijeron que esta muy bueno, el tema es que ninguno tiene manejo de delphi y sql manager entonces no se si ademas de crearlo en el sql manager tengo que invocarlo desde el delphi o en la base desde el datamodule, mil disculpas por mi ignorancia, pero ya que me meti en esto brete quiero desafiarlo hasta que me salga, ya que de esa forma se aprende un poco mas y mejor creo.

bueno mis amigos del club estoy a merced de sus ayudas nuevamente.

Gracias, Alejandro

Casimiro Notevi 03-12-2011 10:18:28

Tienes que crear TODOS los triggers indicados por guillotmarc, y luego en tu código delphi cuando haces cualquier entrada, modificación, etc. del stock, se cambiará automáticamente en la base de datos.
¡¡¡Pero pon aquí tu código, que lo revisemos!!!

ilchicho 04-12-2011 01:33:44

Como descontar cantidad de stock en tabla de Articulos.
 
Querida gente no se si estoy poniendo mal los trigger o que esta pasando,
puede ser que sea tambien el navo yo, pero no me actualiza el stock.
asi que les envio el proyecto para que lo miren, depaso por ahy les sirve o no,
y si me pueden dar una mano perfecto y sino bueno colaboro con algo.

gracias

Aqui el proyecto, va en el c y la base tb en el c

http://www.clubdelphi.com/foros/C:\U...IRUBROSOSA.rar

Casimiro Notevi 04-12-2011 10:52:57

¿Pero dónde lo has puesto?


La franja horaria es GMT +2. Ahora son las 10:21:02.

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