FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Falla en dbExpress de Delphi 2007 con Firebird para campos BCD
Hola,
Tengo un problema con dbExpress, Firebird y Delphi 2007: Resulta que al usar Sum() en un Select, si la expresión dentro del Sum contiene un valor de Doble Precisión multiplicado por uno BCD, el dbExpress está reconociendolo como un campo Float; en lugar de un campo FmtBcd, que sería lo lógico dado que es el valor más grande. Por ejemplo, si tengo esto:
Donde UNDOBLE es DOUBLE PRECISION y UNOBCD es DECIMAL(18,2) , dbExpress me identifica el campo LASUMA como un DOUBLE PRECISION, o sea un TFloatField cuando debía ponerlo como un TFMTBCDField. Es de anotar que si uso Sum() sobre un campo BCD, dbExpress trabaja bien; es decir, en el ejemplo, si uso SUM(UNOBCD) si se genera en Delphi 2007 un TFMTBCDField (aunque, al igual que en campos simples) hay que ajustarle luego manualmente la propiedad Precision a 18). Dos preguntas : 1. De quién es la falla ?. De el dbExpress como tal ?. Del driver dbExpress que estoy usando para Firebird ?, o del propio Firebird ?. Pensaría que es el driver ya que el que uso es el que viene con Delphi y ese no está certificado; pero, no estoy seguro. 2. Que puede hacerse ?. Tengo la opción de cambiar el algoritmo; pero, sería ineficiente y además muy problemático porque ese tipo de situaciones me son comunes en el desarrollo que estoy haciendo. |
#2
|
||||
|
||||
¿Has probado haciendo un 'cast'?
Código:
Select cast( Sum(UNDOBLE * UNOBCD) as tipoquequieras) LASUMA From TABLAC |
#3
|
|||
|
|||
Muchas Gracias. Funciona; pero ..
Hola Casimiro,
Muchas gracias por la sugerencia. La probé y efectivamente funciona; pero, hay dos puntos que me preocupan. 1. Sigue la duda de donde está el error, o la deficiencia. Ya que un CAST no debería ser necesario. Lo lógico es convertir automáticamente a la precisión más alta soportada. 2. Me preocupa un poco el tema de la portabilidad. El CAST está incluído en el SQL Standard; así que por ese lado no debería haber problemas. El DECIMAL también está en el standard; pero, la implementación es la que me preocupa, ya que no sé si en otros motores un BCD de 18 dígitos con 2 decimales es implementado con el tipo DECIMAL. Me explico mejor: El comando, para mis propósitos queda: SELECT CAST (Sum(UNDOBLE * UNOBCD) AS DECIMAL(18,2)) FROM MITABLA El caso es que mi estrategia de portabilidad siempre opera con la premisa de que mi programa corre con cualquier motor SQL sin necesidad de hacer cambios en el mismo, tan solo en el script de creación de la Base de Datos; o a lo sumo, en situaciones muy especiales, con algún cambio mínimo al programa. Si el tipo de dato en el CAST toca cambiarlo, dado que hay muchos queries de ese estilo, enfrentaría un cambio mayor que para mis propósitos es inaceptable. |
#4
|
||||
|
||||
La verdad es que en eso no puedo ayudarte, creo que deberías echar un vistazo a las especificaciones de cada uno de los motores sql que piensas usar para comprobarlo.
|
#5
|
|||
|
|||
Gracias. POdría ser cualquie SQL-92
Cita:
De todas formas muchas gracias. El problema es que no se que motores se usarán en algún momento. La idea es que teoricamente pueda ser cualquier motor que soporte SQL-92 |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
DB2 9.7 en Linux con dbExpress para Delphi 2007. Funciona bien ? | rolandoj | Conexión con bases de datos | 0 | 26-01-2010 13:57:02 |
cual es la mejor opcion para conectar delphi 2007 con firebird 2 | hibero | Conexión con bases de datos | 16 | 27-10-2008 03:32:01 |
driver dbxdb230.dll para delphi 2007 en dbexpress | kokud | Conexión con bases de datos | 2 | 24-04-2008 14:59:21 |
Delphi 2007 + dbExpress + MySQL | totote | Conexión con bases de datos | 2 | 28-12-2007 14:09:20 |
Firebird + DBExpress + Delphi 2007 | diegofhernando | Conexión con bases de datos | 9 | 31-08-2007 01:19:27 |
|