Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Error dbexpress y clientdatasets (https://www.clubdelphi.com/foros/showthread.php?t=70792)

fjcg02 11-11-2010 00:35:50

Error dbexpress y clientdatasets
 
Hola a todos,

tengo un problema un tanto curioso y me gustaría saber si a alguno de vosotros os ha ocurrido.

Resulta que tengo dos módulos de datos que se crean al arrancar la aplicación.

Tengo tropecientos formularios que creo en runtime. Hay uno, que si lo abro antes de abrir otro concreto, funciona correctamente. Sin embargo, si lo abro tras abrir el otro, o estando este segundo abierto, me da el error

"SQLConnection property required for this operation"

y el formulario no arranca. Pongo un punto de ruptura en la primera instrucción que se ejecuta en el evento FormCreate, y casca antes de llegar ahí.
No siempre casca, pero sí en el 95% de las veces.:confused:
Deduzco que hay internamente algún código que se ejecuta antes del evento FormCreate, pero no sé cómo trazarlo.

Es un tema muy raro, aunque sí debo decir que utilizo querys comunes en los dos formularios ( sin clonarlas ). entiendo que podría dar un error de lógica, pero no de 'inconsistencia'.

Me trae en jaque. Recorro todos los DataSets para ver si algún SQLDataset no tiene alimentado el valor SQLConnection, pero casca antes.

Utilizo firebird, dbexpress, sqlDatasets, datasetproviders y clientdatasets. Delphi 7.

Gracias por vuestra atención.

Un saludo

ElKurgan 11-11-2010 07:56:31

Comprueba si tienes abierto algún dataset del formulario en tiempo de diseño. Antes del create propiamente dicho se ejecuta la carga de componentes del formulario, y tiene toda la pinta de que uno de los componentes necesita conectarse a la base de datos mientras se está creando.

Un saludo

Al González 11-11-2010 08:41:40

Hola Javier.

El mensaje de error que señalas aparece cuando el conjunto de datos SQLDataSet necesita realizar algo a través del objeto TSQLConnection, pero éste no se encuentra asignado en la propiedad SQLConnection.

Es como si el segundo formulario causara que la propiedad SQLConnection de una de las consultas se perdiera.

Por otra parte, no es buena idea dejar en tiempo de diseño la propiedad Active de los conjuntos de datos en True. Sino, abrirlos en tiempo de ejecución conforme los procesos y formularios de la aplicación los necesiten.

En cuanto a poder ver el camino que siguió el programa hasta llegar al punto de ruptura, usa la ventana de pila de llamadas (call stack), pero compilando primero la aplicación con la opción Use Debug DCUs de las opciones del proyecto.

Algunas preguntas:

¿Estás creando y destruyendo módulos de datos en tiempo de ejecución o solamente formularios?

¿Todos los componentes de acceso a datos están en los módulos de datos o algunos están en formularios?

¿Existen componentes TSQLDataSet que no estén en el mismo módulo de datos que el componente TSQLConnection?

¿Usas herencia visual? (plantillas de formularios)

Me voy a dormir, pero por la mañana americana regresaré a echar otro vistazo. ;)

fjcg02 11-11-2010 11:26:09

Gracias a todos por responder.

Intentaré explicar con más detalle la batería de preguntas que me haceis.

Cita:

El mensaje de error que señalas aparece cuando el conjunto de datos SQLDataSet necesita realizar algo a través del objeto TSQLConnection, pero éste no se encuentra asignado en la propiedad SQLConnection.
Está asignado, si no sería imposible que alguna vez funcionara. Además, es una propiedad que asigno en diseño y no vuelvo a tocar.

Cita:

Es como si el segundo formulario causara que la propiedad SQLConnection de una de las consultas se perdiera.
Exacto, ,aunque no entiendo porqué, ya que como digo anteriormente, es una propiedad que no toco en runtime. Si no funcionase, no lo haría nunca.

Cita:

Por otra parte, no es buena idea dejar en tiempo de diseño la propiedad Active de los conjuntos de datos en True. Sino, abrirlos en tiempo de ejecución conforme los procesos y formularios de la aplicación los necesiten.
Salvo error u omisión, están todos cerrados. Los abro explícitamente al crear los formularios o cuando son necesarios. Es fácil al probar saber si me he dejado alguno sin abrir, ya que sino, no funciona.

Cita:

En cuanto a poder ver el camino que siguió el programa hasta llegar al punto de ruptura, usa la ventana de pila de llamadas (call stack), pero compilando primero la aplicación con la opción Use Debug DCUs de las opciones del proyecto.
Intentaré utilizarlo, aunque soy un poco trontxo.

Cita:

