Reconstruir el ancho de columnas del grid despues de un borrado

2,351 views
Skip to first unread message

TheNewInquirer

unread,
Jan 25, 2012, 8:20:55 PM1/25/12
to Comunidad de Visual Foxpro en Español
Gracias a un tema donde alguien pregunto como evitar que un grid se
ponga "en blanco". Ahora entiendo que solo debo hacer esto después de
borrar:

Thisform.migrid.recordsource="nombredemitabla".

El problema, es que al "reconstruir el grid" las columnas pierden el
ancho que tenian anteriormente.

Sé que se podrían restablecer las propiedades del grid de forma
manual, pero.. existe una forma de "guardar las propiedades" del grid
antes del borrado (que abre, cierra y reindexa la tabla) y luego
volver a copiar dichas propiedades al recien abierto grid sin tanto
lio?..

O de plano, tengo que volver a crear la tabla con codigo cada vez que
tenga que borrar?...

Alguna otra forma de tratar este problema?... De manera rápida, claro.

Gracias anticipadas!

Walter R. Ojeda Valiente

unread,
Jan 25, 2012, 11:29:32 PM1/25/12
to publice...@googlegroups.com
La forma correcta es la siguiente:
- El RecordSource de tu grilla es una tabla temporal o vista (por ejemplo: Cursor1)
- Los datos los tienes en otra tabla (por ejemplo: MiTabla)
- Cuando quieres actualizar la grilla:
     a) ZAP de Cursor1
     b) Copias los registros de MiTabla que te interesan en Cursor1
     c) Refrescas la grilla

Así, nunca perderás la configuración de tu grilla porque siempre el RecordSource de la misma es Cursor1 y siempre se trata de la misma tabla temporal, no de dos tablas temporales con el mismo nombre que sería el caso si haces un nuevo SELECT

Saludos.

Walter.





> Date: Wed, 25 Jan 2012 17:20:55 -0800
> Subject: [vfp] Reconstruir el ancho de columnas del grid despues de un borrado
> From: fresass...@gmail.com
> To: publice...@googlegroups.com

Irlandes 1960

unread,
Jan 26, 2012, 6:50:26 AM1/26/12
to publice...@googlegroups.com
Antes de tocar la tabla que tenes en el recorsource de la grilla, tenes que liberarla, sino la grilla se borra.
Es decir, poner Thisform.Grdgral1.recordsource = ' '
Luego generar la nueva consulta, y después
Thisform.Grdgral1.recordsource = 'micursor'
Habitualmente trabajo con grillas que muestran el resultado de una consulta.
En ese caso la rutina sería algo asi como :

Thisform.Grdgral1.recordsource = ' '
select .... from ... into cursor micursor
with Thisform.Grdgral1
    .recordsource = 'micursor'
    .column1.controlsource = 'primercampo'
    .column2.controlsource = 'segundocampo'
    .refresh()
endwith

Esto mantiene las caracteristicas de ancho de columnas, títulos, y todos los etc que le hayas puesto a la grilla en tiempo de diseño.

Luis Maria Guayan

unread,
Jan 26, 2012, 8:19:55 AM1/26/12
to publice...@googlegroups.com
Lee este artículo de Andy Kramek en PortalFox que te ayudará a preservar tus Grids

-- Utilizar un Select seguro para preservar los grids --
http://www.portalfox.com/modules.php?op=modload&name=Sections&file=index&req=viewarticle&artid=69


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

TheNewInquirer

unread,
Jan 26, 2012, 9:58:44 AM1/26/12
to Comunidad de Visual Foxpro en Español
Ups!... Ya llevé el primer regaño jaja por estar usando aún la versión
6 de Visual Foxpro.

El artículo que menciona el maestro Luis María dice esto:

"Y sobre la cláusula READWRITE, si aun está utilizando una versión que
no la soporte, existe una forma para hacerlo; pero no lo diré porque
se debe haber Actualizado. No hay ninguna razón para no haberlo hecho
y sí muchísimas por las que debería - la principal es animar a
Microsoft para que continúe desarrollando VFP, por ejemplo ..."


http://www.portalfox.com/modules.php?op=modload&name=Sections&file=index&req=viewarticle&artid=69

Mi inquietud es esta: la versión 9 de fox puede leer "codigo viejo"
heredado de todas las versiones anteriores de Fox.

