Controlar en un grid la posición de un registro

8,456 views
Skip to first unread message

ultraton500

unread,
Nov 12, 2010, 4:18:21 PM11/12/10
to Comunidad de Visual Foxpro en Español
Qué tal compañeros, aunque se trate de una consulta de un nivel de
detalle bastante alto, en una de esas alguien sabe algo o tiene alguna
ideal al respecto.
Me interesa saber si en un grid es posible posicionar un registro
determinado en una fila determinada. Obviamente no con el scroll sino
programaticamente.
Un ejémplo sería ubicar el registro nro. 250 en la primer fila del
grid.
Desde ya les agradezco cualquier dato.
Saludos,
Javier.

Walter R. Ojeda Valiente

unread,
Nov 12, 2010, 4:26:38 PM11/12/10
to publice...@googlegroups.com
Hola Javier

La forma más sencilla sería agregarle un campo a tu cursor, indexar por ese campo y hacer un Refresh() de la grilla.

Al campo agregado le pondrías los valores 1, 2, 3, 4, etc., según correspondan al orden que deseas mostrar.

Saludos.

Walter.

Luis Maria Guayan

unread,
Nov 12, 2010, 4:51:33 PM11/12/10
to publice...@googlegroups.com
Esto no funciona?

GO 250 IN (ThisForm.Grid1.RecordSource)
ThisForm.Grid1.Refresh()


Luis María Guayán
Tucumán, Argentina
_________________________
http://www.PortalFox.com
Nada corre como un zorro
_________________________

Yvan GMAIL

unread,
Nov 12, 2010, 4:53:01 PM11/12/10
to publice...@googlegroups.com
Has probado con
ThisFORM.grilla.ActivateCell(fila,columna)???


-----Mensaje original-----
De: publice...@googlegroups.com
[mailto:publice...@googlegroups.com] En nombre de ultraton500
Enviado el: Viernes, 12 de Noviembre de 2010 04:18 p.m.
Para: Comunidad de Visual Foxpro en Español
Asunto: [vfp] Controlar en un grid la posición de un registro

ultraton500

unread,
Nov 12, 2010, 6:07:45 PM11/12/10
to Comunidad de Visual Foxpro en Español
Gracias por sus rápidas respuestas, quizás por querer hacerla corta me
faltó claridad en la explicación.
No es que quiera ubicar un reigstro en una tabla y mostrarlo en un
grid.
Lo propuesto por Yvan se acerca bastante pero no es presisamente lo
que quiero conseguir, lo que hace ActivateCell es reubicar la celda
activa y lo que busco es reubicar el contenido del la grid.
Por ej., si tengo un grid de 20 filas para mostrar una tabla de 1000
registros quisiera ver el registro 110 en la 1er. fila, es decir, que
el grid muestre del 110 al 130.
Si ubico el puntero y hago un refresh, el registro apuntado queda al
medio y es lo que quisiera controlar.
Alguna idea de qué poder probar?
Saludos,
Javier.

william zuluaga

unread,
Nov 12, 2010, 9:05:01 PM11/12/10
to publice...@googlegroups.com
adicional prueba moviendose en los registros de la tabla relacionada al grid, el automaticamente te muestra el registro en el que este parada la tabla.


De: Luis Maria Guayan <luis...@portalfox.com>
Para: publice...@googlegroups.com
Enviado: vie,12 noviembre, 2010 16:51
Asunto: Re: [vfp] Controlar en un grid la posición de un registro

ultraton500

unread,
Nov 12, 2010, 11:44:27 PM11/12/10
to Comunidad de Visual Foxpro en Español
Hola William, sucede tal como indicas pero no entiendo cómo podría
mostrar un reg. determinado en el top del grid de esa manera.
Cómo hago para visualizar los reg. que van del 5 al 25? (sin filtrar..
claro está)
Ojalá me equivoque pero creo que no hay forma de controlar eso.
De todas formas gracias por tu aporte.
Saludos,
Javier.

On 12 nov, 20:05, william zuluaga <w2k2sys...@yahoo.es> wrote:
> adicional prueba moviendose en los registros de la tabla relacionada al grid, el
> automaticamente te muestra el registro en el que este parada la tabla.
>
> ________________________________
> De: Luis Maria Guayan <luisma...@portalfox.com>
> Para: publice...@googlegroups.com
> Enviado: vie,12 noviembre, 2010 16:51
> Asunto: Re: [vfp] Controlar en un grid la posición de un registro
>
> Esto no funciona?
>
> GO 250 IN (ThisForm.Grid1.RecordSource)
> ThisForm.Grid1.Refresh()
>
> Luis María Guayán
> Tucumán, Argentina
> _________________________http://www.PortalFox.com

