Saludos
Variables PRIVATE no existen.
Moderator: Rathinagiri
-
Javier Tovar
- Posts: 1275
- Joined: Tue Sep 03, 2013 4:22 am
- Location: Tecámac, México
Re: Variables PRIVATE no existen.
So is Esgici
Saludos
Saludos
- edufloriv
- Posts: 247
- Joined: Thu Nov 08, 2012 3:42 am
- DBs Used: DBF, MariaDB, MySQL, MSSQL, MariaDB
- Location: PERU
Re: Variables PRIVATE no existen.
Saludos amigos,
Como amablemente respondió esgici, lo he resuelto haciendo la variable pública, hasta ahora va bien, espero siga asi. Sin embargo me quedó la duda e hice un pequeño .prg para emular, al mínimo, el entorno del problema.
La verdad me desconcierta, porque he probado y reprobado este test y no puedo hacer que me salga el mismo error. Bueno, será porque en el test el código esta más limpio, de todas formas voy a seguir haciendo pruebas y les informo.
Saludos cordiales a todos.
Como amablemente respondió esgici, lo he resuelto haciendo la variable pública, hasta ahora va bien, espero siga asi. Sin embargo me quedó la duda e hice un pequeño .prg para emular, al mínimo, el entorno del problema.
Code: Select all
#include <hmg.ch>
FUNCTION MAIN()
DEFINE WINDOW Win_Main ;
AT 0 , 0 ;
WIDTH 1020 HEIGHT 730 ;
TITLE "PRINCIPAL" ;
FONT "Arial" SIZE 9 ;
MAIN
DEFINE MAIN MENU
POPUP "&Menú"
ITEM 'Orden de compra' ACTION Orden()
END POPUP
END MENU
END WINDOW
ACTIVATE WINDOW Win_Main
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC ORDEN()
IF IsWindowDefined(Win_Orden)=.T.
MINIMIZE WINDOW Win_Orden
RESTORE WINDOW Win_Orden
RETURN
ENDIF
PRIVATE OH_MODO := 'Inicial'
IF ! ISDIR('c:\Farmacom\Ordenes')
CreateFolder('c:\Farmacom\Ordenes')
ENDIF
DEFINE WINDOW Win_Orden ;
AT 0 , 0 ;
WIDTH 600 HEIGHT 500 ;
TITLE "ORDEN DE COMPRA" ;
FONT "Arial" SIZE 9 ;
CHILD ;
NOMAXIMIZE ;
ON INIT OrdenIniciar() ;
ON RELEASE OrdenSalir()
DEFINE MAIN MENU
POPUP "&Operaciones"
ITEM 'Crear' ACTION OrdenCrear()
ITEM 'Grabar' ACTION OrdenGrabar()
ITEM 'Abrir' ACTION OrdenAbrir()
SEPARATOR
ITEM 'Ver estado' ACTION OrdenVer()
END POPUP
END MENU
END WINDOW
CENTER WINDOW Win_Orden
ACTIVATE WINDOW Win_Orden
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC OrdenIniciar
OH_MODO := 'Nada'
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC OrdenSalir
IF OH_MODO = 'Crear'
MsgInfo('OH_MODO = Crear')
ENDIF
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC OrdenCrear
OH_MODO := 'Crear'
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC OrdenGrabar
OH_MODO := 'Grabar'
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC OrdenAbrir
OH_MODO := 'Abrir'
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC OrdenVer
MsgInfo( 'Estado : '+OH_MODO )
RETURN
Saludos cordiales a todos.
Eduardo Flores Rivas
LIMA - PERU
-
Javier Tovar
- Posts: 1275
- Joined: Tue Sep 03, 2013 4:22 am
- Location: Tecámac, México
Re: Variables PRIVATE no existen.
Hola edufloriv,
El ERROR te va a ocurrir cuando tu declares variables Privadas en un nivel inferior de donde las quieres llamar. tu codigo es igual que el tuyo solo que llamo a la función "OrdenVer()" desde "Win_Main". Espero que te haya quedado claro.
Saludos
El ERROR te va a ocurrir cuando tu declares variables Privadas en un nivel inferior de donde las quieres llamar. tu codigo es igual que el tuyo solo que llamo a la función "OrdenVer()" desde "Win_Main". Espero que te haya quedado claro.
Saludos
Code: Select all
#include <hmg.ch>
FUNCTION MAIN()
DEFINE WINDOW Win_Main ;
AT 0 , 0 ;
WIDTH 1020 HEIGHT 730 ;
TITLE "PRINCIPAL" ;
FONT "Arial" SIZE 9 ;
MAIN
DEFINE MAIN MENU
POPUP "&Menú"
ITEM 'Orden de compra' ACTION Orden()
ITEM 'Orden Ver' ACTION OrdenVer() // <============================AQUI TE SALTA EL ERRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRROOOOOOOOOOOOR!
END POPUP
END MENU
END WINDOW
ACTIVATE WINDOW Win_Main
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC ORDEN()
IF IsWindowDefined(Win_Orden)=.T.
MINIMIZE WINDOW Win_Orden
RESTORE WINDOW Win_Orden
RETURN
ENDIF
PRIVATE OH_MODO := 'Inicial'
IF ! ISDIR('c:\Farmacom\Ordenes')
CreateFolder('c:\Farmacom\Ordenes')
ENDIF
DEFINE WINDOW Win_Orden ;
AT 0 , 0 ;
WIDTH 600 HEIGHT 500 ;
TITLE "ORDEN DE COMPRA" ;
FONT "Arial" SIZE 9 ;
CHILD ;
NOMAXIMIZE ;
ON INIT OrdenIniciar() ;
ON RELEASE OrdenSalir()
DEFINE MAIN MENU
POPUP "&Operaciones"
ITEM 'Crear' ACTION OrdenCrear()
ITEM 'Grabar' ACTION OrdenGrabar()
ITEM 'Abrir' ACTION OrdenAbrir()
SEPARATOR
ITEM 'Ver estado' ACTION OrdenVer()
END POPUP
END MENU
END WINDOW
CENTER WINDOW Win_Orden
ACTIVATE WINDOW Win_Orden
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC OrdenIniciar
OH_MODO := 'Nada'
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC OrdenSalir
IF OH_MODO = 'Crear'
MsgInfo('OH_MODO = Crear')
ENDIF
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC OrdenCrear
OH_MODO := 'Crear'
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC OrdenGrabar
OH_MODO := 'Grabar'
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC OrdenAbrir
OH_MODO := 'Abrir'
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC OrdenVer
MsgInfo( 'Estado : '+OH_MODO )
RETURN
Last edited by Javier Tovar on Wed Mar 26, 2014 9:06 pm, edited 1 time in total.
-
Javier Tovar
- Posts: 1275
- Joined: Tue Sep 03, 2013 4:22 am
- Location: Tecámac, México
Re: Variables PRIVATE no existen.
Ahora cheque este Código.
Saludos
Code: Select all
#include <hmg.ch>
FUNCTION MAIN()
PRIVATE OH_MODO := 'Inicial' // <AQUÍ DECLARO LA VARIABLE Y ES VISIBLE EN TODO EL *.PRG
DEFINE WINDOW Win_Main ;
AT 0 , 0 ;
WIDTH 1020 HEIGHT 730 ;
TITLE "PRINCIPAL" ;
FONT "Arial" SIZE 9 ;
MAIN
DEFINE MAIN MENU
POPUP "&Menú"
ITEM 'Orden de compra' ACTION Orden()
ITEM 'Orden Ver' ACTION OrdenVer()
END POPUP
END MENU
END WINDOW
ACTIVATE WINDOW Win_Main
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC ORDEN()
IF IsWindowDefined(Win_Orden)=.T.
MINIMIZE WINDOW Win_Orden
RESTORE WINDOW Win_Orden
RETURN
ENDIF
IF ! ISDIR('c:\Farmacom\Ordenes')
CreateFolder('c:\Farmacom\Ordenes')
ENDIF
DEFINE WINDOW Win_Orden ;
AT 0 , 0 ;
WIDTH 600 HEIGHT 500 ;
TITLE "ORDEN DE COMPRA" ;
FONT "Arial" SIZE 9 ;
CHILD ;
NOMAXIMIZE ;
ON INIT OrdenIniciar() ;
ON RELEASE OrdenSalir()
DEFINE MAIN MENU
POPUP "&Operaciones"
ITEM 'Crear' ACTION OrdenCrear()
ITEM 'Grabar' ACTION OrdenGrabar()
ITEM 'Abrir' ACTION OrdenAbrir()
SEPARATOR
ITEM 'Ver estado' ACTION OrdenVer()
END POPUP
END MENU
END WINDOW
CENTER WINDOW Win_Orden
ACTIVATE WINDOW Win_Orden
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC OrdenIniciar
OH_MODO := 'Nada'
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC OrdenSalir
IF OH_MODO = 'Crear'
MsgInfo('OH_MODO = Crear')
ENDIF
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC OrdenCrear
OH_MODO := 'Crear'
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC OrdenGrabar
OH_MODO := 'Grabar'
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC OrdenAbrir
OH_MODO := 'Abrir'
RETURN
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
*-------------------------------------------------------------------------
PROC OrdenVer
MsgInfo( 'Estado : '+OH_MODO )
RETURN-
Javier Tovar
- Posts: 1275
- Joined: Tue Sep 03, 2013 4:22 am
- Location: Tecámac, México
Re: Variables PRIVATE no existen.
CORRECCIÓN DE ERRATAS,
Saludos
No es Variables publicas, sino lo correcto es "Variables Privadas".Javier Tovar wrote:El ERROR te va a ocurrir cuando tu declares variables publicas en un nivel inferior de donde las quieres llamar. tu codigo es igual que el tuyo solo que llamo a la función "OrdenVer()" desde "Win_Main". Espero que te haya quedado claro.
Saludos
- luisvasquezcl
- Posts: 1263
- Joined: Thu Jul 31, 2008 3:23 am
- Location: Chile
- Contact:
Re: Variables PRIVATE no existen.
Hola Eduardo,
Cuando declaras una variable a nivel de módulo, me refiero a que es creada cuando inicia el programa y no dentro de una funcion o procedimiento, la variable será visible en todo el programa, ya sea dentro o fuera de un procedimiento o funcion.
Si la defines dentro de un procedimiento o función su visibilidad estará restringuida a esa porción de programa.
Por ejemplo
/* Variable creada a nivel de módulo */
Private MiVar := "Hola"
alert( mivar ) // Aqui muestra "Hola"
Cambiar_valor()
alert( mivar ) // Aqui muestra "Adios"
procedure cambiar_valor()
// aqui cambia la variable creada al inicio del módulo y no crea una nueva.
mivar := "Adios"
Return
/* Variable creada a nivel de procedimiento */
Procedure main
Private Mivar := "Hola"
alert( mivar )
cambiar_valor()
mostrar()
return
procedure cambiar_valor()
// probablemente aqui no te de error porque directamente creará una nueva variable mivar
// pero visible sólo para este procedimiento.
mivar = "Adios"
return
procedure mostrar()
// aqui debería mostrar un error porque la variable no es visible porque fue definida en el main
alert( mivar )
return
Espero te sea de ayuda.
Saludos cordiales,
Luis Vasquez
Cuando declaras una variable a nivel de módulo, me refiero a que es creada cuando inicia el programa y no dentro de una funcion o procedimiento, la variable será visible en todo el programa, ya sea dentro o fuera de un procedimiento o funcion.
Si la defines dentro de un procedimiento o función su visibilidad estará restringuida a esa porción de programa.
Por ejemplo
/* Variable creada a nivel de módulo */
Private MiVar := "Hola"
alert( mivar ) // Aqui muestra "Hola"
Cambiar_valor()
alert( mivar ) // Aqui muestra "Adios"
procedure cambiar_valor()
// aqui cambia la variable creada al inicio del módulo y no crea una nueva.
mivar := "Adios"
Return
/* Variable creada a nivel de procedimiento */
Procedure main
Private Mivar := "Hola"
alert( mivar )
cambiar_valor()
mostrar()
return
procedure cambiar_valor()
// probablemente aqui no te de error porque directamente creará una nueva variable mivar
// pero visible sólo para este procedimiento.
mivar = "Adios"
return
procedure mostrar()
// aqui debería mostrar un error porque la variable no es visible porque fue definida en el main
alert( mivar )
return
Espero te sea de ayuda.
Saludos cordiales,
Luis Vasquez