Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > SQL
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 15-08-2015
Camilo Camilo is offline
Miembro
 
Registrado: jun 2007
Posts: 149
Poder: 20
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
  #2  
Antiguo 15-08-2015
Camilo Camilo is offline
Miembro
 
Registrado: jun 2007
Posts: 149
Poder: 20
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
  #3  
Antiguo 15-08-2015
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: dic 2005
Ubicación: Tres Arroyos, Argentina
Posts: 10.508
Poder: 38
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
  #4  
Antiguo 15-08-2015
Camilo Camilo is offline
Miembro
 
Registrado: jun 2007
Posts: 149
Poder: 20
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
  #5  
Antiguo 17-08-2015
Camilo Camilo is offline
Miembro
 
Registrado: jun 2007
Posts: 149
Poder: 20
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


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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 12:29:32.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi