Pasar archivos un cursor de un formulario privado a otro privado

495 views
Skip to first unread message

Rafael Carballo

unread,
Mar 9, 2015, 2:25:30 PM3/9/15
to publice...@googlegroups.com
Hola a todos estoy agradecido con la ayuda que me aportaron anteriormente cuando tenia problemas de bloque de registros.
He tomado la decisión de trabajar con sesiones privadas de datos porque permite cargar mas de una vez el formulario sin afectar los datos de otros formularios que era el problema que tenia cuando cargaban otro formulario encima de uno y tenia los mismos archivos se me mezclaban datos de un formulario con el otro.
Intente varias veces trabajar con sesiones privadas de datos pero por no poder solventar este problema que les expongo a continuación seguí trabajando con sesiones no privadas.

 Tengo el formulario de consulta de existencias en sesión privada de datos invoco una función de consulta del catalogo de productos que es usada invocada por todos el sistema, esta función clasifica la información a tomar para enviarla a otro formulario  de donde muestro los datos con un grid dentro de este formulario.

El problema actual es el siguiente :

a) Formulario de consulta de existencia  Trabaja Bien
b) Funcion  invocada  trabaja bien que es esta :

FUNCTION C_productos
PARAMETERS xcodsuc
DIMENSION campos(2)
DIMENSION descampos(2)
    DIMENSION anchos(2)
DIMENSION nombretablas(1)
IF EMPTY(xcodsuc)
SELECT codprod,nomprod FROM producto ORDER BY codprod INTO CURSOR v_tmpp
ELSE
SELECT codprod,SPACE(60) nomprod FROM sucursal WHERE codsuc=xcodsuc ORDER BY codprod INTO CURSOR v_tmpp readwrite
UPDATE v_tmpp SET v_tmpp.nomprod=producto.nomprod from producto WHERE v_tmpp.codprod=producto.codprod
endif
nombretablas(1) = "v_tmpp"
campos(1) = "codprod"
campos(2) = "nomprod"

descampos(1) = "Codigo"
descampos(2) = "Nombre"
anchos(1) = 100
anchos(2) = 400
captionform = "CATALOG DE PRODUCTOS"
XCLAVE = ""
DO FORM scx/buscar WITH nombretablas,campos,descampos,anchos,XCLAVE,captionform TO XCLAVE
   
   RETURN xclave

3. el formulario buscar no recibe el cursor "v_tmpp" que antes si lo recibía porque estaba todos los formularios con sesión 1 de datos no privados como ahora.

Esto lo aplico con funciones de consultas en todo el sistema con varias tablas a consultar.

Podría alguien ayudarme si hay manera que tenga que recibir archivo el formulario de sesión privada de datos

Víctor Hugo Espínola Domínguez

unread,
Mar 9, 2015, 2:51:27 PM3/9/15
to publice...@googlegroups.com
Hola Rafael

Pásale con los otros parámetros el id de la sesión:

DO FORM scx/buscar WITH nombretablas,campos,descampos,anchos,XCLAVE,captionform, ThisForm.DataSessionId TO XCLAVE

En el INIT del fomulario Buscar:
Lparameters tcTablas, tcCampos, tcDesCampos, tcAnchos, tuClave, tcCaption, tnDataSessionId

Set DataSession To tnDataSessionId

Saludos,
Víctor.
Lambaré - Paraguay.

Rafael Carballo

unread,
Mar 9, 2015, 4:39:55 PM3/9/15
to publice...@googlegroups.com
Gracias Victor Hugo por tu ayuda, aunque el problema me persiste.

1. Como estoy fuera del formulario al invocar la función el ThisForm.DataSessionId  solo funciona cuando hay método me dice, por lo cual no puedo capturar la datasessionid aunque al hacer set step on y quedarme puedo ver que esta en la session activa

2. Busque otra forma enviar la session desde el formulario que invoco a la funcion y ahí si la envía como 2 de resultado, pero al retornar y llegar al formulario me da el siguiente mensaje 'V_TMPP'  must be created with SELECT ... INTO TABLE

3. Pero si la captura del datasessionid es 2 y siempre sera 2 no tendre conflicto cuando invoque de otro formulario o del mismo con otra instancia el mismo id de session  ???

Saludos 
Rafael Carballo 
El Savaldor, Centro America

Víctor Hugo Espínola Domínguez

unread,
Mar 9, 2015, 4:47:30 PM3/9/15
to publice...@googlegroups.com
>a) Formulario de consulta de existencia  Trabaja Bien
>b) Funcion  invocada  trabaja bien que es esta :

FUNCTION C_productos
PARAMETERS xcodsuc, tnDatassionId

       Set DataSession To tnDataSessionId

...
...
...
      DO FORM scx/buscar    ;
             WITH nombretablas,campos,descampos,
anchos,XCLAVE,captionform, tnDataSessionId ;
            TO XCLAVE


Saludos,
Víctor.
Lambaré - Paraguay.

Víctor Hugo Espínola Domínguez

unread,
Mar 9, 2015, 5:32:50 PM3/9/15
to publice...@googlegroups.com
Hola Rafael

Otra forma de pasar un cursor como parámetro es convertirlo previamente a XML:

CURSORTOXML("v_tmpp", "lcXml", 1, 0, 0, "1")

DO FORM scx/buscar WITH nombretablas,campos,descampos,
anchos,XCLAVE,captionform, lcXml TO XCLAVE

