saber si tengo tablas en el dataenvironment en un formulario

271 views
Skip to first unread message

Marcelo Lopez

unread,
Jun 11, 2024, 4:07:25 PMJun 11
to publicesvfoxpro
HOLa a todos :

Necsitaria saber como puedo detectar si al trabajar con un formulario en modo desarrollo tengo tablas dbf agregadas en el dataenvironment de dicho formulario .
Esto seria :
Hago un modi form desde l de comandos o desde el proyecto y que salga un mensaje de cual o cuales tablas tengo agregadas en el dataenvironment.
Tambien podria ser en el momento de guardar los cambios en el formulario que salga el mensaje mencionado.

desde ya muchas gracias

Cristian Novoa

unread,
Jun 11, 2024, 4:39:14 PMJun 11
to Comunidad de Visual Foxpro en Español
ASELOBJ(a, 2)
? a(1,1).objects.count
? a(1,1).objects(1).name
? a(1,1).objects(1).cursorsource

for lnCursor = 1 to a(1,1).objects.count
   ? a(1,1).objects(lnCursor).cursorsource
next

Dsan

unread,
Jun 11, 2024, 5:08:45 PMJun 11
to publice...@googlegroups.com

No te recomendaría usar el DataEnvironment mejor usa el metodo load del formulario, y hacer esto por cada tabla dbf que vayas a usar.

Ex = null 

TRY

USE tutabla IN 0 

CATCH TO Ex 
Messagebox("Error No: "+str(ex.ErrorNo)+chr(13)+;
"En la linea No: "+str(ex.LineNo)+chr(13)+;
"Detalle: "+(ex.Details)+chr(13)+;
"Message de error: "+(Ex.Message)+chr(13),0+48,"Alerta")
FINALLY 

IF NOT ISNULL(Ex) THEN 
       MESSAGEBOX("La Tabla tuTutbla no existe o no está mapeada su carpeta origen con set path to",0+48,"Alerta")
    ENDIF 
ENDTRY  

Saludos

DS

--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/CAKGbfCasPQoPzjcp%2BYzyLX7BWj8Bjbk%3DGwiStzoL%3DskqHND_0w%40mail.gmail.com.

Mik

unread,
Jun 11, 2024, 6:09:18 PMJun 11
to Comunidad de Visual Foxpro en Español
En mi caso, como no uso el Dataenvironment en mis forms lo remuevo en el vento Load.

IF PEMSTATUS(This,"Dataenvironment",5)
   This.RemoveObject('Dataenvironment')
ENDIF


Saludos!!

Marcelo Lopez

unread,
Jun 13, 2024, 9:46:19 AMJun 13
to publice...@googlegroups.com
gracias a todos por las rtas. 
En el caso de usar 
IF PEMSTATUS(This,"Dataenvironment",5)
   This.RemoveObject('Dataenvironment')
ENDIF 

hay alguna manera de saber si ademas de verificar si existe el metodo dataenvironment  , dentro del mismo hay tablas agregadas ?
me refiero a poder poner un codigo dentro del if que verifique esto .
Justamente lo que quiero hacer es en modo desarrollo al trabajar con un formulario , en el momento de guardar los cambios poder verificar si hay tablas y poder  sacarlas de ahi para abrirlas en el load o en el init . gracias por la ayuda

Cristian Novoa

unread,
Jun 13, 2024, 11:46:10 AMJun 13
to Comunidad de Visual Foxpro en Español
Usa ASELOBJ para recorrer las tablas, y con WriteMethod puedes modificar el el método Load.

Cristian Novoa

unread,
Jun 13, 2024, 11:48:50 AMJun 13
to Comunidad de Visual Foxpro en Español
Se me olvidaba. Alguna vez tuve la necesidad de modificar todos los formularios en tiempo de diseño, así que se me ocurrió lo siguiente. Haz un respaldo de tu proyecto antes.

lcDir = ".\forms"

lnCantForm = ADIR(laForm, lcDir+"\*.scx", "D")


CLEAR

FOR lnIndice = 1 TO lnCantForm
lcForm = laForm(lnIndice, 1)

? lnIndice, lcForm


