Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-08-2015
Camilo Camilo is offline
Miembro
 
Registrado: jun 2007
Posts: 147
Poder: 17
Camilo Va por buen camino
Actualizar inventario desde DbGridEh

Hola Amigos del Club.
uso Delphi XE y BD - Firebird
Mi pregunta es la Siguiente:
Tengo una tabla que se llama Inventarios. Dentro de ella hay un campo que se llama Codigo_Producto este campo es la llave primaria. y entre otros tengo un campo que se llama cantidad.
Necesito actualizar la cantidad de los productos desde un DbGrideh. esto lo lo gro bien. es decir con el procedimiento que pongo a continuacion me actualiza correctamente el problema es que no me suma lo que hay en el inventario con el parametro que le doy. Ejemplo:
Tengo un producto cuya codigo es 100 y la cantidad en inventarios es 500. Cuando lo actualizo con una cantidad de 100 (Deberia darme 600) entonces lo que hace es reemplazar la cantidad de 500 por la de 100 es decir actualiza con el parametro pero no lo suma.
Por favor me puden guiar en esta inquietud; de antemano mil gracias.
Código Delphi [-]
procedure TFCargaFactura.BitBtn1Click(Sender: TObject);
begin
DBGridEh1.DataSource.DataSet.First;
While not (DBGridEh1.DataSource.DataSet.Eof) do
  begin
      with IBQActualizaInventario do
       begin
       IBQActualizaInventario.Close;
             ParamByName('CODIGO_PRODUCTO').AsString:= DbGrideH1.Columns[0].Field.AsString;
               ParamByName('NOMBRE_PRODUCTO').AsString:= DbGrideH1.Columns[1].Field.AsString;
                 ParamByName('CANTIDAD').AsInteger:= DbGrideH1.Columns[2].Field.AsInteger;
                  ParamByName('PRECIO').AsFloat:= DbGrideH1.Columns[3].Field.AsFloat;
                  
       IBQActualizaInventario.Open;

      DBGridEh1.DataSource.DataSet.Next;
       end;
       end;
       DataModule1.IBT1.CommitRetaining;
       DataModule1.IBTInventario.close;
       DataModule1.IBTInventario.Open;
       Showmessage('EL INVENTARIO SE ACTUALIZO CON EXITO');
end;

El Query desde el cual se hace la actualizacion es el siguiente
Código SQL [-]
UPDATE OR INSERT INTO Inventario
(Codigo_Producto, Cantidad, Precio, Nombre_Producto )
VALUES (:Codigo_Producto, :Cantidad, :Precio, :Nombre_Producto)

Última edición por Camilo fecha: 14-08-2015 a las 17:03:56. Razón: Amigos moderadores que pena con ustedes. Creo que cree este hilo donde no correponde y no se como corregirlo. disculpas mil
Responder Con Cita
  #2  
Antiguo 14-08-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Camilo.

Es que la declaración INSERT OR UPDATE hace solamente eso. Es decir verifica que la clave primaria (o la columna especificada en la cláusula MATCHING) existan. Si alguna de las anteriores no existe, realiza una inserción de modo contrario una modificación.

Pero según entiendo, estas intentando incrementar el valor de una determinada columna y la instrucción solo está diseñada para insertar o modificar de acuerdo a si existe o no el valor especificado.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #3  
Antiguo 15-08-2015
Camilo Camilo is offline
Miembro
 
Registrado: jun 2007
Posts: 147
Poder: 17
Camilo Va por buen camino
Hola Ecfisa. Gracias por tu tiempo, experiencia y sobre todo la voluntad de colaboración.
Sobre el tema te cuento que tienes razón yo intento ademas sumar la cifra de la nueva compra. posteriormente restar la cifra de la venta. en fin.
Me puedes orientar en mi pregunta por fa. Sera que hay que hacer un ciclo, sera que debo calcular un campo inicialmente y luego si subirlo?.
Entonces me toca hacer otro procedimiento? me puedes orientar un poco sobre cual hacer. Mil Gracias.

Última edición por Camilo fecha: 15-08-2015 a las 01:02:03.
Responder Con Cita
  #4  
Antiguo 15-08-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Camilo.

Creo que podrías hacerte un procedimiento similar a este ejemplo:
Código Delphi [-]
procedure UpdateInventory(qy: TIBQuery; const Cod: string;
  const Cant: Integer; const Prec: Currency);
