愛招飛幫助手冊 愛招飛幫助手冊
  • FastERP-1
  • Smart
  • PinToo
  • FastWeb
  • FastERP-2 企業管理系統 (opens new window)
  • 印染業ERP (opens new window)
  • 工廠終端機 (opens new window)
  • TARS
  • MARS
  • TaskRunner
  • Flying
  • FastDesk
  • HiDesk
  • HiNAT
  • FastBPM
  • 設備故障診斷 (opens new window)
  • 設備最佳運轉效益 (opens new window)
  • 企業智能助手SmeGPT (opens new window)
  • 燈號管理 (opens new window)
  • 戰情室 (opens new window)
  • 能源管理 (opens new window)
  • 人車定位 (opens new window)
  • 戰情指揮系統 (opens new window)
  • FastERP-1
  • FastWeb
  • Smart
  • PinToo
  • Flying
  • TARS
  • 通用功能

    • Report
    • Script
    • Echarts
    • Chart
    • DB Install
  • FastERP-1
  • Smart
  • PinToo
  • FastWeb
  • FastERP-2 企業管理系統 (opens new window)
  • 印染業ERP (opens new window)
  • 工廠終端機 (opens new window)
  • TARS
  • MARS
  • TaskRunner
  • Flying
  • FastDesk
  • HiDesk
  • HiNAT
  • FastBPM
  • 設備故障診斷 (opens new window)
  • 設備最佳運轉效益 (opens new window)
  • 企業智能助手SmeGPT (opens new window)
  • 燈號管理 (opens new window)
  • 戰情室 (opens new window)
  • 能源管理 (opens new window)
  • 人車定位 (opens new window)
  • 戰情指揮系統 (opens new window)
  • FastERP-1
  • FastWeb
  • Smart
  • PinToo
  • Flying
  • TARS
  • 通用功能

    • Report
    • Script
    • Echarts
    • Chart
    • DB Install
  • FastWeb幫助主頁
  • 學習手冊

    • 基本入門

    • 功能介紹

    • 控制元件說明

    • 系統工具

    • 系統管理

    • 云服務工具

    • 資料庫工具

    • 專用模板

    • 外部功能

    • 開發流程

      • 開發案例
        • 1. 建立資料庫
        • 2. 建立模組
        • 3. 模組設計
          • 3.1. 引用公共單元
          • 3.2. 機構管理
          • 3.3. 護照管理
        • 4. 功能表配置
        • 5. 許可權設定
        • 6. 檢查
      • 紡織印染業ERP設計實務
      • 頁面佈局
      • URLFrame與JS的互動
      • 自定控制元件擴充套件

      • RestAPI擴充套件

      • IsoBean開發

    • 函式程式

  • 開發手冊

目录

開發案例

# FastWeb開發案例

  • 適用平臺:WEB(桌面)

  在本節中,我們將以一個護照管理系統為例,講解在FastWeb中如何進行模組開發以及實現模組上線的功能。

# 1. 建立資料庫

  在本範例中,我們使用MSSQL作為演示用資料庫。在FastWeb資料庫中,建立兩個表Pass_Paper_Inst與Pass_Paper_Info。表的基本資訊如下圖所示,也可以直接執行下方的SQL進行表的建立。我們提供的示例中已經建立了這兩個表,無需再進行建立。

Paper_Inst
Paper_Info
---Pass_Paper_Inst 簽證機構表
CREATE TABLE [dbo].[Pass_Paper_Inst](
	[ID] [nvarchar](50) NOT NULL,
	[InstNo] [nvarchar](50) NOT NULL,
	[InstName] [nvarchar](50) NOT NULL,
	[ParentID] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Pass_Paper_Inst] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

