FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Extraño error de Select Sum() en TSQLQuery de dbExpress
Hola,
Me encontré con un extraño error en dbExpress que, aunque lo solucioné, me preocupa bastante porque no debería ocurrir en una tecnología con la madurez que debería tener dbExpress. Corresponde a casos muy comunes; así que su corrección y detección implica un esfuerzo muy grande cuando se está migrando. Por ello quiero comentarselos. La historia es así: El siguiente comando SQL me está generando el error "Field Name missing":
Para analizar el error, hice una pequeña aplicación solo con un componente TSQLConnection y uno TSQLQuery, a fin de descartar cualquier problema generado por algún error previo en la aplicación original. Esta es la rutina que ejecuta el query:
Las consideraciones son las siguientes: 1. Uso Delphi 2007 Update 1 con Interbase y estoy migrando una aplicación BDE a dbExpress. Es la primera vez que uso dbExpress 2. Obviamente, la rutina trabaja perfectamente en Delphi 4 con BDE y también la probé en Delphi 2007 con BDE (lógicamente cambiando el Prepared := True por Prepare) 3. El DataType y el ParamType para el parámetro ACode están ajustados a ftString y ptInput 4. El DFM lo revisé internamente y está bien. 5. Si se intenta usar el editor de campos sobre el TSQlQuery, la opción Add All Fields genera el mismo error y la opción Add Fields no muestra ningún campo disponible 6. El Error se dispara en código al ejecutar Active := True 7. Si en lugar de usar Sum() se utiliza la función Count() el query trabaja bien. La solución que encontré fué darle un nombre en el Query a la función Sum(); es decir, el siguiente comando trabaja bien:
INFORMACIÓN ADICIONAL Lo he rastreado dentro del código Delphi, por falta de tiempo solo hasta donde he podido, y me he encontrado con lo siguiente: En el programa ejemplo, el depurador, al usar F7 (paso a paso) sobre Active me conduce a la unidad dbXCommon; pero la rutina SetActive que implementa la parte de escritura de la propiedad Active, en la jerarquía de TSQLQuery, según los fuentes Delphi, es la del ancestro TDataSet; o sea que no está redefinida para dbExpress (solo algunas rutinas internas de ella). Vale anotar que en este caso el depurador sigue una ruta que no muestra donde se produce el error mencionado Lo anterior pone en evidencia otro error porque la jerarquía indicada la verifique en la versión original de la rutina. Me explicó: He desarrollado una emulación de BDE con componentes descendientes de los homólogos dbExpress; el componente original que uso en la rutina no es el del ejemplo de prueba sino un TQuery (descendiente de TSQLQuery) y al rastrear ahí su propiedad Active el depurador conduce efectivamente al SetActive de TDataset. Ahí muestra que el error se genera porque la variable FFieldName del objeto TField está quedando en blanco. INFORMACIÓN EN BORLAND Hay dos reportes en Borland sobre "Field Name missing" que relatan casos muy parecidos: http://qc.borland.com/wc/qcmain.aspx?d=49237 http://qc.borland.com/wc/qcmain.aspx?d=14435 Claramente, el fondo del problema es el mismo; sin embargo, hay diferencias sutiles con el que describo. Lo más preocupante es que el reporte 14435 está desde Delphi 7 Última edición por rolandoj fecha: 22-09-2007 a las 19:53:19. |
#2
|
|||
|
|||
Gracias; pero no es con campos persistentes
Hola waly2k1,
Muchas gracias por tú observacion en http://www.clubdelphi.com/foros/show...t=48255&page=2; pero el problema no es con campos persistentes; de hecho, en este caso no los uso. Además como verás en mi codigo siempre tengo la política de poner Active a False antes del Active en True. El problema es que cuando dbExpress analiza el "Select Sum(AREAESPACIO) From PLANTAFISICA" crea automáticamente un campo para Sum(AREAESPACIO); pero el nombre de dicho campo le queda vacío y por eso se genera el mensaje de error. Como puedes ver en mi nota original, la solución fué darle un nombre al resultado de la función Sum(AREAESPACIO). Por otra parte, te comento que la aplicación como tal ya está migrada de BDE a dbExpress y estamos en fase de verificar que no haya errores ocultos; pero de todas formas sigo muy interesado en este error. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Xml, DBExpress y TSQLQuery | Gran Cacique | Conexión con bases de datos | 1 | 03-09-2007 18:37:47 |
(DBExpress)la función IsIndexField del TSQLQuery siempre me devuelve falso | amezeta32 | Conexión con bases de datos | 0 | 17-08-2006 00:20:46 |
error extraño | gilberto_1126 | Varios | 2 | 05-09-2004 01:01:01 |
Error Extraño | Esau | OOP | 5 | 19-11-2003 18:01:32 |
Comportamiento extraño de cds con dbExpress | mosorio | Varios | 0 | 01-09-2003 17:11:38 |
|