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)
-   -   problema de posicionamiento en tabla (https://www.clubdelphi.com/foros/showthread.php?t=88846)

viaraSOFT.com 12-08-2015 23:48:45

problema de posicionamiento en tabla
 
Hola amigos estoy implementando zeoslib en Delphi XE y resulta que tengo una tabla con códigos numéricos del 1 al 16, mi problema es que cuando hago tabla.first para posicionarme al inicio y empezar a recorrerla, el componente zeos por alguna razón que no entiendo se posiciona en el segundo registro de la tabla, después accesa el primero, después el tercero y así sucesivamente. Ejemplo: cuando despliego la lista de códigos me queda: 2,1,3,4,5,6,... en vez de 1,2,3,4,5,6,...

Ya he intentando re-indexar y hacer vacum a dicha tabla en el pgAdmin pero igual me la recorre de esta forma tan extraña. Anteriormente usaba el componente de PostgresDAC de MicroOlap y no tenía ese problema. Agradezco cualquier ayuda que me puedan brindar!

Casimiro Notevi 12-08-2015 23:52:18

¿Pero qué sql estás ejecutando?
Tú decides el orden. En tu caso será algo así:
Código SQL [-]
select * from mitabla order by codigo

viaraSOFT.com 13-08-2015 03:17:41

Gracias Casimiro! yo estoy recorriendo la tabla con un ciclo porque no estoy utlizando un dblist si no un objeto lista corriente. El código es sencillo:
Código Delphi [-]
tabla.First;
while not (tabla.EOF) do begin
     lista.Items.Add(tabla.FieldByName(codig).AsString);
     tabla.Next;
end;

AgustinOrtu 13-08-2015 04:09:59

Definitivamente coincido con Casimiro, el problema es el orden
Como insertaste los registros?
Como los recuperas? En el codigo de ejemplo que es "Tabla"?

Hablas de un objeto lista corriente y no un, ¿ dblist ?

Que es un "objeto lista corriente"? Yo interprete TList, o TList<T>
Como se llena este objeto lista corriente? como insertas los registros?

elaguna 13-08-2015 04:57:17

Qué tal.

¿Has probado con un TZQuery?

Casimiro Notevi 13-08-2015 09:25:08

Quitas el componente tabla y pones un componente query. En su sentencia select pones lo que te he escrito antes, y aprovechando tu código, quedaría así:
Código Delphi [-]
query.First;
while not (query.EOF) do begin
     lista.Items.Add(query.FieldByName(codig).AsString);
     query.Next;
end;

Cita:

Empezado por viaraSOFT.com (Mensaje 495445)
Gracias Casimiro! yo estoy recorriendo la tabla con un ciclo porque no estoy utlizando un dblist si no un objeto lista corriente. El código es sencillo:
tabla.First;
while not (tabla.EOF) do begin
lista.Items.Add(tabla.FieldByName(codig).AsString);
tabla.Next;
end;


Lepe 13-08-2015 17:28:26

Para completar un poco...En Bases de datos Sqls, Al hacer un "tabla.insert", no se guarda al final de tabla. Esto se hace por eficiencia, no tiene sentido irse al final de la tabla para insertar y después volver a donde se estaba.
Se busca un hueco de un registro eliminado (por ejemplo) y se inserta allí mismo.


En Paradox y demás BBDD de escritorio, el "tabla.Append" sí lo inserta al final de la tabla. El "tabla.insert" lo hace donde pueda.

Te recomiendo usar un tZQuery de esos con el sql : "select codig from tabla order by codig" y que hagas una rutina que usarás más de lo que crees, sobre todo si la aplicación es multiusuario.
Código Delphi [-]
procedure CampoALista (campo, tabla : string; Lista : TStrings);
begin 
   {crear el zquery, asignar el transaction y base de datos}
   zqry.sql.text := Format ('select %s from %s order by %s', [campo, tabla, campo]);
   zqry.Open() ; // ya está en el primer registro.
   while not zqry.eof() do begin 
      lista.Add(zqry.FieldbyName(campo). asstring));
      zqry.next();
   end;
   zqry.Free();
end;

Ahora la puedes llamar:
Código Delphi [-]
Form1.combobox1.items.Clear;
CampoALista( 'codig', 'nombretabla', Form1.combobox1.items )

Saludos

viaraSOFT.com 13-08-2015 17:35:09

3 Archivos Adjunto(s)
Muchas gracias amigos ya logré resolver el problema mediante la propiedad "sortedfields" del TZTable, le establecí el campo codigo y autompáticamente me seteó la propiedad "IndexFieldNames" = codigo Asc y listo ahora si me despliega el TList debidamente ordenado, gracias por la ayuda! Adjunto unas imágenes para ilustrar el problema y la solución usando esta propiedad por si a alguno algún se topa con el mismo inconveniente.
Archivo Adjunto 3234 Archivo Adjunto 3232 Archivo Adjunto 3233

Casimiro Notevi 13-08-2015 17:55:43

Cita:

Empezado por Lepe (Mensaje 495477)
Saludos

:)
> Doctor, doctor, todo el mundo me ignora.
>> ¡Que pase el siguiente!


La franja horaria es GMT +2. Ahora son las 01:19:45.

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