Returning Arrays from functions in VFP

2,013 views
Skip to first unread message

Fox Reloaded

unread,
Mar 25, 2013, 9:10:06 PM3/25/13
to publice...@googlegroups.com
Hola amigos Foxeros®

Antes que nada agradezco mucho su ayuda en cuanto a POO, mi pregunta es la siguiente, como puedo hacer para retornar un array en una funcion que sea capturada por una variable, teniendo en cuenta que la variable que le paso a la funcion es por referencia. Gracias...

Ejemplo:

a = funcion(mi_var)

funcion(my_var as XXXX)
    dimension result(my_var)
    for i = 1 to my_var step 1   
           store result(i) = (my_var + 3.14) - 2
    endfor
    return @result
endfunc

Al parecer esta logica que practico no funciona con foxpro, que han intentado hacer al respecto cuando necesitan que una funcion les retorne un array?

Gracias de antemano por toda su colaboracion... :)

Irwin Rodriguez

unread,
Mar 25, 2013, 9:38:42 PM3/25/13
to publice...@googlegroups.com
Saludos Fox Reloaded,

Hice un pequeño ejemplo en base a lo que explicas; solo le agregué como segundo parámetro el nombre del arrego.

Espero te ayude en algo.

Saludos..!!!

LOCAL N_VARIABLE,N_RESULTADO
N_VARIABLE=5
N_RESULTADO=FUNCION(N_VARIABLE,"NOMBRE_ARR")

FUNCTION FUNCION(P_VARNAME,P_NOMARR)
LINEXE="PUBLIC ARRAY "+P_NOMARR+"(P_VARNAME)"
&LINEXE
LOCAL N_POSACT
N_POSACT=1
FOR N_POSACT=1 TO P_VARNAME STEP 1
    LINEXE="STORE ((P_VARNAME+3.14)-2) TO "+P_NOMARR+"(N_POSACT)"
    &LINEXE
ENDFOR &&N_POSACT=1 TO P_VARNAME STEP 1
RETURN
--
Ing. Irwin Rodríguez
Consultor Informático
0412-521.06.79
 

Antes de imprimir este documento piense bien si es necesario hacerlo, el árbol que servirá para hacer el papel tardará 7 años en crecer. 

 
NOTA: La información mostrada en este mensaje es de caracter Confidencial y está dirigida unicamente a los contactos señalados en el encabezado; si el lector de este correo no es el destinatario del mismo, se le notifica que cualquier copia o distribución queda totalmente prohibida. Si usted ha recibido este mensaje por error, por favor notifique inmediatamente al remitente por este mismo medio y bórrelo de su sistema.

Carlos Miguel FARIAS

unread,
Mar 25, 2013, 10:53:07 PM3/25/13
to Grupo Fox

Pasa un arreglo por referencia, o devolve un objeto que lo contenga.
Local array la(1)
lo  = tu función(porvalor, @la)

Dentro tu función puedes redimensionar y asignar valores.
O si no podrías crear un objeto dentro de la función y lo usas como retorno.
Saludos: Miguel, La Pampa (RA)

Luis Maria Guayan

unread,
Mar 26, 2013, 8:36:01 AM3/26/13
to publice...@googlegroups.com
Deberias pasar tu Array por referencia, ej:

DIMENSION Result(Mi_Var)
=funcion(mi_var, @Result)

DISPLEY MEMO LIKE Result

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

Fox Reloaded

unread,
Mar 26, 2013, 9:27:43 AM3/26/13
to Comunidad de Visual Foxpro en Español
Gracias a todos por su ayuda, siguiendo sus consejos claro, encontre que este procedimiento esta en una clase custom, lo cual como decia el compañero carlos miguel, en vez de utilizar un objeto para devolver los elementos de la matriz, utilize la misma variable que cree con DIMENSION en la misma clase para este proposito...

Una ultima pregunta, en un array tecnicamente podria meter otro array como uno de sus elementos, digamos que el array que quiero usar para esto es una tabla temporal en base a una consulta a una base de datos, si es un array tipo tabla, como meter los datos de estos en un elemento del array? Normalmente en C solo se pasa los valores de la matriz a dicho elemento en el otro, como se haria eso en foxpro?

Un ultimo detalle, tecnicamente yo podria crear u obtener del espacio de nombres WIN_COM_API algun control que me sirva como otra tabla temporal para meter mis datos, que tan viable es esta opcion, dado que en ese caso ya foxpro crea cursores muy buenos dentro de sus funciones SQL. Que dirian al respecto?

Gracias de antemano. :)


2013/3/26 Luis Maria Guayan <luism...@gmail.com>



--
Thank you for everything... :)


----  Christian Torres ----
* * * * Venezuela * * * *

Carlos Miguel FARIAS

unread,
Mar 26, 2013, 10:34:45 AM3/26/13
to publice...@googlegroups.com
Un elemento de un array puede tener un único valor, o sea, que no podría contener una arreglo. El valor en realidad es un apuntador a algún lugar de la memoria.
Las dimensiones de un arreglo pueden ser dos.
Un elemento de un arreglo podría ser un objeto (aunque no le he probado a fondo).
Pero para el caso que planteas, devolver el resultado de una consulta mediante un arreglo es "COMPLICAR EN FOXPRO ALGO QUE JUSTAMENTE HACE MAS FACIL QUE OTROS LENGUAJES".
Y lo grito, porque, en VFP, podemos crear un cursor, con los datos seleccionados y manejarlos sin problemas, sin recurrir a arrays (que es lo único que se puede hacer en muchos otros lenguajes".
Y esos cursores, se pueden compartir, mientras te mantengas en la misma sesión de datos, o sea que no hace falta volverlos de la función generadora.
Y en todo caso, si insistis con el array, o lo devolves por referencia o dentro de un objeto.
Saludos: Miguel

Fox Reloaded

unread,
Mar 26, 2013, 10:47:01 AM3/26/13
to Comunidad de Visual Foxpro en Español
Esa era la respuesta que estaba buscando, gracias.

En palabras basicas en mi clase ya creada, podria crear un cursor vacio y llenarlo con datos de un query y este mismo colocarlo dentro de un elemento de una matriz con la instruccion STORE TO... Cierto?

Gracias por su ayuda, intentare probar esto, pero si me podrian brindar mas informacion en base a su experiencia me seria de mucha ayuda...

Un abrazo.


2013/3/26 Carlos Miguel FARIAS <carlosmig...@gmail.com>

Jose Antonio Blasco

unread,
Mar 26, 2013, 11:04:34 AM3/26/13
to Comunidad de Visual Foxpro en Español
Fox Reloaded, yo utilizo este codigo como parte de una función mía:

LOCAL loParam
SELECT curBusca
lnNumCampos = AFIELDS(laCampos) 
loParam = CREATEOBJECT('custom')
WITH loParam
FOR i = 1 TO lnNumCampos 
  lcValorCampo = 'curBusca' + '.' + laCampos(i,1)
  .AddProperty(laCampos(i,1),&lcValorCampo)
ENDFOR
ENDWITH
*
RETURN loParam


Básicamente, te crea un objeto, con tantas propiedades como campos tenga un cursor y con su mismo nombre. 
El valor de cada propiedad será el valor de cada campo del registro seleccionado del cursor.

Tal vez te sirva como idea.

Un saludo.

Jose A. Blasco
Zaragoza - España
Visual FoxPro 9 SP2

"No hay camino hacia la libertad, la libertad es el camino" - Indira Gandhi
“Nunca te olvides de sonreír, porque el día que no sonrías  será un día perdido”  -  Charles Chaplin
“Todo el mundo quiere tener un amigo, pero pocos se toman la molestia de ser uno”
- Anónimo
Message has been deleted

Fernando D. Bozzo

unread,
Mar 26, 2013, 8:10:04 PM3/26/13
to publice...@googlegroups.com
Hola Fox Reloaded:

Sería mucho más útil para todos si las preguntas de distintos temas las hicieras en hilos distintos y no en el mismo, ya que en la marea de respuestas, si alguien intentara buscar por el título se perdería todos los otros temas tratados aquí.

Sobre tu pregunta para devolver arrays de arrays. Antes de plantearte una solución técnica sería mucho mejor si comentaras que es lo que necesitás hacer, porque devolver datos de consultas los podés devolver de varias formas: XML, arrays bidimensionales (campos memo no), colecciones de objetos, texto plano, cursores, etc. Pero nuevamente, las soluciones más eficientes para resolver tu problema dependerán de lo que necesites hacer, de si esos resultados son para ser usados dentro de la misma aplicación o para ser enviados a otras aplicaciones, de si trabajás en N-Capas, lo que en los últimos dos casos por ejemplo podrían descartar a los cursores.

Saludos.-

Fox Reloaded

unread,
Mar 26, 2013, 8:14:39 PM3/26/13
to Comunidad de Visual Foxpro en Español
Hola Fernando Bozzo,

No veo donde desvie el tema de arrays, creo que el hecho de que le haya agregado un par de cosas como cuestion de aclararme a mi mismo sobre este tema de arrays en foxpro, que veo que esta bien suplementado, bueno el caso es que necesitaba saber muy bien de los arreglos y ese tipo, porque mi idea es hacer un cursor propio en base a uno que devuelve un query a una DBMS.

Todo esto con el fin de no utilizar el cursor que devuelve la consulta, ya que esta a veces tiene su limitante y el hecho de poner esto en una clase que devuelva un objeto como el que queremos me parece una opcion muy acertada.

Pero bueno yo agradezco mucho su ayuda porque siempre que la he necesitado han estado alli para solventar mis dudas...


Un abrazo... :)


