Que se ejecuta primero el Load o el Init

3,221 views
Skip to first unread message

emr

unread,
Mar 13, 2011, 11:07:02 PM3/13/11
to Comunidad de Visual Foxpro en Español
Hola saludos a todos una pregunta que creo estar en el entendido que
es el load lo que se ejecuta primero.

solo que tengo un formulario de ABC de articulos, y tengo en el Init
el siguiente codigo:

thisform.cont1.txtporiva.Value = xporiva
thisform.cont1.comincluido.value = 'S'
thisform.cont1.commoneda.Value = 'P'
thisform.cont1.grid1.Visible = .f.
thisform.cont1.txtclaveart.SetFocus
thisform.Refresh
SELECT 4
SET ORDER TO CLAVEVAL && VAL(CLAVE)
GO bottom
bcvec = VAL(clave)+1
vcveart = ALLTRIM(STR(INT(bcvec)))
SET ORDER to CLAVE && CLAVE

thisform.cont1.txtclaveart.Value = vcveart
thisform.Refresh

La pregunta es por que algunas veces cuando ejecuto en mi aplicación
este formulario me marca error donde dice que la variable CLAVEVAL no
existe, siendo que CLAVEVAL es un indice que tengo creado con la tabla
de articulos y esta asignado al Select 4, lo curioso es que no siempre
me marca este error, solo algunas veces y lo mas curioso es que lo
marca cuando ejecutas por primera vez el formulario.

En el load abro la tabla asi.

use catalart order tag clave IN 4

Saludos y muchas gracias como siempre popr su ayuda.

Enrique Martinez Regalado
Puerto Vallarta, Jalisco México

Ricardo Pina

unread,
Mar 13, 2011, 11:14:57 PM3/13/11
to publice...@googlegroups.com
Hola

El load va primero

Saludos

--
Ricardo Pina
D&SIP
Desarrollo y Servicios Informáticos Profesionales
www.dsip.com.ar

Walter R. Ojeda Valiente

unread,
Mar 13, 2011, 11:19:34 PM3/13/11
to publice...@googlegroups.com
El orden de ejecución de los métodos es fácil de recordar, es una chica que se llama LISA y su apellido empieza con G. O sea: LISA G.

Load
Init
Show
Activate

Gotfocus

Una pregunta: ¿por qué no abres tu tabla en el método INIT en lugar de abrirla en el método LOAD?

En Load todavía nada está definido.

Saludos.

Walter.

emr

unread,
Mar 13, 2011, 11:38:36 PM3/13/11
to Comunidad de Visual Foxpro en Español
Walter, pero hay algo de malo que abra mis tablas en el Load ? siempre
lo hago asi, y me ha funcionado, solo quiero saber si es asi, para
cambiar mi manera de abrir mis tablas y pasarlas al Init. Lo que si no
entiendo es por que me marca el error, por que me identifica el Indice
CLAVEVAL como variable. Insisto no es siempre pero si algunas veces me
marca el error.

saludos

Enrique Martinez

GeoSys Diseño de Software

unread,
Mar 14, 2011, 12:31:16 AM3/14/11
to publice...@googlegroups.com
Si las tablas se abren en el entorno de datos (DataEnvironment) no las abro en el Load y si no las tengo asignadas en el entorno de datos, si las abro en el LOAD.


