Variables PRIVATE no existen.

HMG en Español

Moderator: Rathinagiri

Javier Tovar
Posts: 1275
Joined: Tue Sep 03, 2013 4:22 am
Location: Tecámac, México

Re: Variables PRIVATE no existen.

Post by Javier Tovar »

So is Esgici :D :D :D

Saludos
User avatar
edufloriv
Posts: 240
Joined: Thu Nov 08, 2012 3:42 am
DBs Used: DBF, MariaDB, MySQL, MSSQL, MariaDB
Location: PERU

Re: Variables PRIVATE no existen.

Post by edufloriv »

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.

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
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.

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.

Post by Javier Tovar »

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

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.

Post by Javier Tovar »

Ahora cheque este Código.

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
Saludos
Javier Tovar
Posts: 1275
Joined: Tue Sep 03, 2013 4:22 am
Location: Tecámac, México

Re: Variables PRIVATE no existen.

Post by Javier Tovar »

CORRECCIÓN DE ERRATAS, :D
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.
No es Variables publicas, sino lo correcto es "Variables Privadas".

Saludos
User avatar
luisvasquezcl
Posts: 1259
Joined: Thu Jul 31, 2008 3:23 am
Location: Chile
Contact:

Re: Variables PRIVATE no existen.

Post by luisvasquezcl »

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
Post Reply