FoxPro/Visual FoxPro - pasar a otro formulario por medio de un grid

   
Vista:

pasar a otro formulario por medio de un grid

Publicado por @nDy (11 intervenciones) el 23/04/2013 21:39:06
Hola, ojala me puedan ayudar a seguir adelante con mi proyecto, haber ahi les va mi consulta:
En mi Form1 tengo un grid que esta conectada con mi base de datos allclien donde me muestra: nombre de los clientes(empresas), cod del cliente, ubicacion, telefono. lo que deseo saber es que si seleccionando un cliente del grid y por medio de un boton o haciendo doble click pueda llamar al formulario trabajadores donde deseo que se muestre en otro grid la lista de trabajadores que laboran en dicha empresa.
La idea que tuve fue en un texbox del formulario trabajadores me capture el ultimo codcliente que seleccione en el form1 y luego que por medio de ese dato filtrar el listado de trabajadores pero no consigo pasar ese dato de un formulario a otro, estuve averiguando y logre encontrar:

LOCAL validar
validar = INT(VAL(thisform.text1.Value))
thisform.text3.VaLUE= validar

con el q logro pasar el dato de un text a otro text que estan en un mismo formulario, pero como seria si quiero pasarlo al formulario trabajadores?? y ademas me he dado cuenta que por ejemplo el codigo es: 00111222 solo pasa: 111222 no considerando los ceros y tambien hay codigos que tienen letras tanto en el inicio medio y final, quisiera que ese dato pase al otro formulario de manera exacta.
O habra otra forma de llamar al siguiente formulario con la lista de trabajadores, la lista de trabajadores esta en una base de datos "trabajadores" donde hay un campo codcliente. De antemano gracias por la ayuda
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

pasar a otro formulario por medio de un grid

Publicado por Javier (265 intervenciones) el 23/04/2013 23:29:47
Hola:
Llama al segundo formulario asi (por ejemplo en el click de un boton)

DO FORM WITH ALLCLIEN.Numero
la clausula with envia como parámetro el campo numero de la tabla allclien.

Para que el segundo formulario "reciba" el dato, escribi en el evento Init de ese form:

PARAMETERS nN
PUBLIC nNumero
nNumero = nN

o

PARAMETERS nN
ThisForm.nNumero = nN && Si es que creaste la propiedad nNumero en el form.

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

pasar a otro formulario por medio de un grid

Publicado por Fidel (558 intervenciones) el 24/04/2013 00:15:53
1) Si transformas un Alfanumérico en número, te desaparecerán los ceros de la izquierda.
El valor 00111222 es un character ( "0011122" ), por lo que debes tomarlo con Alltrim(). Ello porque el textbox contiene todos los espacios asignados.


2)
a) Si el dato está en una tabla apuntada, en el formulario secundario solo tienes que dirigirte al dato.
b) Si el dato es un valor ingresado en un TextBox, puedes llamar al formulario secundario así:
DO FORM ..\FORMS\SECUNDARIO WITH thisform && pasas el objeto formulario como referencia.

En el init del form secundario:
LPARAMETERS xoForm
ADdproperty(Thisform,"CallForm",xoForm) && crea la propiedad "CallForm" y le asigna el valor del parámetro.

En el lugar que te convenga del formulario, por ejemplo;
Thisform.Text1.Value=thisform.CallForm.Text3.Value && coloca en el Text1 del formulario secundario el valor del Text3 del formulario primario.
También puedes usarlo en un comando LOCATE o una función Seek() ó IndexSeek()
Indexseek(Alltrim(Thisform.CallForm.Text3.Value),.T.,"TABLA","INDICE")

3) No entiendo bien la idea, pero puedes hacer DblClick() sobre la cuadrícula para producir la aparición del formulario secundario (o de cualquier otra acción).
3-1) Si tu control GRid es AllowCellSelection=.t. (Default) el tema es un poco más complicado porque no responderá a los click sobre la cuadrícula (salvo en las líneas lo que requiere mucha puntería). En este caso tienes dos opciones:
3.1.a) Atacar el DblClick del Text1 de la columna que quieras afectar.
3.1.b) Usar BindEvent() y escribir el código en un método delegado.
Por ejemplo, incluyes en el formulario un método de usuario como este:

* Metodo LLamado *
lcCodigo=AllClie.Cod
* Creas un cursor con la lista de trabajadores que corresponden al cliente
SELECT * FROM trabajadores WHERE cod=lcCodigo into Cursor Pworkers
SELECT PWORKERS
GO TOP
IF EOF()
Messagebox("No hay trabajadores asociados al cliente")
RETURN
ENDIF
do form ..\forms\secundario with "pWorkers" && paso el cursor como referencia.
* Pasar el nombre del cursor como referencia te permite tener un secundario que responda a diversos llamados.
* ENDPROC

Después de armar el Control Grid del primario:
with thisform.grid
For i=1 to .ColumnCount
BindEvent(.Columns[i].TExt1 , "DblClick" , Thisform , "LLamado" )
NEXT
Con esto, el control Grid responderá al dblClick en cualquier lugar y ejecuta el método "Llamado".

3.2) Si tu control Grid es AllowCellSelection=.F., entonces puedes atacar el DblClick del control Grid
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

pasar a otro formulario por medio de un grid

Publicado por @nDy (11 intervenciones) el 25/04/2013 00:55:36
FIDEL me podrias explicar un poco mejor lo del punto "3" ok cambie el grid a AllowCellSelection=.F. pero luego si te entendi bien en el form1 creo un metodo con el nombre: "LLAMADO" y en ese lugar coloco la codificacion:
cCodigo=AllClie.Cod
* Creas un cursor con la lista de trabajadores que corresponden al cliente
SELECT * FROM trabajadores WHERE cod=lcCodigo into Cursor Pworkers
SELECT PWORKERS
GO TOP
IF EOF()
Messagebox("No hay trabajadores asociados al cliente")
RETURN
ENDIF
do form ..\forms\secundario with "pWorkers" && paso el cursor como referencia.
* Pasar el nombre del cursor como referencia te permite tener un secundario que responda a diversos llamados.
* ENDPROC

Después de armar el Control Grid del primario:
with thisform.grid
For i=1 to .ColumnCount
BindEvent(.Columns[i].TExt1 , "DblClick" , Thisform , "LLamado" )
NEXT
Con esto, el control Grid responderá al dblClick en cualquier lugar y ejecuta el método "Llamado".
O en que lugares??? porq lo hice y no me resulto ni me sale error algo estare haciendo mal?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

pasar a otro formulario por medio de un grid

Publicado por Fidel (558 intervenciones) el 25/04/2013 02:18:05
Bueno, parece que cometí una torpeza. Aclaro:

1
2
3
4
5
6
7
8
9
10
11
12
&& AllowCellSelection = .T.  && (Default)
WITH thisform.grid1
	For i=1 to .ColumnCount
		BindEvent(.Columns[i].TExt1 , "DblClick" , Thisform , "LLamado" )
	NEXT
ENDWITH
 
&& AllowCellSelection = .F.  && muestra seleccionada toda la línea
                                                    && no se procesan los eventos de los objetos de las columnas
                                                    && se procesa el Click ó DblClick ó KeyPress del control Grid.
 
BINDEVENT(thisform.grid1,"DblClick",thisform,"LLamado")

En este caso, como sabes cual es el campo de la tabla que necesitas para pescar otros registros, no tenés problema en usar cualquiera de ambas.

En otros casos, cuando se necesita saber en que celda se hizo doble click, no es posible utilizar (al menos de esta forma) AllowCellSelection=.F.
Además en el método delegado es necesario determinar qué control produjo el doble click, para lo cual utilizas la función Aevents(). Por ejemplo
nEvents=AEVENTS(gaEvent,0)
IF nEvents=0
RETURN
ENDIF
loObjeto=gaEvent[1]
&& si el objeto está en una columna de un control grid, la columna es:
loColumna=loObjeto.parent

Perdón por la torpeza.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

pasar a otro formulario por medio de un grid

Publicado por @nDy (11 intervenciones) el 26/04/2013 19:56:35
fidel la codificacion que me mandas toddaaaaa va en el metodo "llamado" o hay alguna que va en otra parte porque lo hago de ese modo y no me resulta haber si me explicas por favor
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

pasar a otro formulario por medio de un grid

Publicado por Fidel (558 intervenciones) el 26/04/2013 21:54:16
En el método "LLAMADO" va lo que tendrías que poner en el DblClick(). Por eso se lo denomina método delegado, porque sustituye al Evento al que se lo apunta con BINDEVENT()

En alguna parte del formulario estarás configurando el Control Grid. Debajo de la configuración del grid, va lo siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
if thisform.Grid1.AutoCellSelection
       WITH thisform.grid1
	     For i=1 to .ColumnCount
		       BindEvent(.Columns[i].TExt1 , "DblClick" , Thisform , "LLamado" )
            NEXT
         ENDWITH
ELSE
               BINDEVENT(thisform.grid1,"DblClick",thisform,"LLamado")
ENDIF
 
BindEvent dice que cuando se haga DblClick sobre cualquier celda del control grid, se ejecute el método "LLamado" que se encuentra en Thisform.
Las formas son distintas para el caso de AutoCellSelection .F. / .T., porque el control grid responde de manera distinta según el valor de esta propiedad. Si AutoCellSelection=.T. (default), responderá a los DblClick de los objetos contenidos en las columnas (Textbox, Checkbox, etc). Si autoCellSelection=.F., responderá al DblClick del Control Grid y  no a los de los objetos.


Como ejemplo de lo que puede ir en el método delegado LLAMADO, puse:
1
2
3
4
5
6
7
8
9
10
lcCodigo=AllClie.Cod
* Creas un cursor con la lista de trabajadores que corresponden al cliente
SELECT * FROM trabajadores WHERE cod=lcCodigo into Cursor Pworkers
SELECT PWORKERS
GO TOP
IF EOF()
      Messagebox("No hay trabajadores asociados al cliente")
      RETURN