2013/3/26 Fernando D. Bozzo <fdb...@gmail.com>
Hola Fox Reloaded:

Sería mucho más útil para todos si las preguntas de distintos temas las hicieras en hilos distintos y no en el mismo, ya que en la marea de respuestas, si alguien intentara buscar por el título se perdería todos los otros temas tratados aquí.

Sobre tu pregunta para devolver arrays de arrays. Antes de plantearte una solución técnica sería mucho mejor si comentaras que es lo que necesitás hacer, porque devolver datos de consultas los podés devolver de varias formas: XML, arrays bidimensionales (campos memo no), colecciones de objetos, texto plano, cursores, etc. Pero nuevamente, las soluciones más eficientes para resolver tu problema dependerán de lo que necesites hacer y de si esos resultados son para ser usados dentro de la misma aplicación o para ser enviados a otras aplicaciones, lo que en el último caso por ejemplo descartaría a los cursores.

Saludos.-

ZeRoberto

unread,
Mar 26, 2013, 9:21:06 PM3/26/13
to publice...@googlegroups.com
Cuantos correos te creaste Fresita?

Saludos

Fer

unread,
Mar 27, 2013, 2:35:15 AM3/27/13
to publice...@googlegroups.com

Chicos, basta de acoso a gente del foro, sobre todo cuando esa gente se comporta como debe.  En serio, haya pasado lo que haya pasado hay que dejarlo en el olvido, si no el foro se echa a perder.
Es mi opinión.

Fox Reloaded

unread,
Mar 27, 2013, 11:11:06 AM3/27/13
to Comunidad de Visual Foxpro en Español
Fresita? Es eso un insulto o algo por el estilo?

Si es asi no veo porque tengan que hacerlo, solo hice una pregunta para lo cual me supieron dar una respuesta que me ayudó, es todo.

Ahora si me aclaran que esta pasando o que sucedio para que tomen esa actitud, no hay problema, puede ser un mal entendido y que no nos  dieramos cuenta de ello.

De todas maneras gracias por la ayuda prestada en este caso en particular.

Un abrazo.


2013/3/27 Fer <fdb...@gmail.com>

Rick C. Hodgin

unread,
Mar 27, 2013, 12:33:24 PM3/27/13
to publice...@googlegroups.com
Para usos pequeños, intente lo siguiente (For small uses, try this):

lcArray = foo()
? ALEN(&lcArray,1), ALEN(&lcArray,2)
&lcArray[2,2] = "rick"


FUNCTION foo
LOCAL lcArrayName
    lcArrayName = SYS(2015)
    PUBLIC &lcArrayName
    DIMENSION &lcArrayName[5,2]
    RETURN lcArrayName

Saludos Cordiales,
Rick C. Hodgin
Reply all
Reply to author
Forward
0 new messages