UniGUI使用ADO组件、调用数据库的存储过程、生成EXECL表的例子

UniGUI使用ADO组件、调用数据库的存储过程、生成EXECL表的例子
(自己学习记录一下,不一定合理,仅供参考)
本例子是 使用ADO等组件连接一个云服务器的一个数据库,调用GetOrg存储过程,把机构信息展现
把结果导出的一个EXECL表里,并下载
把 显示的 HSate 的值进行替换 1表示正常,其他表示暂停。
多数与 VCL APP的做法差不多。
要点

  1. 使用ADO组件,必须将 TUniServerModule 的自动初始化属性 AutoColnitialize 设置为 True。
  2. 导出的EXECL表时:XLSObj.Sheets[0].AutoWidthCol(1); //Write 之前设置一下第二列的列宽度 为自动
  3. 导出的需要下载:
    UniSession.SendFile('机构清单.xlsx','机构清单1.xlsx');
    //第一个参数是服务器端的文件名 第二个为下载到客户端的文件名
  4. 显示值替换问题:
    1)定义UniDBGrid1的 onDrawColumnCell事件
    2)例子中的procedure TMainForm.flagGetText(Sender:TField;var Text:string;displayText:Boolean); //要自己写,木有自动生成
    导出表在服务器端的文件名在实际应用时需要改进,防止相互覆盖(可能是吧,没试过)

UniMainModule的组件

MainForm的组件及样式

Main.pas参考代码

unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics,
  Controls, Forms, uniGUITypes, uniGUIAbstractClasses,
  uniGUIClasses, uniGUIRegClasses, uniGUIForm, uniBasicGrid, uniDBGrid,
  uniGUIBaseClasses, uniButton, Data.DB, uniPanel, uniPageControl,
  XLSSheetData5, XLSReadWriteII5, uniLabel, Vcl.Dialogs;

type
  TMainForm = class(TUniForm)
    UniButton1: TUniButton;
    UniButton2: TUniButton;
    UniButton3: TUniButton;
    UniButton4: TUniButton;
    UniDBGrid1: TUniDBGrid;
    UniPageControl1: TUniPageControl;
    UniTabSheet1: TUniTabSheet;
    UniTabSheet2: TUniTabSheet;
    UniDBGrid2: TUniDBGrid;
    XLSReadWriteII51: TXLSReadWriteII5;
    procedure UniButton1Click(Sender: TObject);
    procedure UniButton2Click(Sender: TObject);
    procedure UniButton4Click(Sender: TObject);
    procedure flagGetText(Sender:TField;var Text:string;displayText:Boolean);
    procedure UniDBGrid1DrawColumnCell(Sender: TObject; ACol, ARow: Integer;
      Column: TUniDBGridColumn; Attribs: TUniCellAttribs);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

function MainForm: TMainForm;

implementation

{$R *.dfm}

uses
  uniGUIVars, MainModule, uniGUIApplication;

function MainForm: TMainForm;
begin
  Result := TMainForm(UniMainModule.GetFormInstance(TMainForm));
end;

procedure TMainForm.UniButton1Click(Sender: TObject);
begin
  try
    with uniMainModule.ADOStoredProc1 do
    begin
      Close;
      ProcedureName := 'GetOrg';
      Parameters.Refresh;
      Parameters.ParamByName('@CID').Value := '00';
      Parameters.ParamByName('@Adate').Value := 'AA';
      Prepared;
      Open;
    end;
  except
    begin
        MessageDlg('查询失败!', mtWarning, [mbOK],nil);
        UniSession.AddJS('Ext.get("messagebox-1001_header-title-textEl").setText("警告")');
    end;

  end;

end;

procedure TMainForm.UniButton2Click(Sender: TObject);
var
  XLSObj : TXLSReadWriteII5;
  XLSWookSheet : TXLSWorksheet;
  i : integer;
  DispState : string;
begin
  XLSObj := TXLSReadWriteII5.Create(nil);
  XLSObj.Sheets[0].Name := '机构清单';

  try
    XLSObj.Sheets[0].AsString[0,0] := '代码';
    XLSObj.Sheets[0].AsString[1,0] := '名称';
    XLSObj.Sheets[0].AsString[2,0] := '状态';
    XLSObj.Sheets[0].AsString[3,0] := '中心';
    XLSObj.Sheets[0].AsString[4,0] := 'GIP';

    i := 1;

    uniMainModule.ADOStoredProc1.First;
    while not uniMainModule.ADOStoredProc1.Eof do
    begin
      XLSObj.Sheets[0].AsString[0,i] := uniMainModule.ADOStoredProc1.FieldByName('HNO').AsString;
      XLSObj.Sheets[0].AsString[1,i] := uniMainModule.ADOStoredProc1.FieldByName('HNAME').AsString;
      if Trim(uniMainModule.ADOStoredProc1.FieldByName('HState').AsString) ='1' then  DispState:='正常'
        else  DispState:='暂停';

      XLSObj.Sheets[0].AsString[2,i] := DispState;
      XLSObj.Sheets[0].AsString[3,i] := uniMainModule.ADOStoredProc1.FieldByName('HCID').AsString;
      XLSObj.Sheets[0].AsString[4,i] := uniMainModule.ADOStoredProc1.FieldByName('GIP').AsString;
      uniMainModule.ADOStoredProc1.Next;
      inc(i);
    end;
    XLSObj.Sheets[0].AutoWidthCol(1);     //Write 之前设置一下第二列的列宽度 为自动
    XLSObj.Filename := '机构清单.xlsx';
    XLSObj.Write;
  finally
    XLSObj.Free;
  end;
  UniSession.SendFile('机构清单.xlsx','机构清单1.xlsx');
    //第一个参数是服务器端的文件名 第二个为下载到客户端的文件名
end;

procedure TMainForm.UniButton4Click(Sender: TObject);
begin
  Close;
end;

procedure TMainForm.UniDBGrid1DrawColumnCell(Sender: TObject; ACol,      //这个是UniDBGrid1的 onDrawColumnCell事件
  ARow: Integer; Column: TUniDBGridColumn; Attribs: TUniCellAttribs);
begin
  if Column.FieldName = 'HState' then
  begin
    Column.Field.OnGetText := flagGetText;
  end;
end;

procedure TMainForm.flagGetText(Sender:TField;var Text:string;displayText:Boolean);    //这个是自己写的
begin
  if Sender.AsString = '1' then Text := '正常'
    else Text := '暂停';

end;

initialization
  RegisterAppFormClass(TMainForm);

end.
posted @   月如无恨月长圆  阅读(141)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 历时 8 年,我冲上开源榜前 8 了!
· 物流快递公司核心技术能力-海量大数据处理技术
· 四大AI编程工具组合测评
· 关于能否用DeepSeek做危险的事情,DeepSeek本身给出了答案
· 如何在 Github 上获得 1000 star?
点击右上角即可分享
微信分享提示