begin
  qy.Close;
  qy.SQL.Clear;
  qy.SQL.Add('UPDATE INVENTARIO');
  qy.SQL.Add('SET CANTIDAD = CANTIDAD + COALESCE(:CANTIDAD, 0),');
  qy.SQL.Add('PRECIO = PRECIO + COALESCE(:PRECIO, 0)');
  qy.SQL.Add('WHERE CODIGO_PRODUCTO = :CODIGO');
  qy.ParamByName('CODIGO').AsString    := Cod;
  qy.ParamByName('CANTIDAD').AsInteger := Cant;
  qy.ParamByName('PRECIO').AsCurrency  := Prec;
  qy.ExecSQL;
end;

Ejemplos de llamada,

Agrega 4 unidades e incrementa 15.5 el precio del producto código '1':
Código Delphi [-]
  UpdateInventory(IBQueryTmp, '1', 4, 15.5);

Decrementa 4 unidades y decrementa 15.5 el precio del producto código '1':
Código Delphi [-]
  UpdateInventory(IBQueryTmp, '1', -4, -15.5);

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #5  
Antiguo 15-08-2015
Camilo Camilo is offline
Miembro
 
Registrado: jun 2007
Posts: 147
Poder: 17
Camilo Va por buen camino
Hola Ecfisa.
El código lo implemento y no pasa nada. es decir no bota error pero no actualiza nada tampoco. por otro lado tengo la duda de ese "IBQueryTmp". de que se trata?
Una aclaración que me parece pertinente:
los campos cantidad y precio (integer y DoublePresicion) respectivamente los actualizo con base en los registros de una factura que se refleja en el DbGridEh1. si esta factura contiene 5 registros de productos comprados y en el inventario hay 4 de los 5 productos entonces el comportamiento seria actualizar los 4 que existen en los dos campos e insertar el 5. por eso el recorrido que hago del grid.
mi problema esta en que los parámetros no están tomando las cantidades y precios del inventario sino que toman solo las nuevas y (o) no hace nada o las duplica.
Responder Con Cita
  #6  
Antiguo 15-08-2015
Camilo Camilo is offline
Miembro
 
Registrado: jun 2007
Posts: 147
Poder: 17
Camilo Va por buen camino
Hola recapitulo para ubicarnos en donde voy.

Si hago esto entonces me inserta o me actualiza bien la primera vez pero si ya existe el registro entonces me actualiza sin sumarme los nuevos valores de cantidad y precio.
Código Delphi [-]
procedure TFCargaFactura.Button1Click(Sender: TObject);
begin
  DBGridEh1.DataSource.DataSet.First;
  while not (DBGridEh1.DataSource.DataSet.Eof) do
  begin
    with IBQActualizaInventarios do
    begin
      UpdateInventory(IBQueryTmp, DbGrideH1.Columns[0].Field.AsString,
        DbGrideH1.Columns[2].Field.AsInteger, DbGrideH1.Columns[3].Field.AsFloat);
      IBQActualizaInventarios.Close;
      ParamByName('CODIGO_PRODUCTO').AsString:= DbGrideH1.Columns[0].Field.AsString;
      ParamByName('CATEGORIA').AsString:= DbGrideH1.Columns[4].Field.AsString;
      ParamByName('NOMBRE_PRODUCTO').AsString:= DbGrideH1.Columns[1].Field.AsString;
      ParamByName('REFERENCIA_PRODUCTO').AsString:= DbGrideH1.Columns[5].Field.AsString;
      ParamByName('CANTIDAD').AsInteger:= DbGrideH1.Columns[2].Field.AsInteger;
      ParamByName('PRECIO').AsFloat:= DbGrideH1.Columns[3].Field.AsFloat;
      ParamByName('Auditoria').AsString:=Edit1.Text;
      ParamByName('Fecha_Auditoria').AsDateTime:= StrToDate(MaskEdit1.Text);
      IBQActualizaInventarios.Open;
      DBGridEh1.DataSource.DataSet.Next;
    end;
  end;
  DataModule1.IBT1.CommitRetaining;
  DataModule1.IBTInventario.close;
  DataModule1.IBTInventario.Open;
  Showmessage('EL INVENTARIO SE ACTUALIZO CON EXITO');
end;

Y si hago esto entonces me acrtualia perfecto pero si el registro ya existe si no existe no lo inserta.
Código Delphi [-]
procedure TFCargaFactura.BitBtn1Click(Sender: TObject);
begin
  DBGRidEh1.DataSource.DataSet.First;
  while not DBGridEh1.Eof do
  begin
    UpdateInventory(IBQueryTmp, DbGrideH1.Columns[0].Field.AsString,
      DbGrideH1.Columns[2].Field.AsInteger,DbGrideH1.Columns[3].Field.AsFloat);
    DBGridEh1.DataSource.DataSet.Next;
  end;
  DataModule1.IBT1.CommitRetaining;
