Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-08-2021
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 19
amadis Va por buen camino
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).

Última edición por amadis fecha: 14-08-2021 a las 01:29:02.
Responder Con Cita
  #2  
Antiguo 14-08-2021
PepCat PepCat is offline
Miembro
 
Registrado: mar 2017
Posts: 96
Poder: 8
PepCat Va por buen camino
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)');
                                                              ^^^
                                                              |||
Responder Con Cita
  #3  
Antiguo 14-08-2021
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 19
amadis Va por buen camino
Hola, ese espacio lo puse aqui porque sino aparecía una Carita, El nombre del parametro no tiene espacio entre el dos puntos
Responder Con Cita
  #4  
Antiguo 14-08-2021
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿edporcentage.text tiene un valor correcto? comas, puntos, etc.
Responder Con Cita
  #5  
Antiguo 14-08-2021
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 19
amadis Va por buen camino
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
Responder Con Cita
  #6  
Antiguo 14-08-2021
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Pon el (:P1) entre paréntesis, por probar.
Responder Con Cita
  #7  
Antiguo 14-08-2021
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 19
amadis Va por buen camino
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.
Responder Con Cita
  #8  
Antiguo 14-08-2021
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 19
amadis Va por buen camino
¿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.??
Responder Con Cita
  #9  
Antiguo 14-08-2021
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
¿Qué componentes estás usando? Me refiero al QAct.
Responder Con Cita
  #10  
Antiguo 14-08-2021
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 19
amadis Va por buen camino
QAct es un FDQuery (Firedac)
Responder Con Cita
  #11  
Antiguo 14-08-2021
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
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);
Responder Con Cita
  #12  
Antiguo 16-08-2021
manelb manelb is offline
Miembro
 
Registrado: mar 2017
Posts: 280
Poder: 8
manelb Va por buen camino
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 ...
Responder Con Cita
  #13  
Antiguo 17-08-2021
amadis amadis is offline
Miembro
 
Registrado: may 2005
Ubicación: San José, Colón, Entre Ríos, Argentina
Posts: 315
Poder: 19
amadis Va por buen camino
Resuelto

Muchisimas Gracias, ese CAST era la solución...
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
old format or invalid type library delphi heiverp Varios 4 10-03-2016 18:02:50
Error Unkown SQL Data Type(0) mRoman Conexión con bases de datos 3 11-10-2012 14:14:39
Invalid Field type (Blob) mrnovice Conexión con bases de datos 5 08-01-2010 16:45:39
Error: Class EoleException, old format or invalid type..... gaby_stars Varios 0 26-06-2008 02:18:07
Domain ó Standard data Type? jwmoreira Firebird e Interbase 2 01-03-2007 22:36:35


La franja horaria es GMT +2. Ahora son las 22:47: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