Walter R. Ojeda Valiente

unread,
Nov 13, 2010, 1:05:04 AM11/13/10
to publice...@googlegroups.com
Ya te lo dije, es simple, agrégale un campo a tu tabla y ponle en ese campo los números de orden de aparición.

Saludos.

Walter.

ultraton500

unread,
Nov 13, 2010, 1:18:37 AM11/13/10
to Comunidad de Visual Foxpro en Español
Hola Walter, parece que estamos trasnochando Já!!
La única forma que se me ocurre para conseguir lo que quiero
utilizando ese campo es aplicando un filtro y la idea es no filtrar.
Perdón si no entiendo la idea, podrías explicarla un poquitín mas?
Saludos cordiales,
Javier.

Walter R. Ojeda Valiente

unread,
Nov 13, 2010, 2:24:21 AM11/13/10
to publice...@googlegroups.com
Hola Javier

No, no tienes que filtrar, debes usar un índice nomás.

Supongamos que tienes 20.000 registros. Entonces al campo que has agregado (llamémosle CampoPosicion le colocas el valor 99999)

REPLACE ALL CAMPOPOSICION WITH 99999

Luego haces un índice

INDEX ON STR(CAMPOPOSICION) TO INDICE1

Luego al registro que quieres que esté en primer lugar le pones el número 1.

REPLACE CAMPOPOSICION WITH 1

Al registro que quieres que esté en segundo lugar le pones el número 2.

REPLACE CAMPOPOSICION WITH 2

Y así sucesivamente.

Para que aparezcan en ese orden, refrescas la grilla

THISFORM.GRILLA1.REFRESH()

Al finalizar, vuelves a dejar todos los campos con su valor inicial.

REPLACE ALL CAMPOPOSICION WITH 99999

Saludos.

Walter.

ultraton500

unread,
Nov 13, 2010, 3:14:02 AM11/13/10
to Comunidad de Visual Foxpro en Español
Hola Walter, ahora entiendo y sin duda es una manera efectiva de
lograrlo.
En mi caso debo respetar el orden de la lista para que continúe siendo
recorrida con las teclas de flechas y Avpág/Repág en el orden rubro-
subrubro-nombre.
No fué por comodidad que no expliqué acerca de las restricciones y
detalles sino para evitar dificultar la interpretación ya que tengo un
quilombo de cosas mezcladas en esto. Pero estoy mas que satisfecho con
tu aporte y el de los otros compañeros, asi que Walter, Luis María,
Yvan y Winlliam les agradezco el tiempo que han dedicado a ayudarme.
Saludos cordiales,
Javier.

Pedro Orlando Cardoza Padilla

unread,
Nov 13, 2010, 10:04:23 AM11/13/10
to publice...@googlegroups.com

declara una variable publica
En el evento Afterrowchange del Grid  pon esto
variable=Recno()
ahora ya tienes el numero de registro en la variable y haz lo que quieras con el refiriendote a la variable
Por ejemplo
Delete for Recno()=Variable
goto Variable
Delete



ultraton500

unread,
Nov 13, 2010, 10:49:05 PM11/13/10
to Comunidad de Visual Foxpro en Español
Gracias por la sugerencia Pedro, pero no entiendo cómo puedo de esa
manera mover el contenido del grid hacia arriba o hacia abajo.
Por ej. en una tabla de clientes ordenados por nombre y mostrados en
un grid, cómo ubico el primer nombre con "H" en la 1er. fila del grid
pero sin filtrar ni reordenar. Quisiera hacer, mediante programación,
lo mismo que se haría clickeando n veces una de las flechas de scroll
hasta que el registro se posicione en 1er. lugar.
Saludos cordiales,
Javier.

On 13 nov, 09:04, Pedro Orlando Cardoza Padilla <pcardoz...@yahoo.es>
wrote:

Jose Antonio

unread,
Nov 15, 2010, 7:28:32 AM11/15/10
to publice...@googlegroups.com
Javier, intenta lo siguiente, una vez generado el cursor que vas a
asignar al grid, haces

goto bottom
goto 250 (si este es el registro en que te quieres posicionar)


y mira si queda como querias.

un saludo.

