Dataenviroment Dinámico

Saludos. Como hago para modificar la propiedad "Database" de cada objeto "cursor" definido dentro de un "Dataenviroment" el cual es incorporado a un formulario en tiempo de diseño. En la documentación se indica que esta propiedad puede ser modificada en tiempo de ejecución y no en diseño, pero no logro ubicar un ejemplo, código y/o método que me indique como hacerlo. La idea es que mi sistema pueda trabajar con su Base de Datos y que esta se pueda ubicar en cualquier ruta distinta a la que originalmente se uso en su diseño. Tengo prevista una variable publica en el Sistema (que se define en el módulo de configuración) que almacena la ruta de la Base de Datos.
Nota: busco una solución sencilla, mi sistema tiene más de 100 formularios cada una con un Dataenviroment. Se vale cualquier otra idea a la que tengo.
Respuesta
1
Ok, la solución no es tan sencilla, sin embargo trataré de que darte una solución sencilla.
Primero que nada recuerda que cada tabla se almacena como un objeto cursor, por lo que en cada formulario, en el evento beforeopentables tendrías que poner algo parecido a lo siguiente:
Local miembros as array
Local i as integer
Local OldDBF As string
Local NewPath as string
Local OldPath as string
Miembros =AMEMBERS(A_Cursors,THISFORM.dataenvironment,2)
NewPath = Sys(5)+'\sigxx\data\'
For i=1 to Miembros
Oldpath=This.&A_Cursors..cursorsource
*-- Aqui rescato el nombre del alias del cursor
OldDBF = Substr(Oldpath,RAT([\],Oldpath)+1)
*-- Aqui le pongo el nuevo path
This.&A_Cursors..cursorsource=NewPath+Olddbf
endfor
This.OpenTables()
Fíjate que además deberás poner la propiedad autoopentables=.F. para que no te marque error.
Si te sirve y eso es todo,
Muchísimas Gracias. Tu respuesta a sido la mejor y la más útil, entiendes mi concepto. Sin embargo, te mando algunos ajustes ya que el enfoque no fue el correcto. Tu enfoque es válido para tablas libres, pero mi problema se centra en la Base de Datos. La propiedad que en este caso me interesaba era Database y no cursorsource, pero fue muy buena la idea.
Mis ajustes son:
Local miembros as array
Local i as integer
Local NewDB As string
Miembros =AMEMBERS(A_Cursors,THISFORM.dataenvironment,2)
NewDB = allt(m.var_publica)+'MI_BD.DBC'
For i=1 to Miembros
*-- Aqui le pongo la nueva ruta a mi Base de Datos
This.&A_Cursors..database=NewDB
endfor
This.OpenTables()
Nota: La propiedad autoopentables debe estar en .T. para que funcione.

2 respuestas más de otros expertos

Respuesta
-1
Antes que otra cosa debemos recordar que la base de datos es un contenedor de todas las tablas y sus indices e información adicional.
Tu puedes tener tantas bases de datos necesites aunque no veo la necesidad.
Cada formulario cuenta con su dataenvironment más este no es limitativo.
Si quiero utilizar otra tabla o tablas que no están en el ambiente las puedo llamar de forma clásica:
select 0
Use mitabla order mindice
Y que a tu disposición y la puedes relacionar con cualquiera de las tablas del ambiente.
Si no tienes en el sistema la ruta puedes utilizar:
¿USE? Para que aparezca la venta de búsqueda.
Suerte
Disculpa pero tendría mucho trabajo. Sin embargo ya otro experto me suministro la respuesta que deseaba, te la paso para que la tengas a mano:
La solución fue:
* Este codigo se debe colocar en el metodo BeforeOpenTable de cada formulario.
Local miembros as array
Local i as integer
Local NewDB As string
Miembros =AMEMBERS(A_Cursors,THISFORM.dataenvironment,2)
NewDB = allt(m.var_publica)+'MI_BD.DBC'
For i=1 to Miembros
*-- Aqui le pongo la nueva ruta a mi Base de Datos
This.&A_Cursors..database=NewDB
endfor
This.OpenTables()
Nota: La propiedad autoopentables debe estar en .T. para que funcione.
*
Respuesta
-1
Una solución que se me ocurre es que no uses el Dataenviroment y que abras la(s) tabla(s) que vayas a ocupar en el evento init de cada formulario.
De esa forma, puedes especificar la ruta de las tablas.
Bueno, eso digo yo...
Disculpame pero la respuesta no me satisface, otra experto ya me dio la solución y te la paso para que veas que es sencilla la respuesta:
La solución fue:
* Este codigo se debe colocar en el metodo BeforeOpenTable de cada formulario.
Local miembros as array
Local i as integer
Local NewDB As string
Miembros =AMEMBERS(A_Cursors,THISFORM.dataenvironment,2)
NewDB = allt(m.var_publica)+'MI_BD.DBC'
For i=1 to Miembros
*-- Aqui le pongo la nueva ruta a mi Base de Datos
This.&A_Cursors..database=NewDB
endfor
This.OpenTables()
Nota: La propiedad autoopentables debe estar en .T. para que funcione.
*

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas