PDA

Ver la Versión Completa : Invalid data type for multiplication in dialect 3


amadis
14-08-2021, 01:25:09
Que tal compañeros.

Tengo un problema redondeando una multiplicación.

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


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:


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.
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:

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:

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
Muchisimas Gracias, ese CAST era la solución...