FoxPro/Visual FoxPro - Como trabajar con un formulario que llamé desde otro?

   
Vista:

Como trabajar con un formulario que llamé desde otro?

Publicado por Jose jose.gt600@hotmail.com (8 intervenciones) el 23/07/2016 21:32:31
Hola.
Resulta que tengo que llamar un formulario desde el formulario con el que estoy programando.
En mi caso, lo hago con Do Form. Primero me pregunta si quiero crear un nuevo registro, y sii le digo que si me redirige al formulario que pedí. Pero el problema está en cómo hacer que me deje los texts en blanco para poder crear yo el nuevo registro.
Todo esto desde el formulario con el que trabaje en en primer lugar.

Hasta ahora hice esto:

sino=messagebox ("¿Desea guardar este cliente?",4+32+256,"¡ATENCIÓN!")
IF sino=6
PUBLIC existe
existe=1
DO FORM form_clientes


Pero no sé como hacer para que me muestre los texts en blanco para que yo los rellene.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Como trabajar con un formulario que llamé desde otro?

Publicado por Fidel José (320 intervenciones) el 24/07/2016 18:11:53
Para mi, la mejor manera, es crear un cursor (1 solo registro) y trabajar con este cursor.
Un ejemplo puede ser la siguiente metodología, válida solamente para tablas nativas (dbf).
Se basa en dos procedures (en prg o en una clase custom) "Create_Cursor" y "Save_Cursor".
Esta metodología se puede extender con un tercer método (por ejemplo Fill_cursor) donde se puede trabajar con más de un registro.
También se puede hacer que el método Create_Cursor genere un cursor con más campos agregados a los de la tabla original.
Lo que pongo acá es solo el principio.

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
* Metodo o evento de un form o procedure
LOCAL lcTabla,lModifica
 
lcTabla = "CLIENTES"
lModifica = .t.
* Acá busco un cliente (en grid o de otra forma de modo que
* quede apuntado el registro)
 
 
DO FORM frmClientes WITH m.lcTabla,m.lModifica
 
*------------------------------------------------------
* Init del formulario Clientes
LPARAMETERS tcTabla,tlModifica
 
lcCursor = get_cursor(m.tcTabla,m.tlModifica)
IF ISNULL(m.lcCursor)
	* Proceso fallido
	RETURN .f.
ENDIF
 
* Crea o actualiza 3 propiedades del form
ADDPROPERTY(thisform,"tableUsed",m.tcTabla)
ADDPROPERTY(thisform,"cursorUsed",lcCursor)
ADDPROPERTY(THISFORM,"Modifica",tlModifica)
 
* Supongamos que la tabla original tiene los
* campos Apellido,nombres y cuit
* Y que tenemos en el form, 3 cuadros de texto relacionados
WITH this
	.txt_Apellido.ControlSource = lcCursor+".Apellido"
	.txt_nombres.ControlSource = lcCursor+".Nombres"
	.txt_Cuit.controlsource = lcCursor+".cuit"
ENDWITH
 
* Botón de aceptar cambios
* ( Proceso de Validación final de Datos )
IF NOT THISFORM.Modifica
        * Acá corresponde actualizar el Identificador con el número definitivo
       * y reemplazar el valor en el cursor
ENDIF
save_cursor(thisform.tableUsed , thisform.CursorUsed ,.t.)
 
* Destroy del Form frmclientes
* (Por si se abandonó el proceso sin grabar)
IF USED(this.CursorUsed)
	USE IN SELECT(this.CursorUsed)
ENDIF

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
PROCEDURE create_Cursor
LPARAMETERS tcTabla,tlModifica
*!*	tcTabla: Alias de la tabla a modificar/mostrar
*!*	tlModifica: .f. crea un registro vacío en el cursor
*!*				.t. Carga el cursor con el registro actual de la tabla
 
LOCAL lcCursor,lDoit,lcAlias
 
lcAlias = ALIAS()
lcCursor = null
lDoit = .t.
 
IF !EMPTY(m.tcTabla) AND USED(m.tcTabla)
	IF m.tlModifica
		SELECT (m.tcTabla)
		IF EOF()
			MESSAGEBOX("Debe señalar un registro",0,PROGRAM())
			lDoit = .f.
		ENDIF
	ENDIF
	IF m.ldoit
 
		lcCursor = "cur"+m.tcTabla		&& asigna un alias al cursor
		* Crea un nuevo cursor basado en la tabla (sin registros)
		SELECT *,RECNO() as tb_record, .f. as tb_delete ;
			FROM (m.tcTabla) ;
			WHERE .f. ;
			INTO CURSOR (m.lcCursor) READWRITE
 
		IF m.tlModifica
			* Para modificación o consulta
			SELECT (tcTabla)
			SCATTER TO laDatos
			INSERT INTO (lcCursor) FROM ARRAY laDatos
			SELECT (lcCursor)
			replace tb_record WITH RECNO(m.tcTabla)
 
		ELSE
			* Si es alta, crea un registro vacío
			* Acá se pueden insertar datos fijos y
			* el número probable de identificador (el definitivo se pondrá luego)
			SELECT (m.lcCursor)
			APPEND BLANK
		ENDIF
 
	ENDIF
ENDIF
 
* Repone la tabla/cursor seleccionada al inicio
IF !EMPTY(m.lcAlias) AND USED(m.lcAlias)
	SELECT (m.lcAlias)
ENDIF
RETURN m.lcCursor

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
PROCEDURE Save_Cursor
LPARAMETERS tcTabla,tcCursor ,tlDestroy
IF !USED(m.tcTabla) OR !USED(m.tcCursor)
	RETURN .f.
ENDIF
LOCAL lnREcord,lDelete
LOCAL ARRAY laDatos(1)
SELECT (m.tcCursor)
SET DELETED OFF
RECALL ALL
SET DELETED ON
 
SCAN
	lnRecord = tb_record
	lDelete = tb_delete
	SCATTER TO laDatos
	* Si lnRecord = 0, se trata de un alta.
	* Si el
	IF m.lnRecord = 0
		IF !m.lDelete
			INSERT INTO (m.tcTabla) FROM ARRAY laDatos
 
		ENDIF
	ELSE
		SELECT (m.tcTabla)
		GO m.lnRecord
		IF m.lDelete AND RLOCK()
			DELETE
			UNLOCK
		ELSE
			IF RLOCK()
				GATHER FROM laDatos
			ENDIF
		ENDIF
	ENDIF
	* desbloquea el registro modificado
	UNLOCK IN SELECT(m.tcTabla)
ENDSCAN
 
IF m.tlDestroy
	* Cierra el cursor de modificaciones
	USE IN SELECT(m.tcCursor)
ENDIF
* Provoca bajada de cache
FLUSH in SELECT(m.tcTabla)
 
RETURN
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar