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)
-   -   Tratando de incrementar un valor con UPDATE (https://www.clubdelphi.com/foros/showthread.php?t=92666)

viverosjosem 23-12-2017 03:08:08

Tratando de incrementar un valor con UPDATE
 
Hola Amigos.
soy nuevo en Firebird. e revisado muchas paginas de internet, pero no e encontrado nada para dar solucion a mi problema.

Siempre e trabajado con delphi y paradox. Ahora estoy tratando de pasar mi codigo a SQL. Estoy experimentando con Firebird 2.5.
El problema que tengo es el siguiente:
Tengo una base de datos con una tabla llamada comanda, la cual almacena los pedidos de una mesa. Entonces lo que quiero, es, actualizar la cantidad de un producto modificando el contenido del campo cantidad.

El punto es que no logro actualizar el campo cantidad, sumandole a su valor original, un nuevo valor. Algo como: Campo_Cantidad = Campo_Cantidad + variable.
Código Delphi [-]
 SQLDataSet1.Close;
  SQLDataSet1.CommandText :=  'UPDATE ' + ' Comanda ' +
                                     'SET ' +
                                         'Salon      =:Salon, ' +
                                         'Mesa       =:Mesa, '  +
           'Cantidad   =:Cantidad, ' +
                                         'Loaded     =:Loaded ' +
                                      'WHERE ' +
                                          'Salon  = ' + QuotedStr(sSalon)  + ' AND ' +
                                          'Mesa   = ' + QuotedStr(sNumero) + ' AND ' +
                                          'Codigo = ' + QuotedStr(sCodigo) + ' AND ' +
                                          'Loaded = ' + QuotedStr('2') + ';';


         SQLDataSet1.ParamByName('Salon' ).AsString   := sSalon;
         SQLDataSet1.ParamByName('Mesa' ).AsString    := sMesa;
         SQLDataSet1.ParamByName('Loaded' ).AsString  := '1';
         SQLDataSet1.ParamByName('Cantidad' ).AsFloat := SQLDataSet1.ParamByName('Cantidad' ).AsFloat + iCantidad;
         SQLDataSet1.ExecSQL(False);

** Si en el codigo escribo: "ParamByName", solo graba el valor de "iCantidad", ignorando el valor original que ya estaba grabado.

** Si en el codigo escribo: "FieldByName", Me da un error que dice: SQLDataSet1 Field 'cantidad' not found.


Alguna idea de como poder hacerlo.
De antemano, muy agradecido.

viverosjosem 23-12-2017 04:17:51

Hola. un alcance.
Cuando digo: Si en el codigo escribo: "ParamByName", me refiero a esta linea:
SQLDataSet1.ParamByName('Cantidad' ).AsFloat := SQLDataSet1.ParamByName('Cantidad' ).AsFloat + iCantidad;

y cuando digo: Si en el codigo escribo: "FieldByName", me refiero a esta linea:
SQLDataSet1.ParamByName('Cantidad' ).AsFloat := SQLDataSet1.FieldByName('Cantidad' ).AsFloat + iCantidad;

Espero, quede mas claro.

Gracias de antemano.

WHILENOTEOF 23-12-2017 14:00:19

La actualización del campo CANTIDAD la tienes que hacer en el update de la base de datos, no en el parámetro, es decir:

Código SQL [-]
UPDATE COMANDA SET CANTIDAD = CANTIDAD + :ICANTIDAD

No tiene sentido hacerlo en el parámetro, porque el parámetro no sabe cual es el valor que tiene actualmente el campo CANTIDAD en la base de datos. El parámetro ICANTIDAD es donde pondrías en la consulta. Tampoco creo que tenga mucho sentido actualizar la mesa y el salón, si forman parte del mismo WHERE de la consulta que vas a actualizar.

viverosjosem 23-12-2017 18:37:33

Hola Whilenoteof. agradezco tu ayuda.
Hice lo que me sugeriste.

Cambié la asignación del parametro cantidad a: Set Cantidad = Cantidad + iCantidad

Código Delphi [-]
 SQLDataSet1.Close;
  SQLDataSet1.CommandText :=  'UPDATE ' + ' Comanda ' +
                                     'SET ' +
                                         'Cantidad   = Cantidad + :iCantidad  ' +
                                      'WHERE ' +
                                          'Salon  = ' + QuotedStr(sSalon)  + ' AND ' +
                                          'Mesa   = ' + QuotedStr(sNumero) + ' AND ' +
                                          'Codigo = ' + QuotedStr(sCodigo) + ';';

         SQLDataSet1.ParamByName('Cantidad' ).AsFloat := iCantidad;
         SQLDataSet1.ExecSQL(False);

pero me da un error: SQLDataSet1 Field 'cantidad' not found;


tambien lo probe quitando la linea:
SQLDataSet1.ParamByName('Cantidad' ).AsFloat := iCantidad;.. y nada.
..y luego quite esta: SQLDataSet1.ExecSQL(False);.. y nada.

hice todas las conbinaciones que se me ocurrieron y no produce nada, o en el peor de los casos me da error.

Alguna nueva idea?

Gracias por la ayuda. muy agradecido

WHILENOTEOF 23-12-2017 18:49:15

Cita:

Empezado por viverosjosem (Mensaje 523732)
Hola Whilenoteof. agradezco tu ayuda.
Hice lo que me sugeriste.

Cambié la asignación del parametro cantidad a: Set Cantidad = Cantidad + iCantidad

Código Delphi [-]
 SQLDataSet1.Close;
  SQLDataSet1.CommandText :=  'UPDATE ' + ' Comanda ' +
                                     'SET ' +
                                         'Cantidad   = Cantidad + :iCantidad  ' +
                                      'WHERE ' +
                                          'Salon  = ' + QuotedStr(sSalon)  + ' AND ' +
                                          'Mesa   = ' + QuotedStr(sNumero) + ' AND ' +
                                          'Codigo = ' + QuotedStr(sCodigo) + ';';

         SQLDataSet1.ParamByName('Cantidad' ).AsFloat := iCantidad;
         SQLDataSet1.ExecSQL(False);

pero me da un error: SQLDataSet1 Field 'cantidad' not found;


tambien lo probe quitando la linea:
SQLDataSet1.ParamByName('Cantidad' ).AsFloat := iCantidad;.. y nada.
..y luego quite esta: SQLDataSet1.ExecSQL(False);.. y nada.

hice todas las conbinaciones que se me ocurrieron y no produce nada, o en el peor de los casos me da error.

Alguna nueva idea?

Gracias por la ayuda. muy agradecido

Fíjate en los nombres que les das a los campos y a los parámetros, yo le he puesto al parámetro iCantidad, para que no coincida con el mismo nombre que tiene el campo, no sé si sería motivo de error, pero no me gusta hacer coincidir los nombres de campos y parámetros. La sentencia
Código Delphi [-]
SQLDataSet1.ParamByName('Cantidad' ).AsFloat
da error, porque no hay ningún parámetro que se llame Cantidad, tal como yo te lo he puesto sería iCantidad, es decir:
Código Delphi [-]
SQLDataSet1.ParamByName('iCantidad' ).AsFloat
, asegúrate también que la query tiene definido ese parámetro (dependiendo de los componentes que utilices, se creará automáticamente a partir de la notación :iCantidad).

Caminante 23-12-2017 18:50:08

Hola

Si el parametro se llama icantidad debes usar ese nombre y no 'cantidad'.

Código Delphi [-]
SQLDataSet1.Close;   SQLDataSet1.CommandText :=  'UPDATE ' + ' Comanda ' +       'SET ' +          'Cantidad   = Cantidad + :iCantidad  ' +          'WHERE ' +          'Salon  = ' + QuotedStr(sSalon)  + ' AND ' +          'Mesa   = ' + QuotedStr(sNumero) + ' AND ' +          'Codigo = ' + QuotedStr(sCodigo) + ';';           SQLDataSet1.ParamByName('iCantidad' ).AsFloat := iCantidad;          SQLDataSet1.ExecSQL(False);

Saludos

viverosjosem 23-12-2017 19:16:06

Gracias WhileNoteof.
Tenias razon. Cambie el campo Cantidad, por el parametro iCantidad y funciono perfectamente.

Código Delphi [-]
SQLDataSet1.ParamByName('iCantidad' ).AsFloat  := iCantidad;

Muy agradecido.
Tambien mis agradecimientos a Caminante.


La franja horaria es GMT +2. Ahora son las 13:23:05.

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