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 Buscar Temas de Hoy Marcar Foros Como Leídos

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo Hace 3 Semanas
viverosjosem viverosjosem is offline
Registrado
 
Registrado: Dec 2017
Posts: 9
Poder: 0
viverosjosem Va por buen camino
Unhappy Nuevamente problemas con UPDATE SQL

Hola Amigos.
Hace dias hice una consulta en este foro, y me respondieron muy bien y logre resolver mi problema. Pero ahora estoy en una situacion similar y no logro dar con la solucion:

Como dije en la consulta anterior, soy nuevo en todo lo referenta a SQL y Firebird.

Anteriormente tenia que actualizar un campo "cantidad" de la base de datos que ya tenia un valor, con una nueva cantidad. (el problema lo resolvi con la generosa ayuda de los integrantes del foro).

Ahora tengo un problema similar: Luego de actualizar el campo cantidad con su nuevo valor, debo actualizar el campo Total.

Tengo como ejemplo:
Variables de programa:
iCantidad = 5.
iPrecio = 1500.

En la base de datos ya existe: "Cantidad = 2". Por lo tanto el valor del campo: "Total", deberia ser: Total = 10.500.- (7 * 1500).

Pero el problema es que no logro actualizar el campo "Total".
Me sale un error: SQLDataSet1.Parameters "Total" not found

E probado con todas las combinaciones que se me han ocurrido y nada.

Les dejo el codigo con el que estoy trabajando en las pruebas.

Código Delphi [-]
      iCantidad := StrToFloat(EdCantidad.Text);
      iPrecio   := StrToFloat(EdPrecio.Text);
      iTotal    := iCantidad * iPrecio;

      SQLDataSet1.Close;
      SQLDataSet1.CommandText :=  'UPDATE ' + ' Comanda ' +
                                   'SET ' +
                                       'Cantidad  = (Cantidad + :iCantidad), ' +
                                       'Precio    = :Precio, ' +
                                       'Total     = (Cantidad * :iPrecio) ' +
                                   'WHERE ' +
                                       'Salon  = ' + QuotedStr(EdSalon.Text) + ' AND ' +
                                       'Numero = ' + QuotedStr(EdMesa.Text)  + ' AND ' +
                                       'Codigo = ' + QuotedStr(EdCodigo.Text)+ ';';

      SQLDataSet1.ParamByName('iCantidad').AsFloat := iCantidad;
      SQLDataSet1.ParamByName('Precio').AsFloat    := iPrecio;
      SQLDataSet1.ParamByName('Total').AsFloat     := iTotal;

      SQLDataSet1.ExecSQL(False);

Todo lo demas funciona a la perfeccion. Solo el campo total, es el que me da problemas.

De antemano gracias por la ayuda.

Y felices Fiestas de Año Nuevo.
Responder Con Cita
  #2  
Antiguo Hace 3 Semanas
Avatar de Caminante
Caminante Caminante is offline
Miembro
 
Registrado: Oct 2010
Ubicación: Lima - Peru
Posts: 272
Poder: 8
Caminante Va camino a la fama
Hola y felices fiestas solo dar mi punto de vista.

Creo que el campo Total no deberia formar parte de la tabla ya que es un valor que se calcula a partir de los otros dos. Yo dejaria solo esos dos campos (Cantidad y precio) y cuando necesite el Total solo lanzar una consulta mas o menos asi:

Código SQL [-]
Select Cantidad, Precio,  cantidad *  precio as Total from tabla ....

De esa manera el valor se calcularia automaticamente.

Espero sea util

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
  #3  
Antiguo Hace 3 Semanas
viverosjosem viverosjosem is offline
Registrado
 
Registrado: Dec 2017
Posts: 9
Poder: 0
viverosjosem Va por buen camino
Hola Caminante.
Entiendo lo que me comentas. Pero en una comanda el detalle que puede contener varias lineas, debe ir totalizado por linea. Entiendo que esta forma planteada por ti, me podria servir para totalizar al final de la comanda. pero como digo por cada linea impresa esta debe estar totalizada.

por ejemplo: SELECT Descripcion, cantidad, precio, total FROM COMANDA WHERE NumeroMesa = NN., Al final de la comanda me parece bien poder totalizar todo con este metodo.

Aprecio la ayuda, pero de todas maneras me interesa saber como podria grabar el total. Asi podre entender y ocupar el procedimiento en alguna otra situacion de similares caracteristicas.

Alguna otra opcion?

Saludos y gracias nuevamente.
Responder Con Cita
  #4  
Antiguo Hace 3 Semanas
viverosjosem viverosjosem is offline
Registrado
 
Registrado: Dec 2017
Posts: 9
Poder: 0
viverosjosem Va por buen camino
Caminante.
Tenias razon. luego de analizar lo que me comentaste. aplique tu ejemplo y funciono mejor de lo esperado.

