Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Internet (https://www.clubdelphi.com/foros/forumdisplay.php?f=3)
-   -   Apuntar a la posición 1 (https://www.clubdelphi.com/foros/showthread.php?t=59602)

Almd 02-09-2008 07:32:01

Apuntar a la posición 1
 
Buenas.
Tengo un grid que muestra una serie de datos ordenados por posición. Varios de esos datos tienen asignada la posición 0, y el resto pues 1,2,3 y así sucesivamente.
Lo que quiero hacer es que, al abrir el grid y mostrarme los datos, que en vez de sacarme todos los que tengan 0 y luego el resto, que se vea directamente el de la primera posición teniendo que subir en la barra para ver los que tengan la posición 0.
Espero haberme explicado bien. Salu2.

tcp_ip_es 02-09-2008 12:03:04

Si es un dbgrid con que hagas un locate del campo posición en el dataset que estes utilizando te bastaría.

Si es un stringgrid tendrías que recorrer la columna posición hasta encontrar el 1.

Código Delphi [-]
      
with stringgrid1 do
begin 
 for J:= 0 to RowCount - 1 do
  if cells[1,J] = 1 then
  begin 
   col:=1;
   row:=J; 
  end; 
end;

Almd 02-09-2008 12:20:32

Es un TQuery si es a eso a lo que te refieres. Este es el código:

Código Delphi [-]
procedure NombreTabla.MostrarCamposTabla;
begin
With Query do
Begin
Close;
Sql.Clear;
Sql.Add ('SELECT * FROM TABLAUSUARIOS WHERE NOMBRETABLA = 'TABLAX' ORDER BY POSICION');
try
Open;
Except
End;
end;
end;

Una vez tengo la select, entiendo que después de Open debo introducir el código, ¿el que me has puesto valdría?

coso 02-09-2008 12:24:08

tal como te dice tcp_ip, echale un vistazo en la ayuda de delphi al metodo locate. saludos.

Almd 02-09-2008 12:27:26

Perdona si, es en un dbgrid.

Echaré un vistazo al método locate. Gracias.

Caro 02-09-2008 13:18:19

Hola, nose si estoy entendiendo bien pero el locate no le soluciona su problema, según a lo que entiendo el tiene varios registros que tienen como posición 0, otros varios con 1 y asi sucesivamente, creo que el quiere mostrar solo el primer registro que tenga posición 0 y el primero con 1 y el primero con 2, y de alguna forma cuando este digamos en el de posición 0 se muestren todos los demas registros que tengan la posición 0. Si estoy mal me corriges Almd y explicas mas tu pregunta.

Saluditos

coso 02-09-2008 13:39:26

por lo q yo entendi, era colocarse en el de posicion primera, y si se quieren ver los anteriores con posicion cero subir mediante la barra. Con un locate buscando posicion uno, siempre que este ordenado por posicion, ya se soluciona no? si no es el caso y se quiere el ultimo con posicion cero, buscas el 1 y luego haces un prior.

coso 02-09-2008 13:42:51

si es lo que dice caro, entonces tendras que hacer el select mediante group by, y, por ejemplo, rehacer el select sin el group by cuando se clickee sobre un registro. Eso si, los campos q se muestren mediante el group by tendran q ser los comunes a todos los registros, pues si no te saldran varios grupos diferenciados.

Caro 02-09-2008 14:20:12

Cita:

Empezado por coso (Mensaje 311044)
por lo q yo entendi, era colocarse en el de posicion primera, y si se quieren ver los anteriores con posicion cero subir mediante la barra. Con un locate buscando posicion uno, siempre que este ordenado por posicion, ya se soluciona no?

Claro, si es así estoy de acuerdo ;), pero esta parte es la que me ha hecho ver de la forma que explique:

Cita:

Empezado por Almd (Mensaje 311005)
.................Varios de esos datos tienen asignada la posición 0, y el resto pues 1,2,3 y así sucesivamente.
Lo que quiero hacer es que, al abrir el grid y mostrarme los datos, que en vez de sacarme todos los que tengan 0 y luego el resto, que se vea directamente el de la primera posición teniendo que subir en la barra para ver los que tengan la posición 0.

Ahora, si fuera así mostrar solo el primero que tenga 0 o 1, creo que en la consulta se debería usar un distinct sobre el campo posición y luego seguir con lo que explica coso en el anterior mensaje.

Otra forma también sería haciendo una relación maestro detalle sobre la misma tabla. En el que haga de maestro estaría la consulta con el distinct y despues todo lo demas que se tiene que hacer para la relación. Así tenemos en un DBGrid los primeros de cada posición y cuando se vaya moviendo en ese grid, en el otro se va mostrando el resto que hay para esa posición en la que se encuentre.

Saluditos

Almd 02-09-2008 14:20:40

Veamos, tengo varios registros con posicion 0, y el resto son consecutivos o sea, 1, 2, 3, etc. quedando así;

0 - Registro
0 - Registro
0 - Registro
1 - Registro
2 - Registro
3 - Registro...

Mi intención es que el cursor se sitúe en la posición 1 quedando las 0 ocultas y no quedando mas remedio que subir mediante la barra lateral para poder verlas.
Espero haberme explicado!! je je. Salu2 y gracias a to2.

tcp_ip_es 02-09-2008 14:55:07

Pues entonces es con el locate, esta claro :D

Código Delphi [-]

TuQuery.Locate('posicion',1,[]);

Almd 02-09-2008 15:56:35

Efectivamente, tal y como lo has puesto funciona, aunque ahora tengo otras dos dudas.
La primera es que me apunta a la primera posición, pero no lo coloca en el grid, es decir, que la flecha sí sale situada en la posición 1 pero se siguen viendo las posiciones con 0.
La segunda supongo que tendré que investigar por mi parte ya que, al incluir el código que me has puesto, curiosamente emplea un procedimiento que tengo en el programa que consiste en incluir las filas que faltan de una base de datos, a la que estoy utilizando. No sé si será que mezcla algún otro query que haya por ahí, ¿qué opinais?

tcp_ip_es 02-09-2008 16:11:39

logicamente te coloca el cursor en la posición que encuentra pero no te hace el scroll hasta ocultar los 0. imaginate que tienes el dbgrid con 10 lineas visibles con los siguientes datos: 5 ceros y 1,2 y 3 , en este caso se verían todas las líneas y te sobrarían "3 espacios", no creo que puedas correr el scroll hacia abajo si no tienes los datos suficientes, si no quieres que se vean los 0 yo los excluiría mediante la consulta.

El Locate no debería ejecutarte ningún procedimiento que tengas por ahi a no ser que lo coloques en un evento que lance el locate creo que lanza el beforescroll y el afterscroll aunque no estoy muy seguro en estos momentos....

coso 02-09-2008 16:12:42

Cita:

el locate creo que lanza el beforescroll y el afterscroll aunque no estoy muy seguro en estos momentos
si, y el datachange tambien del dataset asociado.

Almd 03-09-2008 08:13:40

Cita:

Empezado por tcp_ip_es (Mensaje 311094)
logicamente te coloca el cursor en la posición que encuentra pero no te hace el scroll hasta ocultar los 0. imaginate que tienes el dbgrid con 10 lineas visibles con los siguientes datos: 5 ceros y 1,2 y 3 , en este caso se verían todas las líneas y te sobrarían "3 espacios", no creo que puedas correr el scroll hacia abajo si no tienes los datos suficientes, si no quieres que se vean los 0 yo los excluiría mediante la consulta.

Tengo los 0's suficientes para que hiciera el scroll, por eso lo preguntaba, pero tal vez me esté complicando demasiado je je.
¿Entonces podría usar scroll para que apuntara a la primera posición?

tcp_ip_es 03-09-2008 08:25:55

una solucion "cutre" sería que vieses cuantos ceros te deja por arriba cuando haces el locate una vez hecho esto ya sabes que el locate tiene que ser de la primera posición + esa cantidad, de esa manera el cursor a lo mejor se te colocaría en otra posición pero el primero del dbgrid sería el 1. Una vez hecho esto puedes hacer otro locate consecutivo y buscar el uno de nuevo... no se si me he explicado :D

Código Delphi [-]
query.locate('posicion',1+Cantidaddecerosqueahoraveoporencima,[]);
query.locate('posicion',1,[]);
pruebalo y me cuentas ;)

