Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 05-09-2005
Avatar de jzginez
jzginez jzginez is offline
Miembro
 
Registrado: sep 2003
Ubicación: Puebla, México
Posts: 247
Poder: 21
jzginez Va por buen camino
procedimiento que no inserta ni actualiza

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
  /* Procedure Text */
  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') /*si el proveedor es el principal solo actualizo los datos*/
   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;
   /* la parte anterior funciona bien*/
  if (: proceso = 'S')/* si el proveedor es secundario */
   Then Begin
      Select id from proveeproduc where id_proveedor = : PROVEEDOR and id_producto = : producto into : EXISTE;
      if (: EXISTE is null) /* si no existe inserto nuevo proveedor */
        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);
             /* si existe actualizo datos*/
        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
   /* la parte anterior tambien funciona*/
  if (: proceso = 'A') /*si el proveedor va hacer el principal*/
   Then Begin
      update proveeproduc set principal = 'N' where id_producto = : producto;
       /*a los que ya existen les indico que no son principal*/
      Select id from proveeproduc where id_proveedor = : PROVEEDOR and id_producto = : producto into : EXISTE;
      if (: EXISTE is null) /* si no existe lo inserto*/
        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');
          /* si existe solo lo actualizo */
        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
__________________
Espero poder seguir exprimiéndote el cerebro 8)
Jorge Zamora Ginez
Puebla, Pue. México
Responder Con Cita
  #2  
Antiguo 06-09-2005
Avatar de jzginez
jzginez jzginez is offline
Miembro
 
Registrado: sep 2003
Ubicación: Puebla, México
Posts: 247
Poder: 21
jzginez Va por buen camino
Hola a todos aunque desafortunadamente nadie a respondido y varios lo han leido lo cual interpreto como que tampoco le encuentran donde esta el error les comento que la solución que encontre fue dividir el procedimiento en tres procedimientos uno para cada if y estos los llamo desde delphi con esto ya esta funcionando bien.

Gracias
__________________
Espero poder seguir exprimiéndote el cerebro 8)
Jorge Zamora Ginez
Puebla, Pue. México
Responder Con Cita
  #3  
Antiguo 12-09-2005
Avatar de rastafarey
rastafarey rastafarey is offline
Miembro
 
Registrado: nov 2003
Posts: 927
Poder: 21
rastafarey Va por buen camino
Resp

Creo que no has octenido respuesta ya que el codigo es un poco largo y amuchos eso le molesta.

Si puedes trata de concretar las cosas mas. Ya que el codigo dificulto que lo lean y menos que lo traten de entender
__________________
Todo se puede, que no exista la tecnología aun, es otra cosa.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro


La franja horaria es GMT +2. Ahora son las 19:59:47.


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
Copyright 1996-2007 Club Delphi