En ocasiones necesitamos pasar una cantidad indeterminada de parámetros a alguna función o procedimiento cuando escribimos aplicaciones en VFP. Adicionalmente a la forma tradicional de hacerlo, es decir, enumerando aquellos que se han de recibir, existe la posibilidad de pasar un objeto o un array como parametro, dotando de esta forma de una enorme flexibilidad a nuestras aplicaciones.
La primera de estas, usando un objeto, es aun mas flexible que la segunda, porque permite incluso ir añadiendo o quitando elementos de forma natural en el camino. Un poco de código para verlo:
Primero, creamos el objeto:
1 2 3 4 5 | miObjeto= createobject("Empty") &&Creamos el objeto usando la clase Empty, que no contiene propiedades innecesarias Addproperty(miObjeto,"mipropiedad1","un valor de texto") &&Podemos asignar cadenas Addproperty(miObjeto,"mipropiedad2",5) &&números Addproperty(miObjeto,"mipropiedad3",.f.) &&boleanos (o cualquier otra cosa, otro objeto o incluso un array) mifuncion(miObjeto) &&y lo enviamos |
Y en la función que habrá de recibirlo:
1 2 3 4 | Parameters miObjeto && y le hacemos lo que sea... if vartype(miObjeto.mipropiedad1)!="U" &&procesamos endif && también podríamos recorrerlo con AMEMBERS... |
Hacerlo con arrays es básicamente lo mismo, solo que tiene un par de peculiaridades: el array debe ser visible desde fuera de la función que lo transmite, y debe ser precedido por una @ para ser interpretado como una referencia, ya que de lo contrario nuestra función recibirá el argumento como un valor, y este sera el contenido de la celda 1,1 de nuestra array.
Ahora bien, esta característica ya interesante de por si adquiere otra dimensión si consideramos que en combinación con la librería JSON para VFP desarrollada por Craig Boyd (existen otras, pero esta es muy buena y gratuita) podemos simplemente crear un objeto en VFP, convertirlo en JSON y enviarlo por http a un servidor:
1 2 3 4 5 6 7 8 9 10 11 | SET LIBRARY TO "json.fll" ADDITIVE &&Añadimos la librería loJSON = CreateObject("json") &&Creamos el objeto mensaje= loJSON.Stringify(miObjeto) &&Genero el JSON loHTTP = CREATEOBJECT("WinHttp.WinHttpRequest.5.1") && Creamos un objeto para la conexión loHTTP.Open("POST","http://miserver/miarchivo.php",.F.) && Establecemos la ruta loHTTP.SetRequestHeader("Content-Type", "application/x-www-form-urlencoded") && Configuramos el envio loHTTP.SetRequestHeader("User-Agent", "Lo-que-sea") && el Agente que deseamos pasar loHTTP.SetRequestHeader("Content-length",LEN(mensaje)) && El tamaño del mensaje loHTTP.Send(mensaje) && Lo enviamos loHTTP.WaitForResponse() && Esperamos la respuesta mirespuesta= loHTTP.ResponseText && Y hacemos cualquier cosa con ella |
Y en el servidor, con PHP hacemos algo como esto:
1 2 3 4 | require_once('JSON.php'); //Llamamos la clase Json de http://mike.teczno.com/json.html (con la función nativa de PHP5 se obtiene un valor null al decodificar) $input = $_POST['mensaje']; //Obtenemos el valor recibido $value = $json->decode($input); //Lo transformamos echo $value->mipropiedad1 //Imprime "un valor de texto" |
Es posible tambien hacerlo a la inversa, es decir, crear el objeto en PHP e interpretarlo en VFP, e incluso puede ser usado para crear objetos complejos y usarlos plenamente en uno y otro lado de la conexión…
Y si lo podemos hacer con PHP, tambien podremos con muchos otros lenguajes para los que se ha implementado el protocolo: Python, toda la gama .net y muchos otros.


Información Bitacoras.com…
Valora en Bitacoras.com: En ocasiones necesitamos pasar una cantidad indeterminada de parámetros a alguna función o procedimiento cuando escribimos aplicaciones en VFP. Adicionalmente a la forma tradicional de hacerlo, es decir, enumerando aque……