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)
-   -   Nuevamente problemas con UPDATE SQL (https://www.clubdelphi.com/foros/showthread.php?t=92691)

viverosjosem 01-01-2018 00:39:29

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.

Caminante 01-01-2018 00:54:00

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

viverosjosem 01-01-2018 04:11:41

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.

viverosjosem 01-01-2018 06:11:22

Caminante.
Tenias razon. luego de analizar lo que me comentaste. aplique tu ejemplo y funciono mejor de lo esperado.

Muy agradecido.

Saludos.

WHILENOTEOF 01-01-2018 14:19:15

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¡

viverosjosem 01-01-2018 23:05:31

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.

ecfisa 02-01-2018 00:29:13

Hola.
Cita:

Empezado por viverosjosem (Mensaje 523857)
.... 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 :)

viverosjosem 02-01-2018 05:48:02

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. ^\||/^\||/^\||/


La franja horaria es GMT +2. Ahora son las 17:47:58.

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