Cuando he trabajado con DBF`s  siempre las he abierto en el LOAD y no en el INIT:

USE MITABLA SHARED && Si ningún orden.
 
En el INIT:

SELECT MITABLA ORDER 1

o de esta otra manera:

SELECT MITABLA
SET ORDER TO 1 && o depende el órden del índice que quiero.

Nunca me ha fallado.


Saludos


Anthony Contreras Peralta

Costa Rica


emr

unread,
Mar 14, 2011, 1:02:25 AM3/14/11
to Comunidad de Visual Foxpro en Español
Gracias Anthony, es lo mismo que yo he venido haciendo, pero estoy
viendo que algo trae mi formulario, por eso lo estoy haciendo de
nuevo, por que si me marca error en el indice.

Saludos y gracias

Enrique Martinez

On 13 mar, 22:31, GeoSys Diseño de Software <geosy...@gmail.com>
wrote:

marcelobuenosaires

unread,
Mar 14, 2011, 6:57:51 AM3/14/11
to publice...@googlegroups.com
Hola

Proba el "SET ORDER TO CLAVEVAL"
en el Load

Saludos
MarceloBuenosAires
____________________

El 14/03/2011 12:07 a.m., emr escribi�:


> Hola saludos a todos una pregunta que creo estar en el entendido que
> es el load lo que se ejecuta primero.
>
> solo que tengo un formulario de ABC de articulos, y tengo en el Init
> el siguiente codigo:
>
> thisform.cont1.txtporiva.Value = xporiva
> thisform.cont1.comincluido.value = 'S'
> thisform.cont1.commoneda.Value = 'P'
> thisform.cont1.grid1.Visible = .f.
> thisform.cont1.txtclaveart.SetFocus
> thisform.Refresh
> SELECT 4

> SET ORDER TO CLAVEVAL&& VAL(CLAVE)


> GO bottom
> bcvec = VAL(clave)+1
> vcveart = ALLTRIM(STR(INT(bcvec)))

> SET ORDER to CLAVE&& CLAVE
>
> thisform.cont1.txtclaveart.Value = vcveart
> thisform.Refresh
>
> La pregunta es por que algunas veces cuando ejecuto en mi aplicaci�n


> este formulario me marca error donde dice que la variable CLAVEVAL no
> existe, siendo que CLAVEVAL es un indice que tengo creado con la tabla
> de articulos y esta asignado al Select 4, lo curioso es que no siempre
> me marca este error, solo algunas veces y lo mas curioso es que lo
> marca cuando ejecutas por primera vez el formulario.
>
> En el load abro la tabla asi.
>
> use catalart order tag clave IN 4
>
> Saludos y muchas gracias como siempre popr su ayuda.
>
> Enrique Martinez Regalado

> Puerto Vallarta, Jalisco M�xico
>
>

Luis Maria Guayan

unread,
Mar 14, 2011, 8:14:37 AM3/14/11
to publice...@googlegroups.com
Personalmente cuando abro tablas específicas de un formulario, las abro en el método BeforeOpenTables del entorno de datos.

Nunca utilizo areas específicas, sino abro las tablas con:

USE MiTabla IN 0

Y siempre me refiero a las areas de trabajo con su alias:

SELECT ("MiTabla")

Cuando me refiero a los índices, lo hago por su etiqueta:

SET ORDER TO TAG Codigo IN ("MiTabla")


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

Irlandes 1960

unread,
Mar 14, 2011, 9:41:44 AM3/14/11
to publice...@googlegroups.com
coincido plenamente con Luis. Para eso esta el entorno de datos del formulario.
De esta forma sabes que la tabla esta abierta antes que se haga nada en el formulario.
También en referirme a las tablas por un alias y no por el nro de área de trabajo, que es mas frágil y limitado
En lo especifico de tu consulta, recorda que el fox (que es un animal con muchas mañas) presenta una dualidad en la sintaxis del "set order to" 
Escrito de la forma en que lo pones vos, claveval puede estar haciendo referencia a un tag o al valor de la variable claveval.  Para eliminar la dualidad, especifica la palabra TAG como lo indica Luis
Suerte y larga vida al zorro.

Jose Antonio Blasco

unread,
Mar 14, 2011, 11:04:41 AM3/14/11
to publice...@googlegroups.com
No se se se ha dicho ya, pero entre el "Load" y el "Init" del
formulario, se ejecutan los "Init" de todos los objetos contenidos en
dicho formulario. Puede ser que tengamos algo en ellos que altere el
resultado.

Un saludo.

El día 14 de marzo de 2011 14:41, Irlandes 1960
<irland...@gmail.com> escribió:

--
Jose A. Blasco
Zaragoza - España

Jairo Miranda

unread,
Mar 14, 2011, 4:04:40 PM3/14/11
to publice...@googlegroups.com

Load (Evento)

Se produce antes de crear un objeto.

El evento Load se produce en primer lugar para el FormSet y, a continuación, para los formularios en él contenidos. El evento Load se produce antes que los eventos Activate y GotFocus. Para impedir que se cree un formulario, devuelva falso (.F.) desde el evento Load; el evento Destroy no se ejecutará.

Init (Evento)

Se produce cuando se crea un objeto.

Para FormSets y otros objetos contenedores, los eventos Init de todos los objetos contenidos se desencadenan antes que el evento Init del contenedor, por lo que es posible tener acceso a los objetos contenidos en el evento Init del contenedor. El evento Init de cada objeto contenido se produce en el orden en que se agregó al objeto contenedor.

Ósea  que  primero es el load y después el init

 

Jairo

Marlon Cabrera

unread,
Mar 14, 2011, 4:07:52 PM3/14/11
to publice...@googlegroups.com, Jose Antonio Blasco
Sobre lo de abrir las tablas Luis Maria lo dejo claro , sobre como trabajan los eventos te recomiendo esta lectura http://www.portalfox.com/index.php?name=Sections&req=viewarticle&artid=42&page=1 , a mi me ayuda a entener muchas cosas y limpiar las aplicaciones de cosas "raras".

Richard Gaviria

unread,
Mar 14, 2011, 4:24:50 PM3/14/11
to Grupo VFP
Hagan una prueba muy siemple para que se den cuenta, creen un form y dentro de él un textbox que se llame text1.
 
Intenten en el load :
Thisform.Text1.Width=125
 
Les retornará el error "Miembro desconocido Text1" que quiere decir que el objeto aún no ha sido creado.
 
Si repiten el mismo ejemplo desde el Init no tendrán ningún problema porque el Init se ejecuta después que se crean los objetos.
 
Saludos.
 
Rick.
http://www.engineersoftasociados.com
 
 
 
 

 

From: ja...@vidapanama.com
To: publice...@googlegroups.com
Subject: RE: [vfp] Que se ejecuta primero el Load o el Init
Date: Mon, 14 Mar 2011 15:04:40 -0500

Enrique Martinez

unread,
Mar 15, 2011, 1:35:20 AM3/15/11
to publice...@googlegroups.com
Muchas gracias a todos por su aporte, me queda claro y aprendí mucho
de sus comentarios,

Luis Maria muchas gracias por tu sugerencia, muy atinada como siempre.

Saludos a todos y como como dice Irlandes 1960 larga vida al Zorro.

Enrique Martinez

Victor Espina

unread,
Mar 15, 2011, 11:48:03 AM3/15/11
to Comunidad de Visual Foxpro en Español
Hola. La verdad no tengo idea de cual puede ser la causa de tu error,
pero quisiera aprovechar la oportunidad para darte un par de consejos:

a) Siempre que necesites acceder a dos o mas propiedades de un objeto
cualquiera, es mas eficiente hacer uso de la sentencia WITH. Esto es
porque "." en una instruccion tipo objeto.objeto.propiedad conlleva un
cierto tiempo en ser "resuelto", por lo que es mas eficiente
resolverlo solo una vez. Entonces, en lugar de:

thisform.cont1.txtporiva.Value = xporiva
thisform.cont1.comincluido.value = 'S'
thisform.cont1.commoneda.Value = 'P'
thisform.cont1.grid1.Visible = .f.
thisform.cont1.txtclaveart.SetFocus
thisform.Refresh

es mas eficiente hacer:

WITH THISFORM.Cont1
.txtporiva.Value = xporiva
.comincluido.value = 'S'
.cont1.commoneda.Value = 'P'
.cont1.grid1.Visible = .f.
.cont1.txtclaveart.SetFocus
.Refresh
ENDWITH


b) Referenciar una tabla o cursor en base al nivel de trabajo donde
fue abierta no solo puede llevar a confusiones sobre que tabla o
cursor esta abierto en un area especifica, sino que ademas hace que el
codigo sea mas dificil de entender, pues si tu ves algo como:

SELECT 4

no hay forma alguna de saber que es lo que esta abierto ahi. En cambio
si ves algo como:

SELECT articulos

ya sabes que estas accediendo a la tabla de Articulos.
Adicionalmente, abrir una tabla en un area de trabajo especifica puede
llevar a que accidentalmente cierres otra tabla que ya estaba abierta
en ese nivel, sobre todo si no usas sesiones de datos privadas.
Entonces, en lugar de hacer:

SELECT 4
USE articulos
....
SELECT 4
REPLACE columna WITH valor

mejor has asi:

SELECT 0 && Utiliza la siguiente area de trabajo disponible en la
session
USE articulos
...
SELECT articulos
REPLACE column WITH valor

Otra buena idea, sobre todo si tus tablas tienen nombres cripticos al
estilo de MAESTPROD, es usar la clausul ALIAS, a fin de poder usar
nombres mas descriptivos en tu codigo, lo cual facilita su lectura.
Asi, en el caso de MAESTRPROD podrias hacer:

SELECT 0
USE maestprod ALIAS maestroProductos
...
SELECT maestroProductos
REPLACE codigo WITH valor


Saludos

Victor Espina
Reply all
Reply to author
Forward
0 new messages