Almd 03-09-2008 10:41:11

Cita:

Empezado por tcp_ip_es (Mensaje 311370)
una solucion "cutre" sería que vieses cuantos ceros te deja por arriba cuando haces el locate una vez hecho esto ya sabes que el locate tiene que ser de la primera posición + esa cantidad, de esa manera el cursor a lo mejor se te colocaría en otra posición pero el primero del dbgrid sería el 1. Una vez hecho esto puedes hacer otro locate consecutivo y buscar el uno de nuevo... no se si me he explicado :D

Código Delphi [-]
query.locate('posicion',1+Cantidaddecerosqueahoraveoporencima,[]);
query.locate('posicion',1,[]);
pruebalo y me cuentas ;)


Lo probé y me temo que no funciona :(

Almd 03-09-2008 11:30:11

¿Qué mas formas hay de apuntar a la posición 1 que no sea mediante locate?

tcp_ip_es 03-09-2008 11:59:19

con el next y el prior te puedes mover por el dataset en este caso tu query.

Código Delphi [-]
q1.open;
q1.first;
while not(q1.eof) and (q1.fieldbyname('posicion').value <> 1) do
begin
q1.next;
end;

Con esto te lo localiza pero sigues viendo los ceros, luego puedes ajustar haciendo más next para que desaparezcan (tb es un poco cutre :p )

Almd 03-09-2008 12:31:40

También funciona , pero sigo teniendo el problema de que inserta los campos de otra tabla :(. No se si realizar un nuevo query y llamarlo de otra forma... :confused:


La franja horaria es GMT +2. Ahora son las 19:43:59.

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