MODIFY FORM (lcDir+"\"+lcForm) NOWAIT

*
*obarra_herram_diseño.cmdAjustar.Click()
ASELOBJ(laControl, 3)
loForm = laControl(1).Name
*loForm.propiedad =
*lcCodigoInit = "lnNum=1536"+CHR(13)+CHR(10)+"MESSAGEB('NUM VALE:'+STR(lnNum))"
*loForm.WriteMethod("Init", lcCodigoInit)


*obarra_herram_diseño.cmdAjustar.Click()


KEYBOARD '{CTRL+S}' && grabar
KEYBOARD '{CTRL+F4}' && salir



*!* FOR I=1 TO 30
*!* INKEY(0.1)
*!* next
NEXT

micky khan

unread,
Jun 13, 2024, 5:47:37 PMJun 13
to publice...@googlegroups.com
Y si fuera que deseo adicionar alguna clase como lo haria ???  


Gracias...




--
  <_>
 (o o)
 (  °  )
<>-<>
Micky Khan

Cristian Novoa

unread,
Jun 13, 2024, 6:03:45 PMJun 13
to Comunidad de Visual Foxpro en Español
Explícame con lujo de detalles qué quieres hacer.

Marcelo Lopez

unread,
Jun 14, 2024, 8:20:42 AMJun 14
to publice...@googlegroups.com
gracias por las rtas :

Intente poner este codigo en el load  de un form con dos tablas agregadas en el dataenvironmment:

IF PEMSTATUS(This,"Dataenvironment",5)

ASELOBJ(a, 2)


for lnCursor = 1 to a(1,1).objects.count
  Wait WINDOW  a(1,1).objects(lnCursor).cursorsource
next
   
ENDIF

Al ejecutarlo , me sale un msg de error que me dice "a is not on array "   

Zarlu

unread,
Jun 14, 2024, 11:17:18 AMJun 14
to Comunidad de Visual Foxpro en Español
Buenos días Marcelo!

El DataEnvironment siempre estará presente, tenga o no tablas.

Esto creo te servirá:
For Each oObj IN Thisform.DataEnvironment.Objects
If Lower(m.oObj.BaseClass) = "cursor"
Wait WINDOW;
"Name :"+m.oObj.Name+Chr(13)+;
"Alias :"+m.oObj.Alias+Chr(13)+;
"Database :"+m.oObj.Database+Chr(13)+;
"CursorSource :"+m.oObj.CursorSource+;
CHR(13)+CHR(13)+;
"Presiona cualquier tecla para continuar..."
Endif
Endfor
*Fuente http://www.davphantom.net/category.asp?tag=visual-fox-pro-2/page14/

Suerte
zarlu
Chetumal, Quintana Roo, México

Zarlu

unread,
Jun 14, 2024, 11:26:01 AMJun 14
to Comunidad de Visual Foxpro en Español
Qué tal Marcelo!

En desarrollo, con el Form abierto a modificación y seleccionado y desde la ventana de comandos:

ASELOBJ(aArray, 2)
FOR EACH oObj IN aArray(1).Objects
? oObj.Name
EndFOR

Suerte
zarlu
Chetumal, Quintana Roo, México

Elides Paredes

unread,
Jun 14, 2024, 1:17:27 PMJun 14
to Comunidad de Visual Foxpro en Español
Hola amigos.
Meto en el formulario un ComboBox.
En el init coloqué lo siguiente
*
* Cbo_Alias_Num
* ----------


* Muestra una lista con las tablas del entorno de datos.

* AUSED( ) crea una matriz de dos dimensiones donde Incluye en la primera columna los alias de tabla
* abiertas y  La segunda columna de la matriz contiene los números de área de trabajo correspondientes a
* las tablas. La función retorna el número de filas de la matriz, que es igual al número de tablas abiertas
* en la sesión de datos.

LOCAL Num_Tablas, texto

Num_Tablas = 0
Num_Tablas = AUSED(Vector)

WITH This
     .BoundColumn = 2
     .BoundTo = .F.
.DisplayValue = 2

FOR I = 1 TO Num_Tablas  && Loop para meter los nombres de tablas en el combo.

* Así funciona bien. Pero coloca primero el número de área y luego el nombre de la tabla y lo quiero alrevés.

*!*    .AddItem (TRANSFORM (Vector(I,2))) && Columna 2 Alias
*!*    .list [.NewIndex, 2] =   (Vector(I,1))  && Columna 1 Número de Área

    .AddItem (Vector(I,1))  
   .list [.NewIndex, 2] =   TRANSFORM (Vector(I,2) ) && Columna 2 Número de Área
 
ENDFOR

ENDWITH
 
 
 
* Estos no funcionan.  

*    .AddListItem( TRANSFORM (Vector(I,2)   ,1))

* los que siguen si funcionan
    * .AddItem (TRANSFORM (Vector(I,1)),1)
    *  TRANSFORM es porque el combo solo acepta caracteres no números
    * .AddItem (Vector(I,1),1)

*!* This.RowSourceType = 5
*!* This.RowSource = 'Vector'

* Control.AddListItem(cItem [, nItemID] [, nColumn])

*  Control.AddItem(cItem [, nIndex] [, nColumn])
*  Parámetros
*  cItem
*  Especifica la expresión de cadena que se agrega al control.
*  nIndex
*  Especifica la posición donde el elemento se coloca en el control. Si proporciona un valor válido para el parámetro opcional nIndex, cItem se colocará en esa posición dentro del control. Si especifica un nIndex que ya existe, el elemento se insertará en esa posición y todos los elementos por debajo del elemento se moverán una posición hacia abajo en la parte de lista del control ComboBox o ListBox.
*  Si omite nIndex y la propiedad Sorted está establecida en el valor verdadero (.T.), cItem se agregará en orden alfabético. Si omite nIndex y la propiedad Sorted está establecida en el valor falso (.F.), cItem se agregará al final de la parte de lista del control ComboBox o ListBox.

*  nColumn
*  Especifica la columna del control al que se va a agregar el nuevo elemento. El valor predeterminado es 1.

*
* Cbo_Alias_Num
* ----------


* Muestra una lista con las tablas del entorno de datos.

* AUSED( ) crea una matriz de dos dimensiones donde Incluye en la primera columna los alias de tabla
* abiertas y  La segunda columna de la matriz contiene los números de área de trabajo correspondientes a
* las tablas. La función retorna el número de filas de la matriz, que es igual al número de tablas abiertas
* en la sesión de datos.

LOCAL Num_Tablas, texto

Num_Tablas = 0
Num_Tablas = AUSED(Vector)

WITH This
     .BoundColumn = 2
     .BoundTo = .F.
.DisplayValue = 2

FOR I = 1 TO Num_Tablas  && Loop para meter los nombres de tablas en el combo.

* Así funciona bien. Pero coloca primero el número de área y luego el nombre de la tabla y lo quiero alrevés.

*!*    .AddItem (TRANSFORM (Vector(I,2))) && Columna 2 Alias
*!*    .list [.NewIndex, 2] =   (Vector(I,1))  && Columna 1 Número de Área

    .AddItem (Vector(I,1))  
   .list [.NewIndex, 2] =   TRANSFORM (Vector(I,2) ) && Columna 2 Número de Área
 
ENDFOR

ENDWITH
 
 
 
* Estos no funcionan.  

*    .AddListItem( TRANSFORM (Vector(I,2)   ,1))

* los que siguen si funcionan
    * .AddItem (TRANSFORM (Vector(I,1)),1)
    *  TRANSFORM es porque el combo solo acepta caracteres no números
    * .AddItem (Vector(I,1),1)

*!* This.RowSourceType = 5
*!* This.RowSource = 'Vector'

* Control.AddListItem(cItem [, nItemID] [, nColumn])

*  Control.AddItem(cItem [, nIndex] [, nColumn])
*  Parámetros
*  cItem
*  Especifica la expresión de cadena que se agrega al control.
*  nIndex
*  Especifica la posición donde el elemento se coloca en el control. Si proporciona un valor válido para el parámetro opcional nIndex, cItem se colocará en esa posición dentro del control. Si especifica un nIndex que ya existe, el elemento se insertará en esa posición y todos los elementos por debajo del elemento se moverán una posición hacia abajo en la parte de lista del control ComboBox o ListBox.
*  Si omite nIndex y la propiedad Sorted está establecida en el valor verdadero (.T.), cItem se agregará en orden alfabético. Si omite nIndex y la propiedad Sorted está establecida en el valor falso (.F.), cItem se agregará al final de la parte de lista del control ComboBox o ListBox.

*  nColumn
*  Especifica la columna del control al que se va a agregar el nuevo elemento. El valor predeterminado es 1.

*--------------------------
En el click del combo coloqué esto.
*
* Cbo_Alias_Num
* ------------             Click

* Al hacer click sobre un item, Selecciona el área cuyo valor Seleccionó.

SELECT VAL (This.Value)
Titulo = 'Tabla ' + ALIAS(VAL(This.Value))
DEFINE WINDOW ventana FROM 5,0 TO 15,40 IN DESKTOP ;
TITLE "Resultados" FONT "MS Sans Serif", ;
14 STYLE "B" FLOAT GROW CLOSE PANEL ;
ICON FILE "C:\Configurargv\Imagenes\Iconos\BUG.ICO" HALFHEIGHT ;
COLOR RGB(,,255,255,255,128)

* Esto es solo  un ejemplo para mí, pero lo copié tal cual lo tengo en mi formuario
*!* BROWSE FIELDS;
*!* Descripcio :H = 'Descripción'   :26    ,;    
*!* PreUnBss   :H = 'Precio Unitario Bs. s/Iva'  :22     :P = '999,999,999.99' ,;
*!* PreUnBsc   :H = 'Precio Unitario Bs. c/Iva'  :22     :P = '999,999,999.99' ,;
*!* PreToBss    :H = 'Precio Total Bs s/Iva'       :22     :P = '999,999,999.99' ,;
*!* PreToBsc    :H = 'Precio Total Bs c/Iva'       :22     :P = '999,999,999.99' ,;
*!* PreUnDols  :H = 'Precio Uni.Dol s/Iva'        :22     :P = '999,999,999.99' ,;
*!* PreUnDolc  :H = 'Precio Uni.Dol c/Iva'        :22     :P = '999,999,999.99' ,;
*!* PreToDols   :H = 'Precio Total Dol. s/Iva'    :22     :P = '999,999,999.99' ,;
*!* PreToDolc   :H = 'Precio Total Dol. c/Iva'    :22     :P = '999,999,999.99'  ;
*!* FONT 'Verdana', 12 STYLE 'I' ;
*!* TITLE 'Resumen de Precios y Precio s' ;
*!* WINDOW Ventana  NODELETE SAVE NOAPPEND


IF VAL (This.Value) <> 0
  BROWSE FONT 'Verdana',14 STYLE 'I'    TITLE  Titulo WINDOW Ventana  NODELETE SAVE NOAPPEND
ENDIF

RELEASE WINDOWS Ventana

Zarlu

unread,
Jun 14, 2024, 2:48:22 PMJun 14
to Comunidad de Visual Foxpro en Español
Buenas tardes Elides!

Te sugiero crear un hilo nuevo por tema. Así queda a la vista de todos.
Dices: "...* Así funciona bien. Pero coloca primero el número de área y luego el nombre de la tabla y lo quiero alrevés...."

Quizá sea esto lo que requieres:
Num_Tablas = AUSED(Vector)
WITH This
.ColumnCount = 2

FOR I = 1 TO Num_Tablas 
.AddItem (PADR(Vector(I,1),20," "))
  .list [I, 2] =  PADL(TRANSFORM(Vector(I,2)),5," ")
EndFor
.ListIndex=1
ENDWITH


Suerte
zarlu
Chetumal, Quintana Roo, México

Elides Paredes

unread,
Jun 15, 2024, 10:25:25 AMJun 15
to Comunidad de Visual Foxpro en Español
Buen día amigo Zarlu.
Para mí siempre es un placer recibir recomendaciones porque es como la hormona que me hace crecer, por tanto me siento igualmente agradecido.

Sin embargo, en éste caso particular, mi comentario es referente al mismo tema. Esa fué la solución que conseguí para ver en un combo la lista de tablas abiertas en el formulario; algo que se crea en el Init del combo.  y en el click del combo, tengo un procedimiento para mostrar con un browse la tabla que seleccione.

Saludos cordiales amigos
Elides Paredes, Barquisimeto Venezuela

Zarlu

unread,
Jun 15, 2024, 11:05:53 AMJun 15
to Comunidad de Visual Foxpro en Español
Buenos días Elides!

Ok. Entiendo. Y una disculpa, no entendí el sentido de tu mensaje.
Ahora bien...
Lo que expones funciona para las tablas abiertas sin distinguir si provienen o no del  DATAENVIRONMENT, y es esté el que motiva el tema de este hilo.
Interesante tu código. Saludos.

Suerte
zarlu
Chetumal, Quintana Roo, México


Marcelo Lopez

unread,
Jun 15, 2024, 2:03:39 PMJun 15
to publice...@googlegroups.com
gracias a todos por la ayuda ! Aplique el código que pasó  ZArlu y anduvo de 10 ! 

For Each oObj IN Thisform.DataEnvironment.Objects
If Lower(m.oObj.BaseClass) = "cursor"
Wait WINDOW;
"Name :"+m.oObj.Name+Chr(13)+;
"Alias :"+m.oObj.Alias+Chr(13)+;
"Database :"+m.oObj.Database+Chr(13)+;
"CursorSource :"+m.oObj.CursorSource+;
CHR(13)+CHR(13)+;
"Presiona cualquier tecla para continuar..."
Endif
Endfor

Elides Paredes

unread,
Jun 15, 2024, 3:08:20 PMJun 15
to Comunidad de Visual Foxpro en Español
Estimado amigo Zarlu.

Mis saludos cordiales.

Por eso es que me gusta tanto éste foro. Siempre aprendo algo. Mil gracias Zarlu, por tomarte el tiempo para comentar cosas positivas, y de verdad nunca ví el  DataEnvironment como un objeto dentro del formulario. Algo que es muy frecuente en la lógica de VFP,  y por tanto nunca se me habría ocurrido un código así. De hecho lo copié con comentarios; en el mismo formulario donde tengo mi opción para ver las tablas. Porque me pareció interesante.
Y estoy seguro que me va a ser muy útil.
Mil gracias.

Elides Paredes
Barquisimeto Venezuela.

Reply all
Reply to author
Forward
0 new messages