Por eso pensé: si en una máquina vieja, no puedo instalar VFP9, podré
instalar la versión 6 para labores de mantenimiento de la base de
datos, pero tal vez lo contrario no sea válido, es decir, instalar la
versión 6 en una máquina con W7 32 bits.

Mi duda es: VFP9 puede instalarse en cualquier versión de windows
hacia atrás: W98, W2000, NT, XP, Vista?...

Creo que lo pondré en un nuevo tema para ser más organizado, de todas
formas.

Carlos Miguel FARIAS

unread,
Jan 26, 2012, 2:44:20 PM1/26/12
to publice...@googlegroups.com
Ojo con versiones anteriores a vfp 9. Vfp 9 permite en las tablas, tipos de indices (binarios) y tipos de datos que vfp -8 no soportan, si haces mantenimiento con vfp mas viejo, puede que te de error o te malogre alguna tabla.
Lo de indices no me acuerdo bien si salio en vfp 9 o alguna antes, pero hay que tener cuidado con esas particularidades.
Además si la tabla tiene autoincrementales (version 8 y 9) una versión que no lo soporte, a lo mejor no tiene problemas al leer, pero si al agregar y por supuesto al mantener.
Saludos: Miguel, La Pampa (RA)

extremo

unread,
Jan 26, 2012, 2:52:45 PM1/26/12
to Comunidad de Visual Foxpro en Español
lo mas facil de implementar es lo que te dice Walter, de hecho yo
trabajo tal cual lo hace Walter.

Bendiciones


On 26 ene, 16:44, Carlos Miguel FARIAS <carlosmiguelfar...@gmail.com>
wrote:
> Ojo con versiones anteriores a vfp 9. Vfp 9 permite en las tablas, tipos de
> indices (binarios) y tipos de datos que vfp -8 no soportan, si haces
> mantenimiento con vfp mas viejo, puede que te de error o te malogre alguna
> tabla.
> Lo de indices no me acuerdo bien si salio en vfp 9 o alguna antes, pero hay
> que tener cuidado con esas particularidades.
> Además si la tabla tiene autoincrementales (version 8 y 9) una versión que
> no lo soporte, a lo mejor no tiene problemas al leer, pero si al agregar y
> por supuesto al mantener.
> Saludos: Miguel, La Pampa (RA)
>
> El 26 de enero de 2012 11:58, TheNewInquirer <fresassincr...@gmail.com>escribió:
>
>
>
> > Ups!... Ya llevé el primer regaño jaja por estar usando aún la versión
> > 6 de Visual Foxpro.
>
> > El artículo que menciona el maestro Luis María dice esto:
>
> > "Y sobre la cláusula READWRITE, si aun está utilizando una versión que
> > no la soporte, existe una forma para hacerlo; pero  no lo diré porque
> > se debe haber Actualizado. No hay ninguna razón para no haberlo hecho
> > y sí muchísimas por las que debería - la principal es animar a
> > Microsoft para que continúe desarrollando VFP, por ejemplo ..."
>
> >http://www.portalfox.com/modules.php?op=modload&name=Sections&file=in...
>
> > Mi inquietud es esta: la versión 9 de fox puede leer "codigo viejo"
> > heredado de todas las versiones anteriores de Fox.
>
> > Por eso pensé: si en una máquina vieja, no puedo instalar VFP9, podré
> > instalar la versión 6 para labores de mantenimiento de la base de
> > datos,  pero tal vez lo contrario no sea válido, es decir, instalar la
> > versión 6 en una máquina con W7 32 bits.
>
> > Mi duda es: VFP9 puede instalarse en cualquier versión de windows
> > hacia atrás: W98, W2000, NT, XP, Vista?...
>
> > Creo que lo pondré en un nuevo tema para ser más organizado, de todas
> > formas.- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -

Samuel SM-H

unread,
Jan 26, 2012, 3:14:21 PM1/26/12
to publice...@googlegroups.com
Que bueno, algo en comuún entre Extremo y Walter.

Nunca me a fallado esto:
grid.recordsource  = ''
  sentencia select ..... Into cursor CURGRILLA readwrite
grid.recordsource  = 'CURGRILLA'

y se respetan las propiedades de mi grilla, sin alterarse el diseño.