--Pass_Paper_Info 簽證表
CREATE TABLE [dbo].[Pass_Paper_Info](
	[ID] [nvarchar](50) NOT NULL,
	[OwnerNo] [nvarchar](50) NOT NULL,
	[OwnerName] [nvarchar](50) NOT NULL,
	[PaperNo] [nvarchar](50) NOT NULL,
	[PaperType] [nvarchar](50) NOT NULL,
	[PaperState] [nvarchar](50) NOT NULL,
	[InstNo] [nvarchar](50) NOT NULL,
	[InstName] [nvarchar](50) NOT NULL,
	[UserImage] [image] NULL,
	[PaperDate] [datetime] NULL,
	[PaperExpire] [datetime] NULL,
 CONSTRAINT [PK_Pass_Paper_Info] PRIMARY KEY CLUSTERED 
(
	[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

# 2. 建立模組

  在FastWeb中點選左側功能表欄中的[系統工具]-[模組列表(WEB)],打開模組列表界面。在此處建立兩個模組,分別對應為機構管理和護照管理。

  點選模組頁面左上角的[新增]按鈕,進行模組的新增,填寫模組的標題以及對應的開發使用者,填寫完成後點選[儲存]。

  按照同樣的方式建立護照管理。

# 3. 模組設計

# 3.1. 引用公共單元

  在該案例中,我們將資料庫的連線定義寫在公共單元中,如果已經按照要求設定好TARS中關於FastWeb資料庫的連線設定,在此處可直接勾選引用。

  進入任意一個模組的設計模式界面,切換至程式程式碼編輯界面,在右側的公共單元中選擇pub_js_tarslink(JScript)或者pub_pas_tarslink(PasScript),點選上方的[修改]按鈕,打開公共單元編輯界面。

  根據實際的情況修改GetRFWeb其中的部分屬性內容,修改完成後,點選[儲存]以完成資料庫連線的定義。

# 3.2. 機構管理

  在模組列表中選擇機構管理,點選上方的[模組設計]按鈕,進入到模組設計界面。

  在其中放置一個TUgContainer三個TUgButton、一個TUgTreeGrid、一個TUgRFDataSet、一個TUgDataSource和一個UgTimer。設計效果如圖所示。

  其中的部分控制元件配置如下:

  • UgWebRunFrame

  該控制元件為頁面的背景,其中的部分屬性配置如下:

屬性 取值 說明
Align alClient 控制元件客戶端頁面佈局
  • UgContainerPanel01

  該控制元件用於為工具欄的按鈕區確定佈局。其中的部分屬性配置如下:

屬性 取值 說明
Align alTop 控制元件排佈於頁面的頂部
  • btnAppend、btnDelete、btnEditor

  該控制元件為按鈕控制元件。

屬性 取值 說明
Caption 新增/刪除/修改 按鈕字幕內容
Name btnAppend/btnDelete/btnEditor 按鈕控制元件名稱
  • UgFDQuery01 TUgRFDataSet的控制元件名稱
屬性 取值 說明
CachedUpdates True 是否允許快取需要進行更新的數據
  • UgDataSource01
屬性 取值 說明
DataSet UgFDQuery01 設定數據源繫結的數據集
  • UgDBTreeGrid01

  該控制元件是以樹的方式對數據內容進行顯示。在此處需設定兩組欄位用於顯示。雙擊該控制元件,在顯示的表格編輯器中對需要顯示的欄位進行設定。

  該控制元件的部分屬性配置如下:

屬性 取值 說明
DataSource UgDataSource01 設定控制元件繫結的數據源
IdField ID 設定顯示為樹形結點的主鍵欄位
IdParentField ParentID 設定顯示為樹形節點的父結點的欄位
  • FullExpand

  該控制元件為一個計時器的控制元件,用於延遲觸發事件,此處用於展開數據表格。

屬性 取值 說明
Name FullExpand 控制元件的名稱
Interval 500 控制元件的時間間隔
  • 事件設定

UgWebRunFrame的Events界面,在OnAfterRunScript處雙擊以產生事件。

btnApeend、btnDelete、btnEditor的Events界面,在OnClick處雙擊以產生事件。

FullExpand的Events界面,在OnTimer處雙擊以產生事件。

UgDBTreeGrid01的Events界面,在OnSelectionChange處雙擊以產生事件。

  • 程式碼程式編輯

  在事件對應的程式產生后,在對應的事件中進行程式碼的填寫,包含一些自定義函式以及過程的定義。該程式需要引用公共單元中的DBLink,在公共單元模組中需對DBLink進行勾選。

  參考的程式內容如下:

    //JScript
    function GetEditorForm()
    //產生編輯窗體,用於編輯機構資訊
    {
      var edID,edInstNo,edInstName,edParentID,btOk;
      Result = new TUgWebForm(UniApplication);
      Result.FreeOnClose = False;
      Result.Width = 320;
      Result.Height = 460;
      Result.Bordericons =biSystemMenu;
      
      //ID欄位
      edID= new TUgEdit(Result);
      edID.Name = "edID";
      edID.Height = 48;
      edID.Enabled = False;
      edID.Parent = Result;
      edID.FieldLabel = "記錄唯一地址";
      edID.FieldLabelSeparator = "";
      edID.FieldLabelAlign = laTop;
      edID.Align = alTop;
      edID.Margins.Left = 8;
      edID.Margins.Right = 8;
      edID.AlignWithMargins = True;
      
      //InstNo機構程式碼
      edInstNo = new TUgEdit(Result);
      edInstNo.Name = "edInstNo";
      edInstNo.Height = 48;
      edInstNo.Parent = Result;
      edInstNo.FieldLabel = "機構程式碼";
      edInstNo.FieldLabelSeparator = "";
      edInstNo.FieldLabelAlign =laTop;
      edInstNo.Align = alTop;
      edInstNo.Margins.Left = 8;
      edInstNo.Margins.Right = 8;
      edInstNo.AlignWithMargins = True;
      edInstNo.EmptyText="請輸機構組程式碼";
    
      //InstName客戶名稱
      edInstName= new TUgEdit(Result);
      edInstName.Name = "edInstName";
      edInstName.Height = 48;
      edInstName.Parent = Result;
      edInstName.FieldLabel = "機構名稱";
      edInstName.FieldLabelSeparator = "";
      edInstName.FieldLabelAlign = laTop;
      edInstName.Align = alTop;
      edInstName.Margins.Left = 8;
      edInstName.Margins.Right = 8;
      edInstName.AlignWithMargins = True;
      edInstName.EmptyText="請輸入機構名稱";
    
      //ParetID 上級地址
      edParentID= new TUgEdit(Result);
      edParentID.Name = "edParentID";
      edParentID.Height = 48;
      edParentID.Enabled = False;
      edParentID.Parent = Result;
      edParentID.FieldLabel = "上級地址";
      edParentID.FieldLabelSeparator = "";
      edParentID.FieldLabelAlign = laTop;
      edParentID.Align = alTop;
      edParentID.Margins.Left = 8;
      edParentID.Margins.Right = 8;
      edParentID.AlignWithMargins = True;
      
      btOk= new TUgButton(Result);
      btOk.Name = "btOk";
      btOk.Height = 32;
      btOk.Parent = Result;
      btOk.Margins.Bottom= 6;
      btOk.Margins.Left = 8;
      btOk.Margins.Right = 8;
      btOk.Align = alBottom;
      btOk.Caption="儲存";
      btOk.ModalResult = mrOK;
      btOk.AlignWithMargins = True;  
    }
    
    //獲取目前節點的下級節點數
    function CurrentCount(AParentID)
    {
      var iCds;
      iCds= new TUgRFDataSet(Self);
      try{
      	iCds.Connection = GetRFWeb;
      	iCds.SQL = UgFDQuery01.SQL;
        iCds.Open;
        iCds.Filtered = False;
        iCds.Filter   = "ParentID = """+ AParentID + """";
        iCds.Filtered = True;
        Result=iCds.RecordCount;
        }
      finally{
        iCds.Free;
      }
    }
    
    //獲取目前節點的索引值
    function CurrentIndex(AParentID,AID)
    {
      var iCds,i;
      iCds= new TUgRFDataSet(Self);
      try{
        iCds.Connection = GetFD;
      	iCds.SQL = UgFDQuery01.SQL;
        iCds.Open;
        iCds.IndexFieldNames = UgFDQuery01.IndexFieldNames;
        iCds.Filtered = False;
        iCds.Filter   = "ParentID = """ + AParentID + """";
        iCds.Filtered = True;
        i=0;
        while (!iCds.Eof)
        {
          if (iCds.FieldByName("ID").AsString == AID)
          {
            Result= i;
            return;
          }
          i = i + 1;
          iCds.Next;
        }
        Result= -1;
      }
      finally{
        iCds.Free;
      }
    }
    
    //以唯一地址獲取上級地址
    function GetParentByGuid(AID)
    {
      var iCds;
      iCds= new TUgRFDataSet(Self);
      try{
        iCds.Connection = GetRFWeb;
      	iCds.SQL = UgFDQuery01.SQL;
        iCds.Open;
        iCds.Filtered = False;
        iCds.Filter   = "ID = """ + AID + """";
        iCds.Filtered = True;
        if (iCds.RecordCount > 0){
          Result=iCds.FieldByName("ParentID").AsString;
          return;
        }
        Result= "";
      }
      finally{
        iCds.Free;
      }
    }
    
    //重新整理按鈕狀態
    function RefButtons()
    {
      var c,p,g,i;
      //目前節點唯一地址
      g = UgFDQuery01.FieldByName("ID").AsString;
      //目前節點上級地址
      p = UgFDQuery01.FieldByName("ParentID").AsString;
      //獲取目前節點的下級節點數
      c = CurrentCount(g);
      //獲取目前節點的索引值
      i = CurrentIndex(p,g);
      btnAppend.Enabled = True;
      btnDelete.Enabled = ((c == 0) && (p != ""));
      btnEditor.Enabled = p != "";
    }
    
    //btnAppend的OnClick事件,點選按鈕以新增按鈕分類
    function btnAppendOnClick(sender)
    {
      var F,b,l,e,c;
      F=GetEditorForm;
      l= new TStringList;
      Try{
        F.Caption = UGMM.LT("新增機構");
        TUgEdit(F.FindComponent("edID")).Text   = UGMM.CreateGuid; //獲取GUID
        if (UgFDQuery01.IsEmpty){
          TUgEdit(F.FindComponent("edParentID")).Text = TUgEdit(F.FindComponent("edID")).Text;
        }
        else{
          TUgEdit(F.FindComponent("edParentID")).Text = UgFDQuery01.FieldbyName("ID").AsString; 
        }
        e="";
        b=True;
        While (b)
        {
          if (e!="")
          MessageDlg(e,mtError,mbOK);
          if (F.ShowModal == mrOK) 
          {
            Try{
              if (Trim(TUgEdit(F.FindComponent("edInstNo")).Text) == "")
                RaiseException(UGMM.LT("機構程式碼不能為空"));
              if (Trim(TUgEdit(F.FindComponent("edInstName")).Text) == "")
                RaiseException(UGMM.LT("機構名稱不能為空"));
                 l.Clear;
              l.add("ActionType=Update");
              l.add("ID=" + TUgEdit(F.FindComponent("edID")).Text);
              l.add("InstNo=" + TUgEdit(F.FindComponent("edInstNo")).Text);
              l.add("InstName=" + TUgEdit(F.FindComponent("edInstName")).Text);
              l.add("ParentID=" + TUgEdit(F.FindComponent("edParentID")).Text);
              
              UgFDQuery01.Append;
              UgFDQuery01.FieldbyName("ID").AsString = l.Values["ID"];
              UgFDQuery01.FieldbyName("InstNo").asString = l.Values["InstNo"];
              UgFDQuery01.FieldbyName("InstName").asString = l.Values["InstName"];
              UgFDQuery01.FieldbyName("ParentID").asString = l.Values["ParentID"];
              UgFDQuery01.Post;
    					UgFDQuery01.ApplyUpdates(-1);
              b = False;
              UgDBTreeGrid01.Refresh;
              RefButtons;
            }
            Except{RaiseException(ExceptionMessage);}
           }
           else{
            b=False;
            }
          }
        }
      Finally{
        l.Free;
        F.Free;
      }
    }
    
    //btnDelete按鈕的OnClick事件
    function btnDeleteOnClick(sender)
    {
      var c,p,g,i;
      if (UgFDQuery01.FieldbyName("ID").asString == UgFDQuery01.FieldbyName("ParentID").asString)
      RaiseException(UGMM.LT("禁止刪除功能表根節點"));
      
      //目前節點唯一地址
      g = UgFDQuery01.FieldByName("ID").AsString;
      //目前節點上級地址
      p = UgFDQuery01.FieldByName("ParentID").AsString;
      //獲取目前節點的下級節點數
      c = CurrentCount(g);
      //判斷是否有下級欄位
      if (c > 0)
      RaiseException(UGMM.LT("不能刪除有下級節點的記錄"));
        if (MessageDlg(UGMM.LT("是否刪除該機構"),mtWarning,mbYes + mbNo) == mrYes)
        {
          UgFDQuery01.Delete;
          UgFDQuery01.ApplyUpdates(-1);
          UgDBTreeGrid01.Refresh;
          RefButtons;
        }
    }
    
    //btnEditor按鈕的OnClick事件,點選以修改
    function btnEditorOnClick(sender)
    {
      var F,b,l,e;
      F=GetEditorForm;
      l= new TStringList();
      Try{
        F.Caption = UGMM.LT("編輯機構");
        TUgEdit(F.FindComponent("edID")).Text   = UgFDQuery01.FieldbyName("ID").AsString; 
        TUgEdit(F.FindComponent("edInstNo")).Text   = UgFDQuery01.FieldbyName("InstNo").AsString; 
        TUgEdit(F.FindComponent("edInstName")).Text   = UgFDQuery01.FieldbyName("InstName").AsString; 
        TUgEdit(F.FindComponent("edParentID")).Text   = UgFDQuery01.FieldbyName("ParentID").AsString;
        e="";
        b=True;
        While (b)
        {
          if (e!="")
          MessageDlg(e,mtError,mbOK);
          if (F.ShowModal == mrOK) 
          {
          Try{
              if (Trim(TUgEdit(F.FindComponent("edFGroupCode")).Text) == "")
                RaiseException(UGMM.LT("機構代號不能為空"));
              if (Trim(TUgEdit(F.FindComponent("edFGroupName")).Text) == "")
                RaiseException(UGMM.LT("機構名稱不能為空"));
                 l.Clear;
              l.add("ActionType=Update");
              l.add("ID=" + TUgEdit(F.FindComponent("edID")).Text);
              l.add("InstNo=" + TUgEdit(F.FindComponent("edInstNo")).Text);
              l.add("InstName=" + TUgEdit(F.FindComponent("edInstName")).Text);
              l.add("ParentID=" + TUgEdit(F.FindComponent("edParentID")).Text);
    
              UgFDQuery01.Edit;
              UgFDQuery01.FieldbyName("ID").asString = l.Values["ID"];
              UgFDQuery01.FieldbyName("InstNo").asString = l.Values["InstNo"];
              UgFDQuery01.FieldbyName("InstName").asString = l.Values["InstName"];
              UgFDQuery01.FieldbyName("ParentID").asString = l.Values["ParentID"];
    					UgFDQuery01.Post;
              UgFDQuery01.ApplyUpdates(-1);
              b = False;
              UgDBTreeGrid01.Refresh;
              RefButtons;
            }
            Except{RaiseException(ExceptionMessage);}
              
           }
         else{
            b=False;
          }
        }
      }
      Finally{
        l.Free;
        F.Free;
      }
    }
    
    //UgWebRunFrame的OnAfterRunScript事件,窗體運行時進行程式載入
    function UgWebRunFrameOnAfterRunScript(Sender)
    {
    //翻譯界面
      UGMM.LC(Self);
    //節點自動展開
      FullExpand.Enabled = True;
    //驗證模組許可權
      UGMM.VerifyRunFramePerm(Self);
      UgFDQuery01.Connection = GetRFWeb;
      UgFDQuery01.SQL.Text = "SELECT * FROM Paper_Inst";
      UgFDQuery01.Open; 
    }
    
    //FullExpand的OnTimer事件,以啟用延遲表格重新整理的功能
    function FullExpandOnTimer(sender)
    {
      FullExpand.Enabled = False;
      UgDBTreeGrid01.FullExpand;
    }
    
    //UgDBTreeGrid01的OnSelectionChange事件,重新整理按鈕
    function UgDBTreeGrid01OnSelectionChange(sender)
    {
      RefButtons;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    //PasScript
    Function GetEditorForm:TUgWebForm;
    //產生編輯窗體,用於編輯機構資訊
    Var
      edID:TUgEdit;
      edInstNo:TUgEdit;
      edInstName:TUgEdit;
      edParentID:TUgEdit;
      btOk:TUgButton;
    Begin
      Result := TUgWebForm.Create(UniApplication);
      Result.FreeOnClose := False;
      Result.Width := 320;
      Result.Height := 460;
      Result.Bordericons :=biSystemMenu;
      
      //ID欄位
      edID:=TUgEdit.Create(Result);
      edID.Name := 'edID';
      edID.Height := 48;
      edID.Enabled := False;
      edID.Parent := Result;
      edID.FieldLabel := '記錄唯一地址';
      edID.FieldLabelSeparator := '';
      edID.FieldLabelAlign := laTop;
      edID.Align := alTop;
      edID.Margins.Left := 8;
      edID.Margins.Right := 8;
      edID.AlignWithMargins := True;
      
      //InstNo機構程式碼
      edInstNo := TUgEdit.Create(Result);
      edInstNo.Name := 'edInstNo';
      edInstNo.Height := 48;
      edInstNo.Parent := Result;
      edInstNo.FieldLabel := '機構程式碼';
      edInstNo.FieldLabelSeparator := '';
      edInstNo.FieldLabelAlign :=laTop;
      edInstNo.Align := alTop;
      edInstNo.Margins.Left := 8;
      edInstNo.Margins.Right := 8;
      edInstNo.AlignWithMargins := True;
      edInstNo.EmptyText:='請輸機構組程式碼';
    
      //InstName客戶名稱
      edInstName:=TUgEdit.Create(Result);
      edInstName.Name := 'edInstName';
      edInstName.Height := 48;
      edInstName.Parent := Result;
      edInstName.FieldLabel := '機構名稱';
      edInstName.FieldLabelSeparator := '';
      edInstName.FieldLabelAlign := laTop;
      edInstName.Align := alTop;
      edInstName.Margins.Left := 8;
      edInstName.Margins.Right := 8;
      edInstName.AlignWithMargins := True;
      edInstName.EmptyText:='請輸入機構名稱';
    
      //ParetID 上級地址
      edParentID:=TUgEdit.Create(Result);
      edParentID.Name := 'edParentID';
      edParentID.Height := 48;
      edParentID.Enabled := False;
      edParentID.Parent := Result;
      edParentID.FieldLabel := '上級地址';
      edParentID.FieldLabelSeparator := '';
      edParentID.FieldLabelAlign := laTop;
      edParentID.Align := alTop;
      edParentID.Margins.Left := 8;
      edParentID.Margins.Right := 8;
      edParentID.AlignWithMargins := True;
      
      btOk:=TUgButton.Create(Result);
      btOk.Name := 'btOk';
      btOk.Height := 32;
      btOk.Parent := Result;
      btOk.Margins.Bottom:= 6;
      btOk.Margins.Left := 8;
      btOk.Margins.Right := 8;
      btOk.Align := alBottom;
      btOk.Caption:='儲存';
      btOk.ModalResult := mrOK;
      btOk.AlignWithMargins := True;  
    end;
    
    //獲取目前節點的下級節點數
    Function CurrentCount(Const AParentID:String):Integer;
    Var
      iCds:UgRFDataSet;
    begin
      iCds:=TUgRFDataSet.Create(Self);
      try
      	iCds.Connection := GetFD;
      	iCds.SQL := UgFDQuery01.SQL;
        iCds.Open;
        iCds.Filtered := False;
        iCds.Filter   := 'ParentID = '''+ AParentID + '''';
        iCds.Filtered := True;
        Result:=iCds.RecordCount;
      finally
        iCds.Free;
      end;
    end;
    
    //獲取目前節點的索引值
    Function CurrentIndex(const AParentID,AID:String):Integer;
    Var
      iCds:UgRFDataSet;
      i:Integer;
    begin
      iCds:=UgRFDataSet.Create(Self);
      try
        iCds.Connection := GetFD;
      	iCds.SQL := UgFDQuery01.SQL;
        iCds.Open;
        iCds.IndexFieldNames := UgFDQuery01.IndexFieldNames;
        iCds.Filtered := False;
        iCds.Filter   := 'ParentID = ''' + AParentID + '''';
        iCds.Filtered := True;
        i:=0;
        while not iCds.Eof do
        begin
          if iCds.FieldByName('ID').AsString = AID then
          Begin
            Result:= i;
            Exit;
          end;
          i := i + 1;
          iCds.Next;
        end;
        Result:= -1;
      finally
        iCds.Free;
      end;
    end;
    
    //以唯一地址獲取上級地址
    Function GetParentByGuid(const AID:String):string;
    Var
      iCds:UgRFDataSet;
    begin
      iCds:=UgRFDataSet.Create(Self);
      try
        iCds.Connection := GetFD;
      	iCds.SQL := UgFDQuery01.SQL;
        iCds.Open;
        iCds.Filtered := False;
        iCds.Filter   := 'ID = ''' + AID + '''';
        iCds.Filtered := True;
        if iCds.RecordCount > 0 then
        Begin
          Result:=iCds.FieldByName('ParentID').AsString;
          Exit;
        end;
        Result:= '';
      finally
        iCds.Free;
      end;
    end;
    
    //重新整理按鈕狀態
    procedure RefButtons;
    var
      c:Integer;
      p:string;
      g:string;
      i:integer;
    Begin
      //目前節點唯一地址
      g := UgFDQuery01.FieldByName('ID').AsString;
      //目前節點上級地址
      p := UgFDQuery01.FieldByName('ParentID').AsString;
      //獲取目前節點的下級節點數
      c := CurrentCount(g);
      //獲取目前節點的索引值
      i := CurrentIndex(p,g);
      btnAppend.Enabled := True;
      btnDelete.Enabled := (c = 0) and (p <> '');
      btnEditor.Enabled := p <> '';
    end;
    
    //btnAppend的OnClick事件,點選按鈕以新增按鈕分類
    procedure btnAppendOnClick(sender: tobject);
    Var
      F:TUgWebForm;
      b:Boolean;
      l:TStringList;
      e:string;
      c:Integer;
    Begin
      F:=GetEditorForm;
      l:=TStringList.Create;
      Try
        F.Caption := UGMM.LT('新增機構');
        TUgEdit(F.FindComponent('edID')).Text   := UGMM.CreateGuid; //獲取GUID
        if UgFDQuery01.IsEmpty Then
          TUgEdit(F.FindComponent('edParentID')).Text := TUgEdit(F.FindComponent('edID')).Text
        Else
          TUgEdit(F.FindComponent('edParentID')).Text := UgFDQuery01.FieldbyName('ID').AsString; 
        e:='';
        b:=True;
        While b do
        Begin
          if e<>'' then
          MessageDlg(e,mtError,mbOK);
          if F.ShowModal = mrOK then 
          Begin
            Try
              if Trim(TUgEdit(F.FindComponent('edInstNo')).Text) = '' then
                RaiseException(UGMM.LT('機構程式碼不能為空'));
              if Trim(TUgEdit(F.FindComponent('edInstName')).Text) = '' then
                RaiseException(UGMM.LT('機構名稱不能為空'));
                 l.Clear;
              l.add('ActionType=Update');
              l.add('ID=' + TUgEdit(F.FindComponent('edID')).Text);
              l.add('InstNo=' + TUgEdit(F.FindComponent('edInstNo')).Text);
              l.add('InstName=' + TUgEdit(F.FindComponent('edInstName')).Text);
              l.add('ParentID=' + TUgEdit(F.FindComponent('edParentID')).Text);
              
              UgFDQuery01.Append;
              UgFDQuery01.FieldbyName('ID').AsString := l.Values['ID'];
              UgFDQuery01.FieldbyName('InstNo').asString := l.Values['InstNo'];
              UgFDQuery01.FieldbyName('InstName').asString := l.Values['InstName'];
              UgFDQuery01.FieldbyName('ParentID').asString := l.Values['ParentID'];
              UgFDQuery01.Post;
    					UgFDQuery01.ApplyUpdates(-1);
              b := False;
              UgDBTreeGrid01.Refresh;
              RefButtons;
            Except{ExceptionMessage}
              e:=ExceptionMessage;
            end;
          End else
            b:=False;
        End;
      Finally
        l.Free;
        F.Free;
      end;
    End;
    
    //btnDelete按鈕的OnClick事件
    procedure btnDeleteOnClick(sender: tobject);
    var
      c:Integer;
      p:string;
      g:string;
      i:integer;
    Begin
      if UgFDQuery01.FieldbyName('ID').asString = UgFDQuery01.FieldbyName('ParentID').asString then
      RaiseException(UGMM.LT('禁止刪除功能表根節點'));
      
      //目前節點唯一地址
      g := UgFDQuery01.FieldByName('ID').AsString;
      //目前節點上級地址
      p := UgFDQuery01.FieldByName('ParentID').AsString;
      //獲取目前節點的下級節點數
      c := CurrentCount(g);
      //判斷是否有下級欄位
      if c > 0 then
      RaiseException(UGMM.LT('不能刪除有下級節點的記錄'));
        if MessageDlg(UGMM.LT('是否刪除該機構'),mtWarning,mbYes + mbNo) = mrYes then
        Begin
          UgFDQuery01.Delete;
          UgFDQuery01.ApplyUpdates(-1);
          UgDBTreeGrid01.Refresh;
          RefButtons;
        end;
    End;
    
    //btnEditor按鈕的OnClick事件,點選以修改
    procedure btnEditorOnClick(sender: tobject);
    Var
      F:TUgWebForm;
      b:Boolean;
      l:TStringList;
      e:string;
    Begin
      F:=GetEditorForm;
      l:=TStringList.Create;
      Try
        F.Caption := UGMM.LT('編輯機構');
        TUgEdit(F.FindComponent('edID')).Text   := UgFDQuery01.FieldbyName('ID').AsString; 
        TUgEdit(F.FindComponent('edInstNo')).Text   := UgFDQuery01.FieldbyName('InstNo').AsString; 
        TUgEdit(F.FindComponent('edInstName')).Text   := UgFDQuery01.FieldbyName('InstName').AsString; 
        TUgEdit(F.FindComponent('edParentID')).Text   := UgFDQuery01.FieldbyName('ParentID').AsString;
        e:='';
        b:=True;
        While b do
        Begin
          if e<>'' then
          MessageDlg(e,mtError,mbOK);
          if F.ShowModal = mrOK then 
          Begin
            Try
              if Trim(TUgEdit(F.FindComponent('edFGroupCode')).Text) = '' then
                RaiseException(UGMM.LT('機構代號不能為空'));
              if Trim(TUgEdit(F.FindComponent('edFGroupName')).Text) = '' then
                RaiseException(UGMM.LT('機構名稱不能為空'));
                 l.Clear;
              l.add('ActionType=Update');
              l.add('ID=' + TUgEdit(F.FindComponent('edID')).Text);
              l.add('InstNo=' + TUgEdit(F.FindComponent('edInstNo')).Text);
              l.add('InstName=' + TUgEdit(F.FindComponent('edInstName')).Text);
              l.add('ParentID=' + TUgEdit(F.FindComponent('edParentID')).Text);
    
              UgFDQuery01.Edit;
              UgFDQuery01.FieldbyName('ID').asString := l.Values['ID'];
              UgFDQuery01.FieldbyName('InstNo').asString := l.Values['InstNo'];
              UgFDQuery01.FieldbyName('InstName').asString := l.Values['InstName'];
              UgFDQuery01.FieldbyName('ParentID').asString := l.Values['ParentID'];
    					UgFDQuery01.Post;
              UgFDQuery01.ApplyUpdates(-1);
              b := False;
              UgDBTreeGrid01.Refresh;
              RefButtons;
            Except{ExceptionMessage}
              e:=ExceptionMessage;
            end;
          End else
            b:=False;
        End;
      Finally
        l.Free;
        F.Free;
      end;
    End;
    
    //UgWebRunFrame的OnAfterRunScript事件,窗體運行時進行程式載入
    Procedure UgWebRunFrameOnAfterRunScript(Const Sender: TObject);
    Begin
    //翻譯界面
      UGMM.LC(Self);
    //節點自動展開
      FullExpand.Enabled := True;
    //驗證模組許可權
      UGMM.VerifyRunFramePerm(Self);
    End;
    
    //FullExpand的OnTimer事件,以啟用延遲表格重新整理的功能
    procedure FullExpandOnTimer(sender: tobject);
    begin
      FullExpand.Enabled := False;
      UgDBTreeGrid01.FullExpand;
    end;
    
    //UgDBTreeGrid01的OnSelectionChange事件,重新整理按鈕
    procedure UgDBTreeGrid01OnSelectionChange(sender: tobject);
    begin
      RefButtons;
    end;
    
    Begin
      UgFDQuery01.Connection := GetRFWeb;
      UgFDQuery01.SQL.Text := 'SELECT * FROM Paper_Inst';
      UgFDQuery01.Open; 
    End.
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    // Make sure to add code blocks to your code group
    • 儲存運行

      點選設計區界面左上角的儲存按鈕進行儲存,然後點選運行按鈕,進行除錯運行。

      至此機構管理的模組設計完畢。

    # 3.3. 護照管理

      在模組列表中選擇護照管理,點選上方的[模組設計]按鈕,進入到模組設計界面。

      該界面中需要放置的控制元件較多,下方會用表格的方式列出使用的控制元件。

    控制元件名稱 對應控制元件 說明
    UgContainerPanel01 UgContainerPanel 內容面板控制元件,用於放置按鈕以及編輯區的控制元件
    btnFirst UgBitBtn [首頁]按鈕
    btnPrior UgBitBtn [前項]按鈕
    btnNext UgBitBtn [後項]按鈕
    btnLast UgBitBtn [尾項]按鈕
    edQuery UgEdit 用於輸入員工編號的查詢文字框
    btnQuery UgBitBtn [查詢]按鈕
    btnAppend UgBitBtn [新增]按鈕
    UgVerticalLine01 UgVerticalLine [查詢]按鈕與[首項]按鈕之間的垂直間隔線
    UgVerticalLine02 UgVerticalLine [尾項]按鈕與[新增]按鈕之間的垂直間隔線
    UgVerticalLine03 UgVerticalLine [取消]按鈕與[重新整理]按鈕之間的垂直間隔線
    btnDelete UgBitBtn [刪除]按鈕
    btnEditor UgBitBtn [修改]按鈕
    btnSave UgBitBtn [儲存]按鈕
    btnCancel UgBitBtn [取消]按鈕
    btnRefresh UgBitBtn [重新整理]按鈕
    btnPrint UgBitBtn [列印]按鈕
    edOwnerNo UgDBEdit 員工編號編輯框
    edOwnerName UgDBEdit 員工姓名編輯框
    cbPaperType UgDBComboBox 護照型別下拉選擇框
    edPaperNo UgDBEdit 護照編號編輯框
    dtpPaperDate UgDBDateTimePicker 入庫日期選擇框
    dtpPaperExpire UgDBDateTimePicker 有效期至選擇框
    cbPaperState UgDBComboBox 護照狀態選擇框
    lkcbInstNo UgDBLookupComboBox 機構編號下拉選擇框
    lkcbInstName UgDBLookupComboBox 機構名稱下拉選擇框
    UgGroupBox01 UgGroupBox 圖片顯示控制元件的外層組框
    UgDBImage01 UgDBImage 圖片顯示控制元件
    UgDBGrid01 UgDBGrid 列表顯示元件
    dsPaperInfo UgDataSource 護照資訊數據源控制元件
    QryPaperInfo UgRFDataSet 儲存護照資訊的數據集
    dsPaperInst UgDataSource 機構數據源控制元件
    QryPaperInst UgRFDataSet 儲存機構資訊的數據集
    UgFileUpload01 UgFileUpload 檔案上傳的控制元件
    UgHtmlReport01 UgHtmlReport HTML格式報表控制元件

      其中的控制元件屬性設定如下:

    • UgContainerPanel01
    屬性 取值 說明
    Align alTop 內容面板控制元件需置頂
    Height 256 控制元件的高度
    • edQuery
    屬性 取值 說明
    Width 121 控制元件的寬度
    EmptyText 請輸入員工編號 輸入框為空時顯示的文字內容
    Name edQuery 控制元件名稱
    • btnQuery/btnFirst/btnPrior/btnNext/btnLast/btnQuery/btnAppend/btnDelete/btnEditor/btnSave/btnCancel/btnRefresh/btnPrint
    屬性 取值 說明
    Caption 查詢/首項/前項/後項/尾項/新增/刪除/修改/儲存/取消/重新整理/列印 按鈕顯示的文字字幕
    Height 40 控制元件高度
    Name btnQuery/btnFirst/btnPrior/btnNext/btnLast/btnQuery/
    btnAppend/btnDelete/btnEditor/btnSave/btnCancel/btnRefresh/btnPrint
    控制元件名稱
    • UgVerticalLine01/UgVerticalLine02/UgVerticalLine03
    屬性 取值 說明
    Height 40 控制元件高度
    Name UgVerticalLine01/UgVerticalLine02/UgVerticalLine03 控制元件名稱
    • edOwnerNo
    屬性 取值 說明
    DataField OwnerNo 設定繫結的欄位
    DataSource dsPaperInfo 設定繫結的數據源
    FieldLabel 員工編號 設定顯示的標籤內容
    FieldLabelWidth 60 設定標籤的顯示寬度
    Name edOwnerNo 控制元件名稱
    Width 250 控制元件寬度
    • edOwnerName
    屬性 取值 說明
    DataField OwnerName 設定繫結的欄位
    DataSource dsPaperInfo 設定繫結的數據源
    FieldLabel 員工姓名 設定顯示的標籤內容
    FieldLabelWidth 60 設定標籤的顯示寬度
    Name edOwnerName 控制元件名稱
    Width 250 控制元件寬度
    • cbPaperType
    屬性 取值 說明
    DataField PaperType 設定繫結的欄位
    DataSource dsPaperInfo 設定繫結的數據源
    FieldLabel 護照型別 設定顯示的標籤內容
    FieldLabelWidth 60 設定標籤的顯示寬度
    Items 護照/港澳通行證/臺灣通行證 設定下拉選框的專案
    Name cbPaperType 控制元件名稱
    Width 250 控制元件寬度
    • edPaperNo
    屬性 取值 說明
    DataField PaperNo 設定繫結的欄位
    DataSource dsPaperInfo 設定繫結的數據源
    FieldLabel 護照編號 設定顯示的標籤內容
    FieldLabelWidth 60 設定標籤的顯示寬度
    Name edPaperNo 控制元件名稱
    Width 250 控制元件寬度
    • dtpPaperDate
    屬性 取值 說明
    DataField PaperDate 設定繫結的欄位
    DataSource dsPaperInfo 設定繫結的數據源
    FieldLabel 入庫日期 設定顯示的標籤內容
    FieldLabelWidth 60 設定標籤的顯示寬度
    Name dtpPaperDate 控制元件名稱
    Width 250 控制元件寬度
    • dtpPaperExpire
    屬性 取值 說明
    DataField PaperExpire 設定繫結的欄位
    DataSource dsPaperInfo 設定繫結的數據源
    FieldLabel 有效期至 設定顯示的標籤內容
    FieldLabelWidth 60 設定標籤的顯示寬度
    Name dtpPaperExpire 控制元件名稱
    Width 250 控制元件寬度
    • cbPaperState
    屬性 取值 說明
    DataField PaperState 設定繫結的欄位
    DataSource dsPaperInfo 設定繫結的數據源
    FieldLabel 護照狀態 設定顯示的標籤內容
    FieldLabelWidth 60 設定標籤的顯示寬度
    Items 已出庫/未出庫 設定下拉選框的專案
    Name cbPaperState 控制元件名稱
    Width 250 控制元件寬度
    • lkcbInstNo
    屬性 取值 說明
    DataField InstNo 設定繫結的欄位
    DataSource dsPaperInfo 設定繫結的數據源
    FieldLabel 機構編號 設定顯示的標籤內容
    FieldLabelWidth 60 設定標籤的顯示寬度
    KeyField InstNo 設定下拉選單需要進行傳遞的值的欄位
    ListField InstNo 設定下拉選單顯示的內容的對應欄位
    ListSource dsPaperInst 設定下拉選單顯示的數據對應的數據源
    Name lkcbInstNo 控制元件名稱
    Width 250 控制元件寬度
    • lkcbInstName
    屬性 取值 說明
    DataField InstName 設定繫結的欄位
    DataSource dsPaperInfo 設定繫結的數據源
    FieldLabel 機構名稱 設定顯示的標籤內容
    FieldLabelWidth 60 設定標籤的顯示寬度
    KeyField InstName 設定下拉選單需要進行傳遞的值的欄位
    ListField InstName 設定下拉選單顯示的內容的對應欄位
    ListSource dsPaperInst 設定下拉選單顯示的數據對應的數據源
    Name lkcbInstName 控制元件名稱
    Width 250 控制元件寬度
    • UgGroupBox01
    屬性 取值 說明
    Caption 雙擊框內以上傳圖片 分組框顯示的內容
    • UgDBImage01
    屬性 取值 說明
    DataField UserImage 設定繫結的欄位
    DataSource dsPaperInfo 設定繫結的數據源
    • UgDBGrid01

      UgDBGrid01建立后,雙擊該控制元件以打開欄位視窗,新增如下欄位內容:

      其屬性配置如下:

    屬性 取值 說明
    DataSource dsPaperInfo 設定繫結的數據源
    • dsPaperInfo
    屬性 取值 說明
    DataSet QryPaperInfo 設定其繫結的數據集
    Name dsPaperInfo 控制元件名稱
    • QryPaperInfo
    屬性 取值 說明
    Name QryPaperInfo 控制元件名稱
    • dsPaperInst
    屬性 取值 說明
    DataSet QryPaperInst 設定其繫結的數據集
    Name dsPaperInst 控制元件名稱
    • QryPaperInst
    屬性 取值 說明
    Name QryPaperInst 控制元件名稱
    • UgFileUpload01
    屬性 取值 說明
    Filter *.png,*.jpg 檔案篩選器,篩選指定後綴名的檔案
    Messages.BrowseText 瀏覽 文字資訊翻譯
    Messages.Cancel 取消 文字資訊翻譯
    Messages.PleaseWait 請等待 文字資訊翻譯
    Messages.Processing 正在處理中... 文字資訊翻譯
    Messages.Upload 上傳 文字資訊翻譯
    Messages.UploadError 上傳出錯 文字資訊翻譯
    Messages.Uploading 上傳中 文字資訊翻譯
    Messages.UploadTimeout 上傳超時 文字資訊翻譯
    • UgHtmlReport01
    屬性 取值 說明
    DBGrid UgDBGrid01 選擇導出HTML報表的數據表格
    • 事件設定

    UgWebRunFrame的Events界面,在OnAfterRunScript處雙擊以產生事件。

    btnQuery、btnFirst、btnPrior、btnNext、btnLast、btnAppend、btnDelete、btnEditor、btnSave、btnCancel、btnRefresh、btnPrint的Events界面,在OnClick處雙擊以產生事件。

    lkcbInstNo、lkcbInstName的Events界面,在OnChange處雙擊以產生事件。

    UgDBImage01的Events界面,在OnDoubleClick處雙擊以產生事件。

    UgFileUpload01的Events界面,在OnCompleted處雙擊以產生事件。

    • 程式碼程式編輯

      在事件對應的程式產生后,在對應的事件中進行程式碼的填寫,包含一些自定義函式以及過程的定義。該程式需要引用公共單元中的pub_js_tarslink,在公共單元模組中需對pub_js_tarslink進行勾選。

      參考的程式內容如下:

      //JScript
        //瀏覽狀態
      var tyView   = 0;
        //編輯狀態【新增、編輯、塗改】
      var tyEditor = 1;
        
      //重新整理狀態
      function RefState(AValue)
      {
        //查詢
        btnQuery.Enabled = (AValue == tyView);
        //遊標狀態
        btnFirst.Enabled = (AValue == tyView);
        btnPrior.Enabled = (AValue == tyView);
        btnNext.Enabled  = (AValue == tyView);
        btnLast.Enabled  = (AValue == tyView);
        //編輯功能
        btnAppend.Enabled     = (AValue == tyView);
        btnDelete.Enabled     = ((AValue == tyView) && (!QryPaperInfo.IsEmpty));
        btnEditor.Enabled     = ((AValue == tyView) && (!QryPaperInfo.IsEmpty));
        //儲存功能
        btnSave.Enabled       = (AValue == tyEditor);
        btnCancel.Enabled     = (AValue == tyEditor);
        cbPaperType.Enabled   = (AValue == tyEditor);
        cbPaperState.Enabled  = (AValue == tyEditor);
        lkcbInstNo.Enabled    = (AValue == tyEditor);
        lkcbInstName.Enabled  = (AValue == tyEditor);
        UgDBImage01.Enabled   = (AValue == tyEditor);
        //數據集
        dsPaperInfo.AutoEdit     = (AValue == tyEditor);
        //勾選
        if (AValue == tyEditor){
        UgDBGrid01.Options = dgEditing + dgTitles + dgIndicator + dgColumnResize + dgColLines + dgRowLines + dgConfirmDelete + dgAutoRefreshRow;
        }
        else{
        UgDBGrid01.Options = dgTitles + dgIndicator + dgColumnResize + dgColLines + dgRowLines + dgConfirmDelete + dgAutoRefreshRow;
        }
        //編輯狀態
        Self.IsEditor        = (AValue == tyEditor);
      }
      
      //查詢
      function btnQueryOnClick(sender)
      {
        if (edQuery.Text == "") 
        {
          QryPaperInfo.Filtered = False;
          UgDBGrid01.Refresh;
          return;
        }
        QryPaperInfo.Filtered = False;
        QryPaperInfo.Filter = "OwnerNo = '" + edQuery.Text + "'";
        QryPaperInfo.Filtered = True;
      }
      
      //首項
      function btnFirstOnClick(sender)
      {
        if (QryPaperInfo.IsEmpty)
          return;
        QryPaperInfo.First;
      }
      
      //前項
      function btnPriorOnClick(sender)
      {
        if (QryPaperInfo.IsEmpty)
          return;
        QryPaperInfo.Prior;
      }
      
      //後項
      function btnNextOnClick(sender)
      {
        if (QryPaperInfo.IsEmpty)
          return;
        QryPaperInfo.Next;
      }
      
      //尾項
      function btnLastOnClick(sender)
      {
        if (QryPaperInfo.IsEmpty)
          return;
        QryPaperInfo.Last;
      }
      
      //新增
      function btnAppendOnClick(sender)
      {
        QryPaperInfo.Insert;
        QryPaperInfo.FieldByName("ID").AsString = UGMM.CreateGuid;
        RefState(tyEditor);
      }
      
      //刪除
      function btnDeleteOnClick(sender)
      {
        if (MessageDlg(UGMM.LT("注意:是否刪除該資訊?"),mtWarning,mbYes + mbNo) == mrYes)
        {
          QryPaperInfo.Delete;
          QryPaperInfo.Post;
          QryPaperInfo.ApplyUpdates(-1);
          ShowMessage(UGMM.LT("刪除成功"));
          RefState(tyView);
        }
      }
      
      //修改
      function btnEditorOnClick(sender)
      {
        QryPaperInfo.Edit;
        RefState(tyEditor);  
      }
      
      //儲存
      function btnSaveOnClick(sender)
      {
        if (Trim(QryPaperInfo.FieldByName("OwnerNo").AsString) == "")
        RaiseException(UGMM.LT("員工編號不能為空"));
        
        if (Trim(QryPaperInfo.FieldByName("OwnerName").AsString) == "")
        RaiseException(UGMM.LT("員工名稱不能為空"));
        
        if (Trim(QryPaperInfo.FieldByName("PaperNo").AsString) == "")
        RaiseException(UGMM.LT("護照編號不能為空"));  
      
        if (Trim(QryPaperInfo.FieldByName("PaperType").AsString) == "")
        RaiseException(UGMM.LT("護照型別不能為空"));
        
        if (Trim(QryPaperInfo.FieldByName("PaperDate").AsString) == "")
        RaiseException(UGMM.LT("入庫日期不能為空"));
      
        if (Trim(QryPaperInfo.FieldByName("PaperExpire").AsString) == "")
        RaiseException(UGMM.LT("有效日期不能為空"));
        
        if (Trim(QryPaperInfo.FieldByName("PaperState").AsString) == "")
        RaiseException(UGMM.LT("護照狀態不能為空"));
        
        if (Trim(QryPaperInfo.FieldByName("InstNo").AsString) == "")
        RaiseException(UGMM.LT("機構編號不能為空"));
        
        if (Trim(QryPaperInfo.FieldByName("InstName").AsString) == "")
        RaiseException(UGMM.LT("機構名稱不能為空"));
        
        QryPaperInfo.Post;
        QryPaperInfo.ApplyUpdates(-1);
        ShowMessage(UGMM.LT("儲存成功"));
        RefState(tyView);
      }
      
      //取消
      function btnCancelOnClick(sender)
      {
        if (MessageDlg(UGMM.LT("注意:是否放棄儲存?"),mtWarning,mbYes + mbNo) == mrYes)
        {
          QryPaperInfo.Cancel;
          RefState(tyView);
        }  
      }
      
      //重新整理
      function btnRefreshOnClick(sender)
      {
        UgDBGrid01.Refresh; 
      }
      
      //修改的同時也更改名稱
      function lkcbInstNoOnChange(sender)
      {
        QryPaperInfo.FieldByName("InstName").AsString = QryPaperInst.FieldByName("InstName").AsString;
      }
      
      //雙擊以打開圖片上傳對話方塊
      function UgDBImage01OnDblClick(sender)
      {
        UgFileUpload01.Execute;
      }
      
      //修改的同時也更改編號
      function lkcbInstNameOnChange(sender)
      {
        QryPaperInfo.FieldByName("InstNo").AsString = QryPaperInst.FieldByName("InstNo").AsString;
      }
      
      //上傳后將圖片載入至數據中
      function UgFileUpload01OnCompleted(sender,astream)
      {
        TBlobField(UgDBImage01.DataSource.DataSet.FieldByName(UgDBImage01.DataField)).LoadFromStream(astream);
      }
      
      //列印
      function btnPrintOnClick(sender)
      {
        UgHtmlReport01.Print;
      }
      
      //運行基本內容
      function UgWebRunFrameOnAfterRunScript(sender)
      {
        QryPaperInfo.Connection = GetRFWeb;
        QryPaperInfo.SQL.Text = "SELECT * FROM Pass_Paper_Info";
        QryPaperInfo.Open;
        
        QryPaperInst.Connection = GetRFWeb;
        QryPaperInst.SQL.Text = "SELECT * FROM Pass_Paper_Inst";
        QryPaperInst.Open;
      //進入瀏覽狀態
        RefState(tyView);
      //翻譯界面
        UGMM.LC(Self);
      //驗證模組許可權
        UGMM.VerifyRunFramePerm(Self);
      }
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      119
      120
      121
      122
      123
      124
      125
      126
      127
      128
      129
      130
      131
      132
      133
      134
      135
      136
      137
      138
      139
      140
      141
      142
      143
      144
      145
      146
      147
      148
      149
      150
      151
      152
      153
      154
      155
      156
      157
      158
      159
      160
      161
      162
      163
      164
      165
      166
      167
      168
      169
      170
      171
      172
      173
      174
      175
      176
      177
      178
      179
      180
      181
      182
      183
      184
      185
      186
      187
      188
      189
      190
      191
      192
      193
      194
      195
      196
      197
      198
      199
      200
      201
      202
      203
      204
      205
      206
      207
      208
      209
      210
      211
      212
      213
      214
      //PasScript
      Const
        //瀏覽狀態
        tyView   = 0;
        //編輯狀態【新增、編輯、塗改】
        tyEditor = 1;
        
      //重新整理狀態
      Procedure RefState(Const AValue:Integer);
      Begin
        //查詢
        btnQuery.Enabled := AValue = tyView;
        //遊標狀態
        btnFirst.Enabled := AValue = tyView;
        btnPrior.Enabled := AValue = tyView;
        btnNext.Enabled  := AValue = tyView;
        btnLast.Enabled  := AValue = tyView;
        //編輯功能
        btnAppend.Enabled     := AValue = tyView;
        btnDelete.Enabled     := (AValue = tyView)and(Not QryPaperInfo.IsEmpty);
        btnEditor.Enabled     := (AValue = tyView)and(Not QryPaperInfo.IsEmpty);
        //儲存功能
        btnSave.Enabled       := AValue = tyEditor;
        btnCancel.Enabled     := AValue = tyEditor;
        cbPaperType.Enabled   := AValue = tyEditor;
        cbPaperState.Enabled  := AValue = tyEditor;
        lkcbInstNo.Enabled    := AValue = tyEditor;
        lkcbInstName.Enabled  := AValue = tyEditor;
        UgDBImage01.Enabled   := AValue = tyEditor;
        //數據集
        dsPaperInfo.AutoEdit     := AValue = tyEditor;
        //勾選
        if AValue = tyEditor Then
        UgDBGrid01.Options := dgEditing + dgTitles + dgIndicator + dgColumnResize + dgColLines + dgRowLines + dgConfirmDelete + dgAutoRefreshRow
        Else
        UgDBGrid01.Options := dgTitles + dgIndicator + dgColumnResize + dgColLines + dgRowLines + dgConfirmDelete + dgAutoRefreshRow;
        //編輯狀態
        Self.IsEditor        := AValue = tyEditor;
      end;
      
      //查詢
      procedure btnQueryOnClick(sender: tobject);
      begin
        if edQuery.Text = '' Then
        Begin
          QryPaperInfo.Filtered := False;
          UgDBGrid01.Refresh;
          Exit;
        End;
        QryPaperInfo.Filtered := False;
        QryPaperInfo.Filter := 'OwnerNo = ''' + edQuery.Text + '''';
        QryPaperInfo.Filtered := True;
      end;
      
      //首項
      procedure btnFirstOnClick(sender: tobject);
      begin
        if QryPaperInfo.IsEmpty Then
          Exit;
        QryPaperInfo.First;
      end;
      
      //前項
      procedure btnPriorOnClick(sender: tobject);
      begin
        if QryPaperInfo.IsEmpty Then
          Exit;
        QryPaperInfo.Prior;
      end;
      
      //後項
      procedure btnNextOnClick(sender: tobject);
      begin
        if QryPaperInfo.IsEmpty Then
          Exit;
        QryPaperInfo.Next;
      end;
      
      //尾項
      procedure btnLastOnClick(sender: tobject);
      begin
        if QryPaperInfo.IsEmpty  Then
          Exit;
        QryPaperInfo.Last;
      end;
      
      //新增
      procedure btnAppendOnClick(sender: tobject);
      begin
        QryPaperInfo.Insert;
        QryPaperInfo.FieldByName('ID').AsString := UGMM.CreateGuid;
        RefState(tyEditor);
      end;
      
      //刪除
      procedure btnDeleteOnClick(sender: tobject);
      begin
        if MessageDlg(UGMM.LT('注意:是否刪除該資訊?'),mtWarning,mbYes + mbNo) = mrYes then
        Begin
          QryPaperInfo.Delete;
          QryPaperInfo.Post;
          QryPaperInfo.ApplyUpdates(-1);
          ShowMessage(UGMM.LT('刪除成功'));
          RefState(tyView);
        End;
      end;
      
      //修改
      procedure btnEditorOnClick(sender: tobject);
      begin
        QryPaperInfo.Edit;
        RefState(tyEditor);  
      end;
      
      //儲存
      procedure btnSaveOnClick(sender: tobject);
      begin
        if Trim(QryPaperInfo.FieldByName('OwnerNo').AsString) = '' then
        RaiseException(UGMM.LT('員工編號不能為空'));
        
        if Trim(QryPaperInfo.FieldByName('OwnerName').AsString) = '' then
        RaiseException(UGMM.LT('員工名稱不能為空'));
        
        if Trim(QryPaperInfo.FieldByName('PaperNo').AsString) = '' then
        RaiseException(UGMM.LT('護照編號不能為空'));  
      
        if Trim(QryPaperInfo.FieldByName('PaperType').AsString) = '' then
        RaiseException(UGMM.LT('護照型別不能為空'));
        
        if Trim(QryPaperInfo.FieldByName('PaperDate').AsString) = '' then
        RaiseException(UGMM.LT('入庫日期不能為空'));
      
        if Trim(QryPaperInfo.FieldByName('PaperExpire').AsString) = '' then
        RaiseException(UGMM.LT('有效日期不能為空'));
        
        if Trim(QryPaperInfo.FieldByName('PaperState').AsString) = '' then
        RaiseException(UGMM.LT('護照狀態不能為空'));
        
        if Trim(QryPaperInfo.FieldByName('InstNo').AsString) = '' then
        RaiseException(UGMM.LT('機構編號不能為空'));
        
        if Trim(QryPaperInfo.FieldByName('InstName').AsString) = '' then
        RaiseException(UGMM.LT('機構名稱不能為空'));
        
        QryPaperInfo.Post;
        QryPaperInfo.ApplyUpdates(-1);
        ShowMessage(UGMM.LT('儲存成功'));
        RefState(tyView);
      end;
      
      //取消
      procedure btnCancelOnClick(sender: tobject);
      begin
        if MessageDlg(UGMM.LT('注意:是否放棄儲存?'),mtWarning,mbYes + mbNo) = mrYes then
        Begin
          QryPaperInfo.Cancel;
          RefState(tyView);
        end;  
      end;
      
      //重新整理
      procedure btnRefreshOnClick(sender: tobject);
      begin
        UgDBGrid01.Refresh; 
      end;
      
      //修改的同時也更改名稱
      procedure lkcbInstNoOnChange(sender: tobject);
      begin
        QryPaperInfo.FieldByName('InstName').AsString := QryPaperInst.FieldByName('InstName').AsString;
      end;
      
      //雙擊以打開圖片上傳對話方塊
      procedure UgDBImage01OnDblClick(sender: tobject);
      begin
        UgFileUpload01.Execute;
      end;
      
      //修改的同時也更改編號
      procedure lkcbInstNameOnChange(sender: tobject);
      begin
        QryPaperInfo.FieldByName('InstNo').AsString := QryPaperInst.FieldByName('InstNo').AsString;
      end;
      
      //上傳后將圖片載入至數據中
      procedure UgFileUpload01OnCompleted(sender: tobject;astream: tfilestream);
      begin
        TBlobField(UgDBImage01.DataSource.DataSet.FieldByName(UgDBImage01.DataField)).LoadFromStream(astream);
      end;
      
      //列印
      procedure btnPrintOnClick(sender: tobject);
      begin
        UgHtmlReport01.Print;
      end;
      
      //運行基本內容
      procedure UgWebRunFrameOnAfterRunScript(const sender: tobject);
      begin
        QryPaperInfo.Connection := GetRFWeb;
        QryPaperInfo.SQL.Text := 'SELECT * FROM Pass_Paper_Info';
        QryPaperInfo.Open;
        
        QryPaperInst.Connection := GetRFWeb;
        QryPaperInst.SQL.Text := 'SELECT * FROM Pass_Paper_Inst';
        QryPaperInst.Open;
      //進入瀏覽狀態
        RefState(tyView);
      //翻譯界面
        UGMM.LC(Self);
      //驗證模組許可權
        UGMM.VerifyRunFramePerm(Self);
      end;
      
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      119
      120
      121
      122
      123
      124
      125
      126
      127
      128
      129
      130
      131
      132
      133
      134
      135
      136
      137
      138
      139
      140
      141
      142
      143
      144
      145
      146
      147
      148
      149
      150
      151
      152
      153
      154
      155
      156
      157
      158
      159
      160
      161
      162
      163
      164
      165
      166
      167
      168
      169
      170
      171
      172
      173
      174
      175
      176
      177
      178
      179
      180
      181
      182
      183
      184
      185
      186
      187
      188
      189
      190
      191
      192
      193
      194
      195
      196
      197
      198
      199
      200
      201
      202
      203
      204
      205
      206
      207
      208
      209
      210
      211
      212
      213
      // Make sure to add code blocks to your code group
      • 儲存運行

        點選設計區界面左上角的儲存按鈕進行儲存,然後點選運行按鈕,進行除錯運行。

      # 4. 功能表配置

        點選左側功能表欄中的[系統工具]-[功能表列表(WEB)],進入到功能表列表界面,在該界面下,新增兩個功能表列,分別對應為機構管理和護照管理,配置如圖所示。填寫完成後點選[儲存]。

      # 5. 許可權設定

        在此處我們設定兩種許可權,一種許可權是僅瀏覽,即不能對數據進行更改新增刪除的操作;另外一種許可權是可以進行數據的新增更改刪除查詢。

        在機構管理的程式程式碼編輯界面,切換右側選項卡至許可權選項,點選[新增]按鈕,新增以下兩項平行的許可權選項。許可權選項中的配置內容如圖所示。

        在護照管理的程式程式碼編輯界面,切換右側選項卡至許可權選項,點選[新增]按鈕,新增許可權選項。許可權選項卡中的配置內容如圖所示。

        設定完畢,點選左側功能表欄[系統管理]-[角色],點選[新增]新建一個角色帳套使用者,將其許可權列表中機構管理與護照管理的瀏覽進行勾選。點選[儲存]按鈕。

        點選[查詢]按鈕選擇角色,雙擊將角色切換至系統管理員,將其許可權列表中的機構管理與護照管理下的許可權專案全部勾選,點選[儲存]按鈕。

        點選左側功能表欄中的[系統管理]-[使用者],點選[新增]新建一個使用者user,根據下圖內容進行設定。設定完成點選[儲存]按鈕。

        點選[查詢]按鈕,選擇管理員,雙擊以切換使用者至管理員,檢查其角色是否勾選系統管理員,檢查完成點選[儲存]按鈕。

        至此許可權設定完畢。

      # 6. 檢查

        重新整理瀏覽器,在系統使用者模式下http://localhost:8888 (opens new window)分別用admin與user使用者登陸FastWeb,檢視兩者的差異。

        至此護照管理系統的開發案例已全部完成。

      圖靈數據分析
      紡織印染業ERP設計實務

      ← 圖靈數據分析 紡織印染業ERP設計實務→

      Copyright © 2021-2025 愛招飛IsoFace | ALL Rights Reserved
      • 跟随系统
      • 浅色模式
      • 深色模式
      • 阅读模式