¿Estás creando y destruyendo módulos de datos en tiempo de ejecución o solamente formularios?
Sólamente formularios. Los módulos de datos se crean al principio.

Cita:

¿Todos los componentes de acceso a datos están en los módulos de datos o algunos están en formularios?
Mixto, los principales en los módulos de datos, alguno auxiliar ( los menos ) en los formularios. Lo que sí garantizo es que no hay referencias desde un formulario a componentes de datos de otro formulario ( podría no haber sido creado y cascaría ). Concretamente sólo tego dos sqldataset en cada uno de los formularios. Los demás están en los módulos de datos.

Cita:

¿Existen componentes TSQLDataSet que no estén en el mismo módulo de datos que el componente TSQLConnection?
Sí, aunque hasta ahora no he tenido ningún problema. Lo que sí tengo siempre juntos en el mismo módulo o formulario son los SQLDataset, datasetprovider y clientdataset que están relacionados.


Cita:

¿Usas herencia visual? (plantillas de formularios)
Sí, ... aunque he comprobado que estos dos formularios no son heredados.


Seguiré investigando e intentaré retroalimentar los avances o la solución.

Saludos

fjcg02 12-11-2010 00:55:57

Esto es un poltergueist o como demonios se escriba :confused:

Si comento la apertura de un SQLDataset + clientDataset concreto, no me da el error. Si lo descomento, me da.

Insisto, es cuando abro primero un módulo y luego el otro. Si lo hago en orden inverso, funciona.

Saludos

fjcg02 13-11-2010 00:04:44

Bueno, haciendo diferentes pruebas he conseguido llegar a que no me casque y funcione como debe hacerlo.

No sé porqué extraña razón, hasta el momento, un servidor de Uds. para hacer dos datasets maestro detalle, los hacía un poco a manija. ( Por favor no os riais ).

Qué quiere decir esto: que tengo un maestro, y en su evento OndataChange, por cada tabla detalle, cierro el dataset, doy valor al parámetro, y vuelvo a abrirlo. Hasta ahora siempre me ha funcionado, hasta éste el caso que nos ocupa.

Finalmente, una vez identificado el dataset que me provocaba el error ( que por cierto sigo sin saber porqué fallaba ) , he cambiado la manera de relacionarlo con el dataset maestro, y he utilizado las propiedades de ClientDataset, MasterSource y MasterFields, abriéndolo al crear el formulario y quitando del evento OnDataChange del maestro la apertura del mismo.

No sé si ha sido un aviso de Delphi del tipo "no seas tan burro" o algo similar, pero como os contaba, hasta ahora NUNCA ME HABIA PASADO.

Espero que le sirva a alguien la respuesta, al menos a los que os habeis interesado para saber que está resuelto el problema

Gracias a todos

PD: Al, la invitación sigue en pie

korinho90 01-12-2010 20:02:23

ayuda
 
buenas hola ha todos
miren tengo que hacer un programa que elimine registros y el codigo lo tengo asi
cd.query1.close;
cd.query1.SQL.add('delete*from clilentes');
cd.query1.SQL.add('where id_cliente=:id');
cd.query1.Params[0].AsInteger:=strtoint(edit1.Text);
cd.query1.Prepare;
cd.query1.UnPrepare;
cd.query1.ExecSQL;
y pos si me elimina pero cuando quiero eliminar por segunda ves me marca error
quiero que me elimine cuantos quiera

rgstuamigo 01-12-2010 21:54:20

Cita:

Empezado por korinho90 (Mensaje 383764)
buenas hola ha todos
miren tengo que hacer un programa que elimine registros y el codigo lo tengo asi
cd.query1.close;
cd.query1.SQL.add('delete*from clilentes');
cd.query1.SQL.add('where id_cliente=:id');
cd.query1.Params[0].AsInteger:=strtoint(edit1.Text);
cd.query1.Prepare;
cd.query1.UnPrepare;
cd.query1.ExecSQL;
y pos si me elimina pero cuando quiero eliminar por segunda ves me marca error
quiero que me elimine cuantos quiera

Hola korinho90 Bienvenido(a) al club, como eres nuevo(a) te ruego que antes de postear y exponer tus dudas leas la Guía de estilo para conocer ciertas reglas del foro.;)
En tu caso, tu duda que tienes no tiene nada que ver con el tema que se estaba tratando, en otras palabras para cada duda o problema diferentes debes abrir un nuevo tema(Hilo), de ahí que es importante leer la Guía de Estilo., sin olvidar que tambien antes de postear puedes hacer una busqueda con el buscador del Club;)
Saludos y muchas gracias por tu comprensión:)


La franja horaria es GMT +2. Ahora son las 21:40:49.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi