Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Conexión con bases de datos
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Conexión con bases de datos

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 22-09-2007
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Unhappy 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":

Código SQL [-]
Select Sum(AREAESPACIO) From PLANTAFISICA
Where (CODIGOENCUES = :ACode)

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:

Código Delphi [-]
Function TForm1.GetAreaPredioOtrosPisosDbX(ACode:String)ouble;
Const
     ELERROR = 'Error en %s por "%s"';
Begin
     GetAreaPredioOtrosPisosDbX := 0;
     Try
        With SQLAreaOtrPisoDBx Do Begin
             Active := False;
             If Not Prepared Then Begin
                Prepared := True;
             End;
             Params[0].AsString := ACode;
             Try
                Active := True;
                If (Not IsEmpty) And (Not Fields[0].IsNull) Then Begin
                   GetAreaPredioOtrosPisosDbX := Fields[0].AsFloat;
                End;
             Finally
                Active := False;
             End;
        End;
     Except
        On E:Exception Do Begin
           raise Exception.CreateFmt(ELERROR,[ACode,E.Message]);
        End;
     End;
End;

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:

Código SQL [-]
Select Sum(AREAESPACIO) ELAREA From PLANTAFISICA
Where (CODIGOENCUES = :ACode)

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.
Responder Con Cita
  #2  
Antiguo 28-09-2007
rolandoj rolandoj is offline
Miembro
 
Registrado: abr 2007
Posts: 395
Poder: 18
rolandoj Va por buen camino
Smile 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.
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
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


La franja horaria es GMT +2. Ahora son las 02:43:30.


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