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 desactivado (https://www.clubdelphi.com/foros/showthread.php?t=86465)

blaiselaborde 14-08-2014 11:59:16

DataSource desactivado
 
Hola Buenos días;

En Delphi XE6, tengo una simple conexión de una Query a un Grid por medio de un DataSource. Cuando abro la Query, no se muestra nada en el Grid a menos que active el DataSource: DataSource.DataSet.Active := True;

Hasta ahí solucionado el problema, pero al refrescar la Query con otros parámetros (Close y Open), no ha habido forma de que me muestre los nuevos datos en el Grid, ni desactivando y activando nuevamente el DataSource ni Enabled False y True.

Podrían darme una idéa de qué es lo que estoy haciendo mal?

Gracias.

blaiselaborde 14-08-2014 13:23:26

Otra pista es que reviso la Query y ésta sí modifica su resultado al cambiar los parámetros, lo que puede indicar que el problema está en el Datasource ó en el DBGrid.

Casimiro Notevi 14-08-2014 14:00:15

Debe funcionar bien si el dbgrid tiene asociado el datasource que recoge los datos del dataset.
Si no nos das más pistas... :confused:

blaiselaborde 14-08-2014 14:02:37

He encontrado algo muy extraño y es que si le asigno nuevamente al DataSource la Query, antes de habilitar los controles, funciona correctamente:

DataSource1.DataSet := DataModule.Query1;

No sé si por tener la Query en un DataModule tenga algo que ver que se desconecta. De todas formas, antes de hacer la asignación, verifico el valor del DataSource1.DataSet y su valor es correcto.

engranaje 14-08-2014 14:28:34

Poco conozco de xe6 pero en versiones antiguas de delphi cuando querias cerrar, modificar y abrir un dataset que tenía controles "enganchados" era recomendable siempre hacer un dataset.disablecontrols antes de cerrar el dataset y un dataset.enablecontrols despues de abrirlo. Lo digo solo por si sirve de ayuda, ya digo que no tengo idea de si en las últimas versiones de delphi es necesario hacer esto.

Casimiro Notevi 14-08-2014 14:55:35

Nunca ha hecho falta.
Pero vuelvo a repetir lo anterior, si no nos das más pistas...

Al González 14-08-2014 19:22:44

Yo también discrepo. Lo de llamar a DisableControls y EnableControls nunca ha sido necesario para poder cerrar y reabrir un conjunto de datos con efectividad visual. De todas formas lo dicho por engranaje muestra lo que es tener el valor de ayudar.

blaiselaborde: Para salir de dudas te recomiendo que, a manera de prueba, hagas todas las operaciones empleando el objeto rejilla.
Código Delphi [-]
DBGrid1.DataSource.DataSet := ElQuery;
DBGrid1.DataSource.DataSet.Close;
TQuery (DBGrid1.DataSource.DataSet).LoQueSea;  // Si es que es de clase "TQuery"
DBGrid1.DataSource.DataSet.Open;

nlsgarcia 14-08-2014 22:42:11

blaiselaborde,

Cita:

Empezado por blaiselaborde
...En Delphi XE6, tengo una simple conexión de una Query a un Grid por medio de un DataSource. Cuando abro la Query, no se muestra nada en el Grid...No sé si por tener la Query en un DataModule tenga algo que ver...

:rolleyes:

Revisa este código:
Código Delphi [-]
  unit Unit2;
  
  interface
  
  uses
    System.SysUtils, System.Classes, Data.DB, IBX.IBDatabase, IBX.IBCustomDataSet,
    IBX.IBQuery;
  
  type
    TDM = class(TDataModule)
      IBTransaction1: TIBTransaction;
      IBDatabase1: TIBDatabase;
      IBQuery1: TIBQuery;
      DataSource1: TDataSource;
      procedure DataModuleCreate(Sender: TObject);
    private
      { Private declarations }
    public
      { Public declarations }
    end;
  
  var
    DM : TDM;
  
  implementation
  
  {%CLASSGROUP 'Vcl.Controls.TControl'}
  
  {$R *.dfm}
  
  procedure TDM.DataModuleCreate(Sender: TObject);
  begin
  
     IBDatabase1.Params.Clear;
     IBDatabase1.DatabaseName := 'D:\DB\FireBird\EMPLOYEE.FDB';
     IBDatabase1.LoginPrompt := False;
     IBDatabase1.Params.Add('User_Name=SYSDBA');
     IBDatabase1.Params.Add('Password=masterkey');
     IBDatabase1.DefaultTransaction := IBTransaction1;
     IBDatabase1.Connected := True;
  
     IBTransaction1.DefaultDatabase := IBDatabase1;
     IBQuery1.Database := IBDatabase1;
     IBQuery1.Transaction := IBTransaction1;
     DataSource1.DataSet := IBQuery1;
  
  end;
  
  end.
Código Delphi [-]
  unit Unit1;
  
  interface
  
  uses
    Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
    Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, IBX.IBDatabase, Vcl.StdCtrls,
    IBX.IBCustomDataSet, IBX.IBQuery, Vcl.Grids, Vcl.DBGrids;
  
  type
    TForm1 = class(TForm)
      DBGrid1: TDBGrid;
      Button1: TButton;
      Edit1: TEdit;
      Edit2: TEdit;
      Label1: TLabel;
      Label2: TLabel;
      procedure Button1Click(Sender: TObject);
      procedure FormCreate(Sender: TObject);
    private
      { Private declarations }
    public
      { Public declarations }
    end;
  
  var
    Form1: TForm1;
  
  implementation
  
  uses
     Unit2;
  
  {$R *.dfm}
  
  procedure TForm1.Button1Click(Sender: TObject);
  begin
     with DM.IBQuery1 do
     begin
  
        Close;
  
        SQL.Clear;
  
        SQL.Text := 'Select * From EMPLOYEE';
  
        if (Edit1.Text <> EmptyStr) and (Edit2.Text = EmptyStr) then
        begin
           SQL.Add(' Where Lower(FIRST_NAME) = :P1');
           ParamByName('P1').Value := LowerCase(Edit1.Text);
        end;
  
        if (Edit1.Text = EmptyStr) and (Edit2.Text <> EmptyStr) then
        begin
           SQL.Add(' Where Lower(LAST_NAME) = :P2');
           ParamByName('P2').Value := LowerCase(Edit2.Text);
        end;
  
        if (Edit1.Text <> EmptyStr) and (Edit2.Text <> EmptyStr) then
        begin
           SQL.Add(' Where Lower(FIRST_NAME) = :P1');
           SQL.Add(' Or Lower(LAST_NAME) = :P2');
           ParamByName('P1').Value := LowerCase(Edit1.Text);
           ParamByName('P2').Value := LowerCase(Edit2.Text);
        end;
  
        Open;
  
     end;
  end;
  
  procedure TForm1.FormCreate(Sender: TObject);
  begin
     DBGrid1.DataSource := DM.DataSource1;
  end;
  
  end.
El código anterior en Delphi XE6 bajo Windows 7 Professional x32, permite realizar consultas en un componente TDBGrid a una base de datos en FireBird (Tabla EMPLOYEE), por medio de un DataModule con los InterBase Data Access Components (IBDAC), como se muestra en las siguientes imagenes:





Espero sea útil :)

Nelson.


La franja horaria es GMT +2. Ahora son las 16:43:39.

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