end;

Este el el llamado de la funcion que ecfisa expone arriba.

Entonces necesito combinar las dos. es decir si no esta el registro entonces creelo pero si esta entonces actualice los valores cantidad y precio.

Gracias por la ayuda que pueda recibir.

Última edición por ecfisa fecha: 15-08-2015 a las 23:33:39. Razón: corregir identación para mejor visualización
Responder Con Cita
  #7  
Antiguo 15-08-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 36
ecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to beholdecfisa is a splendid one to behold
Hola Camilo.
Cita:
Empezado por Camilo Ver Mensaje
Hola Ecfisa.
El código lo implemento y no pasa nada. es decir no bota error pero no actualiza nada tampoco. por otro lado tengo la duda de ese "IBQueryTmp". de que se trata?
El código incrementa o decrementa las columnas cantidad y precio en base al valor enviado en sus respectivos parametros: Cant y Prec y puedo asegurarte que lo hace (a menos que realizes un Rollback o RollbackRetaining).
También podría suceder que esté realizando la modificación y no la veas reflejada por que no actualizaste el TDataSet asociado al TDBGrid...


"IBQueryTmp", es otro TIBQuery qualquiera, de uso general, pero también podría haberlo escrito de este modo:
Código Delphi [-]
procedure UpdateInventory(const Cod: string; const Cant: Integer; const Prec: Currency);
var
  qy: TIBQuery;
begin
  qy := TIBQuery.Create(nil);
  try
    qy.Database    := Tu_DataModule.Tu_IBDatabase;
    qy.Transaction := Tu_DataModule.Tu_IBTransaction;
    qy.Close;
    qy.SQL.Clear;
    qy.SQL.Add('UPDATE INVENTARIO');
    qy.SQL.Add('SET CANTIDAD = CANTIDAD + COALESCE(:CANTIDAD, 0),');
    qy.SQL.Add('PRECIO = PRECIO + COALESCE(:PRECIO, 0)');
    qy.SQL.Add('WHERE CODIGO_PRODUCTO = :CODIGO');
    qy.ParamByName('CODIGO').AsString    := Cod;
    qy.ParamByName('CANTIDAD').AsInteger := Cant;
    qy.ParamByName('PRECIO').AsCurrency  := Prec;
    qy.ExecSQL;
  finally
    qy.Free;
  end;
end;
Si no deseas complicarte, una buena alternativa es el uso del TIBDataSet, un componente que conjuga las virtudes de una tabla y una consulta, te recomiendo que revises estos enlaces que tratan sobre él:
Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo 15-08-2015
Camilo Camilo is offline
Miembro
 
Registrado: jun 2007
Posts: 147
Poder: 17
Camilo Va por buen camino
hola. tienes toda la razón el procedimiento si funciona correctamente es que no lo veía actuar pero.......Escribí otro mensaje en que aclaro que las dos cosas funcionan perfectamente pero independientes. me gustaria saber como (por que no pude solo) hacer para esto leí los documentos y son interesantes pero confieso mi bloqueo mental y no fui capaz de hacer esto. Le echas una miradita al mensaje No. 6 por fa.
Responder Con Cita
  #9  
Antiguo 17-08-2015
Camilo Camilo is offline
Miembro
 
Registrado: jun 2007
Posts: 147
Poder: 17
Camilo Va por buen camino
Señores del Club este tema ha quedado resuelto hice unas modificaciones no tanto al código como si al concepto. y el código aportado por ecfisa en sus respuestas 4 y 7 me vino como anillo al dedo. Puedo decir que prescindí del método Update Or insert por lo que bien explican los textos y aportes.
Amigo Ecfisa Eres muy amable y "Calidoso" en tus conocimientos.
Mil Gracias.
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

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Actualizar Inventario JJMR2009 Varios 4 23-06-2011 21:11:03
Mostrar columnas en un Dbgrideh Nayi SQL 3 16-09-2008 16:43:09
wordwrap in dbgrideh (EhLib) ElCherchu Varios 5 12-07-2007 00:14:09
Actualizar Archivos Desde FTP papu24ar Varios 4 21-03-2007 03:50:57
Insertar en un DbgridEh columnas con distintos componentes mateamargo OOP 5 16-06-2005 21:35:03


La franja horaria es GMT +2. Ahora son las 17:18:10.


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