Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Update un campo sumando existencia (Inventario) (https://www.clubdelphi.com/foros/showthread.php?t=48893)

enecumene 07-10-2007 21:02:22

me los presento los dos sin problemas Q2612A y 5

Caral 07-10-2007 21:13:43

Hola
Estoy perdido, pero me divierto mucho.
Probemos esto:
Código Delphi [-]
ZSumaInventario.SQL.Add('update articulos set cantidad = :inv where ref = :cod');
ZSumaInventario.ParamByName('cod').Value := ZTemp.Fields[1].Value;
ZSumaInventario.ParamByName('inv').Value := IntToStr(strtoint(ZTemp.Fields[3].Value) + strtoint(ZInventario.Fields[3].Value)); 
Showmessage(ZSumaInventario.ParamByName('cod').Value);
Showmessage(ZSumaInventario.ParamByName('inv').Value);

//strtoint(ZInventario.Fields[3].Value) + strtoint(ZTemp.Fields[3].Value);
//Showmessage(ZSumaInventario.ParamByName('inv').Value);
//ZSumaInventario.ExecSQL;
Aqui puede estar el asunto, veamos que pasa.
Deberia:
el primer mensaje: Q2612A
el segundo mensaje: 10
Si se rompe algo no es mi culpa:D
Saludos

basti 07-10-2007 21:23:26

Creo que el problema es con el uso del .value y los parámetros. Value no hace una conversión automática de tipos.

Prueba lo siguiente
Código Delphi [-]
//suma la existecia del articulo
ZSumaInventario.Close;
ZSumaInventario.SQL.Clear;
ZSumaInventario.SQL.Add('update articulos set cantidad = :inv where ref = :cod');
ZSumaInventario.ParamByName('inv').AsInteger := ZInventario.Fields[3].AsInteger + ZTemp.Fields[3].AsInteger;
ZSumaInventario.ParamByName('cod').AsString := ZTemp.Fields[1].AsString;
ZSumaInventario.ExecSQL;

basti 07-10-2007 21:27:37

Añado una cosa, yo prefiero usar FieldByName que Fields. La razón es que si cambias la estructura de la tabla, tendrás que revisar el índice de Fields en todos los sitios. Quedaría algo así:

Código Delphi [-]
//suma la existecia del articulo
ZSumaInventario.Close;
ZSumaInventario.SQL.Clear;
ZSumaInventario.SQL.Add('update articulos set cantidad = :inv where ref = :cod');
ZSumaInventario.ParamByName('inv').AsInteger := ZInventario.FieldByName('Cantidad').AsInteger + ZTemp.FieldByName('Cantidad').AsInteger;
ZSumaInventario.ParamByName('cod').AsString := ZTemp.FieldByName('¿Código?').AsString;
ZSumaInventario.ExecSQL;

Caral 07-10-2007 21:27:55

Hola
Esta es muy buena logica, lo pense tambien, pero no estaba seguro, por eso solicite que se pusieran los mensajes para ver que tipo de datos daba.
Muy bueno basti
Saludos

enecumene 07-10-2007 21:41:26

efectivamente Basti me funciono perfecto, pero ahora tengo otro problema, que solo toma como referencia la primera fila de la tabla temporal que son los detalles que presenta el dbgrid y deberia de hacerlo con todos no? puse dos articulos y solamente me actualiza la primera fila.:confused::confused::confused:.

Saludos.

Caral 07-10-2007 21:49:04

Hola
Ya que me hicieron a un lado:D solo me queda lo ultimo.
Cambia esto a ver:
Código Delphi [-]
ZSumaInventario.ParamByName('cod').AsString := ZInventario.Fields[0].AsInteger
Saludos

enecumene 07-10-2007 22:08:35

Hola Caral, y disculpa, pero no funciono y no hizo nada, no actualiza, solamente con ZTemp lo hace, pero solo lo hace con una sola linea, no hay una forma donde jale todos los registros del ref de ZTemp, porque si tengo dos articulos en la tabla temporal(ZTemp) en el showmessage me deberia salir por ejemplo "Q2612A, C7115A", pero solo me sale por ejemplo "C7115A".

Saludos.

basti 07-10-2007 22:23:35

Cita:

Empezado por enecumene (Mensaje 236812)
efectivamente Basti me funciono perfecto, pero ahora tengo otro problema, que solo toma como referencia la primera fila de la tabla temporal que son los detalles que presenta el dbgrid y deberia de hacerlo con todos no? puse dos articulos y solamente me actualiza la primera fila..

Saludos.

No, la consulta sólo te actualizará el registro que tienes activo en ZTemp.
Tienes que recorrer la tabla ZTemp.
Código Delphi [-]
ZSumaInventario.Close;
ZSumaInventario.SQL.Clear;
ZSumaInventario.SQL.Add('update articulos set cantidad = :inv where ref = :cod');
ZTemp.First;
while not ZTemp.Eof do
begin
  //suma la existecia del articulo
  ZSumaInventario.ParamByName('inv').AsInteger := ZInventario.FieldByName('Cantidad').AsInteger + ZTemp.FieldByName('Cantidad').AsInteger;
  ZSumaInventario.ParamByName('cod').AsString := ZTemp.FieldByName('¿Código?').AsString;
  ZSumaInventario.ExecSQL;
  ZTemp.Next;
end;

enecumene 07-10-2007 22:35:12

Hola, Gracias Basti, Ahora si funciona, va de pelos, y muchas gracias a ti Caral por dedicar tu tiempo en ayudarme, te los agradezco a los dos. ya con esto hago la inversa en el modulo de salida de inventario igual en los ajustes de inventario.

Saludos.


La franja horaria es GMT +2. Ahora son las 16:31:30.

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