PDA

Ver la Versión Completa : No veo la manera de programar esto (Ver dentro)


David
26-05-2007, 19:18:24
Hola

Tengo un form donde se cargan los informes Finformes , luego tengo muchos datamodules , que llaman a su informe correspondiente para que la carge en el formulario Finformes .

Desde el datamodule se llama a una pequeña ventana , para elegir el cliente o el proveedor , luego se cierra la ventana y aparece el informe . Si se vuelve abrir la ventana , se crea una segunda instancia del datamodule , pero como busca el primero no cambia el cliente .

Así pues tengo que poner en el datamodule , un FreeAndNil(datamodule) , para destruirlo . Pero que pasa que se destruye cuando esta aún activo el informe y a veces este requiere del datamodule .

Lo que busco es la manera de que no se cierre el datamodule hasta que no cierre FInformes , pero no puedo poner un código en el informe pues hay muchos datamodules .

A ver si lo entendeis y podeis echarme una mano .

Un saludo

David
26-05-2007, 22:30:43
Como estoy un poco perdido , he realizado un pequeño ejemplo , con la base de datos DBDemos , con un DataModule , un formulario de busqueda que muestra los customers , un formulario donde muestra el detalle de cada formulario al que se accede a través del de búsqueda (este formulario haria las veces del informe) , todo ello dentro de un formulario principal .

El caso es que aquí el ejemplo es simple , y parece que no tiene sentido hacerlo así , pero en una aplicación grande esta de esta forma con muchos datamodules heredados , por lo que hay que poner un código en el formulario para que se destruya cuando se cierra la ventana de Orders .

Mirarlo si podeis , adjunto el código ,esta realizado en Delphi 7

Saludos

fjcg02
28-05-2007, 17:00:33
He estado viendo un poco el código.
Utilizas un DBlookuplist para seleccionar un dato. Este objeto es para seleccionar un dato que sea foreing key ( clave foranea, clave para utilizar en otra tabla ), no para seleccionarlo y utilizar ese dato posteriormente.
Haz una cosa, pon en la ventana que utilizas para seleccionar un botón, que muestre Customer_id. Verás como a pesar de seleccionar cualquiera, siempre tiene el mismo valor.

En lugar de un dblookuplist, utiliza un simple DGrid. Sin tocar nada más obtendrás el resultado que deseas. Lo único que te puede ocurrir es que si reutilizas la ventana para distintas tablas, tendrás que indicar cual es el campo que quieres visualizar en el DBGrid.

Espero haberte ayudado.

Un saludo y suerte.

roman
28-05-2007, 17:21:27
En realidad sí puede usarse un DBLookupListBox, pero David intenta recoger el valor seleccionado del DataSet:


orders.Params[0].AsInteger := CustomerCustNo.AsInteger;


cuando debiera ser directamente del DBLookupListBox


orders.Params[0].AsInteger := DBLookupListBox1.KeyValue;


Sin embargo, eso no resuelve el problema, o, mejor dicho, resuelve la parte que mencionas, pero queda la otra:


Si se vuelve abrir la ventana , se crea una segunda instancia del datamodule , pero como busca el primero no cambia el cliente


Es decir, lo que sucede es que al abrir la segunda ventana, se tienen dos copias del datamodule y dos copias de la ventana de informes (orders en el ejemplo). Los controles de la ventana de informes apuntan a los componentes en el datamodule, pues así se establece en el diseño, pero ¡hay dos ventanas y dos datamodule! ¿Cuál apunta a cuál?

Alguna vez (http://www.clubdelphi.com/foros/showthread.php?t=24473&highlight=DataModule) yo mismo me pregunté esto.

Yo veo dos opciones:


En lugar de hacer la asignación DataSource->DataSet en diseño, la hace por código para así enlazar la ventana con el datamodule que corresponda en lugar del primero que la VCL encuentre.

Obliga a la destrucción del datamodule junto con la ventana, tal como proponía él mismo.


El problema es que a ambas posibilidades les veo problemas. La primera funcionaría pero aún así queda el detalle de en qué momento se destruye el datamodule. En la segunda opción no sirve que la ventana destruya al datamodule al momento de cerrarse (OnClose) porque se produce una violación de acceso.

Supongo que cualquiera de las dos problemáticas puede solventarse, pero es que a mi me gustaría tener un poco más de detalle de qué es lo que quiere lograr David. El ejemplo que pone quizá sobre simplifica la situación, pues no me queda claro porqué quiere construir una instancia del datamodule por cada informe.

// Saludos