PDA

Ver la Versión Completa : como me ubico en la posicion de un registro buscado en un tsdbgrid


Ricsato
26-02-2005, 20:50:50
Hola, me gustaria que alguien me pudiera ayudar respecto a como mostrar la informacion en un renglon de un tsdbgrid.

tengo un query (QDetalle) y un datasource (DSDetalle) donde tengo la informacion que muestra mi componente tsdbgrid, en mi primer columna, tengo mi codigo de producto que seria mi llave primaria, entonces cuando tecleo un codigo de producto que ya existe hago la siguiente instruccion:

If QDetalle.locate('Pro_Codigo', vlpcodigo, [locaseinsensitive]) then
....

con esta instruccion el apuntador del grid se va a hacia donde esta el registro que introduje y ahi se posiciona, pero el problema es cuando son muchos registros que no se ven en una sola pantalla, este apuntador se va hasta el inicio (por ejemplo) y en mi pantalla yo sigo viendo mi ultimo registro en donde estaba tecleando el codigo y no puedo ver hasta donde se fue el apuntador, hasta que lo busque con el boton avance de pagina.

La pregunta es, como puedo hacerle para que cuando se vaya el apuntador del grid a posicionarse a la ubicacion de un codigo que este repetido, pueda tambien moverse mi pantalla y mostrarme los datos de ese renglon, sin tener que ir yo a buscar hasta donde se fue mi apuntador?

De antemano, gracias por sus opiniones.

Saludos desde Mexicali, B.C., Mexico.
Ricardo.

Lepe
26-02-2005, 22:55:58
El tsGrid no lo conozco, pero mira si tiene una proiedad o método llamado:

- MakeVisible, MakeSelectionVisible
- TopRow

Suerte.

Ricsato
27-02-2005, 02:50:22
Hola, fijate que este componente no tiene ninguna propiedad o metodo make, si trae la propiedad TopRow, pero no funciono a lo que ando buscando.
gracias.

Sick boy
27-02-2005, 09:56:23
Hola, fijate que este componente no tiene ninguna propiedad o metodo make, si trae la propiedad TopRow, pero no funciono a lo que ando buscando.

Ummm, yo tampoco conozco ese grid, pero si tiene una propiedad TopRow, y no hace lo que se espera, para que sirve ese TopRow???

Yo creo que toprow si funciona, pero quizas no le estas pasando el valor correcto. Tienes que pasarle el valor (Longint) de la primera fila que quieres mostrar.

Mira la ayuda acerca de TopRow, creo que te sera util.
Y comprueba tambien la ayuda de la propiedad RecNo de los TDataset.

Y debajo de esto:
If QDetalle.locate('Pro_Codigo', vlpcodigo, [locaseinsensitive]) then

Prueba a poner esto:
tsdbgrid.toprow:= QDetalle.dataset.recno;

Ricsato
28-02-2005, 19:16:53
Hola, hice lo que me indicaste, poniendo esto:
tsdbgrid.toprow:= QDetalle.dataset.recno;

pero me marca error en el datset, dice que es deconocido, lo cambie a esto:
tsdbgrid.toprow:= QDetalle.DataSource.DataSet.RecNo;
pero me marca un desbordamiento de memoria y que ese modulo no esta en memoria.

Encontre esta instruccion:
dbgDetalle.MoveBy(-50);
donde el numero del parentesis indica las posiciones a regresarse en el tsdbgrid, y funciona con ese numero fijo!!, ahora el problema es como saber en que posicion esta mi apuntador, con la siguiente instruccion:

Qdetalle.RecNo;

se supone que me regresa un entero con el numero de la posicion de mi registro, pero no me explico por que siempre me regresa un -1, alguien sabe por que? o si existe otra forma de como saber en que posicion se encuentra mi apuntador en la tabla?

lo que estoy haciendo es esto:

If QDetalle.locate('Pro_Codigo', vlpcodigo, [locaseinsensitive]) then
dbgDetalle.MoveBy(Qdetalle.RecNo);

pero como me regresa un -1 el Qdetalle.Recno, solo me avanza una posicion hacia atras y mi apuntador se encuentra en otra parte.

ejecuto aparte Qdetalle.RecNo; para ver que numero muestra, y siempre me trae un -1, siendo que tengo 187 registros.

Gracias por su ayuda.
Saludos.

Sick boy
01-03-2005, 09:45:23
Hola,

Sigo sin saber que grid utilizas :(, ni tampoco se que es dbgdetalle ??

Hola, hice lo que me indicaste, poniendo esto:
tsdbgrid.toprow:= QDetalle.dataset.recno;

pero me marca error en el datset, dice que es deconocido, lo cambie a esto:
tsdbgrid.toprow:= QDetalle.DataSource.DataSet.RecNo;
pero me marca un desbordamiento de memoria y que ese modulo no esta en memoria.

Sigo pensando que toprow es lo mas apropiado, has probado a poner ???tsdbgrid.toprow:=15 (u otro valor)

Tendras un datasource que enlaza el query con el grid, verdad??
Pues utiliza:
datasource.dataset.recno;
en lugar de
query.recno;

Yo nunca uso locate, asi que no se porque no cambia el recno de tu query, quizas alguien más pueda ayudarte en eso.

Saludos

Lepe
01-03-2005, 11:17:04
Recno funciona en tablas paradox, En IB, Firebird, no está implementada esa propiedad, por eso devuelve -1 siempre.

Si necesitas conocer el número de filas, tienes que hacer un sql con count(*) y el mismo ORDER BY.

He mirado los fuentes y veo que las propiedades Col y Row, las tiene comentadas en la seccion Published, podrías quitarles los comentarios y recompilar los fuentes.

teniendo esas 2 propiedades sería facil hacer lo que pides. Aunque no sé si el componente se desestabilizará.

Saludos

Sick boy
01-03-2005, 12:56:25
Pensaba que eran tablas de paradox !!!!

Si necesitas conocer el número de filas, tienes que hacer un sql con count(*) y el mismo ORDER BY.
Creo que no necesita conocer el numero de filas, sino en que fila esta en ese momento.
Si se tratase de ir al ultimo registro, un query.last (ojo, si estas en una red y la cantidad de datos es grande esto seria un desastre) seria suficiente.

Hay otra forma de obtener las propiedades col y row sin recompilar las fuentes.

Precisamente ayer estuve leyendo este articulo de Ian:
http://www.marteens.com/trick48.htm

.....Por desgracia, no de forma directa. Si se tratase de un TDrawGrid o un TStringGrid podríamos calcular el número de fila y columna de la celda que se encuentra bajo el ratón. Tratándose de un TDBGrid, en cambio, no existen métodos públicos (al menos que yo conozca) que identifiquen el registro que se está mostrando en determinada fila. Por suerte existe un truco que, combinando varios métodos protegidos de TDBGrid permiten seleccionar una fila dada partiendo de unas coordenadas del ratón. Primero tenemos que ganar acceso a la sección protegida de TDBGrid, y la forma indicada consiste en definir una clase en la misma unidad donde programaremos la función de localización:

type
TGridHack = class(TDBGrid);

Existe una regla en Delphi que permite el acceso a la sección protegido de cualquier clase definida dentro de la misma unidad. TDBGrid está definida en otra unidad, pero nuestro invento, TGridHack, tiene la misma estructura que su ancestro y sí compartirá unidad con nuestro código. Por lo tanto, tenemos acceso a sus declaraciones protegidas, que lógicamente son las mismas heredades de TDBGrid, su ancestro inmediato.

Bueno, yo no lo he utilizado para el ejemplo que indican en esa web, más bien lo que buscaba era otra propiedad, pero funcionaba bien y sencillo.

Saludos

Lepe
02-03-2005, 09:04:21
Hay otra forma de obtener las propiedades col y row sin recompilar las fuentes.


Hombre, creo que es cuestion de gustos, yo prefiero tener 1 solo componente bueno en la paleta de componentes, que tener el TsmDBGrid y el TsmGridHack.

Cuando andas con prisas, es mejor tener 1 solo componente ;)

Saludos

Sick boy
03-03-2005, 12:38:54
Hombre, creo que es cuestion de gustos, yo prefiero tener 1 solo componente bueno en la paleta de componentes, que tener el TsmDBGrid y el TsmGridHack.

Sigo sin saber que es un TsmDBGrid.

Yo he utilizado el truco anterior para conocer las propiedas row y col, y no he necesitado añadir otro componente a la paleta, ya que todo se puede hacer desde el codigo.

Por otro lado, dudo que exista "1 solo componente bueno", unos iran mejor para unas cosas y otros para otras.

Lepe
04-03-2005, 11:06:23
Sick Boy dale una visual a scalabium web (www.scalabium.com) en el apartado de Freeware, tienes el componenete en cuestion.

[...] y no he necesitado añadir otro componente a la paleta
De acuerdo, es una opción, pero cada vez que necesites saber la columna y la fila (en otros programas) tendrás que crear la función de localización para cada programa, o copiar el código.

La modificación a realizar es quitar 2 comentarios en los fuentes e instalarlo de nuevo. (otra cosa es que funcione.... que no lo he probado). Si está comentado ... por algo será.

Saludos.