ENDIF
do form ..\forms\secundario with "pWorkers" && paso el cursor como referencia.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

pasar a otro formulario por medio de un grid

Publicado por @nDy (11 intervenciones) el 27/04/2013 01:37:35
FIDEL hice lo que me dijistes creee le metodo "LLAMADO":
lcCodigo= allclien.Codunidad
* Creas un cursor con la lista de trabajadores que corresponden al cliente
SELECT * FROM alldiar22 WHERE alldiar22.codUNIDAD=lcCodigo into Cursor Pworkers
SELECT Pworkers
GO TOP
IF EOF()
Messagebox("No hay trabajadores asociados al cliente")
RETURN
ENDIF
DO FORM INTENTO/FORM2 WITH "pWorkers"
Y luego en el INIT del Form1 puse:
if thisform.grid1.AllowCellSelection
WITH thisform.grid1
For i=1 to .ColumnCount
BindEvent(.Columns[i].text1 , "DblClick" , Thisform , "LLamado" )
NEXT
ENDWITH
ELSE
BINDEVENT(thisform.grid1,"DblClick",thisform,"LLamado")
ENDIF

me sale el ERROR: "Property TEXT1 is not found."
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

pasar a otro formulario por medio de un grid

Publicado por Fidel (558 intervenciones) el 27/04/2013 02:30:23
Puede ocurrir que en una o más columnas hayas suprimido el objeto Text1 (default) y reemplazado por otro (Check1, Edit1, Combo1, Text2, TxtAlgo).
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
* Alternativa 1 (no muy recomendable)
* Programar el dblclick solamente si existe un control Text1 en la columna respectiva
if thisform.grid1.AllowCellSelection
	WITH thisform.grid1
		For i=1 to .ColumnCount
			if pemstatus(.Columns[i],"Text1",5)
				BindEvent(.Columns[i].text1 , "DblClick" , Thisform , "LLamado" )
			endif
		NEXT
	ENDWITH
ELSE
	BINDEVENT(thisform.grid1,"DblClick",thisform,"LLamado")
ENDIF
 
* Alternativa 2 - Programar el DblClick para el objeto designado como CurrentControl
* Esto parece más recomendable
if thisform.grid1.AllowCellSelection
	WITH thisform.grid1
		For i=1 to .ColumnCount
			lcCurrent=.Columns[i].CurrentControl
			BindEvent(.Columns[i].&lcCurrent , "DblClick" , Thisform , "LLamado" )
		NEXT
	ENDWITH
ELSE
	BINDEVENT(thisform.grid1,"DblClick",thisform,"LLamado")
ENDIF
 
*Variante
*Puedes asignar el método delegado por BindEvent solamente si la clase del CurrentControl es un *TextBox a través de &lcCurrent..BaseClass
* En este caso no responderá al DblClick() si el objeto es un EditBox, ComboBox, Checkbox, * *Container, etc.
 
	WITH thisform.grid1
		For i=1 to .ColumnCount
			lcCurrent=.Columns[i].CurrentControl
			IF UPPER(.Columns[i].&lcCurrent..BaseClass)=="TEXTBOX"
				BindEvent(.Columns[i].&lcCurrent , "DblClick" , Thisform , "LLamado" )
			ENDIF
		NEXT
	ENDWITH
 
* Para considerar varios objetos, hay que modificar un poco la linea
IF INLIST(UPPER(.Columns[i].&lcCurrent..baseClass) , "TEXTBOX","EDITBOX")
	BindEvent(.Columns[i].&lcCurrent , "DblClick" , Thisform , "LLamado" )
ENDIF


Fijate que CurrentControl devuelve el nombre del objeto (name) y no la referencia al objeto, por lo que es necesaria la macrosustitución &lcCurrent.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

pasar a otro formulario por medio de un grid

Publicado por @nDy (11 intervenciones) el 27/04/2013 19:25:26
Amigo FIDEL tenes razon en una de las columnas he reeemplazado por un CHECKBOX y bueno he intentado ponerle la codificacion de la alternativa Nº 02 y ahora me sale el ERROR: "No PARAMETER statement is found" que es lo que estoy haciendo mal???
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

pasar a otro formulario por medio de un grid

Publicado por Fidel (558 intervenciones) el 28/04/2013 17:50:42
Si mantienes el código original del Método "Llamado"
DO FORM INTENTO/FORM2 WITH "pWorkers"

en el init del formulario INTENTO/FORM2 , está faltando
PARAMETERS xcCursor && un parámetro que recibe el nombre del cursor generado.
&& debe ser la primer línea del INIT.


* Con ese parámetro puedes mostrar un Grid en el secundario basado el cursor pasado.
thisform.Grid1.REcordSource=xcCursor && sin comillas porque es una Variable.
*Para calificar los controlSource puedes usar
Thisform.Grid.Columns[1].ControlSource='&xcCursor..Campo1" && dos puntos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar