FoxPro/Visual FoxPro - Ejecutar Rutina fuera de vfp

 
Vista:
sin imagen de perfil

Ejecutar Rutina fuera de vfp

Publicado por Alejandro (5 intervenciones) el 27/05/2022 17:55:22
Hola buen día, tengo un ejecutable que funciona sin la pantalla de VFP, trabajo con la version 9, en general todo funciona bien, solo que para la busqueda puse un boton que activa una rutina o un PRG para realizar la busqueda conforme los indices de la base a consultar, obviamente dentro de vfp funciona bien, pero al momento de inicial el ejecutable fuera de vfp, al oprimir el boton de busqueda no hace nada.
Podrian orientarme como puedo hacer para funcione fuera de la ventana de vfp, dicho boton.
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
sin imagen de perfil
Val: 147
Bronce
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Ejecutar Rutina fuera de vfp

Publicado por zarlu (97 intervenciones) el 02/06/2022 19:54:03
Buenas tardes Alejandro!

Por "sin la pantalla de VFP" entiendo que es con los runtime de VFP. Osea sin tener instalado el VFP
Creo que si el ejecutable ya funciona el detalle no es que funcione el botón "fuera de la ventana de vfp" sino que algo debe faltar en el código del botón.
Asumo si logras visualizar el formulario que contiene el bóton

Valida que el botón si se ejecuta poniendo en la primera línea de su Click:
Wait "se ejecutó el boton" Windows

Suerte
zarlu
Chetumal, Quintana Roo, México
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ejecutar Rutina fuera de vfp

Publicado por Alejandro (5 intervenciones) el 06/06/2022 19:02:25
Gracias por tu comentario Zarlu, el boton si se ejecuta la situación es como lo explica fidel, mi botón ejecuta una rutina en un formulario que oculta la ventana de fox o mas bien se ejecuta fuera de fox, con el cambio que me propuso ya se ve que la ejecucion del programa de busqueda apenas lo estoy probando me falta compilarlo y ejecutarlo en linea para ver como funciona, por el momento me oculta el formulario para pedir los datos de busqueda y luego me presenta nuevamente el formulario con el dato encontrado, mientras lo ejecuto con la ventana de fox dicho boton me muestra tanto la ventana de busqueda como el formulario.
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
sin imagen de perfil
Val: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Ejecutar Rutina fuera de vfp

Publicado por Fidel José (657 intervenciones) el 02/06/2022 23:31:13
Entiendo que te refieres a que ocultas _Screen y utilizas un formulario ShowWindow = 2 como pantalla principal.
Puede que la rutina se ejecute correctamente, pero no se vean los resultados. Dónde esperas ver los resultados?. Si es un formulario, debe tener la propiedad ShowWindow = 1 y un tamaño que quepa dentro del principal o probar con la propiedad Desktop = .T.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ejecutar Rutina fuera de vfp

Publicado por Alejandro (5 intervenciones) el 06/06/2022 20:43:36
Gracias por la sugerencia, ya se ve la ejecución del programa y presenta la ventana de solicitud de datos a buscar con la propiedad Desktop=.T.
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
sin imagen de perfil
Val: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Ejecutar Rutina fuera de vfp

Publicado por Fidel José (657 intervenciones) el 06/06/2022 22:56:23
Para que el ejecutable no haga un flash extraño en el inicio (siempre intenta mostrar _screen), haz lo siguiente:
Busca en el proyecto en la solapa Other, abre la sección de Text Files y edita el archivo Config (config.fpw) y asegúrate que tenga esta línea
SCREEN = OFF
Luego, con click derecho lo marcas como incluido.

Una aclaración: el objeto _Screen de Visual Fox estará siempre, aunque esté oculto.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ejecutar Rutina fuera de vfp

Publicado por Alejandro (5 intervenciones) el 08/06/2022 01:38:58
Muchas gracias por tu apoyo, te comento ese archivo no lo tengo en mi proyecto y te comparto lo que ejecuta mi boton de busqueda para que igual y veas que es lo que estoy haciendo mal, el boton esta dentro de un formulario y desde ahi se ejecuta el la rutina que te comparto mas adelante, mi proyecto inicia con una rutina y de ahi se dedica a abrir y cerrar formularios, todo esto sin tener activa la ventana de fox, la rutina es la siguiente:

IF SET("TALK") = "ON"
SET TALK OFF
m.talkstat = "ON"
ELSE
m.talkstat = "OFF"
ENDIF
m.compstat = SET("COMPATIBLE")
SET COMPATIBLE FOXPLUS

IF NOT WEXIST("PRIMERA")
DEFINE WINDOW PRIMERA;
FROM INT((SROW()-13)/2),INT((SCOL()-28)/2) ;
TO INT((SROW()-13)/2)+12,INT((SCOL()-28)/2)+27 ;
TITLE " Dato a buscar ? " FLOAT NOCLOSE SHADOW ;
NOMINIMIZE DOUBLE COLOR SCHEME 7
ENDIF

IF TYPE("segunda") $ "UL" OR EMPTY(m.segunda)
m.segunda = SPACE(60)
ENDIF
m.oksrch = 1
m.fldnum = 0

DIMENSION fldarry(10,4) && default dimensions. AFIELDS will reset if necessary.
m.fldcnt = AFIELDS(fldarry)
m.startord = ORDER()
m.startalias = ALIAS()

m.curord = ORDER()
IF EMPTY(m.curord)
SET ORDER TO 1
m.curord = ORDER()
ENDIF

FOR i = 1 TO FCOUNT()
IF FIELDS(i) == m.curord
m.fldnum = i
ENDIF
ENDFOR

IF m.fldnum > 0
m.fldname = FIELDS(m.fldnum)
ELSE
SET ORDER TO 1
m.fldnum = 1
m.fldname = FIELDS(1)
ENDIF

skipvar = .T.

curs_stat = (UPPER(SET("CURSOR")) = "ON")
SET CURSOR ON

*activa la busqueda
IF WVISIBLE("PRIMERA")
ACTIVATE WINDOW PRIMERA SAME
ELSE
ACTIVATE WINDOW PRIMERA NOSHOW
ENDIF
@ 4,3 SAY "En:" SIZE 1,3, 0
@ 1,1 GET m.segunda SIZE 1,24 DEFAULT " " PICTURE "@S60" ;
WHEN quinta()
@ 3,7 GET fldnum PICTURE "@^" FROM fldarry ;
SIZE 3,12 DEFAULT 1 VALID sexta() COLOR SCHEME 5, 6
@ 7,8 GET oksrch ;
PICTURE "@*VN \!\<OK;\?\<Cancelar" SIZE 1,10,1 ;
DEFAULT 1 VALID septima()

IF NOT WVISIBLE("PRIMERA")
ACTIVATE WINDOW PRIMERA
ENDIF

READ CYCLE MODAL ;
ACTIVATE tercera() ;
DEACTIVATE cuarta()

RELEASE WINDOW PRIMERA

IF m.talkstat = "ON"
SET TALK ON
ENDIF
IF m.compstat = "ON"
SET COMPATIBLE ON
ENDIF

IF curs_stat
SET CURSOR ON
ELSE
SET CURSOR OFF
ENDIF
skipvar = .F.

FUNCTION gettag
*) Returns tag number corresponding to field "fldname", or 0 if there
*) is not tag with the same name as "fldname."
parameter fldname
PRIVATE ALL
m.fldname = UPPER(ALLTRIM(m.fldname))
i = 1
DO WHILE !EMPTY(TAG(i)) AND i < 1000
IF UPPER(TAG(i)) == m.fldname
RETURN i
ENDIF
i = i + 1
ENDDO
RETURN 0

PROCEDURE waitmsg
IF RECCOUNT() > 1000
WAIT WINDOW "Buscando. Espere un momento..." NOWAIT
ELSE
WAIT WINDOW "Buscando" NOWAIT
ENDIF

PROCEDURE doloc
PARAMETERS term, answer
* See if the user wants to do a long substring search

IF NOT WEXIST("doloc")
DEFINE WINDOW doloc ;
FROM INT((srow()-9)/2),INT((scol()-62)/2) ;
TO INT((srow()-9)/2)+8,INT((scol()-62)/2)+61 ;
FLOAT NOCLOSE SHADOW panel COLOR SCHEME 3
ENDIF

answer = .F.
ACTIVATE WINDOW doloc NOSHOW

@ 5,16 GET locok ;
PICTURE "@*HT \!\<Buscar;\?\<Cancelar" ;
SIZE 1,12,4 ;
DEFAULT 1
@ 1,1 SAY " El dato a buscar no se ha localizado"
@ 2,1 SAY " Pudo ser capturado incorrectamente."
@ 3,1 SAY " ¨Desea realizar una nueva b£squeda ?"

IF NOT WVISIBLE("doloc")
ACTIVATE WINDOW doloc
ENDIF

READ CYCLE MODAL

RELEASE WINDOW doloc
answer = (locok = 1)

FUNCTION quinta && m.segunda WHEN

m.segunda = PADR(m.segunda,60)
SHOW GETS

FUNCTION sexta && fldnum VALID

m.fldname = FIELDS(m.fldnum)
tagnum = gettag(m.fldname) && tag number of tag with name fldname

IF tagnum > 0
SET ORDER TO TAG(m.tagnum)
ELSE
SET ORDER TO 0
ENDIF
SHOW GETS

FUNCTION septima && oksrch VALID
skipvar = .F.
IF m.oksrch = 1 AND !EMPTY(m.segunda)
m.segunda = ALLTRIM(m.segunda)
WAIT CLEAR

m.tagnum = gettag(m.fldname)
IF m.tagnum > 0
SET ORDER TO TAG(m.tagnum)
ELSE
DO waitmsg && warn user that this may take a while
ENDIF
m.thisrec = RECNO()
DO CASE
CASE TYPE("&fldname") $ "CM" && character or memo field
IF m.tagnum > 0
SEEK ALLTRIM(m.segunda)
IF !FOUND()
IF m.thisrec <= RECCOUNT() AND m.thisrec > 0
GOTO m.thisrec
ENDIF
answer = .F.
DO doloc WITH m.segunda, m.answer && prompt for locate

IF m.answer = .T.
DO waitmsg
GOTO TOP
LOCATE FOR UPPER(m.segunda) $ UPPER(&fldname)
ENDIF
ENDIF
ELSE
LOCATE FOR UPPER(m.segunda) $ UPPER(&fldname)
ENDIF
CASE TYPE("&fldname") $ "FN" && floating or numeric
m.segunda = CHRTRAN(m.segunda,'"','')
m.segunda = CHRTRAN(m.segunda,"'","")
LOCATE FOR VAL(ALLTRIM(m.segunda)) = &fldname
CASE TYPE("&fldname") = "D" && date
m.segunda = CHRTRAN(m.segunda,'{}"()','')
m.segunda = CHRTRAN(m.segunda,"'",'')
m.segunda = ALLTRIM(m.segunda)
LOCATE FOR CTOD(segunda) = &fldname
CASE TYPE("&fldname") = "L" && logical
IF "T" $ UPPER(m.segunda)
LOCATE FOR &fldname
ELSE
LOCATE FOR !&fldname
ENDIF
CASE TYPE("&fldname") = "U" && unknown field type--should't happen
WAIT WINDOW "Field "+m.fldname+" not found"
ENDCASE
IF !FOUND()
SET CURSOR OFF
mensaje=MESSAGEBOX("Dato no encontrado","Continuar")
IF m.thisrec <= RECCOUNT() AND m.thisrec > 0
GOTO m.thisrec
ENDIF
ELSE
SET CURSOR OFF
mensaje=MESSAGEBOX("Dato encontrado!","Continuar")
CLEAR READ
ENDIF
ELSE
SET ORDER TO (m.startord)
CLEAR READ
ENDIF

FUNCTION tercera && Read Level Activate

* Activate Code from screen: APPSRCH
SELECT (m.startalias)

FUNCTION cuarta && Read Level Deactivate
* Deactivate Code from screen: APPSRCH
?? CHR(7)
SET TALK OFF
RETURN .F.
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
sin imagen de perfil
Val: 1.011
Oro
Ha mantenido su posición en FoxPro/Visual FoxPro (en relación al último mes)
Gráfica de FoxPro/Visual FoxPro

Ejecutar Rutina fuera de vfp

Publicado por Fidel José (657 intervenciones) el 10/06/2022 23:43:47
La verdad Alejandro, con toda la riqueza que tiene vfp9, utilizar cosas como define Window, no tiene sentido.
Deberías leer algo sobre programación orientada a objetos y aprovechar la variedad de clases que ofrece vfp9.
No entiendo cual es el propósito de esas líneas, ciertamente no me detuve a interpretarlas. Pero por la secuencia de LOCATE que utilizas se me ocurre que se puede reemplazar todo eso con SELECT-SQL
El uso de @ x,y Say es algo totalmente obsoleto, que viene de la compatibilidad con los viejos fox para DOS. Yo las he utilizado en Clipper y para vfp únicamente para las impresoras matriciales, que prácticamente no existen. En las impresoras Laser y Deskjet no se pueden utilizar esos comandos. Si no querés trabajar con los reportes de Visual Fox, tenés que utilizar el comando "?".

Te recomiendo estos artículos del Maestro Fernando Bozzo

https://fdbozzo.blogspot.com/2014/01/crear-un-proyecto-foxpro-por-donde.html
https://fdbozzo.blogspot.com/2014/09/vfp-guia-de-buenas-practicas-de.html
https://fdbozzo.blogspot.com/2014/08/como-trabaja-foxpro-internamente.html
https://fdbozzo.blogspot.com/2014/06/la-importancia-de-un-buen-nombre-para.html
https://fdbozzo.blogspot.com/2014/01/desmitificando-el-control-de-errores.html

Te envío en adjunto un trabajo del maestro tucumano Daniel Díaz sobre programación orientada a objetos y particularmente sobre objetos de Visual fox.

Disculpa si mis apreciaciones te resultan algo violentas.
Saludos
Fidel
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ejecutar Rutina fuera de vfp

Publicado por ALEJANDRO (5 intervenciones) el 11/06/2022 00:12:00
Gracias Fidel por tus comentarios y no tengo por que molestarme o sentirme mal, todos pedimos ayuda por este medio por que sabemos que hay personas con mas conocimientos y son valiosas sus aportaciones, solo recuerda que no todos estamos al mismo nivel y creo que comprendes por tu comentario final, que hay momentos en los que debemos de moderar un poco como nos dirigimos a los demás, nunca dar por hecho que estan a un mismo nivel de conocimientos, como dicen algunas veces tenemos que explicar con bolitas y palitos, yo tengo varias rutinas que me han funcionado y por flojera o por comodidad no eh actualizado, a parte de que no me dedico a programar, lo hago para facilitar un poco mi trabajo actual y es manejo de presupuesto, creo que queda claro el porque programo poco, mi trabajo es mas de números, pero uso la programación para minimizar tiempos. Voy a leer lo que me sugieres y nuevamente gracias por tu aporte.
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