En el INIT del formulario Buscar:
Lparameters tcTablas, tcCampos, tcDesCampos, tcAnchos, tuClave, tcCaption, tcXml

XMLTOCURSOR(tcXml, "v_tmmp")

Saludos,
Víctor.
Lambaré - Paraguay.


El 9 de marzo de 2015, 17:39, Rafael Carballo <rafca...@gmail.com> escribió:

Rafael Carballo

unread,
Mar 9, 2015, 7:24:25 PM3/9/15
to publice...@googlegroups.com
Muchas gracias Victor Hugo con el paso de cursor a xml funciono lo único que veo que la conversión es mas tardada que el sql por ejemplo la tabla con la que estoy trabajando tiene 17,900 registros y se tarda aproximadamente 30 segundos pero la solución ya me la distes y te agradezco.

Saludos a todos los foxeros les agradezco pos la ayuda prestada.

En la próxima aportare una clase que les pueda servir de subir a excel cualquier archivo o datos de un grid formateado en excel con dos titulos cabeceras y sumados con las mismas formulas de excel las columnas que se deseen sumar esto me ha servidor para que el usuario no me pida tantos reportes y el pueda hacer sus cálculos o cualquier manejo con los datos creas en memoria el archivo de excel sin grabarlo, preparare la app apropiada para que la puedan usar en sus aplicaciones si lo deseean.



Rafael Carballo
El Salvador

Víctor Hugo Espínola Domínguez

unread,
Mar 9, 2015, 8:38:08 PM3/9/15
to publice...@googlegroups.com
Hola Rafael

Con esa cantidad de registros el algoritmo es muy ineficiente, porque está procesando los diecimuchosmiles registros 3 (TRES) veces!!!
Al efectuar el SELECT, al convertir a XML y luego al reconverir a CURSOR.

Puedes optimizar el tiempo enviando al formulario BUSCAR el SELECT que debe efectuar en el INIT del formulario, el código sería algo así:

Function C_productos
Parameters xcodsuc

Local lcSelect
Local XCLAVE, anchos[1], campos[1], captionform, descampos[1], nombretablas[1]

Dimension m.campos(2)
Dimension m.descampos(2)
Dimension m.anchos(2)
Dimension m.nombretablas(1)

If Empty(m.xcodsuc)
    lcSelect = "Select codprod, nomprod From producto Order By codprod"
Else
    Text To m.lcSelect Textmerge Noshow Pretext 15
    Select  s.codprod
          , p.nomprod
        From sucursal s
        Left Join producto p
            On s.codprod = p.codprod
        Where s.codsuc = <<m.xcodsuc>>
        Order By s.codprod
    Endtext
Endif

lcSelect = m.lcSelect + " Into Cursor v_tmpp"


nombretablas(1)    = "v_tmpp"
campos(1)        = "codprod"
campos(2)        = "nomprod"

descampos(1) = "Codigo"
descampos(2) = "Nombre"
anchos(1)     = 100
anchos(2)     = 400
captionform     = "CATALOG DE PRODUCTOS"
XCLAVE         = ""

Do Form scx\buscar                                 ;
  With m.nombretablas, m.campos, m.descampos, m.anchos, m.XCLAVE, m.captionform, m.lcSelect ;
  To m.XCLAVE

Return m.XCLAVE

Fíjate que fue eliminado el comando UPDATE, de esta forma disminuye más aún el tiempo de proceso.


En el INIT del fomulario Buscar:
Lparameters tcTablas, tcCampos, tcDesCampos, tcAnchos, tuClave, tcCaption, tcSelect

&tcSelect

Saludos,
Víctor.
Lambaré - Paraguay.

Martin Paredes

unread,
Mar 9, 2015, 8:50:06 PM3/9/15
to publice...@googlegroups.com
te paso tips, lo utilizo mucho entre formularios......

     FORM 1, EVENTO CLICK (BOTON)
1.- crea un cursor en blanco
     SELECT tus_campos FROM tabla INTO CURSOR mycursor READWRITE
2.- =AFIELDS(mycursor)
3.- SELECT tus_campos FROM tabla WHERE x and y and z INTO ARRAY myarray
4.- IF TYPE("myarray()")="U" THEN
         DO FORM 2
     ENDIF

FORM 2, EVENTO INIT
1.- IF TYPE("myarray()")="U" THEN
         CREATE CURSOR xyz FROM ARRAY mytemp
         APPEND FROM ARRAY myarray
         GO TOP
         BROW
     ENDIF
     ...............
     ................

Y todo lo realizas en memoria.

Salds...
Mapasac
General Escobedo, N.L. Mexico


El lunes, 9 de marzo de 2015, 12:25:30 (UTC-6), Rafael Carballo escribió:

Jorge Kiernan

unread,
Mar 10, 2015, 4:21:11 AM3/10/15
to publicesvfoxpro

Otra posibilidad es pasarle al segundo formulario el dbf a usar como parametro.
Luego del select obtienes cual es el archivo físico con DBF() y lo pasa como parametro para abrirlo en el form secundario.
Y otra posibilidad, es que ese formulario dependiente del primero, se invoque con sesión predeterminada de datos, heredando en ese caso todos los datos abiertos en la sesión del formulario invocan te.

Reply all
Reply to author
Forward
0 new messages