La Web del Programador: Comunidad de Programadores
https://www.lawebdelprogramador.com/foros/FoxPro-Visual-FoxPro/1364480-Como-hago-para-que-Grid-desaparece.html

Cómo hago para que Grid desaparece

Cómo hago para que Grid desaparece

Publicado por Andrés (1 intervención) el 11/01/2013 22:12:33
Saludos a todos,

Soy nuevo en esto de programar pero elegí Visual FoxPro para trabajar pues conocía que es un buen programa para utilizar bases de datos, ya sean propias o de algún otro programa como SQL.

Tengo una pregunta; diseñé un formulario para el ingreso de cierta información en el cual inserté una Grid, le añadí los datos que me gustaría que se mostrasen y hasta ahí todo perfecto, el problema es al momento de poner nuevo, pues se desaparece la Grid. Cómo puedo hacer para que no se desaparezca y además que se actualice la información que se muestra en la grid.

La codificación que tiene el botón nuevo es la siguiente:

USE nombretabla
SET ORDER TO IDCAMPO
GO BOTTOM in nombretabla
nuevocodigo=VAL(idcampo)+1
thisform.cod.Value=nuevocodigo
thisform.cargo.Value=""
thisform.cargo.setfocus
thisform.guardar.Enabled= .T.

Una aclaración, los campos cod y cargo son dos cuadros de texto donde se ingresa la información.
El cuadro donde se coloca el código genera de manera automática el siguiente código.

La codificación del botón guardar es:

USE nombretabla ALIAS nomtabla
IF EMPTY(ALLTRIM(thisform.cargo.Value))
MESSAGEBOX("No se puede guardar, digite un cargo",0+16,"Error")
thisform.cargo.Value=""
thisform.cargo.setfocus
ELSE
APPEND BLANK
replace idcargo WITH PADL(Alltrim(Str(thisform.cod.value)),8,"0")
replace nombrecar WITH thisform.cargo.value
MESSAGEBOX("Datos guardados",0,"Informativo")
ENDIF
thisform.guardar.Enabled= .F.
thisform.nuevo.SetFocus

Por favor indíquenme si estoy en algún error, pero principalmente mi problema es cuando se desaparece el o la grid (no sé como es realmente) y que no se actualiza sino hasta que cierro el formulario y lo vuelvo a abrir.

Espero haber podido ser un poco claro con mi inquietud.

Muchas gracias de antemano.
Imágen de perfil de Edgar Zambrano

Cómo hago para que Grid desaparece

Publicado por Edgar Zambrano (72 intervenciones) el 11/01/2013 22:17:56
al final de tu código del botón guardar coloca esta linea

thisform.Refresh()

esto hará que se actualicen todos los controles del formulario
sin imagen de perfil

Cómo hago para que Grid desaparece

Publicado por Fidel (657 intervenciones) el 12/01/2013 00:57:16
No sé cómo tendrás ordenadas las cosas, pero observo lo siguiente:
Si no estás utilizando Entorno de Datos, tienes que abrir las tablas en el Load del formulario y cerrarlas en el Unload.
Si la tabla NombreTabla está abierta y la vuelves a abrir (aunque sea con un alias), y esa tabla estaba asociada al control grid, éste quedará en blanco. Eso porque al enviar otra instrucción USE, la tabla que estaba abierta se cierra y se vuelve a abrir, lo que desengancha la relación con el control grid.

Precaución: Si no utilizas Entorno de Datos, deberás tener alguna forma de evitar que las tablas se cierran cuando se abre y se cierra otro formulario. Si no te gusta el entorno de datos, tendrás que crear un cursor que controle que procesos o formularios tienen las tablas abiertas.

En cuanto al control de codificación automática, te sugiero que utilices otra tabla donde tengas tus numeradores, con un código de búsqueda. Básicamente sería una tabla que contiene:
Código de Búsqueda, Descripción de lo que se busca, número.
Ahí te doy una idea sobre como generar esta tabla y cómo se puede utilizar con las siguientes rutinas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
******************************
PROCEDURE GEN_NUMERA()
******************************
* Rutina de Instalación del sistema
* Rutina de Verificación del sistema
* El nombre de tabla y el campo que lleva la numeración
* deben preverse para una rutina de repaso de numeradores.
* Se pueden agregar otras condiciones, según se necesite
***********************************************************
if !file("NUMERA")
	CREATE TABLE NUMERA ("CODIBUS" C(4),"DESCRIP" C(40),"NUMERO" I,;
		"TABLA" C(8),"CAMPO" C(12), "TIPO" C(1),"NCHAR" I)
	select numera
	INDEX ON CODIBUS TAG INUMERO
	USE
ENDIF
USE NUMERA IN 0 SHARED
 
Dimension ganum(3,7)
ganum[1,1]="CLI"	&& Codigo de busqueda de numerador
GANUM[1,2]="Tabla Clientes" && descripcion
ganum[1,3]=0
ganum[1,4]="CLIENTES"
ganum[1,5]="IDCLIEN"
GANUM[1,6]="C"
GANUM[1,7]=6
 
ganum[2,1]="PRO"
GANUM[2,2]="Tabla Proveedores"
ganum[2,3]=0
ganum[2,4]="PROVEDOR"
GANUM[2,5]="IDPROV"
ganum[2,6]="C"
GANUM[2,7]=4
 
