Я пытаюсь понять, как заполнить TIWDBGrid (компонент IntraWeb) TFDStoredProc (компонент FireDac) - PullRequest
0 голосов
/ 02 октября 2018

В настоящее время у меня есть форма, которая собирает данные для входа, форма с TIWDBGrid, которая должна возвращать все хосты, связанные с user_id, который создается при входе в систему из моей базы данных mysql, и модуль общих данных.

Ниже приведен код моей страницы входа в систему

unit login_unit;

interface

uses
  Classes, SysUtils, IWAppForm, IWApplication, IWColor, IWTypes, IWCompButton,
  IWCompLabel, Vcl.Controls, IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl,
  IWControl, IWCompEdit;

type
  Tlogin_form = class(TIWAppForm)
    enter_usermame_TIWEdit: TIWEdit;
    enter_password_TIWEdit: TIWEdit;
    Username: TIWLabel;
    Password: TIWLabel;
    login_TIWButton: TIWButton;
    returned_user_id_TIWEdit: TIWEdit;
    procedure login_TIWButtonClick(Sender: TObject);
  public
  end;

implementation

{$R *.dfm}

uses email_data, host_lookup_unit;


procedure Tlogin_form.login_TIWButtonClick(Sender: TObject);
var
  host_lookup_form:Thost_lookup_Form;
begin
  email_data_DataModule.Login_userProc.Prepare;
  email_data_DataModule.Login_userProc.ParamByName('user_name_').Value := enter_usermame_TIWEdit.Text;
  email_data_DataModule.Login_userProc.ParamByName('pass_word_').Value := enter_password_TIWEdit.Text;
  email_data_DataModule.Login_userProc.Execute;
  email_data_DataModule._user_id := email_data_DataModule.Login_userProc.ParamByName('user_id_').Value;
  returned_user_id_TIWEdit.Text := email_data_DataModule.Login_userProc.ParamByName('user_id_').Value;


  email_data_DataModule.Hosts_requested_frm_user_idProc.Prepare;
  email_data_DataModule.Hosts_requested_frm_user_idProc.ParamByName('user_id_').Value := email_data_DataModule._user_id;
  email_data_DataModule.Hosts_requested_frm_user_idProc.Execute;

  thost_lookup_form.Create(Self).Show;

end;

initialization
  Tlogin_form.SetAsMainForm;

end.

Моя страница просмотра host_look имеет компонент TIWDBGrid, и он выглядит следующим образом:

unit host_lookup_unit;

interface

uses
  Classes, SysUtils, IWAppForm, IWApplication, IWColor, IWTypes, Vcl.Controls,
  IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl, IWControl, IWCompGrids,
  IWDBGrids, IWCompButton;

type
  Thost_lookup_Form = class(TIWAppForm)
    IWDBGrid1: TIWDBGrid;

  public
  end;

implementation

{$R *.dfm}

uses email_data;


end.

Я убедился, чтоДля параметра DataSource было задано значение email_data_DataModule.hosts_table_requested_TDataSource

И, наконец, код для моего модуля данных выглядит следующим образом:

unit email_data;

interface

uses
  Forms,
  SysUtils, Classes, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error,
  FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool,
  FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Phys.MySQL, FireDAC.Phys.MySQLDef,
  FireDAC.VCLUI.Wait, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf,
  FireDAC.DApt, Data.DB, FireDAC.Comp.DataSet, FireDAC.Comp.Client;

type
  Temail_data_DataModule = class(TDataModule)
    EmaildbConnection: TFDConnection;
    Login_userProc: TFDStoredProc;
    hosts_table_requested_TDataSource: TDataSource;
    Hosts_requested_frm_user_idProc: TFDStoredProc;
  private
  public
    _user_id : integer;
  end;

function email_data_DataModule:Temail_data_DataModule;

implementation

{$R *.dfm}

uses ServerController;
function email_data_DataModule:Temail_data_DataModule;
begin
  result := UserSession.email_data_DataModule;
end;

end.

Как я могу убедиться, что данные из Hosts_requested_frm_user_idProG для моего домена заполнены?

Заранее спасибо и извините за длинный пост

1 Ответ

0 голосов
/ 03 октября 2018

Есть несколько проблем с вашим приложением:

Во-первых, все ваши формы должны иметь объект WebApplication в качестве владельца, поэтому измените строку, где вы создаете IWForm, на

procedure Tlogin_form.login_TIWButtonClick(Sender: TObject);
var
  host_lookup_form:Thost_lookup_Form;
begin
  ...
  thost_lookup_form.Create(WebApplication).Show;
end;

Во-вторых, я думаю, что вы должны использовать не хранимый процесс для извлечения данных, а объект запроса.Если вы используете FireDAC, рассмотрите возможность изменения его на TFDQuery, который будет извлекать набор результатов.

Кроме того, вы должны поместить ваш TDataSource в ту же форму, где находится IWDBGrid, и подключить их через свойство IWDBGrid.DataSource.

Добавьте модуль, в котором объект DataModule объявлен, к предложению использования IWForm (в разделе интерфейса) и объявите поле формы.Поэтому у вас должно получиться что-то вроде этого:

unit host_lookup_unit;

interface

uses
  Classes, SysUtils, IWAppForm, IWApplication, IWColor, IWTypes, Vcl.Controls,
  IWVCLBaseControl, IWBaseControl, IWBaseHTMLControl, IWControl, IWCompGrids,
  IWDBGrids, IWCompButton,
  email_data;  // <- Include your DM here

type
  Thost_lookup_Form = class(TIWAppForm)
    IWDBGrid1: TIWDBGrid;
    hosts_table_requested_TDataSource: TDataSource;
  private
    FDataModule: Temail_data_DataModule;
  public
  end;

implementation

{$R *.dfm}

procedure Thost_lookup_Form .host_lookup_FormCreate(Sender: TObject);
begin
  FDataModule := email_data_DataModule;   // set your field referencing the DM here and use it within your form. Don't use the email_data_DataModule() function anymore!
  hosts_table_requested_TDataSource.DataSet :=  FDataModule.Login_userQuery;  // Connect your DataSource and your DataSet, via code. This is the best way to do it!
end;

Я также настоятельно рекомендую вам удалить логику, связанную с настройкой параметров и открытием запроса из вашей формы.Этот код принадлежит к модулю данных!

У вас должно быть что-то вроде этого:

unit email_data;

interface

uses
  Forms,
  SysUtils, Classes, FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Error,
  FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def, FireDAC.Stan.Pool,
  FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Phys.MySQL, FireDAC.Phys.MySQLDef,
  FireDAC.VCLUI.Wait, FireDAC.Stan.Param, FireDAC.DatS, FireDAC.DApt.Intf,
  FireDAC.DApt, Data.DB, FireDAC.Comp.DataSet, FireDAC.Comp.Client;

type
  Temail_data_DataModule = class(TDataModule)
    EmaildbConnection: TFDConnection;
    Login_userQuery: TFDQuery;
    Hosts_requested_frm_user_idQuery: TFDQuery;
  private
    F_user_id: Integer;
  public
    function SetUserNameAndPassword(const AUserName, AUserPassword: string): Integer;
  end;

function email_data_DataModule:Temail_data_DataModule;

implementation

{$R *.dfm}

uses ServerController;

function email_data_DataModule: Temail_data_DataModule;
begin
  result := UserSession.email_data_DataModule;
end;

function Temail_data_DataModule.SetUserNameAndPassword(const AUserName, AUserPassword: string): Integer;
begin
  Login_userQuery.Prepare;
  Login_userQuery.ParamByName('user_name_').Value := AUserName;
  Login_userQuery.ParamByName('pass_word_').Value := AUserPassword;
  Login_userQuery.Open;
  F_user_id := Login_userQuery.ParamByName('user_id_').Value;
  Result := Login_userQuery.ParamByName('user_id_').Value;

  Hosts_requested_frm_user_idQuery.Prepare;
  Hosts_requested_frm_user_idQuery.ParamByName('user_id_').Value := F_user_id;
  Hosts_requested_frm_user_idQuery.Open;  
end;

end.

Все, что вам нужно сделать сейчас, это собрать и запустить приложение.Это должно работать.

Примечание. Весь приведенный выше код не проверен (я написал его в блокноте, а не в Delphi IDE), поэтому в нем могут быть опечатки и некоторые другие ошибки.

...