PDA

Ver la Versión Completa : insertar y consultar una tabla desde datamodule


anubis
29-09-2011, 02:16:11
hola de nuevo.

Hay cosas que no entiendo todavia o me cuesta entender:

En primera, si tengo un datamodule y ahi asigno la base de datos, asigno las tablas a los querys y luego los activo porque no puedo hacer lo mismo desde otra unit si de otra unit si puedo consultar esas tablas, por que no me permite hacer:

module.datamodule1.zquery1.active:=true;

me dice que no encuentra la base de datos.

Pero si hago una consulta si me deja?

La otra cuestion es:

si inserto registros todo va bien pero, si posteriormente modifico alguno de ellos, no puedo volver a consultar porque me da error.

Ya probé, como digo a volver a activar el query pero no funciona.

Se que son cosas elementales pero es me atraganta.

El programa que estoy haciendo si inserta registros y los cambia pero las consultas nuevas no.

Una manita plis porque no entiendo por mas vueltas que doy.

gracias

Caral
29-09-2011, 02:37:52
Hola
No entiendo esto:
module.datamodule1.zquery1.active:=true;

Se supone que el datamodule es como un form mas, solamente que no es visible.
No se deberia llamar simplemente asi ?:
datamodule1.zquery1.active:=true;

No entiendo que es module.
Saludos

Casimiro Notevi
29-09-2011, 02:40:19
no puedo volver a consultar porque me da error.

¿Y el error saca algún mensaje?

anubis
29-09-2011, 03:06:08
tienes toda la razon caral con

datamodule1.query1.active
es mas que suficiente para que haga el enlace.

Voy por partes entonces.

en el datamodule asigno la base de datos y conecto los query y los activo, hasta ahi me funciona todo bien.

Hago consultas de unas tablas e inserto en otras, tambien todo bien.

El gran problema surge cuando en una tabla hago:


datamodule1.zquery1.sql.Clear;
datamodule1.ZQuery1.SQL.Text:='update tcuentas set cuenta=:cuenta, nombrecuenta=:nombrecuenta, numcheque=:numcheque where clave=:clave';
datamodule1.zquery1.parambyname('clave').asinteger:=clavecuenta;
datamodule1.zquery1.ParamByName('cuenta').asstring:=ncuenta.Caption;
datamodule1.zquery1.parambyname('nombrecuenta').asstring:=label4.Caption;
datamodule1.zquery1.parambyname('numcheque').asinteger:=numcheque;
datamodule1.zquery1.ExecSQL;


me hace perfecta la modificacion, pero quiero volver a consultar esa tabla.
Como es logico me dice que no se puede porque estas consultando eun dataset inactivo, asi que lo intento activar con:

datamodule1.query1.active:=true;

ahi me dice que no encuentra la tabla, asi que se la asigno de nuevo con

datamodule1.zquery1.sql.text:='select * from tcuenta';

y ahi ya me dice que no la base de datos no esta.

Digo yo, hasta donde yo creia, con los insert no hay que hacer practicamente nada, pero con los update hay que reactivar la tabla no?.

gracias por contestar

editado: por cierto, el datamodule se autocrea antes de crear el form.

alej.villa
29-09-2011, 03:48:23
El gran problema surge cuando en una tabla hago:
Código Delphi [-] (http://www.clubdelphi.com/foros/#)datamodule1.zquery1.sql.Clear; datamodule1.ZQuery1.SQL.Text:='update tcuentas set cuenta=:cuenta, nombrecuenta=:nombrecuenta, numcheque=:numcheque where clave=:clave'; datamodule1.zquery1.parambyname('clave').asinteger:=clavecuenta; datamodule1.zquery1.ParamByName('cuenta').asstring:=ncuenta.Caption; datamodule1.zquery1.parambyname('nombrecuenta').asstring:=label4.Caption; datamodule1.zquery1.parambyname('numcheque').asinteger:=numcheque; datamodule1.zquery1.ExecSQL;

porque en vez de hacerlo por sql la modificacion no la haces de este modo


datamodule1.tu_tabla.edit
datamodule1.tu_tabla.fieldbyname('campos').asstring:=clavecuenta;
datamodule1.tu_tabla.post


de esa forma no utilizarias el query y puedes hacer tu consulta sin problemas

PD: cuando me refiero a tu tabla no es al zquery1
sino a la tabla que tienes conectada directamente con la base de datos

anubis
29-09-2011, 03:54:31
Gracias por la respuesta.

Puedo probar con la tabla pero sigue sin servir un query?

El problema es reactivar luego el query o la tabla que no me deja puesto que esta enlazado con el datamodule.

alej.villa
29-09-2011, 04:01:59
porque no pruebas haciendo esto

dm.query.close;
dm.query.sql.clear;
dm.query.sql.add('SELECT * FROM tu tabla');
dm.query.open;

anubis
29-09-2011, 04:05:42
si, tambien lo he probado, al poner open me sigue diciendo que el dataset no esta activo.

alej.villa
29-09-2011, 04:10:31
tienes algún código en la parte de propiedades del sql del query?

si es asi creo que lo mejor es dejarlo en blanco y cada vez que necesites consultar algo le indiques lo que deseas consultar

anubis
29-09-2011, 04:29:36
gracias de nuevo

con el table1 como dices si funciona lo unico que no actualiza el dato hasta que cierro el programa yl o vuelvo a abrir, ya probe a desactivar la tabla, cerrarla abrirla, refrescarla, etc... el query no lo refresca porque no lo permite.

El principal problema qu etenia con el query es que desde el datamodule si me deja activar los query pero desde el programa principal no, y esto es un problemita.

edito:

con el zquery.refresh si actualiza pero creo que no es forma o si de hacer las cosas?.

Ya me lie.:)

lo que quiero saber es porque el zquery no me funciona con el active.

Caral
29-09-2011, 18:19:20
Hola
Creas el datamodule en tiempo de ejecución cuando creas el form.
Lo destruyes en algún momento?, en que evento se crea ?.
El query esta en el datamodule por ende este se crea de igual forma, no es asi?.
Saludos

anubis
29-09-2011, 20:36:57
Si, el datamodule lo creo en tiempo de ejecucion cuando se abre la aplicacion, pero antes de crear el form.
No lo destruyo y si, el query esta en el datamodule asi que se crea a la vez.

Esta en el evento oncreate del datamodule.

Si algo estoy haciendo mal ahi cuentame porque por mas vueltas qu ele doy no doy con ello.

ah, la unidad del datamodule esta en el uses del interface de la unidad principal, no en la implementacion (que tambien lo puse ahi).

Me darias un soplo de aire si me haces ver la solucion.

gracias mil

Caral
29-09-2011, 20:41:59
Hola
Pregunto solo por curiosidad:
Por que crear el datamodule y lo demas en ejecucion y no en diseño?.
Saludos

anubis
29-09-2011, 23:07:02
Perdon, no se crean en ejecución sino en diseño, automaticamente.

No se si es a lo que te refieres.

De todas formas, sigo sin entender por que no se puede acceder al query desde otra unit.

saludos