Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   GetFieldNames no trabaja apropiadamente bajo dbExpress?,o el problema será Firebird? (https://www.clubdelphi.com/foros/showthread.php?t=54892)

rolandoj 02-04-2008 17:36:48

GetFieldNames no trabaja apropiadamente bajo dbExpress?,o el problema será Firebird?
 
Hola,

Alguién sabe como obtener, usando dbExpress en Delphi 2007, la lista de campos de una tabla, exactamente en el mismo orden en que ellos están definidos en la tabla ?.

Veamos, el método GetFieldNames devuelve la lista de campos de la tabla; pero, no necesariamente en el orden en el cual están definidos. En mi caso, el orden es vital porque se trata de un algoritmo que llena una tabla creando dinámicamente los queries requeridos (Insert, Update, etc) y cuyos datos provienen de otra aplicación, la cual los manda en el el orden en el que los campos fueron creados en la Base de Datos. Esta operación se aplica sobre numerosas tablas.

Ahora bien, esto funcionaba perfectamente bajo BDE; pero con dbExpress y Firebird se está presentando el problema. No me queda claro si es un error en el método a nivel de dbExpress o si el problema es el driver a Firebird?.

La solución debe funcionar independientemente del motor de Base de Datos que se esté usando

Alguién puede aportar una solución ?

ContraVeneno 02-04-2008 18:18:00

Nunca he utilizado Firebird, pero en SQL Server hay una tabla que se llama sysobjects y otra que se llama syscolumns. Que son tablas que almacenan toda la información referente a campos y tablas en toda la base de datos. Tal vez Firebird tenga algo similar y solo habría que hacer una consulta a esas tablas.

rolandoj 03-04-2008 01:06:59

Gracias; pero la idea es una solución general
 
Cita:

Empezado por ContraVeneno (Mensaje 277050)
Nunca he utilizado Firebird, pero en SQL Server hay una tabla que se llama sysobjects y otra que se llama syscolumns. Que son tablas que almacenan toda la información referente a campos y tablas en toda la base de datos. Tal vez Firebird tenga algo similar y solo habría que hacer una consulta a esas tablas.

Hola,

Muchas gracias por el aporte; pero, necesito una solución general; es decir, algo que no dependa del motor de base de datos que se esté usando.

En últimas, la falla de driver Firebird no sería tan crítica porque simplemente cambiaría de motor y no tendría que codificar nada extra; pero, la preocupación grande la tengo es porque si el problema es con dbExpress se perdería la capacidad de trabajar rutinas genéricas y tocaría codificar individualmente para más de 70 tablas, una locura !!.

Muchos saludos

rolandoj 03-04-2008 05:20:20

Confirmado. Es un problema de dbExpress
 
Hola,

Después de hacer un seguimiento al código de implementación de dbExpress he podido determinar la causa del problema y es definitivamente un error de dbExpress, no del driver. Inicialmente, la lista de campos es obtenida correctamente; pero, antes de devolverla a la rutina que llama, el código de dbExpress relaiza un ordenamiento. Supongo que lo hicieron para satisfacer otros servicios de la rutina; pero no se percataron que en el caso de los campos de la tabla, el oden debe ser el que existe en la Base de Datos.

Voy a verificar si no hay ningún reporte en CodeGear y si no lo hay se los enviaré.

Lo bueno para mí es que como el código original funciona puedo escribir un parche.

Al González 03-04-2008 08:02:52

¡Hola Rolando!

Hace tiempo que no te dejabas ver.

Normalmente, al hablar de un método, es muy aconsejable indicar la clase a la cual pertenece. No me queda claro si te refieres a TSQLConnection.GetFieldNames, a TDataSet.GetFieldNames o a TFields.GetFieldNames. Supongo que te refieres al primero.

Voy a echarle una mirada rápida (en Delphi 7)...

...Así, de bote pronto, pareciera un asunto del controlador (driver) de dbExpress.

Podrías ilustrarme en qué lugar del código está ese ordenamiento que mencionas. Siempre es de mi interés todo lo que tenga que ver con la VCL, y últimamente, por trabajar en Magia Data, me interesa todo lo relacionado a dbExpress y otros componentes de acceso a datos.

Un meta-abrazo.

Al González. :)

keyboy 03-04-2008 08:23:09

Yo también supongo que se refiere a TSQLConnection. La revisión en Delphi 7 te va a llevar a pensar que Rolando se ha equivocado, pero no, en Delphi 2007, por extraño que parezca han puesto

Código Delphi [-]
ISList:= TWideStringList.Create;
try
  try
    ISList.BeginUpdate;
    ISList.Duplicates := dupIgnore;
    ISList.CaseSensitive := False;
    while not DataSet.Eof do
    begin
      ISList.Add(TPlatformField.AsWideString(NameField));
      DataSet.Next;
    end;
    ISList.Sorted := True;
  finally
    ISList.EndUpdate;
  end;
  try
    List.BeginUpdate;
    List.Clear;
    List.AddStrings(ISList);
  finally
    List.EndUpdate;
  end;
finally
  ISList.Free;
end;

cosa que realmente no entiendo el porqué. ISList es un objeto temporal y sus elementos se asignan inmediatamente después a la lista original List que se proporciona a GetFieldNames, de manera que no alcanzo a ver cuál podría ser la necesidad de ordenar la lista.

Bye

Al González 03-04-2008 08:36:12

Vaya, muy interesante ilustración Keyboy (me gustaría llamarte por tu nombre si no te importara en algún momento hacerlo público).

Tal parece que este es uno de los nuevos cambios en dbExpress.

A mí también me extraña el por qué ordenar la lista de nombres.

Quizá Andreano Lanusse pueda respondernos a esta duda. Alguna razón debieron tener.

Saludos.

Al González. :)

rolandoj 03-04-2008 16:47:27

Efectivamente, es el error que muestra Keyboy
 
Hola,

Veo que han interpretado muy correctamente lo que descubrí.

Ciertamente, el problema es esa línea de

Código Delphi [-]
ISList.Sorted := True;

Como dije, busqué en CodeGear y no encontré reporte del problema por lo que he procedido a crear uno, incluso sugiriendo la solución.

Pienso que el problema pudo ocurrir porque la rutina que contiene a esa línea es utilizada para otros servicios. En general, lo que hace es recuperar información de esquema, así que supongo que lo necesitaban para algún otro servicio y no tuvieron en cuenta el caso en que se solicitan los campos en el orden en que aparezcan en la base de datos.

De todas formas, no es una explicación muy satisfactoria porque lo más lógico es devolver las cosas en el orden natural de las mismas. Si luego se requieren en orden alfabético la rutina que las llama solo necesita hacer el "sort". En cambio, como están las cosas, no hay forma de obtener los datos en el orden natural.

En mi caso, lo que estoy haciendo es basarme en el código de ellos para escribir un parche, porque, a decir verdad, no le tengo mucha confianza a corregir sqlExpr y recompilar.

Al, he estado super ocupado con el proyecto y por eso he escrito muy poco, usualmente solo cuando tengo un problema. Ahora estoy en la etapa final y empiezo a tener más tiempo. No he olvidado la explicación detallada de por qué la mejor solución al problema con el BDE era reemplazarlo directamente. Espero escribir pronto al respecto

Muchos saludos


La franja horaria es GMT +2. Ahora son las 17:24:49.

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