Hola amigos espero tengan paciencia para leer tanto, tengo problemas con un procedimiento si me pueden ayudar se los agradecere como siempre, para empezar tengo firebird 1.5, delphi 7 y las fibplus, es un procedimiento en firebird el que me da el problema no la aplicación les esplico a grandes razgo lo que tengo y lo que estoy intentando hacer:
entre las diferentes tablas de la base de datos tengo una para productos, proveedores, proveedores por productos, compras y detallecompras.
Despues ingresar una nueva compra con su detalle (compras y detallecompras) verifico que el proveedor este dado de alta como proveedor del producto (proveeproduc donde entre otras cosas tengo costos y tiempos de entrega)
si esta dado de alta y además es el proveedor principal para dicho articulo actualizo los costos en proveeproduc, si existe pero no es el principal pregunto si se quiere que ahora seha el el principal y de igual forma actualizo los datos en proveeproduc, si no existe el proveedor para este articulo lo doy de alta.
en teoria eso es todo, como condición los proveedores deben de estar previamente dados de alta en la tabla de proveedores.
ahora como lo logro:
Con delphi verifico si existe el proveedor para el articulo y si es el principal así ya se si lo que necesito es solo actualizar datos o actualizar datos he ingresar nuevo proveedor para articulo con lo cual tengo 3 parametros:
compra: con la que he realizado pruebas es la "31",
producto: el de la compra es un tornillo con clave "1462"
proceso: "A" para ctualizar e ingresar datos. otros valores son "P" -> principal y "S" -> secundario
el procedimiento en firebird es el siguiente:
Código SQL
[-]
CREATE PROCEDURE ACTUALIZAPROVEEDOR (
COMPRA INTEGER,
PRODUCTO INTEGER,
PROCESO CHAR(10))
AS
DECLARE VARIABLE PROVEEDOR INTEGER;
DECLARE VARIABLE MONEDA INTEGER;
DECLARE VARIABLE IMPUESTO INTEGER;
DECLARE VARIABLE DESCUENTO INTEGER;
DECLARE VARIABLE FECHA DATE;
DECLARE VARIABLE DOCUMENTO INTEGER;
DECLARE VARIABLE COSTO DOUBLE PRECISION;
DECLARE VARIABLE CANTIDAD DOUBLE PRECISION;
DECLARE VARIABLE UNIMEDIDA INTEGER;
DECLARE VARIABLE EXISTE INTEGER;
begin
select id_proveedor, id_impuesto, id_descuento, fecha, numdocumento from compras where id = : compra into : PROVEEDOR, : IMPUESTO, : DESCUENTO, : FECHA, : DOCUMENTO;
select cantidad, precio, id_unimed from detallecompras where id_compra = : compra and id_producto = : producto into : CANTIDAD, : COSTO, : UNIMEDIDA;
if (: proceso = 'P')
Then update proveeproduc set costouni = : COSTO, id_moneda = : MONEDA, id_impuesto = : IMPUESTO, id_descuento = : DESCUENTO,
ultimocosto = : FECHA, facturacompra = : DOCUMENTO,
descuento = (: COSTO * (select porcentaje from tipodescuento where id = : DESCUENTO) / 100),
costo1 = (select costo1 from productos where id = : producto),
costo2 = (select costo2 from productos where id = : producto)
where id_producto = : producto and id_proveedor = : PROVEEDOR;
if (: proceso = 'S')
Then Begin
Select id from proveeproduc where id_proveedor = : PROVEEDOR and id_producto = : producto into : EXISTE;
if (: EXISTE is null)
then insert into proveeproduc (id_proveedor, id_producto, costouni, id_moneda, id_impuesto, id_descuento, descuento, costo1, costo2, ultimocosto, facturacompra)
values (: PROVEEDOR, : producto, : COSTO, : MONEDA, : IMPUESTO, : DESCUENTO, (: COSTO * (select porcentaje from tipodescuento where id = : DESCUENTO) / 100), (select costo1 from productos where id = : producto), (select costo2 from productos where id = : producto), : FECHA, : DOCUMENTO);
Else update proveeproduc set costouni = : COSTO, id_moneda = : MONEDA, id_impuesto = : IMPUESTO, id_descuento = : DESCUENTO,
descuento = (: COSTO * (select porcentaje from tipodescuento where id = : DESCUENTO) / 100),
costo1 = (select costo1 from productos where id = : producto),
costo2 = (select costo2 from productos where id = : producto),
ultimocosto = : FECHA, facturacompra = : DOCUMENTO
where id_producto = : producto and id_proveedor = : PROVEEDOR;
End
if (: proceso = 'A')
Then Begin
update proveeproduc set principal = 'N' where id_producto = : producto;
Select id from proveeproduc where id_proveedor = : PROVEEDOR and id_producto = : producto into : EXISTE;
if (: EXISTE is null)
then insert into proveeproduc (id_proveedor, id_producto, costouni, id_moneda, id_impuesto, id_descuento, descuento, costo1, costo2, ultimocosto, facturacompra, principal)
values (: PROVEEDOR, : producto, : COSTO, : MONEDA, : IMPUESTO, : DESCUENTO, (: COSTO * (select porcentaje from tipodescuento where id = : DESCUENTO) / 100), (select costo1 from productos where id = : producto), (select costo2 from productos where id = : producto), : FECHA, : DOCUMENTO, 'S');
Else update proveeproduc set costouni = : COSTO, id_moneda = : MONEDA, id_impuesto = : IMPUESTO, id_descuento = : DESCUENTO,
descuento = (: COSTO * (select porcentaje from tipodescuento where id = : DESCUENTO) / 100),
costo1 = (select costo1 from productos where id = : producto),
costo2 = (select costo2 from productos where id = : producto),
ultimocosto = : FECHA, facturacompra = : DOCUMENTO, Principal = 'S'
where id_producto = : producto and id_proveedor = : PROVEEDOR;
update productos set id_proveedor = : PROVEEDOR;
End
suspend;
end
la parte que dice if (: proceso = 'A') es la que no funciona ya depure linea a linea el código y si entra no marca ningun error pero al verificar el contenido de las tablas no hiso nada, si alguien me puede ayudar a verificar esto o dar alguna otra idea para solucionar esto ya que me quede con este problema y no se me ocurre otra forma de solucionar lo que quiero
Gracias y disculpen el rollo