Muy agradecido.

Saludos.
Responder Con Cita
  #5  
Antiguo Hace 3 Semanas
WHILENOTEOF WHILENOTEOF is offline
Miembro
 
Registrado: Mar 2008
Posts: 119
Poder: 10
WHILENOTEOF Va por buen camino
Efectivamente si trabajas con Total como un campo calculado, te puede funcionar y no hace falta que lo tengas actualizado. A nivel de línea de "comanda" lo puedes obtener con cantidad * precio, y a nivel de toda la "comanda" lo puedes obtener con sum(cantidad * precio). De todas formas revisa el código que has puesto, porque te pasa lo mismo que en el anterior mensaje, te salta ese error porque el campo Total, no lo tienes definido como parámetro en la consulta (ni falta que hace, podíamos decir).

Otro recurso que puedes utilizar para este tipo de situaciones en Firebird, es definir el campo TOTAL en la tabla, y mantenerlo actualizado en un trigger cuando cambian los campos cantidad o precio.

¡Feliz año nuevo a todos/as¡
Responder Con Cita
  #6  
Antiguo Hace 2 Semanas
viverosjosem viverosjosem is offline
Registrado
 
Registrado: Dec 2017
Posts: 9
Poder: 0
viverosjosem Va por buen camino
Talking

Hola Whilenoteof.
Se que el error es similar a la consulta anterior. Hice todas las convinaciones que se me ocurrieron pero no logre nada. Con la ayuda de "Caminante", logre resolver el problema tal como tu lo indicas. Pero aun me queda la inquietud, de como deberia hacerlo si quisiera almacenar en la base de datos el resultado de multiplicar dos campos y almacenarlos en un tercero. Alguna idea?..

El problema puntual lo resolvi con la ayuda de "Caminante", que es la misma solucion que tu me das. que claramente es la correcta para este caso. Pero aun asi quisiera saber si es posible grabar el resultado de la operacion de dos campos de la base de datos en un tercer campo. (Es un procedimiento que podria ser requerido para otro tipo de operaciones).

Saludos.

Gracias "Whilenoteof", y "Caminante", por su tiempo.

Feliz Año.
Responder Con Cita
  #7  
Antiguo Hace 2 Semanas
Avatar de ecfisa
ecfisa ecfisa is offline
Moderador
 
Registrado: Dec 2005
Ubicación: Tres Arroyos, Argentina
Posts: 9.906
Poder: 28
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 behold
Hola.
Cita:
Empezado por viverosjosem Ver Mensaje
.... Pero aun asi quisiera saber si es posible grabar el resultado de la operacion de dos campos de la base de datos en un tercer campo. ...
En Firebird no es necesario que ese tercer campo exista fìsicamente, podes crear campos calculados mediante la declaración COMPUTED BY, ej.:
Código SQL [-]
CREATE TABLE UNA_TABLA (
    ID        INTEGER NOT NULL,
    CANTIDAD  INTEGER NOT NULL,
    PRECIO    NUMERIC(18,2) NOT NULL,
    TOTAL     COMPUTED BY (CANTIDAD * PRECIO),
    VALOR_IVA   ...
);
...
Código SQL [-]
ALTER TABLE UNA_TABLA ADD MONTO_IVA COMPUTED BY (PRECIO * 0.21)
, etc.

Podes usar esas columnas con las cláusulas SELECT, WHERE, ORDER BY y, a partir de Firebird 2.0, hasta podes indexarlas.

Saludos
__________________
Daniel Didriksen

Guía de estilo - Uso de las etiquetas - La otra guía de estilo ....
Responder Con Cita
  #8  
Antiguo Hace 2 Semanas
viverosjosem viverosjosem is offline
Registrado
 
Registrado: Dec 2017
Posts: 9
Poder: 0
viverosjosem Va por buen camino
Thumbs up

Hola Ecfisa.
Muy agradecido por tus comentarios. funciono de maravillas el comando "COMPUTED BY". Es lo que estaba buscando.

Un gran Club, grandes aportes, son geniales.

Nuevamente gracias a todos por su tiempo y aportes. Me han sido de gran ayuda en este nuevo emprendimiento.

Gracias A Eficsa, Whilenoteof, y Caminante. por ayuda y solucion a mis dudas.
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
Problemas con UPDATE golf2008 MySQL 5 04-11-2008 15:48:27
problemas con Update. sargento elias Firebird e Interbase 14 12-06-2008 19:30:16
problemas con el UPDATE huwabe78 SQL 7 30-11-2006 14:44:48
Problemas de con UPDATE jmlifi Varios 3 20-05-2005 22:59:42
Problemas con Update ramonibk MS SQL Server 2 01-09-2004 15:40:32


La franja horaria es GMT +2. Ahora son las 18:20:14.


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