Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-12-2017
viverosjosem viverosjosem is offline
Baneado
 
Registrado: dic 2017
Posts: 64
Poder: 0
viverosjosem Va por buen camino
Unhappy 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.
Responder Con Cita
  #2  
Antiguo 23-12-2017
viverosjosem viverosjosem is offline
Baneado
 
Registrado: dic 2017
Posts: 64
Poder: 0
viverosjosem Va por buen camino
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.
Responder Con Cita
  #3  
Antiguo 23-12-2017
WHILENOTEOF WHILENOTEOF is offline
Miembro
 
Registrado: mar 2008
Posts: 232
Poder: 17
WHILENOTEOF Va camino a la fama
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.

Última edición por WHILENOTEOF fecha: 23-12-2017 a las 14:03:51.
Responder Con Cita
  #4  
Antiguo 23-12-2017
viverosjosem viverosjosem is offline
Baneado
 
Registrado: dic 2017
Posts: 64
Poder: 0
viverosjosem Va por buen camino
Unhappy

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
Responder Con Cita
  #5  
Antiguo 23-12-2017
WHILENOTEOF WHILENOTEOF is offline
Miembro
 
Registrado: mar 2008
Posts: 232
Poder: 17
WHILENOTEOF Va camino a la fama
Cita:
Empezado por viverosjosem Ver Mensaje
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).
Responder Con Cita
  #6  
Antiguo 23-12-2017
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: oct 2010
Ubicación: Lima - Peru
Posts: 338
Poder: 15
Caminante Va camino a la fama
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
__________________
Caminante, son tus huellas el camino y nada más; Caminante, no hay camino, se hace camino al andar.
Antonio Machado
Responder Con Cita
  #7  
Antiguo 23-12-2017
viverosjosem viverosjosem is offline
Baneado
 
Registrado: dic 2017
Posts: 64
Poder: 0
viverosjosem Va por buen camino
Thumbs up

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.
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
como incrementar valor en ibdatapump SmartZooft Firebird e Interbase 11 04-10-2017 20:57:30
tratando de hacer un sum de un count julyus SQL 5 03-04-2009 03:04:01
Incrementar campo según el valor de otro subzero Firebird e Interbase 3 06-08-2008 22:41:52
tratando de interceptar excepcion Cañones OOP 4 16-05-2007 02:52:39
UPDATE de un campo dependiendo del valor de un campo de otra tabla Javi2 SQL 5 18-04-2005 17:35:05


La franja horaria es GMT +2. Ahora son las 01:22:19.


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