Saludos.

Norberto

unread,
Jan 26, 2012, 3:30:04 PM1/26/12
to Comunidad de Visual Foxpro en Español
Te recomiendo lo mismo que Luis Maria.
Si tenes VFP6 no te preocupes. Andy Kramek no quiso decirlo pero la
solucion es esta:

En vez de ....INTO CURSOR cReadOnly pone ..... INTO DBF cReadWrite
(Por supuesto el nombre del cursor lo decidis vos)

On 26 ene, 11:58, TheNewInquirer <fresassincr...@gmail.com> wrote:
> Ups!... Ya llevé el primer regaño jaja por estar usando aún la versión
> 6 de Visual Foxpro.
>
> El artículo que menciona el maestro Luis María dice esto:
>
> "Y sobre la cláusula READWRITE, si aun está utilizando una versión que
> no la soporte, existe una forma para hacerlo; pero  no lo diré porque
> se debe haber Actualizado. No hay ninguna razón para no haberlo hecho
> y sí muchísimas por las que debería - la principal es animar a
> Microsoft para que continúe desarrollando VFP, por ejemplo ..."
>
> http://www.portalfox.com/modules.php?op=modload&name=Sections&file=in...

Victor Espina

unread,
Jan 26, 2012, 3:57:35 PM1/26/12
to publice...@googlegroups.com
El problema con la solucion del INTO DBF es que:

a) Debes generar un archivo temporal que sea unico, para evitar el problema que se presentaria si dos usuarios distintos ejecutan ese codigo al mismo tiempo.

b) Tanto con la solucion del INTO DBF como con la tradicional solucion del DBF(), se presenta el problema de que si el cursor original contiene columnas cuyo nombre supere los 10 caracteres, estos se truncaran en el cursor final.

Una alternativa a estas dos soluciones es usar CREATE CURSOR.  Para mas informacion, mira esta entrada en mi blog:


Saludos

Victor Espina

Irlandes 1960

unread,
Jan 27, 2012, 8:26:28 AM1/27/12
to publice...@googlegroups.com
Lo que dice Victor es muy cierto, por eso yo pongo especial cuidado en no usar nombres de campos de mas de 10 caracteres en ningún lado.
Y lo de pisar el nombre de la tabla cuando usas la clausula into DBF lo tengo solucionado con una rutina a la que le paso el nombre del alias que quiero usar y me devuelve un path libre donde ubicarla (arranca con TEMP, luego TEMP1 y así sucesivamente hasta encontrar / crear un temp donde pueda alojar el dbf que necesito) 
Esto lo arme ya que la clausula readwrite no existía en las primeras versiones de VFP

TheNewInquirer

unread,
Jan 30, 2012, 10:36:19 AM1/30/12
to Comunidad de Visual Foxpro en Español
Leyendo más sobre el tema, encontré este artículo:

http://www.portalfox.com/index.php?name=News&file=article&sid=2331

Me parece que con esto podré resolverlo, (espero jeje)..

Me interesa mucho ese tema, ya que manejo "codigo para presentar otros
grids" al presionar una tecla de funcion como F8, o incluso para hacer
cálculos cuando el usuario presiona ciertas teclas.

Existe algun otro truco para "conservar" no solo el ancho de las
columnas del grid después de un borrado, sino todas sus propiedades,
métodos, etc. ...?

Saludos!

Luis Mata

unread,
Jan 30, 2012, 11:36:32 AM1/30/12
to publice...@googlegroups.com
AutoFit no ayuda?

-----Mensaje original-----
De: publice...@googlegroups.com
[mailto:publice...@googlegroups.com] En nombre de TheNewInquirer
Enviado el: lunes, 30 de enero de 2012 10:36 a.m.
Para: Comunidad de Visual Foxpro en Español
Asunto: [vfp] Re: Reconstruir el ancho de columnas del grid despues de un
borrado

Leyendo más sobre el tema, encontré este artículo:

Hugo Carlos Aguilar Zapata

unread,
Jan 30, 2012, 11:41:19 AM1/30/12
to publice...@googlegroups.com
yo lo hago asi,

en tiempo de diseño pongo el  grid con los anchos de columna, encabezados, formato de campos y modifico las siguientes propiedades:
RecordSourceType=4 ( Sentencia SQL )
RecordSource = "Select campo1, campo2, campo3 From Tabla where campox = filtro into cursor Cursor1"

