Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   Invalid data type for multiplication in dialect 3 (https://www.clubdelphi.com/foros/showthread.php?t=95335)

amadis 14-08-2021 01:25:09

Invalid data type for multiplication in dialect 3
 
Que tal compañeros.

Tengo un problema redondeando una multiplicación.

Intento redondear un precio que es calculado en la misma query.

Código Delphi [-]
QAct.SQL.Append('UPDATE articulos');
QAct.SQL.Append('SET');
QAct.SQL.Append(' articulos.precio = round((articulos.costo * : P1) * articulos.iva,0)');
Qact.ParamByName('P1').AsFloat := factor+strtofloat(edporcentage.text)/100;
 // el parametro arroja el factor decimal para multiplicar la ganancia, por ej para 45%, arroja 1,45

Necesito que el precio quede redondeado, pero al poner el Round tengo el error

Invalid data type for multiplication in dialect 3

En la tabla tengo alojados el costo del articulo, y el porcentaje de iva y luego por el parámetro agrego el margen de ganancia que también se almacena en la tabla.

De momento estoy ejecutando 2 querys seguidas, en una misma transacción, en la segunda hago solo ROUND(L1,0).

PepCat 14-08-2021 09:52:30

Hola,

Creo que el problema puede estar en el espacio que hay después de los dos puntos del parameto P1.
Es decir el codigo deberia ser:

Código Delphi [-]
QAct.SQL.Append(' articulos.precio = round((articulos.costo * :P1) * articulos.iva,0)');
                                                              ^^^
                                                              |||

amadis 14-08-2021 16:08:00

Hola, ese espacio lo puse aqui porque sino aparecía una Carita, El nombre del parametro no tiene espacio entre el dos puntos

Casimiro Notevi 14-08-2021 17:03:01

¿edporcentage.text tiene un valor correcto? comas, puntos, etc.

amadis 14-08-2021 17:10:26

edporcentage.text puede ser un entero o decimal con coma.

Siempre valores validos.

Igual el problema es el PARAMETRO EN SI, y no lo que le asigno.

Si yo le asigno un numero cualquiera al parámetro da el mismo error.

Si multiplico por otro campo de tabla no hay drama

Casimiro Notevi 14-08-2021 17:26:57

Pon el (:P1) entre paréntesis, por probar.

amadis 14-08-2021 17:33:19

No, el parentesis no me hace diferencia.

Lo que si me funciona, es si en lugar de usar un parámetro ahí, pongo una VARIABLE con el valor que le asigno al parámetro.

Pero meter una variable me implica trabajo extra, cortar el string sql concatenarlo e la variable.
Y luego asegurarme bien de que los números tengan como coma decimal el punto y no la coma, ya que sino da otro error.

amadis 14-08-2021 17:35:01

¿y no existe alguna forma se asignar dos veces el mismo campo?
He probado y me da error, pero quizá hay otra forma que permita luego de asignar el valor al campo precio, en otra instrucción redondearlo.??

Casimiro Notevi 14-08-2021 19:53:30

¿Qué componentes estás usando? Me refiero al QAct.

amadis 14-08-2021 20:24:49

QAct es un FDQuery (Firedac)

Casimiro Notevi 14-08-2021 21:53:00

He hecho una sencilla prueba y me ha funcionado normalmente, pero con IBX, no tengo firedac.
Código SQL [-]
update EJEMPLO3
set sueldo = round((sueldo*(:P1))*id,0);

manelb 16-08-2021 14:44:59

Hola Amadis y saludos a todos...

Pues yo he hecho la prueba con Firedac y tambien me falla, pero el mensaje es diferente:
expression evaluation not supported

A continuación lo he intentado directamente desde IBExpert con la siguiente sentencia:
Código SQL [-]
UPDATE tbl_articulos SET
precio_coste_Medio =  round( (precio_coste_Medio * (:f))  ,0)
where id=1;
y obtengo el mismo error.

Después de investigar un poco, parece que Firebird "desconfía" del tipo de parámetro, y solo va a permitir la sentencia si aseguramos su tipo, por lo que la sentencia siguiente me ha funcionado sin problemas:
Código SQL [-]
UPDATE tbl_articulos SET
precio_coste_Medio =  round( (precio_coste_Medio * cast(:f as numeric(8,2))  ) ,0 )
where id=1;

De todas formas, me desconcierta que con IBX funcione.

Saludos ...

amadis 17-08-2021 14:52:16

Resuelto
 
Muchisimas Gracias, ese CAST era la solución...


La franja horaria es GMT +2. Ahora son las 02:40:20.

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