Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Controlar si una tabla está vacía (https://www.clubdelphi.com/foros/showthread.php?t=90345)

mblascog 21-05-2016 14:07:32

Controlar si una tabla está vacía
 
Buenas,
Tengo un dbgrid que apunta a una tabla y al lado los típicos botones de añadir, modificar y borrar. La pregunta es: en qué evento o donde, tengo que mirar si la tabla está vacía para activar o desactivar dichos botones, es decir, quiero poner enabled=false al botón borrar si la table está vacía, por ejemplo
Pero la cosa se complica ya que esta tabla la tengo unida a otra (mastersource), también con los botones de añadir, modificar y borrar. Conforme me voy desplazando por el dbgrid principal, la tabla secundaria, lógicamente, también cambia de registros, y quiero activar o desactivar botones según el caso.

Gracias.

Caminante 21-05-2016 15:38:10

Hola

Usa la propiedad isempty despues de activar el dataset.

Saludos

ecfisa 21-05-2016 17:06:17

Hola mblascog.

El boton borrar no esta habilitado si la tabla está vacía; solo están habilitados los botones: insertar, editar y refrescar; lo que me parece un comportamiento lógico.

Pero de todos modos si tu intención es deshabilitar todos los botones cuando no haya datos en la tabla, creo que un evento adecuado es OnDataChange de los TDataSources. Y para comprobar la existencia de datos, la propiedad IsEmpty como ya lo dijo Caminante
Código Delphi [-]
...
interface
...
type
  // Para acceder a la propiedad protegida Buttons:
  TDBNavigator = class(DBCtrls.TDBNavigator); 

  TForm1 = class(TForm)
  ...

implementation

// DataSource Detail - OnDataChange
procedure TForm1.dsDetailDataChange(Sender: TObject; Field: TField);
var
  i : TNavigateBtn;
begin
  for i := Low(TNavigateBtn) to High(TNavigateBtn) do
    DBNavigatorDetail.Buttons[i].Enabled := not dsDetail.DataSet.IsEmpty;
end;

// DataSource Master - OnDataChange
procedure TForm1.dsMasterDataChange(Sender: TObject; Field: TField);
var
  i : TNavigateBtn;
begin
  for i := Low(TNavigateBtn) to High(TNavigateBtn) do
    DBNavigatorMaster.Buttons[i].Enabled := not dsMaster.DataSet.IsEmpty;
end;

Saludos :)

mblascog 21-05-2016 19:50:40

Creo que no me he expresado bien. Tengo un dgbrid con registros, y un segundo dbgrid que apunta a otra tabla pero unido al primero. Cada vez que selecciono un registro del primer dbgrid, el segundo puede o no contener registros, por lo que no se trata de mirar la propiedadi isEmpty del dataset al activarlo.

Caminante 21-05-2016 19:58:28

Yo creo que si.

EL DBGrid esta conectado a un datasource y este a un dataset. Para ver si el dataset esta vacio mira el valor de la propiedad isempty.

mblascog 21-05-2016 20:13:25

Caminante, yo buscaba algo parecido al evento onStateChange del datasource, que es automático. Si tengo que comprobar si el dataset isEmpty, cada vez que se cambia de registro tengo que comprobarlo

rocksoft 21-05-2016 23:43:35

Hola Caminante,

que tal con un if db1.RecordCount > 0 then...

Caminante 22-05-2016 00:01:32

Bueno no confio mucho en recordcount ya que puede variar de acuerdo al tipo de dataset y a veces puede no devolver el valor correcto.

Saludos

mblascog 22-05-2016 00:42:39

En realidad mi pregunta no es cómo saber si un dataset está vacío o no, hay varias maneras de controlarlo. Lo que es estoy buscando es la manera automática de detectarlo, en qué evento

Caminante 22-05-2016 01:00:56

En el mensaje 3 el compañero ecfisa te sugirio el evento ondatachage del datasource.

Saludos

mblascog 22-05-2016 01:05:51

El ondatachange salta cuando cambias algún valor, no cuando cambian los registros.

Caminante 22-05-2016 01:35:38

Tambien puedes probar el evento afterscroll del dataset.

ecfisa 22-05-2016 03:22:19

Cita:

Empezado por mblascog (Mensaje 505431)
El ondatachange salta cuando cambias algún valor, no cuando cambian los registros.

De la ayuda de Delphi:
Cita:

Occurs when the data in a record has changed, either due to field edits or moving the cursor to a new record.
Saludos :)

mblascog 22-05-2016 12:31:46

Gracias ecfisa, llevas toda la razón, yo lo hacía con el onStateChange en lugar de onDataChange.

rastafarey 23-05-2016 01:16:23

Usa un taction de tipo delete(mira en los tipos de acciknes) y al relacionarse con el dataset todo se hace solo, lo asignas al botón y listo mijo lindo.

Enviado desde mi SM-G900H mediante Tapatalk

mblascog 23-05-2016 23:05:16

Gracias rastafarey, pero no entiendo mucho a que te refieres. Lo siento

rastafarey 30-05-2016 02:42:52

Si tienes un datasource conectado a un dataset, creas un tactiondelete (mira en lista de los taction a ver si ese el nombre) y esa action le asignas el datasource, ya no tienes que controlar el botón porque el datasource se encarga de habilitar o desahabilitar él estado de dicho boton, asi también pueder usar para edit, insert o cualquier accion que se pueda aplicar a dicha nase de datos. Es lo mismo que tener un tnavigator, pero con taction y botones del tipo que yi quieras.

Enviado desde mi SM-G900H mediante Tapatalk

mblascog 30-05-2016 12:16:09

Gracias rastafarey. Tengo que mirarlo, pues desconozco de lo que me hablas, pero me parece muy interesante


La franja horaria es GMT +2. Ahora son las 15:10:42.

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