-----------
Jose A. Blasco
Zaragoza - España

extremo

unread,
Nov 15, 2010, 7:45:33 AM11/15/10
to Comunidad de Visual Foxpro en Español
y porque no quieres usar set filter?... eso te evitaria muchos
problemas.

Bendiciones

ultraton500

unread,
Nov 15, 2010, 12:59:04 PM11/15/10
to Comunidad de Visual Foxpro en Español
Hola extremo, porque los registros dejarían de ser "recorribles" ya
sea con la rueda del mouse, con el scroll o directamente moviendo la
fila activa hacia arriba y hacia abajo.
El caso es que tengo al costado del grid dos botones para saltar
alfabéticamente respecto de la inicial del nombre seleccionado
actualmente y se dan casos en los que al avanzar o retroceder el
puntero queda en la última o anteúltima fila del grid y quise imitar
el mismo comportamiento que tienen las anclas en html (tal como lo
hace la ayuda .chm de vfp en "Mensajes de error ordenados
alfabéticamente").
Pero bueno, aclaro que es nada mas un detalle y puedo prescindir de
totalmente de él.
Gracias por tu interés.
Saludos,
Javier.

Fabricio

unread,
Nov 15, 2010, 8:06:15 PM11/15/10
to Comunidad de Visual Foxpro en Español
Hola UltraTon500

Para hacer lo que quieres, tú mismo lo has dicho, después de haber
hecho el Seek, puedes hacer Scroll en el grid las líneas que quieras,
por ejemplo, fijate cuantas filas quedan arriba del registro buscado,
y ese es el número de scrooll que debes hacer, hazlo de esta manera:

For nI=1 To 9
ThisForm.Grid1.DoScroll(1)
Next

Sustituye el 9 por la cantidad de líneas que deseas avanzar, el método
DoScroll avanza el puntero dentro del grid hacia la dirección que tu
le indiques, en este caso avanza hacia abajo.

Debes tener en cuenta algunas cositas:

1.- Si seleccionas dos veces la misma letra, es muy probable que el
registro avance más de lo deseado.
Puedes resolverlo haciando un Go Top antes del Seek.
2.- Si seleccionas una letra por decir la "A" y sobre ella no hay más
registros, el primer registro quedará fuera de la pantalla.
Puedes resolverlo haciendo un Go Top, fijate en que Recno()
estás, has el seek, fijate en que Recno() estás, si es igual al
anterior entonces no hagas los Scroll.
3.- Supongamos que tu grid necesita 10 Scrool, el grupo de la letra
"A" tiene sólo 5 registros, seleccionas la letra "B" y haces 10
Scroll, resulta que el primer registro avanzará 5 líneas más de las
necesarias.

Bueno, esto es lo que buscabas, solo debes hacer las pruebas para
resolver estas situaciones y luego las compartes con nosotros.

Saludos

Fabricio

Jose Antonio

unread,
Nov 16, 2010, 4:47:35 AM11/16/10
to publice...@googlegroups.com
Ultraton500, ¿has intentado lo que te he dicho en mi anterior mensaje?
¿no te ha funcionado?

Te recuerdo, si sabes el recno() del registro en que te quieres
posicionar, tras haber asignado el cursor al grid, sobre dicho cursor
o tabla haces

goto bottom
goto miregistro

A mi me funciona así.

Un saludo.

ultraton500

unread,
Nov 16, 2010, 1:00:57 PM11/16/10
to Comunidad de Visual Foxpro en Español
Hola Fabricio, lo que propones es lo que estoy necesitando, probé el
bucle y funciona perfectamente, pero no sé cuántas veces hacer el
DOSCROLL porque estoy teniendo problemas para saber cuál es la fila
activa. Se supone que con Thisform.grid1.ActiveRow debería obtenerlo
pero me devuelve 0 aunque el grid tenga el foco.
De resolver este detalle, el objetivo estaría mas que cumplido de
acuerdo a las expectativas.
Estoy muy agradecido por tu ayuda.
Saludos,
Javier.

ultraton500

unread,
Nov 16, 2010, 1:18:29 PM11/16/10
to Comunidad de Visual Foxpro en Español
Perdón José Antonio, sin querer me he salteado tu post. Acabo de
probar lo que propones pero no se ven cambios aún habiendo hecho
refresh y/o setfocus.
Igualmente agradezco tu aporte.
Saludos,
Javier.

Fabricio

unread,
Nov 16, 2010, 6:26:17 PM11/16/10
to Comunidad de Visual Foxpro en Español
Hola de nuevo UltraTon500

Haciendo algunas pruebas he llegado a esta solución para lo que
quieres hacer:

1.- Haces el Seek, Locate o Busqueda a como quieras
2.- Si lo encuentra:
ThisForm.LockScreen= .T.
With ThisForm.Grid1
.SetFocus
For nI=.RelativeRow-1 To 1 Step -1
.DoScroll(1)
Next
EndWith
ThisForm.LockScreen= .F.
3.- Si no lo encuentra no hagas nada, sólo manda un mensaje si es
necesario.

Explico, primero bloqueas la pantalla para que no presente los
cambios, luego le haces el Focus al grid para que ActiveRow tome el
valor correcto, después recorres el grid hasta que ActiveRow sea 1,
que es lo que tú quieres, por último desbloqueas la pantalla. Listo.

Saludos

Fabricio

Jose Antonio

unread,
Nov 17, 2010, 6:02:52 AM11/17/10
to publice...@googlegroups.com
Hola UltraTon500

Tal vez no explique bien lo que hago yo.
En mi caso, el cursor asociado al grid se llama "clie", y una vez que
sé el "recno()" del registro en que me quiero posicionar, hago lo
siguiente:

thisform.grid1.RecordSource = ""
*
SELECT clie
GOTO bottom
GOTO 45 && aquí va el valor del recno() en que quiero posicionarme
*
thisform.grid1.RecordSource = 'clie'
thisform.grid1.Refresh


Lo he usado en diferentes ocasiones, y me funciona bien.

Un saludo.

ultraton500

unread,
Nov 17, 2010, 10:33:23 AM11/17/10
to Comunidad de Visual Foxpro en Español
Hola Fabricio, funcionó maravillosamente, estoy mas que agradecido. No
tenía tenía conocimiento de ese comando (RelativeRow) y como para ver
qué pasaba probé reemplazarlo por ActiveRow en su lugar pero no es lo
mismo.
Muchas gracias una vez mas por tu dedicación para darme una mano.
Te mando un cordial saludo.
Javier.

ultraton500

unread,
Nov 17, 2010, 11:06:24 AM11/17/10
to Comunidad de Visual Foxpro en Español
Cómo estás José Antonio! Probé también lo que me sugerís y funciona de
manera muy efectiva.
Cuando lo probé anteriormente lo hice tal cual lo hacés pero sin la
reasignación del RecordSource y por eso no me funcionó. En cuanto a
esto, me inquieta un poco el hecho de realizar un RecordSource="" y
RecordSource="tabla" por cada vez que el usuario clickee un botón
siendo que éste puede pasarse un buen rato haciendolo constantemente.
Puntualmente, y por desconocer del tema, me preocupa que pueda llegar
a ser nocivo para la tabla, aunque tratandose de una tabla en memoria
seguramente no pase nada. Esto me resulta interesante para saber si
podría aplicar esta solución sin problemas cuando la fuente de datos
del grid sea una tabla física.
Realmente aprecio y valoro mucho tu actitud y la mano que me has dado
y me han dado el resto de los compañeros.
Saludos cordiales José Antonio,
Javier.

Jose Antonio

unread,
Nov 17, 2010, 11:29:12 AM11/17/10
to publice...@googlegroups.com
Al hacer el Recordsource="", realmente no estas tocando para nada la
tabla o cursor que utilizas, solo le estas anulando al grid la
referencia a dicha tabla o cursor. Esto es muy rápido, y es la misma
técnica que se emplea cuando quieres volver a generar el cursor con un
comando "Select SQL" que esté asignado a un grid, es decir, se
blanquea el Recordsource, se genera el cursor, y se vuelve a asignar
al Recordsource.

Si no lo blanquearas, al ejecutar el comando "Select SQL", habría un
momento que el cursor no existiría y toda la distribución de columnas
y campos del grid, se desharía.

ultraton500

unread,
Nov 17, 2010, 1:01:09 PM11/17/10
to Comunidad de Visual Foxpro en Español
Ok, entendido, a lo de blanquear el grid antes de volver a generar el
cursor lamentablemente lo he tenido que aprender padeciendolo pero no
sabía cómo funcionaba la relación grid-tabla. Gracias por la
explicación, me deja mas tranquilo ahora.
Saludos,
Javier.
Reply all
Reply to author
Forward
0 new messages