ganum[3,1]="ORD"
GANUM[3,2]="Tabla Ordenes"
ganum[3,3]=0
ganum[3,4]="ORDENAR"
GANUM[3,5]="IDORD"
ganum[3,6]="N"
GANUM[3,7]=0
For i=1 to ALEN(ganum,1)
	if !indexseek(ganum[i,1],.f.,"NUMERA","INUMERO")
		INSERT INTO NUMERA (codibus,descrip,numero,tabla,CAMPO,TIPO,NCHAR) ;
		VALUES (ganum[i,1],ganum[i,2],ganum[i,3],ganum[i,4],ganum[i,5],ganum[i,6],ganum[i,7])
	endif
next
select numera
USE
ENDPROC
 
 
************************************************
PROCEDURE NUMERE(xcCodiBus,xlActualiza,xlUltimo)
************************************************
* Ejemplo:
* nVal=Numere("CLI",.t.) , actualiza el numerador.
* Si todavía no se graba, pero se quiere saber cuál es el código
* nVal=Numere("CLI",.F.) , no actualiza el numerador
* Si xlUltimo=.T., devolverá el último utilizado y no actualiza
****************************************************************
* Al grabar un nuevo registro de Clientes, sería;
* select clientes
* APPEND BLANK
* REPLACE IDCLIEN WITH NUMERE("CLI",.T.),;
*	NOMBRE WITH Thisform.TxNombre.value,;
*	etc..
*
****************************************************************
LOCAL nValor,lshut,lctipo,lnChar
if vartype(xcCodibus)#"C".or.empty(xcCodibus)
	Messagebox("Parámetro erróneo",0,"Mensaje")
	return 0
endif
 
if !used("NUMERA")
	use numera in 0 SHARED
	SELECT NUMERA
	lShut=.t.
endif
xcCodibus=Upper(alltrim(xcCodibus))
if !indexseek(xcCodibus,.f.,"NUMERA","INUMERO")
	Messagebox("Parámetro &xcCodibus no definido",0,"Mensaje")
	return 0
endif
indexseek(xcCodibus,.t.,"NUMERA","INUMERO")
lctipo=tipo
lnChar=nChar
if !xlUltimo
	nValor=Numero + 1
	if xlActualiza
		if rlock()
			replace numero with nValor
			unlock
		endif
	endif
else
	nValor=numero
endif
if lshut	&& SI AL INICIO ESTABA CERRADA, SE CIERRA
	select numera
	USE
ENDIF
REturn iif(lcTipo="N",nValor,Padl(ltrim(str(nValor)),lnchar,"0")
ENDPROC


Siguiendo el ejemplo, en el LOAD del formulario (supongamos Clientes);
USE CLIENTES IN 0 SHARED
USE NUMERE IN 0 SHARED

En el UNLOAD del form
IF USED("CLIENTES")
SELECT CLIENTES
USE
ENDIF
IF USED("NUMERA")
SELECT NUMERA
USE
ENDIF

En el evento Valid del TExtbox que contendrá el nombre del cliente
Thisform.CmGrabar.Enabled=!empty(this.Value)
* CmGrabar se habilita solamente si se ingresó el nombre.
* igualmente en el Click de Grabar se pueden testear otras cosas
* Click de CmGrabar
SELECT CLIENTES
APPEND BLANK
REPLACE IDCLIEN WITH NUMERE("CLI",.T.),;
NOMBRE WITH THISFORM.Txnombre.value,;
IDFISCAL WITH loquesea, etc
UNLOCK
Thisform.Cod.Value=NUmere("CLI",.F.) && propone el siguiente código
THISFORM.TxNombre.value="" && limpiar cuadros
Thisform.Grid1.Refresh && actualiza el control grid


Nota: Estoy poniendo USE TABLA IN 0 SHARED. Obviamente esto no tiene mucho sentido. De todos modos debes usar SHARED para todas las tablas que piensas compartir,
De entrada, debes definir alguna variable Pública que contenga la dirección donde están los datos.
Por ejemplo:
release MYDAT
PUBLIC MYDAT
MYDAT="F:\SISTEMA\DATOS" && Esto se puede configurar de diversas formas.

Luego:
USE &MYDAT\CLIENTES IN 0 SHARED

Ó

lcFile=addbs(mydat)+"CLIENTES"
USE &lcFile IN 0 SHARED
sin imagen de perfil

Cómo hago para que Grid desaparece

Publicado por neo (1604 intervenciones) el 12/01/2013 01:05:54
Saludos!
Para volver a mostrar los datos actualizados, te recomiendo echarle un ojo a estas propiedades:

thisform.grid1.recordsource='mi-tabla'
thisform.grid1.resfresh


Aunque personalmente, cuando deseo actualizar los datos de un grid y que no me muestre en blanco lo que hago es redibujar el grid manualmente, por ejemplo digamos que tengo 2 columnas.

En un boton escribe esto:
thisform.grid1.recordsource=""
thisform.grid1.columncount=3
thisform.grid1.column1.header1.caption="Nombre"
thisform.grid1.column2.header1.caption="Direccion"
thisform.grid1.column1.width=120
thisform.grid1.column2.width=150

Todo esto segun tu configuracion real del grid.

Suerte!