Agrego un metodo estandar, generalmente con el nombre de LoadDetail que mando llamar cuando se requiera cambiar o actualizar los datos del grid como la entrada en un campo de texto, click en un boton, desplazamiento en otro grid, etc.
El codigo es algo como esto:
*** llamado del metodo
This.LoadDetail()
*** Metodo
With This
      .gridx.recordsource = "Select campo1, campo2, campo3 From Tabla where campox = filtro into cursor Cursor1"
endwith

Los datos se actualizan dependiendo de la clausula Where.

Hasta el momento no he tenido problemas con redimension de las columnas o sin datos a menos que no haya concidencias en el select en tiempo de ejecución

saludos

Walter R. Ojeda Valiente

unread,
Jan 30, 2012, 2:07:06 PM1/30/12
to publice...@googlegroups.com
Ya describí como hacerlo, busca mi respuesta para no estar repitiéndome.

Saludos.

Walter.



> Date: Mon, 30 Jan 2012 07:36:19 -0800
> Subject: [vfp] Re: Reconstruir el ancho de columnas del grid despues de un borrado
> From: fresass...@gmail.com
> To: publice...@googlegroups.com

TheNewInquirer

unread,
Feb 3, 2012, 10:25:58 AM2/3/12
to Comunidad de Visual Foxpro en Español
Gracias a todos!

Sigo sin poder lograr que al hacer un borrado las columnas "ocultas"
sigan ocultas y no se muestren en el grid.

En el evento LOAD, cargo los datos en mi grid. Cuando llega el
momento, solo "filtro los datos" de la tabla y muestro el grid con los
datos filtrados. (Esta tabla no es importante, solo me sirve de forma
temporal mientras grabo los datos).

El código para borrar una linea del grid con un boton de comando es:

REGACTUAL=RECNO()
Thisform.migrid.recordsource=''

SELECT 3
USE Tablaparapartidastemporales EXCLUSIVE

GOTO REGACTUAL

DELETE
PACK

IF BOF()

Thisform.Refresh()
Thisform.txtcapturanumerodecliente.setfocus()

ELSE
SKIP -1
ENDIF

WAIT WINDOW 'BORRANDO REGISTROS' NOWAIT
Thisform.migrid.recordsource="Tablaparapartidastemporales"
Thisform.migrid.Refresh()

En el botón GRABAR que guardará los datos hacia la tabla grande, deseo
enviar los datos a esa tabla con APPEND FROM y luego BORRAR la tabla o
los datos del grid.

Según las pruebas que he estado haciendo, el problema sigue siendo que
después de borrar, efectivamente ya no se modifica el ancho de las
columnas ni el código que hay en el text de algunas columnas como el
que llama a otro grid para "consultar y elegir" un producto con una
tecla de funcion como F8, pero al reconstruirse el grid, me aparecen
columnas ocultas de la tabla original en el grid con el consecuente
desorden.

Sé que puedo ir y físicamente modificar el orden de los campos de la
tabla para que me aparezcan en ese orden, pero no quisiera hacer esto
cada vez que voy a hacer un nuevo grid.

De preferencia, que sea una solución práctica y sencilla.

No quisiera entrar al sistema posteriormente y no entenderme a mi
mismo jeje

Gracias!



Yvan Carranza

unread,
Feb 3, 2012, 10:41:32 AM2/3/12
to publice...@googlegroups.com
NO UTILICES PACK..
al inicio pone set deleted off para que no salgan los borrados logicos.

Daniel Sánchez

unread,
Feb 5, 2012, 1:51:45 AM2/5/12
to publice...@googlegroups.com
Lo correcto seria que no uses el pack cada vez que borres un registro, y si aún así desearas usarlo, para el grid deberías antes que nada indicar el valor de tu recordsource de tu grid igualarlo a espacio en blanco

thisform.migrid.recordsource=[]

antes de hacer el famoso pack, y después de haber terminado de ejecutar el pack vuelves a indicar el nombre de la tabla en el recordsource

thisform.migrid.recordsource=[mitabla]
thisform.migrid.refresh

Saludos

--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047
Trujillo - Perú
Reply all
Reply to author
Forward
0 new messages