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)
-   -   DataSource en distinto Form que la tabla (https://www.clubdelphi.com/foros/showthread.php?t=4372)

Giniromero 14-10-2003 10:55:22

DataSource en distinto Form que la tabla
 
Hola,

Tengo una aplicación en delphi 6, con Interbase 7 y dialecto 3.

Tengo todos mis DataSet en un DataModule.

El caso es que, del mainForm de mi programa, pulsando un botón, se muestra un nuevo form, form2, que me gestiona una tabla, esto es, nuevos registros, cancelar, aceptar modificaciones....

La tabla en cuestión está en el DataModule del que hablé antes, con todas las demás tablas.

Al tratar de asignarle el siguiente código, me daba error si lo ponía directamente en el onStateChange, del DataSource de dicha tabla, estado este dentro del DModule:

procedure TFrmDModule.SrcDataSet1StateChange(Sender: TObject);
begin
if (DataSet1.State = dsInsert) or (DataSet1.State =dsEdit) then begin
FrmForm2.BitAceptar.Enabled := True;
FrmForm2.BitCancelar.Enabled := True;
FrmForm2.BitNew.Enabled := False;
FrmForm2.BitBorrar.Enabled := False;
FrmForm2.BitSalir.Enabled := False;
end
else begin
FrmForm2.BitAceptar.Enabled := False;
FrmForm2.BitCancelar.Enabled := False;
FrmForm2.BitNew.Enabled := True;
FrmForm2.BitBorrar.Enabled := True;
FrmForm2.BitSalir.Enabled := True;

end;

end;

Pero no me da problemas si dicho datasource lo pongo en el Form2, en vez de en el DModule, con este mismo código en OnStateChange.

procedure TFrmForm2.SrcDataSet1StateChange(Sender: TObject);
begin
if (FrmDModule.DataSet1.State = dsInsert) or (FrmDModule.DataSet1.State =dsEdit) then begin
BitAceptar.Enabled := True;
BitCancelar.Enabled := True;
BitNew.Enabled := False;
BitBorrar.Enabled := False;
BitSalir.Enabled := False;
end
else begin
BitAceptar.Enabled := False;
BitCancelar.Enabled := False;
BitNew.Enabled := True;
BitBorrar.Enabled := True;
BitSalir.Enabled := True;

end;

end;


Mis dudas son,
1)¿por que me da error si pongo el datasource en el datamodule, junto a su tabla correspondiente?

2) poniendo así el código, voy a necesitar poner otro datasource en otra parte del programa, refiriendose a esta misma tabla, ¿puedo hacerlo?

Muchas gracias por todo de antemano,

Virginia

Lepe 14-10-2003 11:30:31

La verdad es que la forma de preguntar el estado de un Dataset, yo lo hago siempre de una de estas dos formas:

Código:

if Dataset.State in [dsInsert, dsEdit] then ....
o tambien puedes usar esta otra forma:
Código:

if dataset.State in dsEditModes  then ....

Por otra parte, da igual donde pongas el Datasource o la tabla, siempre y cuando pongas los "uses" correctamente. (En lugar de añadir el uses en el apartado de Implementation, ponlo arriba del todo)

Si tienes la tabla en otro lado, y teniendo los uses bien definidos, siempre puedes acceder al dataset de esta forma:

Código:

if DataSource.Dataset.State in dsEditModes then....

Un saludo

Giniromero 14-10-2003 11:54:49

Hola,

Cita:

...siempre y cuando pongas los "uses" correctamente. (En lugar de añadir el uses en el apartado de Implementation, ponlo arriba del todo)

¿que diferencia hay, de cara al funcionamiento de la aplicación, entre, poner los uses arriba en vez de en el apartado de implementeación?

Cita:

...da igual donde pongas el Datasource o la tabla, ...
Pero, ¿puedo poner más de uno, (DataSource), a una misma tabla o no?



Cita:

if dataset.State in dsEditModes then ....
¿que diferencia hay entre esto y lo que yo tengo?

¿que implica dsEditModes? ¿son todos los estados en los que, de algún modo se "edita" la tabla, o sólo afecta al estado editar?

Muchas gracias por la ayuda,

Virginia

Lepe 14-10-2003 12:20:50

Cita:

Posteado originalmente por Giniromero

¿que diferencia hay, de cara al funcionamiento de la aplicación, entre, poner los uses arriba en vez de en el apartado de implementeación?

Ninguno.
si en la Unit1 pones arriba, uses Unit2. y despues en la Unit2 pones uses Unit1 te dirá que hay referencias circulares, y no te dejará delphi, por tanto, la solución es poner uno de ellos en la parte de implementación.

Pero si tienes que poner un Datasource y conectarlo a una tabla que lo tienes en otra unidad, como el Datasource se declara en la zona privada (antes de la implementación) pues necesita saber la unidad donde está la tabla a la que se va a enlazar,

Resumiendo:
Si el datasource está en el Form2 y la tabla en el datamodule, entonces, pones el uses datamodule arriba

Cita:

Posteado originalmente por Giniromero
Pero, ¿puedo poner más de uno, (DataSource), a una misma tabla o no?
Si pero ojo con lo que haces, porque los dos apuntan a la misma tabla, si en uno estas insertando o editando... en el otro también, lógicamente. Y los dos Datasource apuntaran al mismo Registro siempre.

Cita:

Posteado originalmente por Giniromero
¿que diferencia hay entre esto y lo que yo tengo?
Código:

if dataset.State in dsEditModes then ....

tu usas dos condiciones en el if y yo una, lo cual indica que yo soy más vago que tú :p

Cita:

Posteado originalmente por Giniromero
¿que implica dsEditModes? ¿son todos los estados en los que, de algún modo se "edita" la tabla, o sólo afecta al estado editar?
dsEditModes es que la tabla está en modo Insercion o en modo Edición, es simplemente una abreviatura. Eficiencia creo que es la misma (no he mirado los fuentes) pero desde luego es más cómodo ¿no?
Cita:

Posteado originalmente por Giniromero
Muchas gracias por la ayuda,
Es un placer poder devolver la ayuda que me han prestado a mí :)
por cierto.... esto parece un Chat en directo ;)

Giniromero 14-10-2003 14:18:42

Hola,


Cita:

por cierto.... esto parece un Chat en directo
Si lo dices por la rapidéz de respuesta, estoy de acuerdo.

;)

Lo dicho, muchas gracias por tu ayuda, me ha sido muy util.

Virginia


La franja horaria es GMT +2. Ahora son las 06:48:37.

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