愛招飛幫助手冊 愛招飛幫助手冊
  • 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
  • Smart幫助主頁
  • 學習手冊

    • 基本入門

    • 功能介紹

    • 控制元件說明

    • 功能用法

    • 專用模板

    • 開發流程

      • 紡織印染業ERP設計實務
        • 1. 系統組成
        • 2. 主頁
          • 2.1. 功能簡述
          • 2.2. 窗體設定
          • 2.3. 控制元件設定
          • 2.4. 指令碼設計
          • 2.5. 多語言設定
          • 2.6. 運行效果
        • 3. 基礎資料頁面設定
          • 3.1. 公司資料編輯-單筆數據表單
          • 3.1.1. 功能簡述
          • 3.1.2. 窗體設定
          • 3.1.3. 控制元件設定
          • 3.1.4. 指令碼設計
          • 3.1.5. 多語言設定
          • 3.1.6. 運行效果
          • 3.2. 客戶資料查詢-多筆數據表單
          • 3.2.1. 功能簡述
          • 3.2.2. 窗體設定
          • 3.2.3. 控制元件設定
          • 3.2.4. 指令碼設計
          • 3.2.5. 多語言設定
          • 3.2.6. 運行效果
          • 3.3. 客戶資料編輯-多筆數據表單
          • 3.3.1. 功能簡述
          • 3.3.2. 窗體設定
          • 3.3.3. 控制元件設定
          • 3.3.4. 指令碼設計
          • 3.3.5. 多語言設定
          • 3.3.6. 運行效果
          • 3.4. 布種資料查詢-多筆數據表單
          • 3.4.1. 功能簡述
          • 3.4.2. 窗體設定
          • 3.4.3. 控制元件設定
          • 3.4.4. 指令碼設計
          • 3.4.5. 多語言設定
          • 3.4.6. 運行效果
          • 3.5. 布種資料編輯-多筆數據表單
          • 3.5.1. 功能簡述
          • 3.5.2. 窗體設定
          • 3.5.3. 控制元件設定
          • 3.5.4. 指令碼設計
          • 3.5.5. 多語言設定
          • 3.5.6. 運行效果
        • 4. 業務單據頁面設定
          • 4.1. 銷售訂單查詢-多筆數據主從表單
          • 4.1.1. 功能簡述
          • 4.1.2. 窗體設定
          • 4.1.3. 控制元件設定
          • 4.1.4. 指令碼設計
          • 4.1.5. 多語言設定
          • 4.1.6. 運行效果
          • 4.2. 銷售訂單編輯-多筆數據主從表單
          • 4.2.1. 功能簡述
          • 4.2.2. 窗體設定
          • 4.2.3. 控制元件設定
          • 4.2.4. 指令碼設計
          • 4.2.5. 多語言設定
          • 4.2.6. 報表設定
          • 4.2.7. 運行效果
        • 5. 匯入窗體設定
          • 5.1. 匯入布種資料-多筆數據表單
          • 5.1.1. 功能簡述
          • 5.1.2. 窗體設定
          • 5.1.3. 控制元件設定
          • 5.1.4. 指令碼設計
          • 5.1.5. 多語言設定
          • 5.1.6. 運行效果
          • 5.2. 文件檢視
          • 5.2.1. 功能簡述
          • 5.2.2. 窗體設定
          • 5.2.3. 控制元件設定
          • 5.2.4. 指令碼設計
          • 5.2.5. 多語言設定
          • 5.2.6. 運行效果
    • 函式程式

  • 開發手冊

目录

紡織印染業ERP設計實務

# Smart 紡織印染業ERP設計實務

  該文件將指導實現在Smart中的單據相關功能。本次我們將在Smart中實現業務系統的功能。

# 1. 系統組成

  以下圖片描述本系統的模組組成,其中公司資料、客戶資料以及布種資料為對應的基礎資料,銷售訂單為引用以上基礎資料產生的單據。除公司資料外,其他的每個模組均包含查詢頁面以及編輯頁面。銷售訂單中還包括列印的相關設定內容。

  本系統主要實現的功能為在建立公司資料、客戶資料、布種資料等基礎資料后,實現銷售訂單的單據的新增、編輯、審覈等相關單據功能,並實現單據的列印。

# 2. 主頁

  主頁頁面,其中主要包含主頁顯示的相關內容。

# 2.1. 功能簡述

  主頁頁面將需要使用到的功能以功能表的形式展現出來,通過與各個對應的模組對接鏈接,點選功能圖示打開對應的功能界面。

# 2.2. 窗體設定

屬性 取值 說明
BorderStyle bsDialog 設定窗體邊框的型別
Caption 系統展示 主窗體的標題名稱
Height 768 主窗體的高度(畫素)
Name Main 主窗體模組的名稱
Width 1024 主窗體的寬度(畫素)

# 2.3. 控制元件設定

  各結構控制元件說明如下,所有涉及到文字顯示的控制元件的Font.Size修改爲12,TPanel型別的控制元件需要清除Caption屬性中原有的字元內容。

控制元件名稱 控制元件型別 說明
Panel1 TPanel 頂部面板佈局控制元件。
Caption:歡迎使用愛招飛演示系統
Color:clGradientInactiveCaption
Panel2 TPanel 左側面板佈局控制元件。作為按鈕的容器
BitBtn6 TBitBtn 圖片按鈕控制元件。
Align:對齊方式alTop
Caption:快捷入口
Glyph: 圖片選擇
BitBtn5 TBitBtn 圖片按鈕控制元件。
Align:對齊方式alTop
Caption:基礎資料
Glyph: 圖片選擇
BitBtn4 TBitBtn 圖片按鈕控制元件。
Align:對齊方式alTop
Caption:銷售管理
Glyph: 圖片選擇
BitBtn3 TBitBtn 圖片按鈕控制元件。
Align:對齊方式alTop
Caption:採購管理
Glyph: 圖片選擇
BitBtn2 TBitBtn 圖片按鈕控制元件。
Align:對齊方式alTop
Caption:生產管理
Glyph: 圖片選擇
BitBtn1 TBitBtn 圖片按鈕控制元件。
Align:對齊方式alTop
Caption:財務管理
Glyph: 圖片選擇
pnCompany TPanel 面板控制元件,存放公司資料圖片按鈕
imgbtnCompany TImage 圖片控制元件,顯示公司資料圖片。
Picture:點選打開圖片選擇對話方塊。
Label2 TLabel 顯示標籤(公司資料)
Caption:公司資料
pnCust TPanel 面板控制元件,存放客戶資料圖片按鈕
imgbtnCust TImage 圖片控制元件,顯示客戶資料圖片。
Picture:點選打開圖片選擇對話方塊。
Label3 TLabel 顯示標籤(客戶資料)
Caption:客戶資料
pnItem TPanel 面板控制元件,存放布種資料圖片按鈕
imgbtnItem TImage 圖片控制元件,顯示布種資料圖片。
Picture:點選打開圖片選擇對話方塊。
Label4 TLabel 顯示標籤(布種資料)
Caption:布種資料
pnSalOrder TPanel 面板控制元件,存放銷售訂單圖片按鈕
imgbtnSalOrder TImage 圖片控制元件,顯示銷售訂單資料圖片。
Picture:點選打開圖片選擇對話方塊。
Label5 TLabel 顯示標籤(銷售訂單)
Caption:銷售訂單

# 2.4. 指令碼設計

type
  TMyHandler = class(TForm)
private 
  FThis:TBaseForm; 
Public 
  constructor Create(AOwner: TComponent); override;
{模組聲明  MODULE-DECLARE}
  procedure imgbtnCompanyClick(Sender: TObject);
  procedure imgbtnCustClick(Sender: TObject);
  procedure imgbtnItemClick(Sender: TObject);
  procedure imgbtnSalOrderClick(Sender: TObject);
end;

//...

var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
{事件繫結  MODULE-BIND}
  this.imgbtnCompany.OnClick := FMyHandler.imgbtnCompanyClick;
  this.imgbtnCust.OnClick := FMyHandler.imgbtnCustClick;
  this.imgbtnItem.OnClick := FMyHandler.imgbtnItemClick;
  this.imgbtnSalOrder.OnClick := FMyHandler.imgbtnSalOrderClick;
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
程式模組名稱 說明
Create 構造器,啟動后運行需初始化設定的內容
imgbtnCompanyClick 公司資料按鈕點選
imgbtnCustClick 客戶資料按鈕點選
imgbtnItemClick 布種資料按鈕點選
imgbtnSalOrderClick 銷售訂單資料點選
  • Create:構造器,啟動后運行需初始化設定的內容。
constructor TMyHandler.Create(AOwner: TComponent);
begin
  FThis :=TBaseForm(AOwner);
end;
1
2
3
4
  • imgbtnCompanyClick:公司資料按鈕點選。
procedure TMyHandler.imgbtnCompanyClick;
//點選打開公司資料模組頁面
var
//定義一個基類窗體
  F: TBaseForm;
begin
  //打開窗體名稱為Company的視窗
  F := paxfunc.OpenForm('Company');
  //打開的視窗與目前視窗建立鏈接
  F.TagObject := FThis;
end;
1
2
3
4
5
6
7
8
9
10
11
  • imgbtnCustClick:客戶資料按鈕點選。
procedure TMyHandler.imgbtnCustClick;
//打開客戶資料
var
  F: TBaseForm;
begin
  F := paxfunc.OpenForm('Cust');
  F.TagObject := FThis;
end;
1
2
3
4
5
6
7
8
  • imgbtnItemClick:布種資料按鈕點選。
procedure TMyHandler.imgbtnItemClick;
//打開布種資料
var
  F: TBaseForm;
begin
  F := paxfunc.OpenForm('Item');
  F.TagObject := FThis;
end;
1
2
3
4
5
6
7
8
  • imgbtnSalOrderClick: 銷售訂單資料點選。
procedure TMyHandler.imgbtnSalOrderClick;
//打開銷售訂單
var
  F: TBaseForm;
begin
  F := paxfunc.OpenForm('SalOrder');
  F.TagObject := FThis;
end;
1
2
3
4
5
6
7
8

# 2.5. 多語言設定

  在功能表欄點選語言-語言設定,打開多語言設定對話方塊,根據提示進行多語言的設定。

# 2.6. 運行效果

# 3. 基礎資料頁面設定

  基礎資料的頁面,除公司資料僅包含編輯頁面,其餘的模組均包含查詢頁面以及編輯頁面。

# 3.1. 公司資料編輯-單筆數據表單

  公司資料編輯頁面設定如下。

# 3.1.1. 功能簡述

  公司資料用於對公司資料的內容進行編輯,此頁面中包含了單筆數據的表單設計模式,資料庫圖片的展示與引用,圖片的對話方塊引入模式的設計說明。

# 3.1.2. 窗體設定

屬性 取值 說明
Caption 公司資料 主窗體的標題名稱
Height 768 主窗體的高度(畫素)
Name Company 主窗體模組的名稱
Width 1024 主窗體的寬度(畫素)

# 3.1.3. 控制元件設定

  各表結構欄位及對應的數據感知控制元件名稱如下:

  • 非數據控制元件說明

  所有涉及到文字顯示的控制元件的Font.Size修改爲12,TPanel型別的控制元件需要清除Caption屬性中原有的字元內容。

控制元件名稱 控制元件型別 說明
Panel1 TPanel 用於頂部的佈局,放置單據的操作按鈕(儲存、修改、退出)
GroupBox1 TGroupBox 左下側的佈局控制元件,作為公司資料中公司資訊部分的數據感知控制元件的容器
GroupBox2 TGroupBox 右下側的佈局控制元件,作為公司資料中公司圖示的數據感知控制元件以及配套控制元件的容器
btnSave TBitBtn 儲存按鈕,點選此按鈕以執行數據集儲存程式
Caption:儲存
btnEdit TBitBtn 修改按鈕,用於啟用單據編輯模式
Caption:修改
btnExit TBitBtn 退出按鈕,用於退出目前單據頁面
Caption:退出
btnUpload TBitBtn 上傳按鈕,用於打開圖片上傳對話方塊頁面
Caption:上傳圖片
btnClearPicture TBitBtn 清除按鈕,用於清除數據集中的圖片
Caption:清除
OpenPictureDialog TOpenPictureDialog 對話方塊控制元件,用於打開圖片選擇對話方塊
dts0 TRFDataSet Basic_Company表對應的數據集
ds0 TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dts0
  • 數據控制元件說明 Basic_Company

  以下數據感知控制元件在設定時需將DataSource控制元件指定為ds0,所有涉及到文字顯示的控制元件的Font.Size修改爲12。由於數據感知控制元件不包含標籤顯示,故每放置一個字元編輯型別的數據感知控制元件前,需要先放置一個TLabel控制元件,並將其Caption屬性設定為數據欄位對應的中文名稱,同樣也需要將其 Font.Size修改爲12。

數據欄位名稱 中文名稱 對應控制元件型別 控制元件名稱 備註
FCompanyID 公司編號 TDBEdit edtFCompanyID
FCompanyCode 公司代號 TDBEdit edtFCompanyCode
FComanyName 簡體名稱 TDBEdit edtFCompanyName
FComanyNameTW 繁體名稱 TDBEdit edtFCompanyNameTW
FCompanyNameEn 英文名稱 TDBEdit edtFCompanyNameEn
FContact 負責人 TDBEdit edtFContact
FCurrenty 本位幣 TDBComboBox cbFCurrenty
FPhone1 電話1 TDBEdit edtFPhone1
FRemovedDate 結帳日期 TDBEdit edtFRemovedDate
FPhone2 電話2 TDBEdit edtFPhone2
FTaxType 稅率類別 TDBComboBox cbFTaxType
FFax 傳真號碼 TDBEdit edtFFax
FTaxRate 稅率 TDBEdit edtFTaxRate
FEmail 郵箱 TDBEdit edtFEmail
FCompanyAddr 簡體地址 TDBEdit edtFCompanyAddr
FCompanyAddrTW 繁體地址 TDBEdit edtFCompanyAddrTW
FCompanyAddrEn 英文地址 TDBEdit edtFCompanyAddrEn
FUrl 公司主頁 TDBEdit edtFUrl
FBank 開戶銀行 TDBEdit edtFBank
FAccountNo 開戶帳號 TDBEdit edtFAccountNo
FZip 郵編號碼 TDBEdit edtFZip
FTaxID 稅號 TDBEdit edtFTaxID
FCompanyLogo 公司圖示 TDBImage CompanyLogo

  其中需要注意的是FCompanyLogo,需額外設定其Font屬性,將其顏色修改爲白色,並將其Color屬性設定為clWhite以掩蓋控制元件名稱的標識。

# 3.1.4. 指令碼設計

type
  TMyHandler = class(TForm)
private 
  FThis:TBaseForm; 
Public 
  constructor Create(AOwner: TComponent); override;
  procedure RefState(Bool: Boolean);
{模組聲明  MODULE-DECLARE}
  procedure btnSaveClick(Sender: TObject);
  procedure btnEditClick(Sender: TObject);
  procedure btnExitClick(Sender: TObject);
  procedure btnUploadClick(Sender: TObject);
  procedure btnClearPictureClick(Sender: TObject);
end;

//...

var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
{事件繫結  MODULE-BIND}
  this.btnSave.OnClick := FMyHandler.btnSaveClick;
  this.btnEdit.OnClick := FMyHandler.btnEditClick;
  this.btnExit.OnClick := FMyHandler.btnExitClick;
  this.btnUpload.OnClick := FMyHandler.btnUploadClick;
  this.btnClearPicture.OnClick := FMyHandler.btnClearPictureClick;
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
  • 程式模組列表
程式模組名稱 說明
Create 構造器,啟動后運行需初始化設定的內容
RefState 用於更新單據頁面按鈕的狀態
btnSaveClick 儲存按鈕的點選事件
btnEditClick 編輯按鈕的點選事件
btnExitClick 退出按鈕的點選事件
btnUploadClick 上傳圖片按鈕的點選事件
btnClearPictureClick 清除按鈕的點選事件
  • Create:構造器,啟動后運行需初始化設定的內容。
constructor TMyHandler.Create(AOwner: TComponent);
begin
  FThis :=TBaseForm(AOwner);
  
  //指定使用帳套設定中的連線設定
  FThis.dts0.Connection := dm.DBConnection;
  //數據集SQL賦值
  FThis.dts0.SQL.Text := 'SELECT * FROM Basic_Company';
  //打開數據集
  FThis.dts0.Open;
  
  //初始化,設定覈取方塊多語言的設定選項(貨幣型別) 
  FThis.cbFCurrenty.Items.CommaText := FThis.siLang1.GetTextW('人民幣,美元,新臺幣,港幣');
  //初始化,設定覈取方塊多語言的設定選項(稅收型別)
  FThis.cbFTaxType.Items.CommaText := FThis.siLang1.GetTextW('增值稅,營業稅,免稅');
  //更新頁面狀態
  RefState(False);
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  • RefState:更新單據頁面按鈕的狀態。
procedure TMyHandler.RefState(Bool: Boolean);
//更新頁面狀態,當頁面設定為True時啟用頁面的編輯模式,按鈕根據編輯模式調整禁用或啟用。
begin
  //數據集、儲存、上傳圖片、清除按鈕在編輯模式下啟用
  FThis.ds0.AutoEdit := Bool;
  FThis.btnEdit.Enabled := not Bool;
  FThis.btnSave.Enabled := Bool;
  FThis.btnUpload.Enabled := Bool;
  FThis.btnClearPicture.Enabled := Bool;   
end;
1
2
3
4
5
6
7
8
9
10
  • btnSaveClick:儲存按鈕的點選事件。
procedure TMyHandler.btnSaveClick;
//儲存
begin
  //儲存
  FThis.dts0.Edit;
  FThis.dts0.Post;
  FThis.dts0.ApplyUpdates(-1);
  //重新整理狀態
  RefState(False);  
end;
1
2
3
4
5
6
7
8
9
10
  • btnEditClick:編輯按鈕的點選事件。
procedure TMyHandler.btnEditClick;
//修改
begin
  RefState(True);  
end;
1
2
3
4
5
  • btnExitClick:退出按鈕的點選事件。
procedure TMyHandler.btnExitClick;
//退出
begin
  FThis.Close;
end;
1
2
3
4
5
  • btnUploadClick:上傳圖片按鈕的點選事件。
procedure TMyHandler.btnUploadClick;
//上傳圖片
begin
  //呼叫打開圖片的對話方塊,選擇圖片后執行下面的指令碼
  if FThis.OpenPictureDialog.Execute(0) then
  begin
   //數據集編輯,將圖片載入至數據集中
   FThis.dts0.Edit;
   TBlobField(FThis.dts0.FieldByName('FCompanyLogo')).Clear;
   TBlobField(FThis.dts0.FieldByName('FCompanyLogo')).LoadFromFile(FThis.OpenPictureDialog.FileName);
   FThis.dts0.Post;
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
  • btnClearPictureClick:清除按鈕的點選事件。
procedure TMyHandler.btnClearPictureClick;
//清空圖片
begin
  //數據集開啟編輯,將圖片所在的欄位清空並提交。
   FThis.dts0.Edit;
   TBlobField(FThis.dts0.FieldByName('FCompanyLogo')).Clear;
   FThis.dts0.Post;
end;
1
2
3
4
5
6
7
8

# 3.1.5. 多語言設定

  在功能表欄點選語言-語言設定,打開多語言設定對話方塊,根據提示進行多語言的設定。

# 3.1.6. 運行效果

# 3.2. 客戶資料查詢-多筆數據表單

  客戶資料查詢頁面設定如下:

# 3.2.1. 功能簡述

  客戶資料的頁面按照客戶分類進行客戶資訊的分類展示,此頁面包含分組顯示錶單的模式設計,表格查詢等相關的模組設計內容。

# 3.2.2. 窗體設定

屬性 取值 說明
Caption 客戶資料 主窗體的標題名稱
Height 768 主窗體的高度(畫素)
Name Cust 主窗體模組的名稱
Width 1024 主窗體的寬度(畫素)

# 3.2.3. 控制元件設定

  各表結構欄位及對應的數據感知控制元件名稱如下,其中的TBitBtn、TLabeledEdit型別的控制元件需修改Font.Size為12,TPanel型別的控制元件需要清除Caption屬性中原有的字元內容。

  • 控制元件說明
控制元件名稱 控制元件型別 說明
Panel1 TPanel 頂部面板顯示,用於放置控制元件容器
edQuery TLabeledEdit 查詢輸入框,用於輸入客戶程式碼與名稱
TextHint:輸入客戶程式碼或名稱
EditLabel.Caption:客戶程式碼或名稱
btnQuery TBitBtn 查詢按鈕,點選以根據條件進行查詢。
Caption:查詢
btnClear TBitBtn 清除按鈕,點選以清除查詢內容恢復至初始狀態。
Caption:清除
btnAppend TBitBtn 新建按鈕,點選以新建單據。
Caption:新建
btnDelete TBitBtn 刪除按鈕,點選以刪除。
Caption:刪除
btnEditor TBitBtn 編輯按鈕,點選以進入編輯模式。
Caption:編輯
btnRefresh TBitBtn 重新整理按鈕,點選以重新整理顯示。
Caption:重新整理
btnShowAll TBitBtn 顯示全部按鈕,點選以顯示全部內容。
Caption:顯示全部
btnExit TBitBtn 退出按鈕,點選以退出目前窗體。
Caption:退出
dts0 TRFDataSet 數據集控制元件,展示客戶分類 Basic_CustGroup
dts1 TRFDataSet 數據集控制元件,展示客戶資訊 Basic_Cust
ds0 TDataSource 數據源控制元件,繫結數據集
DataSet:dts0
ds1 TDataSource 數據源控制元件,繫結數據集
DataSet:dts1
Spliter1 TSpliter 分隔控制元件,用於分隔數據表格控制元件
DBGrid1 TDBGrid 客戶分組數據表格
DataSource:ds0
DBGrid2 TDBGrid 客戶資訊數據表格
DataSource:ds1
  • DBGrid1數據表格說明

  在設定表格列之前,使用滑鼠右鍵點選表格,在選項中選擇Custom Columns,轉換為自定義表格後進行設定。點選Columns屬性打開對話方塊,在此處新增欄位。選擇新增的欄位進行屬性的更改。

FieldName
欄位名
Font.Size
字型大小
Title.Caption
標題文字
Title.Font.Size
標題字型大小
Width
列寬度
FGroupName 10 分組名稱 12 90
FGroupCode 10 分組程式碼 12 80
  • DBGrid2數據表格說明

  在設定表格列之前,使用滑鼠右鍵點選表格,在選項中選擇Custom Columns,轉換為自定義表格後進行設定。點選Columns屬性打開對話方塊,在此處新增欄位。選擇新增的欄位進行屬性的更改。

FieldName
欄位名
Font.Size
字型大小
Title.Caption
標題文字
Title.Font.Size
標題字型大小
Width
列寬度
FCustCode 10 客戶程式碼 12 80
FCustName 10 客戶名稱 12 140
FShortName 10 客戶簡稱 12 80
FDeptName 10 部門名稱 12 80
FEmpName 10 業務員 12 80
FforzenFor 10 凍結 12 60
FCreater 10 建立使用者 12 90
FLstModDate 10 最後修改日期 12 130

# 3.2.4. 指令碼設計

type
  TMyHandler = class(TForm)
private 
  FThis:TBaseForm; 
Public 
  constructor Create(AOwner: TComponent); override;
{模組聲明  MODULE-DECLARE}
  procedure btnQueryClick(Sender: TObject);
  procedure btnClearClick(Sender: TObject);
  procedure btnAppendClick(Sender: TObject);
  procedure btnDeleteClick(Sender: TObject);
  procedure btnEditorClick(Sender: TObject);
  procedure btnRefreshClick(Sender: TObject);
  procedure btnShowAllClick(Sender: TObject);
  procedure btnExitClick(Sender: TObject);
  procedure DBGrid1CellClick(Column: TColumn);
end;

//....

var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
{事件繫結  MODULE-BIND}
  this.btnQuery.OnClick := FMyHandler.btnQueryClick;
  this.btnClear.OnClick := FMyHandler.btnClearClick;
  this.btnAppend.OnClick := FMyHandler.btnAppendClick;
  this.btnDelete.OnClick := FMyHandler.btnDeleteClick;
  this.btnEditor.OnClick := FMyHandler.btnEditorClick;
  this.btnRefresh.OnClick := FMyHandler.btnRefreshClick;
  this.btnShowAll.OnClick := FMyHandler.btnShowAllClick;
  this.btnExit.OnClick := FMyHandler.btnExitClick;
  this.DBGrid1.OnCellClick := FMyHandler.DBGrid1CellClick;
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
  • 程式模組列表
程式模組名稱 說明
Create 構造器,啟動后運行需初始化設定的內容
btnQueryClick 查詢按鈕的點選事件,根據查詢的內容顯示結果
btnClearClick 清除按鈕的點選事件,清除查詢內容並恢復至初始查詢狀態
btnAppendClick 新建按鈕的點選事件,新建基礎資料單據
btnDeleteClick 刪除按鈕的點選事件,刪除基礎資料單據
btnEditorClick 編輯按鈕的點選事件,編輯基礎資料單據
btnRefreshClick 重新整理按鈕的點選事件,重新整理基礎資料頁面的顯示
btnShowAllClick 顯示全部的點選事件,去除所有分類顯示條目
btnExitClick 退出的點選事件,退出並關閉目前視窗
DBGrid1CellClick 表格單元的點選事件,點選以按目前分類進行顯示
  • Create:構造器,啟動后運行需初始化設定的內容。
constructor TMyHandler.Create(AOwner: TComponent);
//構造器
begin
  FThis :=TBaseForm(AOwner);
  //客戶分類與客戶資料數據集設定連線型別為帳套設定
  FThis.dts0.Connection := dm.DBConnection;
  FThis.dts1.Connection := dm.DBConnection;
  //客戶資料分類數據集SQL賦值
  FThis.dts0.SQL.Text := 'Select FInterID,FGroupCode,FGroupName,FNote,FTreeKeyID,' + 
  'FTreeParenteID,FAbsoluteIndex From Basic_CustGroup Order by FGroupCode';
  //客戶資料分類數據集打開
  FThis.dts0.Open;
  //客戶資料分類數據集定位至第一條記錄
  FThis.dts0.First;
  //客戶資料數據集SQL賦值
  FThis.dts1.SQL.Text := 'SELECT * FROM Basic_Cust';
  //客戶資料數據集打開
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  • btnQueryClick:查詢按鈕的點選事件,根據查詢的內容顯示結果。
procedure TMyHandler.btnQueryClick;
//查詢
begin
  //客戶資料數據集關閉
  FThis.dts1.Close;
  //客戶資料數據集SQL重新賦值,引入查詢視窗的內容
  FThis.dts1.SQL.Text :=  'SELECT * FROM Basic_Cust WHERE FCustCode LIKE  ''%' + 
  FThis.edQuery.Text + '%'' or FCustName LIKE ''%' + FThis.edQuery.Text + 
  '%'' Order by FCustCode';
  //客戶資料數據集打開
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
10
11
12
  • btnClearClick:清除按鈕的點選事件,清除查詢內容並恢復至初始查詢狀態。
procedure TMyHandler.btnClearClick;
//清除,清除查詢視窗中的內容,並重新為客戶資料數據集SQL賦值
begin
   FThis.edQuery.Text := '';
   FThis.dts1.SQL.Text := 'SELECT * FROM Basic_Cust';
   FThis.dts1.Open;
end;
1
2
3
4
5
6
7
  • btnAppendClick:新建按鈕的點選事件,新建基礎資料單據。
procedure TMyHandler.btnAppendClick;
//新建,在新的視窗中打開此頁面
var
  F: TBaseForm;
  vInterID: Integer;
begin
  //獲取產生唯一ID,並存入變數中
  vInterID := dm.GetNodeID;
  //客戶資料編輯視窗打開
  F := paxfunc.OpenForm('CustEdit');
  //新打開的視窗建立鏈接
  F.TagObject := FThis;
  //客戶資料數據集參數賦值並打開
  TRFDataSet(F.FindComponent('dtsGeneral')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dtsGeneral')).Open;
  //客戶地址數據集參數賦值並打開
  TRFDataSet(F.FindComponent('dtsCustAddrs')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dtsCustAddrs')).Open; 
  //客戶關係數據集參數賦值並打開 
  TRFDataSet(F.FindComponent('dtsCustRelation')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dtsCustRelation')).Open; 
  //客戶物料數據集參數賦值並打開
  TRFDataSet(F.FindComponent('dtsCustMaterial')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dtsCustMaterial')).Open;
  //客戶資料數據集新增行
  TRFDataSet(F.FindComponent('dtsGeneral')).Append;
  //初始內容新增賦值。FInterID,FGroupID,FCreater欄位賦值
  TRFDataSet(F.FindComponent('dtsGeneral')).FieldByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dtsGeneral')).FieldByName('FGroupID').AsString := FThis.dts0.FieldByName('FInterID').AsString;
  TRFDataSet(F.FindComponent('dtsGeneral')).FieldByName('FCreater').AsString := FThis.siLang1.GetTextW('admin');   
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
  • btnDeleteClick:刪除按鈕的點選事件,刪除基礎資料單據。
procedure TMyHandler.btnDeleteClick;
//刪除
var
  AStoredProc: TRFStoredProc;
  vRAISEMSG,vMSG: String;
  i, j: Integer;
begin
  //呼叫選擇視窗提示刪除客戶資訊
  if paxfunc.YesNoMsg(FThis.siLang1.GetTextW('是否刪除該客戶?'),FThis.siLang1.GetTextW('提示'))  then 
  begin
  //預存程序控制元件建立並設定帳套連線
  AStoredProc := TRFStoredProc.Create(nil);
  AStoredProc.Connection := dm.DBConnection;
  try
    //呼叫預存程序sp_Basic_Cust
    AStoredProc.StoredProcName := 'sp_Basic_Cust';
    //預存程序準備以載入所需參數
    AStoredProc.Prepare;
    if AStoredProc.Prepared then
    begin
      //參數賦值
      AStoredProc.ParamByName('FDataID').AsString := FThis.dts1.FieldByName('FInterID').AsString;
      AStoredProc.ParamByName('Flag').AsString := 'Delete';
      AStoredProc.ParamByName('FUserCode').AsString := FThis.siLang1.GetTextW('admin');
      //輸出參數,確認
      if AStoredProc.FindParam('FMsg') <> nil then
        AStoredProc.ParamByName('FMsg').AsString := '';
      try
      //運行執行預存程序
        AStoredProc.ExecProc;
      //如果有意外情況,此處收集意外資訊
       Except on ExceptionMessage:Exception do
       begin
          //獲取預存程序執行意外的資訊內容
          vRAISEMSG:=ExceptionMessage.Message;
          //文字資訊處理以獲取意外資訊的主幹內容
     
          i := Pos('SQMESSAGE', vRAISEMSG);
          j := Pos('[SQL Server]', vRAISEMSG);
          vMSG := Copy(vRAISEMSG, i, Length(vRAISEMSG) - i + 1);
    

          // 非格式化訊息提示
          if i = 0 then
          begin
            ShowMessage(Copy(vRAISEMSG, j + 12, Length(vRAISEMSG) - j + 1));
            Exit;
          end;
        end;
        end;
        //預存程序執行成功後重新執行查詢點選事件以重新整理表格
        btnQueryClick(sender);
    end;
  finally
    AStoredProc.Free;
  end;  
  
  end;
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
  • btnEditorClick:編輯按鈕的點選事件,編輯基礎資料單據。
procedure TMyHandler.btnEditorClick;
//編輯客戶
var
  F: TBaseForm;
  vInterID: Integer;
begin
  //獲取客戶記錄的唯一ID
  vInterID := FThis.dts1.FieldByName('FInterID').AsInteger;
  //客戶資料編輯視窗打開
  F := paxfunc.OpenForm('CustEdit');
  //與目前視窗建立鏈接
  F.TagObject := FThis;
  //客戶資料數據集參數賦值並打開
  TRFDataSet(F.FindComponent('dtsGeneral')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dtsGeneral')).Open;
  //客戶地址數據集參數賦值並打開
  TRFDataSet(F.FindComponent('dtsCustAddrs')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dtsCustAddrs')).Open; 
  //客戶關係數據集參數賦值並打開 
  TRFDataSet(F.FindComponent('dtsCustRelation')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dtsCustRelation')).Open; 
  //客戶物料數據集參數賦值並打開
  TRFDataSet(F.FindComponent('dtsCustMaterial')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dtsCustMaterial')).Open;
  //客戶列表定位,查詢目前唯一ID在列表中的位置,並進行循環移動定位
  TRFDataSet(F.FindComponent('dtsList')).First;
  While TRFDataSet(F.FindComponent('dtsList')).FieldByName('FInterID').AsString <> FThis.dts1.FieldByName('FInterID').AsString do
  begin
    TRFDataSet(F.FindComponent('dtsList')).Next;
  end;
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
  • btnRefreshClick:重新整理按鈕的點選事件,重新整理基礎資料頁面的顯示
procedure TMyHandler.btnRefreshClick;
//重新整理
begin
  //重新整理狀態顯示,功能與初次打開類似
  FThis.dts0.SQL.Text := 'Select FInterID,FGroupCode,FGroupName,FNote,FTreeKeyID,FTreeParenteID,FAbsoluteIndex From Basic_CustGroup Order by FGroupCode';
  FThis.dts0.Open;
  FThis.dts0.First;
  FThis.dts1.SQL.Text := 'SELECT * FROM Basic_Cust';
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
10
  • btnShowAllClick:顯示全部的點選事件,去除所有分類顯示條目。
procedure TMyHandler.btnShowAllClick;
//設定數據集篩選,取消篩選條件
begin
  FThis.dts1.Filtered := False;
end;
1
2
3
4
5
  • btnExitClick:退出的點選事件,退出並關閉目前視窗。
procedure TMyHandler.btnExitClick;
//退出
begin
  FThis.Close;
end;
1
2
3
4
5
  • DBGrid1CellClick:表格單元的點選事件,點選以按目前分類進行顯示。
procedure TMyHandler.DBGrid1CellClick;
//分類檢視,新增篩選條件,並開啟篩選功能
begin
  FThis.dts1.Filtered := False;
  FThis.dts1.Filter := 'FGroupID = ' + FThis.dts0.FieldByName('FInterID').AsString;
  FThis.dts1.Filtered := True;
end;
1
2
3
4
5
6
7

# 3.2.5. 多語言設定

  在功能表欄點選語言-語言設定,打開多語言設定對話方塊,根據提示進行多語言的設定。

# 3.2.6. 運行效果

# 3.3. 客戶資料編輯-多筆數據表單

  客戶資料編輯頁面設定如下:

# 3.3.1. 功能簡述

  客戶資料編輯用於對客戶資料的資訊進行詳細設定,其中引用了部分查詢表需要使用的業務員資料、幣種資料、客戶分組、布種資料等數據集資訊,也包括了資料庫圖片的上傳與修改,清除等設定方式。

# 3.3.2. 窗體設定

屬性 取值 說明
Caption 客戶資料編輯 主窗體的標題名稱
Height 768 主窗體的高度(畫素)
Name CustEdit 主窗體模組的名稱
Width 1024 主窗體的寬度(畫素)

# 3.3.3. 控制元件設定

  各表結構欄位及對應的控制元件名稱如下:

  • 非數據感知控制元件說明

  頁面中注意修改TBitBtn、TGroupBox型別的控制元件的文字大小Font.Size屬性為12,TPanel型別的控制元件需要清除Caption屬性中原有的字元內容。

控制元件名稱 控制元件型別 說明
Panel1 TPanel 面板控制元件,作為佈局容器使用,位於頂部位置
GroupBox1 TGroupBox 分組框控制元件,作為佈局容器使用,位於Panel下方的置頂位置
PageControl1 TPageControl 頁面控制元件,佔據除頂部空間外所有的位置
在頁面空白處右鍵單擊選擇New Page新增標籤頁TabSheet
TabSheet1 TTabSheet PageControl1中的標籤頁面1
Caption:概覽
TabSheet2 TTabSheet PageControl1中的標籤頁面2
Caption:客戶收貨地址
TabSheet3 TTabSheet PageControl1中的標籤頁面3
Caption:關係人員
TabSheet4 TTabSheet PageControl1中的標籤頁面3
Caption:客戶產品
btnFirst TBitBtn 首項按鈕,點選跳轉至記錄的首頁
Caption:首項
btnPrior TBitBtn 前項按鈕,點選跳轉至記錄的前項
Caption:前項
btnNext TBitBtn 後項按鈕,點選跳轉至記錄的後項
Caption:後項
btnLast TBitBtn 末項按鈕,點選跳轉至記錄的末項
Caption:末項
btnNew TBitBtn 新建按鈕,點選以新建客戶資料
Caption:新建
btnSave TBitBtn 儲存按鈕,點選以儲存資料的更改
Caption:儲存
btnDelete TBitBtn 刪除按鈕,點選以刪除目前的客戶資料
Caption:刪除
btnUpdate TBitBtn 更新按鈕,點選以更新單據中的客戶資料
Caption:更新
btnExit TBitBtn 退出按鈕,點選以退出視窗
Caption:退出
btnUpload TBitBtn 上傳圖片按鈕,點選以打開圖片選擇對話方塊
Caption:上傳圖片
btnClearPicyure TBitBtn 刪除圖片按鈕,點選清除圖片
Caption:清除
OpenPictureDialog TOpenPictureDialog 打開圖片對話方塊
dtsGeneral TRFDataSet 客戶資料資訊數據集
dsGeneral TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsGeneral
dtsCustGroup TRFDataSet 客戶分組資訊數據集
dsCustGroup TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsCustGroup
dtsInvoiceCust TRFDataSet 結帳客戶資訊數據集
dsInvoiceCust TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsInvoiceCust
dtsFDistrict TRFDataSet 區域資訊數據集
dsFDistrict TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsFDistrict
dtsList TRFDataSet 客戶資訊唯一ID列表
  • GroupBox1數據感知控制元件說明

  此頁面中首頁繫結的數據源DataSource為dsGeneral,所有涉及到文字顯示的控制元件的文字大小屬性Font.Size修改爲12。由於數據感知控制元件不包含標籤顯示,故每放置一個字元編輯型別的數據感知控制元件前,需要先放置一個TLabel控制元件,並將其Caption屬性設定為數據欄位對應的中文名稱,同樣也需要將其 Font.Size修改爲12。

數據欄位名稱 中文名稱 對應控制元件型別 控制元件名稱 備註
FGroupID 分組 TDBLookupComboBox lkupGroupID 列表繫結的數據源
ListSource:dsCustGroup
列表顯示的欄位名
ListField:FGroupName
列表對應返回的欄位值
KeyField: FGroupID
FCustCode 客戶程式碼 TDBEdit edtFCustCode
FShortName 客戶簡稱 TDBEdit edtFShortName
FCustName 客戶簡稱 TDBEdit edtFCustName
FCorporation 法人代表 TDBEdit edtFCorporation
FInvoiceCustName 結帳客戶 TDBLookupComboBox lkupFInvoiceCustName 列表繫結的數據源
ListSource:dsInvoiceCust
列表顯示的欄位名
ListField:FInvoiceCustName
列表對應返回的欄位值
KeyField: FInvoiceCustName
FDistrict 區域 TDBLookupComboBox lkupFDistrict 列表繫結的數據源
ListSource:dsFDistrict
列表顯示的欄位名
ListField:FName
列表對應返回的欄位值
KeyField: FName
FForeignName 外語描述 TDBEdit edtFForeignName
FCustLogo 公司圖示 TDBImage CustLogo
FCustomerType 客戶型別 TDBRadioGroup rgFCustomerType 設定選項Items.CommaText := '國內客戶,國外客戶'

  其中需要注意的是FCustLogo,需額外設定其Font屬性,將其顏色修改爲白色,並將其Color屬性設定為clWhite以掩蓋控制元件名稱的標識。

  • TTabSheet1非數據感知控制元件說明
控制元件名稱 控制元件型別 說明
dtsFCurrency TRFDataSet 貨幣資料資訊數據集
dsFCurrency TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsFCurrency
dtsEmp TRFDataSet 員工資料資訊數據集
dsEmp TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsEmp
dtsInvoiceType TRFDataSet 發票型別資訊數據集
dsInvoiceType TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsInvoiceType
dtsSaleType TRFDataSet 發票型別資訊數據集
dsSaleType TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsSaleType
dtsPayItem TRFDataSet 付款方式資訊數據集
dsPayItem TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsPayItem
dtsSettleName TRFDataSet 結算方式資訊數據集
dsSettleName TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsSettleName
  • TTabSheet1數據感知控制元件說明

  此頁面中首頁繫結的數據源DataSource為dsGeneral,所有涉及到文字顯示的控制元件的文字大小屬性Font.Size修改爲12。由於數據感知控制元件不包含標籤顯示,故每放置一個字元編輯型別的數據感知控制元件前,需要先放置一個TLabel控制元件,並將其Caption屬性設定為數據欄位對應的中文名稱,同樣也需要將其 Font.Size修改爲12。

數據欄位名稱 中文名稱 對應控制元件型別 控制元件名稱 備註
FCurrencyID 幣別 TDBLookupComboBox lkupFCurrencyID 列表繫結的數據源
ListSource:dsFCurrency
列表顯示的欄位名
ListField:FCurrencyName
列表對應返回的欄位值
KeyField: FCurrencyID
FExchangeRate 匯率 TDBEdit edtFExchangeRate
FEmpName 業務員 TDBLookupComboBox lkupFEmpName 列表繫結的數據源
ListSource:dsEmp
列表顯示的欄位名
ListField:FEmpName
列表對應返回的欄位值
KeyField: FEmpName
FDeptName 部門名稱 TDBEdit edtFDeptName 設定此控制元件為只讀
ReadOnly:True
FPhone1 電話1 TDBEdit edtFPhone1
FPhone2 電話2 TDBEdit edtFPhone2
FContacts 聯繫人 TDBEdit edtFContacts
FFax 傳真 TDBEdit edtFFax
FTel 行動電話 TDBEdit edtFTel
FZipCode 郵政編碼 TDBEdit edtFZipCode
FEmail 電子郵箱 TDBEdit edtFEmail
FSaleType 銷售型別 TDBLookupComboBox lkupFSaleType 列表繫結的數據源
ListSource:dsSaleType
列表顯示的欄位名
ListField:FName
列表對應返回的欄位值
KeyField: FName
FInvoiceType 發票型別 TDBLookupComboBox lkupFInvoiceType 列表繫結的數據源
ListSource:dsInvoiceType
列表顯示的欄位名
ListField:FName
列表對應返回的欄位值
KeyField: FName
FCreditLine 信用額度 TDBEdit edtFCreditLine
FCreditLineDay 信用天數 TDBEdit edtFCreditLineDay
FAddress 地址 TDBEdit edtFAddress
FHouseBank 開戶銀行 TDBEdit edtFHouseBank
FHouseBnkAct 開戶帳號 TDBEdit edtFHouseBnkAct
FTaxCode 稅號 TDBEdit edtFTaxCode
FPayItemName 付款方式 TDBLookupComboBox lkupFPayItemName 列表繫結的數據源
ListSource:dsPayItem
列表顯示的欄位名
ListField:FName
列表對應返回的欄位值
KeyField: FName
FSettleName 結算方式 TDBLookupComboBox lkupFPayItemName 列表繫結的數據源
ListSource:dsSettle
列表顯示的欄位名
ListField:FName
列表對應返回的欄位值
KeyField: FName
FNote 備註 TDBMemo mmFNote
FCreater 建立使用者 TDBText lbCreater
FLstModDate 最後修改日期 TDBText lbLstModDate
  • TTabSheet2控制元件說明

  頁面中注意修改TBitBtn型別的控制元件的文字大小Font.Size屬性為12,TPanel型別的控制元件需要清除Caption屬性中原有的字元內容。

控制元件名稱 控制元件型別 說明
dtsFCustAddrs TRFDataSet 客戶收貨地址資料資訊數據集
dsFCustAddrs TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsFCustAddrs
Panel2 TPanel 頁面中置頂的佈局控制元件容器,用於放置按鈕
btnCustAddrsAppendRow TBitBtn 新增行按鈕
Caption:新增行
btnCustAddrsDelRow TBitBtn 刪除行按鈕
Caption:刪除行
DBGrid1 TDBGrid 客戶收貨地址表格
DataSource:dsCustAddrs
  • DBGrid1數據表格說明

  在設定表格列之前,使用滑鼠右鍵點選表格,在選項中選擇Custom Columns,轉換為自定義表格後進行設定。點選Columns屬性打開對話方塊,在此處新增欄位。選擇新增的欄位進行屬性的更改。

FieldName
欄位名
Font.Size
字型大小
Title.Caption
標題文字
Title.Font.Size
標題字型大小
Width
列寬度
FCompany 10 收貨公司 12 128
FAddress 10 收貨地址 12 256
FPerson 10 收貨人 12 64
FEmail 10 郵箱 12 128
FPhone 10 電話 12 128
FFax 10 傳真 12 128
  • TTabSheet3控制元件說明

  頁面中注意修改TBitBtn型別的控制元件的文字大小Font.Size屬性為12,TPanel型別的控制元件需要清除Caption屬性中原有的字元內容。

控制元件名稱 控制元件型別 說明
dtsFCustRelation TRFDataSet 關係人員資訊數據集
dsFCustRelation TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsFCustRelation
Panel3 TPanel 頁面中置頂的佈局控制元件容器,用於放置按鈕
btnCustRelationAppendRow TBitBtn 新增行按鈕
Caption:新增行
btnCustRelationDelRow TBitBtn 刪除行按鈕
Caption:刪除行
DBGrid2 TDBGrid 關係人員表格
DataSource:dsCustRelation
  • DBGrid2數據表格說明

  在設定表格列之前,使用滑鼠右鍵點選表格,在選項中選擇Custom Columns,轉換為自定義表格後進行設定。點選Columns屬性打開對話方塊,在此處新增欄位。選擇新增的欄位進行屬性的更改。

FieldName
欄位名
Font.Size
字型大小
Title.Caption
標題文字
Title.Font.Size
標題字型大小
Width
列寬度
FEmpName 10 姓名 12 78
FDeptName 10 部門 12 128
FPosition 10 職務 12 78
FTel 10 行動電話 12 128
  • TTabSheet4控制元件說明

  頁面中注意修改TBitBtn型別的控制元件的文字大小Font.Size屬性為12,TPanel型別的控制元件需要清除Caption屬性中原有的字元內容。

控制元件名稱 控制元件型別 說明
dtsFCustMaterial TRFDataSet 客戶產品資訊數據集
dsFCustMaterial TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsFCustMaterial
Panel4 TPanel 頁面中置頂的佈局控制元件容器,用於放置按鈕
btnCustMaterialAppendRow TBitBtn 新增行按鈕
Caption:新增行
btnCustMaterialDelRow TBitBtn 刪除行按鈕
Caption:刪除行
DBGrid3 TDBGrid 關係人員表格
DataSource:dsCustRelation
  • DBGrid3數據表格說明

  在設定表格列之前,使用滑鼠右鍵點選表格,在選項中選擇Custom Columns,轉換為自定義表格後進行設定。點選Columns屬性打開對話方塊,在此處新增欄位。選擇新增的欄位進行屬性的更改。

FieldName
欄位名
Font.Size
字型大小
Title.Caption
標題文字
Title.Font.Size
標題字型大小
Width
列寬度
FItemCode 10 物料程式碼 12 80
FItemName 10 物料名稱 12 80
FCustItemCode 10 客戶物料程式碼 12 100
FCustItemName 10 客戶物料名稱 12 100

# 3.3.4. 指令碼設計

type
  TMyHandler = class(TForm)
private 
  FThis:TBaseForm; 
Public 
  constructor Create(AOwner: TComponent); override;
{模組聲明  MODULE-DECLARE}
  procedure btnFirstClick(Sender: TObject);
  procedure PageSwitch;
  procedure btnPriorClick(Sender: TObject);
  procedure btnNextClick(Sender: TObject);
  procedure btnLastClick(Sender: TObject);
  procedure btnNewClick(Sender: TObject);
  procedure dtsGeneralNewRecord(DataSet: TDataSet);
  procedure btnSaveClick(Sender: TObject);  
  Procedure UpdateCustDetail;
  procedure btnDeleteClick(Sender: TObject);
  procedure btnUpdateClick(Sender: TObject);
  procedure btnExitClick(Sender: TObject);
  procedure btnCustAddrsAppendRowClick(Sender: TObject);
  procedure dtsCustAddrsNewRecord(DataSet: TDataSet);
  procedure btnCustAddrsDelRowClick(Sender: TObject);
  procedure btnCustRelationAppendRowClick(Sender: TObject);
  procedure btnCustRelationDelRowClick(Sender: TObject);
  procedure btnCustMaterialAppendRowClick(Sender: TObject);
  procedure btnCustMaterialDelRowClick(Sender: TObject);
  procedure dtsCustRelationNewRecord(DataSet: TDataSet);
  procedure dtsCustMaterialNewRecord(DataSet: TDataSet);
  procedure lkupFEmpNameClick(Sender: TObject);
  procedure lkupFInvoiceCustNameClick(Sender: TObject);
  procedure btnUploadClick(Sender: TObject);
  procedure btnClearPictureClick(Sender: TObject);
end;

//...

var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
{事件繫結  MODULE-BIND}
  this.btnFirst.OnClick := FMyHandler.btnFirstClick;
  this.btnPrior.OnClick := FMyHandler.btnPriorClick;
  this.btnNext.OnClick := FMyHandler.btnNextClick;
  this.btnLast.OnClick := FMyHandler.btnLastClick;
  this.btnNew.OnClick := FMyHandler.btnNewClick;
  this.dtsGeneral.OnNewRecord := FMyHandler.dtsGeneralNewRecord;
  this.btnSave.OnClick := FMyHandler.btnSaveClick;
  this.btnDelete.OnClick := FMyHandler.btnDeleteClick;
  this.btnUpdate.OnClick := FMyHandler.btnUpdateClick;
  this.btnExit.OnClick := FMyHandler.btnExitClick;
  this.btnCustAddrsAppendRow.OnClick := FMyHandler.btnCustAddrsAppendRowClick;
  this.dtsCustAddrs.OnNewRecord := FMyHandler.dtsCustAddrsNewRecord;
  this.btnCustAddrsDelRow.OnClick := FMyHandler.btnCustAddrsDelRowClick;
  this.btnCustRelationAppendRow.OnClick := FMyHandler.btnCustRelationAppendRowClick;
  this.btnCustRelationDelRow.OnClick := FMyHandler.btnCustRelationDelRowClick;
  this.btnCustMaterialAppendRow.OnClick := FMyHandler.btnCustMaterialAppendRowClick;
  this.btnCustMaterialDelRow.OnClick := FMyHandler.btnCustMaterialDelRowClick;
  this.dtsCustRelation.OnNewRecord := FMyHandler.dtsCustRelationNewRecord;
  this.dtsCustMaterial.OnNewRecord := FMyHandler.dtsCustMaterialNewRecord;
  this.lkupFEmpName.OnClick := FMyHandler.lkupFEmpNameClick;
  this.lkupFInvoiceCustName.OnClick := FMyHandler.lkupFInvoiceCustNameClick;
  this.btnUpload.OnClick := FMyHandler.btnUploadClick;
  this.btnClearPicture.OnClick := FMyHandler.btnClearPictureClick;
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
  • 程式模組列表
程式模組名稱 說明
Create 構造器,啟動后運行需初始化設定的內容
UpdateCustDetail 更新客戶資料明細的相關內容
PageSwitch 頁面編輯狀態切換的子程式
btnFirstClick 首項按鈕,點選以切換數據集至首項
btnPriorClick 前項按鈕,點選以切換數據集至前項
btnNextClick 後項按鈕,點選以切換數據集至後項
btnLastClick 末項按鈕,點選以切換數據集至末項
btnNewClick 新建按鈕
btnSaveClick 儲存數據
btnDeleteClick 刪除目前顯示的客戶資料
btnUpdateClick 更新客戶資料
btnExitClick 退出目前視窗
btnCustAddrsAppendRowClick 客戶收貨地址新增行
dtsCustAddrsNewRecord 客戶收貨地址新增數據初始化
btnCustAddrsDelRowClick 客戶收貨地址刪除目前選擇行
btnCustRelationAppendRowClick 客戶關係人員新增行
btnCustRelationDelRowClick 客戶關係人人員刪除行
btnCustMaterialAppendRowClick 客戶產品新增行
btnCustMaterialDelRowClick 客戶產品刪除行
dtsCustRelationNewRecord 客戶關係人員新增數據初始化
dtsCustMaterialNewRecord 客戶產品新增數據初始化
lkupFEmpNameClick 業務員變更時傳遞事件
lkupFInvoiceCustNameClick 結帳客戶變更時傳遞數據
btnUploadClick 上傳圖片按鈕
btnClearPictureClick 清空圖片
  • Create:構造器,啟動后運行需初始化設定的內容
constructor TMyHandler.Create(AOwner: TComponent);
begin
  FThis :=TBaseForm(AOwner);
  
  //客戶分類查詢數據集初始化
  FThis.dtsCustGroup.Connection := dm.DBConnection;
  FThis.dtsCustGroup.SQL.Text := 'SELECT FInterID AS FGroupID,FGroupName FROM Basic_CustGroup';
  FThis.dtsCustGroup.Open;
  
  //主表數據集初始化,在呼叫視窗時打開
  FThis.dtsGeneral.Connection := dm.DBConnection;
  FThis.dtsGeneral.SQL.Text := 'SELECT * FROM Basic_Cust WHERE FInterID = :FInterID';
  
  
  //客戶地址數據集初始化
  FThis.dtsCustAddrs.Connection := dm.DBConnection;
  FThis.dtsCustAddrs.SQL.Text := 'SELECT * FROM Basic_CustAddrs WHERE FInterID = :FInterID';

  //客戶關係數據集初始化
  FThis.dtsCustRelation.Connection := dm.DBConnection;
  FThis.dtsCustRelation.SQL.Text := 'SELECT * FROM Basic_CustRelation WHERE FInterID = :FInterID';
  
  //客戶物料數據集初始化
  FThis.dtsCustMaterial.Connection := dm.DBConnection;
  FThis.dtsCustMaterial.SQL.Text := 'SELECT * FROM Basic_CustMaterial WHERE FInterID = :FInterID';
  
  //結帳客戶查詢數據集表初始化
  FThis.dtsInvoiceCust.Connection := dm.DBConnection;
  FThis.dtsInvoiceCust.SQL.Text := 'SELECT FInterID AS FInVoiceCustID,FCustCode AS ' + 
  'FInvoiceCustCode,FCustName AS FInvoiceCustName FROM Basic_Cust';
  FThis.dtsInvoiceCust.Open; 
  
  //區域資訊數據集初始化
  FThis.dtsFDistrict.Connection := dm.DBConnection;
  FThis.dtsFDistrict.SQL.Text := 'SELECT a.FName,a.FCode '
	+ 'FROM dbo.Basic_CommonData A '
	+ 'INNER JOIN Basic_CommonDataType b ON a.FTypeID = b.FInterID '
	+ 'WHERE b.FDataName = ''' + FThis.siLang1.GetTextW('地區') + '''';
  FThis.dtsFDistrict.Open;
  
  //業務員查詢數據集初始化
  FThis.dtsEmp.Connection := dm.DBConnection;
  FThis.dtsEmp.SQL.Text := 'SELECT FInterID AS FEmpID,FEmpCode,FEmpName,FDeptID,FDeptCode,' + 
  'FDeptName FROM Basic_Employee';
  FThis.dtsEmp.Open;
  
  //幣種資料查詢數據集初始化
  FThis.dtsFCurrency.Connection := dm.DBConnection;
  FThis.dtsFCurrency.SQL.Text := 'SELECT FCode as FCurrencyCode,FName as FCurrencyName,FInterID ' + 
  'AS FCurrencyID,FExRate AS FExchangeRate FROM Basic_Currency';
  FThis.dtsFCurrency.Open;
  
  //銷售型別查詢數據集初始化
  FThis.dtsSaleType.Connection := dm.DBConnection;
  FThis.dtsSaleType.SQL.Text := 'SELECT a.FName,a.FInterID '
	+ 'FROM dbo.Basic_CommonData A '
	+ 'INNER JOIN Basic_CommonDataType b ON a.FTypeID = b.FInterID '
	+ 'WHERE b.FDataName = ''' + FThis.siLang1.GetTextW('銷售型別') + '''';
  FThis.dtsSaleType.Open;
 
   //發票型別查詢數據集初始化
  FThis.dtsInvoiceType.Connection := dm.DBConnection;
  FThis.dtsInvoiceType.SQL.Text := 'SELECT a.FName,a.FInterID '
	+ 'FROM dbo.Basic_CommonData A '
	+ 'INNER JOIN Basic_CommonDataType b ON a.FTypeID = b.FInterID '
	+ 'WHERE b.FDataName = ''' + FThis.siLang1.GetTextW('發票型別') + '''';
  FThis.dtsInvoiceType.Open;
  
  //付款方式查詢數據集初始化
  FThis.dtsPayItem.Connection := dm.DBConnection;
  FThis.dtsPayItem.SQL.Text := 'SELECT a.FName,a.FInterID '
	+ 'FROM dbo.Basic_CommonData A '
	+ 'INNER JOIN Basic_CommonDataType b ON a.FTypeID = b.FInterID '
	+ 'WHERE b.FDataName = ''' + FThis.siLang1.GetTextW('付款方式') + '''';
  FThis.dtsPayItem.Open;
  
  //結算方式查詢數據集初始化
  FThis.dtsSettle.Connection := dm.DBConnection;
  FThis.dtsSettle.SQL.Text := 'SELECT a.FName,a.FInterID '
	+ 'FROM dbo.Basic_CommonData A '
	+ 'INNER JOIN Basic_CommonDataType b ON a.FTypeID = b.FInterID '
	+ 'WHERE b.FDataName = ''' + FThis.siLang1.GetTextW('結算方式') + '''';
  FThis.dtsSettle.Open;
  
  //列表查詢數據集初始化
  FThis.dtsList.Connection := dm.DBConnection;
  FThis.dtsList.SQL.Text := 'SELECT FInterID FROM Basic_Cust';
  FThis.dtsList.Open;
  
  //RadioGroup控制元件初始設定
  FThis.rgFCustomerType.Items.CommaText := FThis.siLang1.GetTextW('國內客戶,國外客戶');
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
  • UpdateCustDetail:更新客戶資料明細的相關內容。
//更新客戶資料的其他明細資訊
Procedure TMyHandler.UpdateCustDetail;
Begin
  //客戶地址數據集不為空的話則檢查更新
  if FThis.dtsCustAddrs.RowCount > 0 Then
  Begin
    FThis.dtsCustAddrs.Edit;
    FThis.dtsCustAddrs.Post;
    FThis.dtsCustAddrs.ApplyUpdates(-1);      
  End;
  //客戶關係數據集不為空的話則檢查更新    
  if FThis.dtsCustRelation.RowCount > 0 Then
  Begin
    FThis.dtsCustRelation.Edit;
    FThis.dtsCustRelation.Post;
    FThis.dtsCustRelation.ApplyUpdates(-1);
  End;
  //客戶材料數據集不為空的話則檢查更新    
  if FThis.dtsCustMaterial.RowCount > 0 Then
  Begin
    FThis.dtsCustMaterial.Edit;
    FThis.dtsCustMaterial.Post;
    FThis.dtsCustMaterial.ApplyUpdates(-1);
  End;
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
  • PageSwitch:頁面編輯狀態切換的子程式。
procedure TMyHandler.PageSwitch;
//切換頁面使用的子程式,客戶資料,客戶地址,客戶關係,客戶物料數據集參數重新從客戶ID列表數據集中獲取。
begin
  
  FThis.dtsGeneral.Close;
  FThis.dtsGeneral.ParamByName('FInterID').AsString := FThis.dtsList.FieldByName('FInterID').AsString;
  FThis.dtsGeneral.Open;

  FThis.dtsCustAddrs.Close;
  FThis.dtsCustAddrs.ParamByName('FInterID').AsString := FThis.dtsList.FieldByName('FInterID').AsString;
  FThis.dtsCustAddrs.Open;  
  
  FThis.dtsCustRelation.Close;
  FThis.dtsCustRelation.ParamByName('FInterID').AsString := FThis.dtsList.FieldByName('FInterID').AsString;
  FThis.dtsCustRelation.Open; 
  
  FThis.dtsCustMaterial.Close;
  FThis.dtsCustMaterial.ParamByName('FInterID').AsString := FThis.dtsList.FieldByName('FInterID').AsString;
  FThis.dtsCustMaterial.Open;  
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  • btnFirstClick:首項按鈕,點選以切換數據集至首項。
//切換首項
procedure TMyHandler.btnFirstClick;
begin
  FThis.dtsList.First;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnPriorClick:前項按鈕,點選以切換數據集至前項
//切換前項
procedure TMyHandler.btnPriorClick;
begin
  FThis.dtsList.Prior;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnNextClick:後項按鈕,點選以切換數據集至後項。
//切換後項
procedure TMyHandler.btnNextClick;
begin
  FThis.dtsList.Next;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnLastClick:末項按鈕,點選以切換數據集至末項 。
//切換末項
procedure TMyHandler.btnLastClick;
begin
  FThis.dtsList.Last;
  PageSwitch;
end;
1
2
3
4
5
6
  • **btnNewClick **:新建按鈕。
procedure TMyHandler.btnNewClick;
//新增專案
var
  vGroupID: String;
begin
  //獲取目前分組的資訊
  vGroupID := FThis.dtsGeneral.FieldByName('FGroupID').AsString;
  //主表數據集新增併爲特殊欄位FInterID,FGroupID,FCreater初始賦值
  FThis.dtsGeneral.Append;
  FThis.dtsGeneral.FieldByName('FInterID').AsInteger := dm.GetNodeID;
  FThis.dtsGeneral.FieldByName('FGroupID').AsString := vGroupID;
  FThis.dtsGeneral.FieldByName('FCreater').AsString := FThis.siLang1.GetTextW('admin');
  FThis.dtsGeneral.Post;
  //明細數據集重新獲取參數並打開
  FThis.dtsCustAddrs.Close;
  FThis.dtsCustRelation.Close;
  FThis.dtsCustMaterial.Close;
  FThis.dtsCustAddrs.ParamByName('FInterID').AsString := FThis.dtsGeneral.FieldByName('FInterID').AsString;
  FThis.dtsCustRelation.ParamByName('FInterID').AsString := FThis.dtsGeneral.FieldByName('FInterID').AsString;
  FThis.dtsCustMaterial.ParamByName('FInterID').AsString := FThis.dtsGeneral.FieldByName('FInterID').AsString;
  FThis.dtsCustAddrs.Open;
  FThis.dtsCustRelation.Open;
  FThis.dtsCustMaterial.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
  • btnSaveClick:儲存數據。
procedure TMyHandler.btnSaveClick;
//儲存
Var
  vdts: TRFDataSet;
  t: TDateTime;
begin
  t := now;
  vdts := TRFDataSet.Create(Nil);
  vdts.Connection := dm.DBConnection;
  try
     //檢查客戶資料中的部分必填欄位是否為空。
	if (FThis.dtsGeneral.FieldByName('FCustCode').AsString = '')
  	or (FThis.dtsGeneral.FieldByName('FCustName').AsString = '')
  	Then
  	Begin
    	ShowMessage(FThis.siLang1.GetTextW('客戶程式碼或者客戶名稱不能為空!'));
    	exit;
  	end;
  	if (FThis.dtsGeneral.FieldByName('FEmpName').AsString = '')
  	or (FThis.dtsGeneral.FieldByName('FSaleType').AsString = '')
  	Then
  	Begin
    	ShowMessage(FThis.siLang1.GetTextW('業務員名稱或銷售型別不能為空!'));
    	exit;  
  	End;
      //檢查新增的客戶資料中填寫的客戶程式碼是否與資料庫中的客戶程式碼重複,如果重複則提示並退出儲存流程,修改的流程則不受影響
      vdts.Close;
      vdts.SQL.Text := 'SELECT FInterID FROM Basic_Cust WHERE FCustCode = ''' + FThis.dtsGeneral.FieldByName('FCustCode').AsString + '''';
      vdts.Open;
      if (vdts.RecordCount > 0) and (vdts.FieldByName('FInterID').AsString <> FThis.dtsGeneral.FieldByName('FInterID').AsString) Then
      Begin
        ShowMessage(FThis.siLang1.GetTextW('客戶程式碼重複,請重新選擇客戶程式碼輸入!'));
        Exit;
      end;
  
  	//檢查主表是否有進行修改,被修改的主表客戶是否已經在系統內產生了單據,如有則不允許修改
    vdts.Close;
    vdts.SQL.Text := 'SELECT 1 FROM Basic_Cust WHERE FInterID = ' + FThis.dtsGeneral.FieldByName('FInterID').AsString;
    vdts.Open;
    if vdts.RecordCount > 0 Then
    Begin
    	vdts.Close;
        //查詢客戶ID在業務單據的表中是否存在
    	vdts.SQL.Text := ' if exists(select 1 from Sal_Order where FCustID = ' + FThis.dtsGeneral.FieldByName('FInterID').AsString +') '
   		+' select 1 as FInterID '
    	+' else if exists(select 1 from Inv_CLstockBill where FCustID = ' + FThis.dtsGeneral.FieldByName('FInterID').AsString +') '
    	+' select 1 as FInterID '
    	+' else if exists(select 1 from Inv_CLInvBal where FCustID = ' + FThis.dtsGeneral.FieldByName('FInterID').AsString +') '
    	+' select 1 as FInterID '
    	+' else if exists(select 1 from Man_Mo where FCustID = ' + FThis.dtsGeneral.FieldByName('FInterID').AsString +') '
    	+' select 1 as FInterID '
    	+' else if exists(select 1 from Man_Contact where FCustID = ' + FThis.dtsGeneral.FieldByName('FInterID').AsString +') '
    	+' select 1 as FInterID '
    	+'else '
    	+' select 0 as FInterID ';
    	vdts.Open;
    	IF vdts.FieldByName('FInterID').AsInteger > 0 Then
    	Begin
      	//不儲存客戶資料,僅更新明細表中的相關資訊
        if paxfunc.YesNoMsg(FThis.siLang1.GetTextW('檢測到該客戶資料概覽部分已被單據引用,' + 
        '是否僅更新收貨地址,關係和產品資訊?'),FThis.siLang1.GetTextW('提示'))  then
        begin
           UpdateCustDetail;
           ShowMessage(FThis.siLang1.GetTextW('僅更新送貨地址,關係和產品資訊成功。'));  
        end
    	End
      Else
      Begin
      //未被引用的直接進行儲存
      FThis.dtsGeneral.Edit;
      FThis.dtsGeneral.FieldByName('FLstModDate').AsDateTime := t;
      //數據集是否處於編輯模式,提交		
      if DM.DataSetIsEdit(FThis.dtsGeneral) Then
      	  FThis.dtsGeneral.Post;
          
	FThis.dtsGeneral.ApplyUpdates(-1);
        UpdateCustDetail;
    	ShowMessage(FThis.siLang1.GetTextW('數據儲存成功!'));       
      End;
    End
    Else
    //新增的直接進行儲存
    Begin
    	FThis.dtsGeneral.Edit;
    	FThis.dtsGeneral.FieldByName('FLstModDate').AsDateTime := t;
    	FThis.dtsGeneral.Post;
	FThis.dtsGeneral.ApplyUpdates(-1);
        UpdateCustDetail;
    	ShowMessage(FThis.siLang1.GetTextW('數據儲存成功!'));
    End;			
    //btnAppend.Enabled := True;
    //btnSave.Enabled := False;
	Finally
  	vdts.Free;
  end;
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
  • btnDeleteClick:刪除目前顯示的客戶資料。
procedure TMyHandler.btnDeleteClick;
//刪除
Var
  AStoredProc: TRFStoredProc;
  vRAISEMSG,vMSG: String;
  i, j: Integer;
begin
  //確認對話方塊彈出
  if paxfunc.YesNoMsg(FThis.siLang1.GetTextW('確認要刪除此客戶資料嗎?'),FThis.siLang1.GetTextW('提示'))  then
  begin
  //預存程序控制元件建立
  AStoredProc := TRFStoredProc.Create(nil);
  AStoredProc.Connection := dm.DBConnection;
  try
    //預存程序指定並準備獲取參數
    AStoredProc.StoredProcName := 'sp_Basic_Cust';
    AStoredProc.Prepare;
    if AStoredProc.Prepared then
    begin
      //參數賦值
      AStoredProc.ParamByName('FDataID').AsString := FThis.dtsGeneral.FieldByName('FInterID').AsString;
      AStoredProc.ParamByName('Flag').AsString := 'Delete';
      AStoredProc.ParamByName('FUserCode').AsString := FThis.siLang1.GetTextW('admin');
      if AStoredProc.FindParam('FMsg') <> nil then
        AStoredProc.ParamByName('FMsg').AsString := '';
      try
        AStoredProc.ExecProc;
        //獲取異常資訊並處理顯示
       Except on ExceptionMessage:Exception do
       begin
          vRAISEMSG:=ExceptionMessage.Message;
     
          i := Pos('SQMESSAGE', vRAISEMSG);
          j := Pos('[SQL Server]', vRAISEMSG);
          vMSG := Copy(vRAISEMSG, i, Length(vRAISEMSG) - i + 1);
    
          // 非格式化訊息提示
          if i = 0 then
          begin
            ShowMessage(Copy(vRAISEMSG, j + 12, Length(vRAISEMSG) - j + 1));
            Exit;
          end;
        end;
        end;
    end;
  finally
    AStoredProc.Free;
  end;
  //所有數據集重新整理顯示
  FThis.dtsGeneral.Open;
  FThis.dtsCustAddrs.Open;
  FThis.dtsCustRelation.Open;
  FThis.dtsCustMaterial.Open;  
  end;
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
  • btnUpdateClick:更新客戶資料。
procedure TMyHandler.btnUpdateClick;
//更新
Var
  AStoredProc: TRFStoredProc;
  vRAISEMSG,vMSG: String;
  i, j: Integer;
begin
  //彈出視窗確認
  if paxfunc.YesNoMsg(FThis.siLang1.GetTextW('確認要更新此客戶資料嗎?'),FThis.siLang1.GetTextW('提示'))  then
  begin
  AStoredProc := TRFStoredProc.Create(nil);
  AStoredProc.Connection := dm.DBConnection;
  try
    //預存程序準備
    AStoredProc.StoredProcName := 'sp_Basic_Cust';
    AStoredProc.Prepare;
    if AStoredProc.Prepared then
    begin
      //參數賦值
      AStoredProc.ParamByName('FDataID').AsString := FThis.dtsGeneral.FieldByName('FInterID').AsString;
      AStoredProc.ParamByName('Flag').AsString := 'Update';
      AStoredProc.ParamByName('FUserCode').AsString := FThis.siLang1.GetTextW('admin');
      if AStoredProc.FindParam('FMsg') <> nil then
        AStoredProc.ParamByName('FMsg').AsString := '';
      try
        //執行預存程序
        AStoredProc.ExecProc;
        //意外情況的文書處理
       Except on ExceptionMessage:Exception do
       begin
          vRAISEMSG:=ExceptionMessage.Message;
     
          i := Pos('SQMESSAGE', vRAISEMSG);
          j := Pos('[SQL Server]', vRAISEMSG);
          vMSG := Copy(vRAISEMSG, i, Length(vRAISEMSG) - i + 1);
    
          // 非格式化訊息提示
          if i = 0 then
          begin
            ShowMessage(Copy(vRAISEMSG, j + 12, Length(vRAISEMSG) - j + 1));
            Exit;
          end;
        end;
        end;
    end;
  finally
    AStoredProc.Free;
  end;
  //數據集重新整理
  FThis.dtsGeneral.Open;
  FThis.dtsCustAddrs.Open;
  FThis.dtsCustRelation.Open;
  FThis.dtsCustMaterial.Open;  
  end;
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
  • btnExitClick:退出目前視窗。
procedure TMyHandler.btnExitClick;
//退出視窗
begin
  FThis.Close;
end;
1
2
3
4
5
  • btnCustAddrsAppendRowClick:客戶收貨地址新增行。
procedure TMyHandler.btnCustAddrsAppendRowClick;
//新增行
begin
  FThis.dtsCustAddrs.Append; 
end;
1
2
3
4
5
  • dtsCustAddrsNewRecord: 客戶收貨地址新增數據初始化。
procedure TMyHandler.dtsCustAddrsNewRecord;
//客戶資料地址新增行
begin
  FThis.dtsCustAddrs.FieldByName('FInterID').AsString := FThis.dtsGeneral.FieldByName('FInterID').AsString;
  FThis.dtsCustAddrs.FieldByName('FentryID').AsInteger := FThis.dtsCustAddrs.RecordCount + 1;
  FThis.dtsCustAddrs.Post;
end;
1
2
3
4
5
6
7
  • btnCustAddrsDelRowClick:客戶收貨地址刪除目前選擇行。
procedure TMyHandler.btnCustAddrsDelRowClick;
//刪除
begin
  FThis.dtsCustAddrs.Delete;
end;
1
2
3
4
5
  • btnCustRelationAppendRowClick:客戶關係人員新增行。
procedure TMyHandler.btnCustRelationAppendRowClick;
//客戶關係新增行
begin
  FThis.dtsCustRelation.Append;
end;
1
2
3
4
5
  • btnCustRelationDelRowClick:客戶關係人人員刪除行。
procedure TMyHandler.btnCustRelationDelRowClick;
//客戶關係刪除行
begin
  FThis.dtsCustRelation.Delete;
end;
1
2
3
4
5
  • btnCustMaterialAppendRowClick:客戶產品新增行。
procedure TMyHandler.btnCustMaterialAppendRowClick;
//客戶物料新增行
begin
  FThis.dtsCustMaterial.Append;
end;
1
2
3
4
5
  • btnCustMaterialDelRowClick:客戶產品刪除行。
procedure TMyHandler.btnCustMaterialDelRowClick;
//客戶物料刪除行
begin
  FThis.dtsCustMaterial.Delete;
end;
1
2
3
4
5
  • dtsCustRelationNewRecord:客戶關係人員新增數據初始化。
procedure TMyHandler.dtsCustRelationNewRecord;
//客戶關係新增行時初始化欄位資訊
begin
  FThis.dtsCustRelation.FieldByName('FInterID').AsString := FThis.dtsGeneral.FieldByName('FInterID').AsString;
  FThis.dtsCustRelation.FieldByName('FentryID').AsInteger := FThis.dtsCustRelation.RecordCount + 1;
  FThis.dtsCustRelation.Post;
end;
1
2
3
4
5
6
7
  • dtsCustMaterialNewRecord:客戶產品新增數據初始化。
procedure TMyHandler.dtsCustMaterialNewRecord;
//客戶物料新增行時初始化欄位資訊
begin
  FThis.dtsCustMaterial.FieldByName('FInterID').AsString := FThis.dtsGeneral.FieldByName('FInterID').AsString;
  FThis.dtsCustMaterial.FieldByName('FentryID').AsInteger := FThis.dtsCustMaterial.RecordCount + 1;
  FThis.dtsCustMaterial.Post;
end;
1
2
3
4
5
6
7
  • lkupFEmpNameClick:業務員變更時傳遞事件。
procedure TMyHandler.lkupFEmpNameClick;
//變更業務員資訊時變更關聯欄位資訊
begin
  FThis.dtsGeneral.Edit;
  FThis.dtsGeneral.FieldByName('FEmpID').AsString := FThis.dtsEmp.FieldByName('FEmpID').AsString;
  FThis.dtsGeneral.FieldByName('FEmpCode').AsString := FThis.dtsEmp.FieldByName('FEmpCode').AsString; 
  FThis.dtsGeneral.FieldByName('FDeptID').AsString := FThis.dtsEmp.FieldByName('FDeptID').AsString;
  FThis.dtsGeneral.FieldByName('FDeptCode').AsString := FThis.dtsEmp.FieldByName('FDeptCode').AsString;
  FThis.dtsGeneral.FieldByName('FDeptName').AsString := FThis.dtsEmp.FieldByName('FDeptName').AsString;
end;
1
2
3
4
5
6
7
8
9
10
  • lkupFInvoiceCustNameClick:結帳客戶變更時傳遞數據。
//變更結帳客戶時更新相關資訊
procedure TMyHandler.lkupFInvoiceCustNameClick;
begin
  FThis.dtsGeneral.Edit;  
  FThis.dtsGeneral.FieldByName('FInvoiceCustID').AsString := FThis.dtsInvoiceCust.FieldByName('FInVoiceCustID').AsString;
  FThis.dtsGeneral.FieldByName('FInvoiceCustCode').AsString := FThis.dtsInvoiceCust.FieldByName('FInVoiceCustCode').AsString;
end;
1
2
3
4
5
6
7
  • btnUploadClick:上傳圖片按鈕。
//上傳圖片
procedure TMyHandler.btnUploadClick;
begin
  if FThis.OpenPictureDialog.Execute(0) then
  begin
    FThis.dtsGeneral.Edit;
    TBlobField(FThis.dtsGeneral.FieldByName('FCustLogo')).LoadFromFile(FThis.OpenPictureDialog.FileName);
    FThis.dtsGeneral.Post;
  end;
end;
1
2
3
4
5
6
7
8
9
10
  • btnClearPictureClick:清空圖片。
procedure TMyHandler.btnClearPictureClick;
//清空圖片
begin
    FThis.dtsGeneral.Edit;
    TBlobField(FThis.dtsGeneral.FieldByName('FCustLogo')).Clear;
    FThis.dtsGeneral.Post;
end;
1
2
3
4
5
6
7

# 3.3.5. 多語言設定

  在功能表欄點選語言-語言設定,打開多語言設定對話方塊,根據提示進行多語言的設定。

# 3.3.6. 運行效果

# 3.4. 布種資料查詢-多筆數據表單

  布種資料頁面設定如下:

# 3.4.1. 功能簡述

  布種資料的頁面按照布種分類進行資訊的分類展示,此頁面包含分組顯示錶單的模式設計,表格查詢等相關的模組設計內容。

# 3.4.2. 窗體設定

屬性 取值 說明
Caption 布種資料 主窗體的標題名稱
Height 768 主窗體的高度(畫素)
Name Item 主窗體模組的名稱
Width 1024 主窗體的寬度(畫素)

# 3.4.3. 控制元件設定

  各表結構欄位及對應的數據感知控制元件名稱如下,其中的TBitBtn、TLabeledEdit型別的控制元件需修改Font.Size為12,TPanel型別的控制元件需要清除Caption屬性中原有的字元內容。

  • 控制元件說明
控制元件名稱 控制元件型別 說明
Panel1 TPanel 頂部面板顯示,用於放置控制元件容器
edQuery TLabeledEdit 查詢輸入框,用於輸入布種程式碼與名稱
TextHint:輸入布種程式碼或名稱
EditLabel.Caption:布種程式碼或名稱
btnQuery TBitBtn 查詢按鈕,點選以根據條件進行查詢。
Caption:查詢
btnClear TBitBtn 清除按鈕,點選以清除查詢內容恢復至初始狀態。
Caption:清除
btnAppend TBitBtn 新建按鈕,點選以新建單據。
Caption:新建
btnDelete TBitBtn 刪除按鈕,點選以刪除。
Caption:刪除
btnEditor TBitBtn 編輯按鈕,點選以進入編輯模式。
Caption:編輯
btnRefresh TBitBtn 重新整理按鈕,點選以重新整理顯示。
Caption:重新整理
btnShowAll TBitBtn 顯示全部按鈕,點選以顯示全部內容。
Caption:顯示全部
btnExit TBitBtn 退出按鈕,點選以退出目前窗體。
Caption:退出
dts0 TRFDataSet 數據集控制元件,展示布種分類 Basic_ItemGroup
dts1 TRFDataSet 數據集控制元件,展示布種資料 Basic_Item
ds0 TDataSource 數據源控制元件,繫結數據集
DataSet:dts0
ds1 TDataSource 數據源控制元件,繫結數據集
DataSet:dts1
Spliter1 TSpliter 分隔控制元件,用於分隔數據表格控制元件
DBGrid1 TDBGrid 布種分組數據表格
DataSource:ds0
DBGrid2 TDBGrid 布種資訊數據表格
DataSource:ds1
  • DBGrid1數據表格說明

  在設定表格列之前,使用滑鼠右鍵點選表格,在選項中選擇Custom Columns,轉換為自定義表格後進行設定。點選Columns屬性打開對話方塊,在此處新增欄位。選擇新增的欄位進行屬性的更改。

FieldName
欄位名
Font.Size
字型大小
Title.Caption
標題文字
Title.Font.Size
標題字型大小
Width
列寬度
FGroupName 10 分組名稱 12 90
FGroupCode 10 分組程式碼 12 80
  • DBGrid2數據表格說明

  在設定表格列之前,使用滑鼠右鍵點選表格,在選項中選擇Custom Columns,轉換為自定義表格後進行設定。點選Columns屬性打開對話方塊,在此處新增欄位。選擇新增的欄位進行屬性的更改。

FieldName
欄位名
Font.Size
字型大小
Title.Caption
標題文字
Title.Font.Size
標題字型大小
Width
列寬度
FItemCode 10 物料程式碼 12 80
FItemName 10 物料名稱 12 140
FItemSpec 10 規格 12 80
FUnitName 10 單位 12 80
FUnitPiece 10 件單位 12 64
FforzenFor 10 凍結 12 64

# 3.4.4. 指令碼設計

type
  TMyHandler = class(TForm)
private 
  FThis:TBaseForm; 
Public 
  constructor Create(AOwner: TComponent); override;
{模組聲明  MODULE-DECLARE}
  procedure btnQueryClick(Sender: TObject);
  procedure btnClearClick(Sender: TObject);
  procedure btnAppendClick(Sender: TObject);
  procedure btnDeleteClick(Sender: TObject);
  procedure btnEditorClick(Sender: TObject);
  procedure btnRefreshClick(Sender: TObject);
  procedure btnShowAllClick(Sender: TObject);
  procedure btnExitClick(Sender: TObject);
  procedure DBGrid1CellClick(Column: TColumn);
end;

//...
var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
{事件繫結  MODULE-BIND}
  this.btnQuery.OnClick := FMyHandler.btnQueryClick;
  this.btnClear.OnClick := FMyHandler.btnClearClick;
  this.btnAppend.OnClick := FMyHandler.btnAppendClick;
  this.btnDelete.OnClick := FMyHandler.btnDeleteClick;
  this.btnEditor.OnClick := FMyHandler.btnEditorClick;
  this.btnRefresh.OnClick := FMyHandler.btnRefreshClick;
  this.btnShowAll.OnClick := FMyHandler.btnShowAllClick;
  this.btnExit.OnClick := FMyHandler.btnExitClick;
  this.DBGrid1.OnCellClick := FMyHandler.DBGrid1CellClick;
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
  • 程式模組列表
程式模組名稱 說明
Create 構造器,啟動后運行需初始化設定的內容
btnQueryClick 查詢按鈕的點選事件,根據查詢的內容顯示結果
btnClearClick 清除按鈕的點選事件,清除查詢內容並恢復至初始查詢狀態
btnAppendClick 新建按鈕的點選事件,新建基礎資料單據
btnDeleteClick 刪除按鈕的點選事件,刪除基礎資料單據
btnEditorClick 編輯按鈕的點選事件,編輯基礎資料單據
btnRefreshClick 重新整理按鈕的點選事件,重新整理基礎資料頁面的顯示
btnShowAllClick 顯示全部的點選事件,去除所有分類顯示條目
btnExitClick 退出的點選事件,退出並關閉目前視窗
DBGrid1CellClick 表格單元的點選事件,點選以按目前分類進行顯示
  • Create:構造器,啟動后運行需初始化設定的內容。
constructor TMyHandler.Create(AOwner: TComponent);
//物料分類、物料資訊數據集初始賦值
begin
  FThis :=TBaseForm(AOwner);
  FThis.dts0.Connection := dm.DBConnection;
  FThis.dts1.Connection := dm.DBConnection;
  FThis.dts0.SQL.Text := 'Select FInterID,FGroupCode,FGroupName,FNote,FTreeKeyID,FTreeParenteID,' + 
  'FAbsoluteIndex From Basic_ItemGroup WHERE FTypeID = 1 Order by FGroupCode';
  FThis.dts0.Open;
  FThis.dts0.First;
  FThis.dts1.SQL.Text := 'SELECT * FROM Basic_Item WHERE FTypeID = 1';
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
  • btnQueryClick:查詢按鈕的點選事件,根據查詢的內容顯示結果。
procedure TMyHandler.btnQueryClick;
//查詢,獲取查詢編輯庫中資訊並進行查詢
begin
  FThis.dts1.Close;
  FThis.dts1.SQL.Text :=  'SELECT * FROM Basic_Item WHERE FTypeID = 1 AND (FItemCode LIKE  ''%' + FThis.edQuery.Text + 
  '%'' or FItemName LIKE ''%' + FThis.edQuery.Text + '%'') Order by FItemCode';
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
  • btnClearClick:清除按鈕的點選事件,清除查詢內容並恢復至初始查詢狀態。
procedure TMyHandler.btnClearClick;
//清除編輯框中的內容並初始化查詢
begin
   FThis.edQuery.Text := '';
   FThis.dts1.SQL.Text := 'SELECT * FROM Basic_Item WHERE FTypeID = 1';
   FThis.dts1.Open;
end;
1
2
3
4
5
6
7
  • btnAppendClick:新建按鈕的點選事件,新建基礎資料單據。
procedure TMyHandler.btnAppendClick;
//新建單據
var
  F: TBaseForm;
  vInterID: Integer;
begin
  //獲取唯一ID
  vInterID := dm.GetNodeID;
  //打開物料編輯頁面
  F := paxfunc.OpenForm('ItemEdit');
  //與主視窗建立連線
  F.TagObject := FThis;  
  //目標視窗數據集初始賦值並新增記錄
  TRFDataSet(F.FindComponent('dts0')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dts0')).Open;
  TRFDataSet(F.FindComponent('dts1')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dts1')).Open;  
  TRFDataSet(F.FindComponent('dts0')).Append;
  //新增記錄並初始賦值
 
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FGroupID').AsString := FThis.dts0.FieldByName('FInterID').AsString;
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FTypeID').AsString := '1';//FThis.dts0.FieldByName('FTypeID').AsString; 
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
  • btnDeleteClick:刪除按鈕的點選事件,刪除基礎資料單據。
procedure TMyHandler.btnDeleteClick;
//刪除
var
  AStoredProc: TRFStoredProc;
  vRAISEMSG,vMSG: String;
  i, j: Integer;
begin
  //彈出視窗確認是否進行刪除
  if paxfunc.YesNoMsg(FThis.siLang1.GetTextW('是否刪除該資料?'),FThis.siLang1.GetTextW('提示'))  then 
  begin
  //預存程序控制元件建立
  AStoredProc := TRFStoredProc.Create(nil);
  AStoredProc.Connection := dm.DBConnection;
  try
    //預存程序準備
    AStoredProc.StoredProcName := 'sp_Basic_Item';
    AStoredProc.Prepare;
    if AStoredProc.Prepared then
    begin
      //預存程序參數賦值
      AStoredProc.ParamByName('FDataID').AsString := FThis.dts1.FieldByName('FInterID').AsString;
      AStoredProc.ParamByName('Flag').AsString := 'Delete';
      AStoredProc.ParamByName('FUserCode').AsString := FThis.siLang1.GetTextW('admin');
      if AStoredProc.FindParam('FMsg') <> nil then
        AStoredProc.ParamByName('FMsg').AsString := '';
      try
        //執行預存程序
        AStoredProc.ExecProc;
        //意外情況字串處理
       Except on ExceptionMessage:Exception do
       begin
          vRAISEMSG:=ExceptionMessage.Message;
     
          i := Pos('SQMESSAGE', vRAISEMSG);
          j := Pos('[SQL Server]', vRAISEMSG);
          vMSG := Copy(vRAISEMSG, i, Length(vRAISEMSG) - i + 1);
    

          // 非格式化訊息提示
          if i = 0 then
          begin
            ShowMessage(Copy(vRAISEMSG, j + 12, Length(vRAISEMSG) - j + 1));
            Exit;
          end;
        end;
        end;
        //重新整理表格顯示
        btnQueryClick(sender);
    end;
  finally
    AStoredProc.Free;
  end;  
  
  end;
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
  • btnEditorClick:編輯按鈕的點選事件,編輯基礎資料單據。
procedure TMyHandler.btnEditorClick;
//編輯資料
var
  F: TBaseForm;
  vInterID: Integer;
begin
  //獲取目前選擇的物料唯一ID
  vInterID := FThis.dts1.FieldByName('FInterID').AsInteger;
  //打開物料編輯視窗
  F := paxfunc.OpenForm('ItemEdit');
  //打開視窗與主視窗建立連線
  F.TagObject := FThis;
  //為視窗中的數據集賦值
  TRFDataSet(F.FindComponent('dts0')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dts0')).Open;
  TRFDataSet(F.FindComponent('dts1')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dts1')).Open;  
  //列表數據集打開並根據唯一ID進行定位
  TRFDataSet(F.FindComponent('dtsList')).First;
  While TRFDataSet(F.FindComponent('dtsList')).FieldByName('FInterID').AsString <> FThis.dts1.FieldByName('FInterID').AsString do
  begin
    TRFDataSet(F.FindComponent('dtsList')).Next;
  end;
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
  • btnRefreshClick:重新整理按鈕的點選事件,重新整理基礎資料頁面的顯示。
procedure TMyHandler.btnRefreshClick;
//重新整理顯示
begin
  FThis.dts0.SQL.Text := 'Select FInterID,FGroupCode,FGroupName,FNote,FTreeKeyID,FTreeParenteID,' + 
  'FAbsoluteIndex From Basic_ItemGroup WHERE FTypeID = 1 Order by FGroupCode';
  FThis.dts0.Open;
  FThis.dts0.First;
  FThis.dts1.SQL.Text := 'SELECT * FROM Basic_Item WHERE FTypeID = 1';
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
10
  • btnShowAllClick:顯示全部的點選事件,去除所有分類顯示條目。
procedure TMyHandler.btnShowAllClick;
//顯示全部
begin
  FThis.dts1.Filtered := False;
end;
1
2
3
4
5
  • btnExitClick:退出的點選事件,退出並關閉目前視窗。
procedure TMyHandler.btnExitClick;
//退出視窗
begin
  FThis.Close;
end;
1
2
3
4
5
  • DBGrid1CellClick:表格單元的點選事件,點選以按目前分類進行顯示。
procedure TMyHandler.DBGrid1CellClick;
//分類檢視
begin
  FThis.dts1.Filtered := False;
  FThis.dts1.Filter := 'FGroupID = ' + FThis.dts0.FieldByName('FInterID').AsString;
  FThis.dts1.Filtered := True;
end;
1
2
3
4
5
6
7

# 3.4.5. 多語言設定

  在功能表欄點選語言-語言設定,打開多語言設定對話方塊,根據提示進行多語言的設定。

# 3.4.6. 運行效果

# 3.5. 布種資料編輯-多筆數據表單

  布種資料頁面設定如下。

# 3.5.1. 功能簡述

  布種資料編輯用於對布種資料的資訊進行詳細設定,其中引用了部分查詢表需要使用的計量單位,布種分類,倉庫等數據集資訊。

# 3.5.2. 窗體設定

屬性 取值 說明
Caption 布種資料編輯 主窗體的標題名稱
Height 768 主窗體的高度(畫素)
Name ItemEdit 主窗體模組的名稱
Width 1024 主窗體的寬度(畫素)

# 3.5.3. 控制元件設定

  • 控制元件說明

  頁面中注意修改TBitBtn型別的控制元件的文字大小Font.Size屬性為12,TPanel型別的控制元件需要清除Caption屬性中原有的字元內容。

控制元件名稱 控制元件型別 說明
Panel1 TPanel 面板控制元件,作為佈局容器使用,位於頂部位置
Panel2 TPanel 面板控制元件,作為佈局容器使用,位於第二個頂部位置,放置布種資料的主要數據感知控制元件
Panel3 TPanel 面板控制元件,作為佈局容器使用,佔據居頂控制元件之後的所有位置,放置數據表格與備註欄
Panel4 TPanel 面板控制元件,位於Panel3中居左位置,用於放置表格及按鈕
Panel5 TPanel 面板控制元件,位於Panel4中頂部位置,用於放置按鈕
Panel6 TPanel 面板控制元件,位於Panel3中居右位置,用於放置備註的數據感知控制元件
Panel7 TPanel 面板控制元件,位於Panel6中居頂位置,用於放置備註標籤
btnFirst TBitBtn 首項按鈕,點選跳轉至記錄的首頁
Caption:首項
btnPrior TBitBtn 前項按鈕,點選跳轉至記錄的前項
Caption:前項
btnNext TBitBtn 後項按鈕,點選跳轉至記錄的後項
Caption:後項
btnLast TBitBtn 末項按鈕,點選跳轉至記錄的末項
Caption:末項
btnNew TBitBtn 新建按鈕,點選以新建客戶資料
Caption:新建
btnSave TBitBtn 儲存按鈕,點選以儲存資料的更改
Caption:儲存
btnDelete TBitBtn 刪除按鈕,點選以刪除目前的客戶資料
Caption:刪除
btnExit TBitBtn 退出按鈕,點選以退出視窗
Caption:退出
btnItemSpecAppendRow TBitBtn 新增行按鈕,用於新增規格
btnItemSpecDelRow TBitBtn 刪除行按鈕,用於刪除規格
dts0 TRFDataSet 主數據集,顯示布種資訊
ds0 TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dts0
dts0FGroup TRFDataSet 布種分類數據集
ds0FGroup TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dts0FGroup
dts0FStockID TRFDataSet 倉庫資訊數據集
ds0FStockID TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dts0FStockID
dts0FPackUnit TRFDataSet 倉庫資訊數據集
ds0FPackUnit TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dts0FPackUnit
dts0FUnit TRFDataSet 倉庫資訊數據集
ds0FUnit TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dts0FUnit
dts1 TRFDataSet 明細數據集,顯示布種規格
ds1 TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dts1
dtsList TRFDataSet 數據列表,用於顯示數據資訊唯一ID
DBGrid1 TDBGrid 布種規格數據表格
DataSource:ds0
  • 數據感知控制元件說明

  此頁面中首頁繫結的數據源DataSource為ds0,所有涉及到文字顯示的控制元件的文字大小屬性Font.Size修改爲12。由於數據感知控制元件不包含標籤顯示,故每放置一個字元編輯型別的數據感知控制元件前,需要先放置一個TLabel控制元件,並將其Caption屬性設定為數據欄位對應的中文名稱,同樣也需要將其 Font.Size修改爲12。

數據欄位名稱 中文名稱 對應控制元件型別 控制元件名稱 備註
FGroupID 布種分類 TDBLookupComboBox lkupGroupID 列表繫結的數據源
ListSource:ds0FGroup
列表顯示的欄位名
ListField:FGroupName
列表對應返回的欄位值
KeyField: FGroupID
FfrozenFor 凍結 TDBCheckBox chkFforzenFor
FItemCode 布種程式碼 TDBEdit edFItemCode
FMax 最大安全庫存 TDBEdit edFMax
FItemName 布種名稱 TDBEdit edFItemName
FMin 最小安全庫存 TDBEdit edFMin
FItemSpec 規格 TDBEdit edFItemSpec
FStockID 預設倉庫 TDBLookupComboBox lkupFStockID 列表繫結的數據源
ListSource:ds0FStockID
列表顯示的欄位名
ListField:FWHSName
列表對應返回的欄位值
KeyField: FStockID
FWidth 門幅 TDBEdit edFWidth
FWeightOflength 克重 TDBEdit edFWeightOflength
FColorName 顏色名稱 TDBEdit edFColorName
FPackQty 包裝數量 TDBEdit edFPackQty
FPackUnit 包裝單位 TDBLookupComboBox lkupFPackUnit 列表繫結的數據源
ListSource:ds0FPackUnit
列表顯示的欄位名
ListField:FName
列表對應返回的欄位值
KeyField: FName
FUnitPiece 件單位 TDBLookupComboBox lkupFUnitPiece 列表繫結的數據源
ListSource:ds0FPackUnit
列表顯示的欄位名
ListField:FName
列表對應返回的欄位值
KeyField: FName
FUnitName 計量單位 TDBLookupComboBox lkupFUnitName 列表繫結的數據源
ListSource:ds0FUnit
列表顯示的欄位名
ListField:FUnitName
列表對應返回的欄位值
KeyField: FUnitName
FStandPrice 標準價 TDBEdit edFStandPrice
FPurPrice 採購價 TDBEdit edFPurPrice
FYarn 紗支 TDBEdit edFYarn
FSalePrice 銷售價 TDBEdit edFSalePrice
FMachine 機臺 TDBEdit edFMachine
FYarnLine 線長 TDBEdit edFYarnLine
FNote 備註 TDBMemo mmFNote
  • DBGrid1數據表格說明

  在設定表格列之前,使用滑鼠右鍵點選表格,在選項中選擇Custom Columns,轉換為自定義表格後進行設定。點選Columns屬性打開對話方塊,在此處新增欄位。選擇新增的欄位進行屬性的更改。

FieldName
欄位名
Font.Size
字型大小
Title.Caption
標題文字
Title.Font.Size
標題字型大小
Width
列寬度
FEntryID 10 序 12 64
FItemSpec 10 規格 12 400

# 3.5.4. 指令碼設計

type
  TMyHandler = class(TForm)
private 
  FThis:TBaseForm; 
Public 
  constructor Create(AOwner: TComponent); override;
{模組聲明  MODULE-DECLARE}
  procedure btnFirstClick(Sender: TObject);
  procedure PageSwitch;
  procedure btnPriorClick(Sender: TObject);
  procedure btnNextClick(Sender: TObject);
  procedure btnLastClick(Sender: TObject);
  procedure btnNewClick(Sender: TObject);
  procedure btnSaveClick(Sender: TObject);
  procedure btnDeleteClick(Sender: TObject);
  procedure btnExitClick(Sender: TObject);
  procedure btnItemSpecAppendRowClick(Sender: TObject);
  procedure dts1NewRecord(DataSet: TDataSet);
  procedure btnItemSpecDelRowClick(Sender: TObject);
  procedure lkupFUnitNameClick(Sender: TObject);
end;

//...

var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
{事件繫結  MODULE-BIND}
  this.btnFirst.OnClick := FMyHandler.btnFirstClick;
  this.btnPrior.OnClick := FMyHandler.btnPriorClick;
  this.btnNext.OnClick := FMyHandler.btnNextClick;
  this.btnLast.OnClick := FMyHandler.btnLastClick;
  this.btnNew.OnClick := FMyHandler.btnNewClick;
  this.btnSave.OnClick := FMyHandler.btnSaveClick;
  this.btnDelete.OnClick := FMyHandler.btnDeleteClick;
  this.btnExit.OnClick := FMyHandler.btnExitClick;
  this.btnItemSpecAppendRow.OnClick := FMyHandler.btnItemSpecAppendRowClick;
  this.dts1.OnNewRecord := FMyHandler.dts1NewRecord;
  this.btnItemSpecDelRow.OnClick := FMyHandler.btnItemSpecDelRowClick;
  this.lkupFUnitName.OnClick := FMyHandler.lkupFUnitNameClick;
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
  • 程式模組列表
程式模組名稱 說明
Create 構造器,啟動后運行需初始化設定的內容
PageSwitch 頁面編輯狀態切換的子程式
btnFirstClick 首項按鈕,點選以切換數據集至首項
btnPriorClick 前項按鈕,點選以切換數據集至前項
btnNextClick 後項按鈕,點選以切換數據集至後項
btnLastClick 末項按鈕,點選以切換數據集至末項
btnNewClick 新建按鈕
btnSaveClick 儲存數據
btnDeleteClick 刪除目前顯示的客戶資料
btnUpdateClick 更新客戶資料
btnExitClick 退出目前視窗
btnItemSpecAppendRowClick 規格明細欄新增行
dts1NewRecord 規格明細欄新增行初始化
btnItemSpecDelRowClick 規格明細欄刪除行
lkupFUnitNameClick 計量單位更新
  • Create:構造器,啟動后運行需初始化設定的內容。
constructor TMyHandler.Create(AOwner: TComponent);
begin
  FThis :=TBaseForm(AOwner);
  
  //主數據與明細數據初始賦值
  FThis.dts0.Connection :=dm.DBConnection;
  FThis.dts0.SQL.Text := 'SELECT * FROM Basic_Item WHERE FInterID = :FInterID';
  
  FThis.dts1.Connection := DM.DBConnection;
  FThis.dts1.SQL.Text := 'SELECT * FROM Basic_ItemSpec WHERE FInterID = :FInterID';
  
  //分組資訊數據集初始化
  FThis.dts0FGroup.Connection := dm.DBConnection;
  FThis.dts0FGroup.Close;
  FThis.dts0FGroup.SQL.Text := 'Select FGroupCode + '' '' + FGroupName as FGroupName,FInterID as FGroupID from Basic_ItemGroup where FTypeID = 1';
  FThis.dts0FGroup.Open;
  
  //包裝單位數據集初始化
  FThis.dts0FPackUnit.Connection := dm.DBConnection;
  FThis.dts0FPackUnit.Close;
  FThis.dts0FPackUnit.SQL.Text := 'SELECT a.FName,A.FInterID '
	+ 'FROM dbo.Basic_CommonData A '	
	+ 'INNER JOIN Basic_CommonDataType b ON a.FTypeID = b.FInterID '
	+ 'WHERE b.FDataName = ''' + FThis.siLang1.GetTextW('件單位') + '''';
  FThis.dts0FPackUnit.Open;
  
  //預設倉庫數據集初始化
  FThis.dts0FStockID.Connection := dm.DBConnection;
  FThis.dts0FStockID.Close;
  FThis.dts0FStockID.SQL.Text := 'select FWhsName,FInterID as FStockID from Basic_WHS WHERE isnull(FIsSWH,0)=0';
  FThis.dts0FStockID.Open;
  
  //計量單位數據集初始化
  FThis.dts0FUnit.Connection := dm.DBConnection;
  FThis.dts0FUnit.Close;
  FThis.dts0FUnit.SQL.Text := 'Select FInterID as FUnitID,FUnitCode,FUnitName,FCoefficient from Basic_Unit';
  FThis.dts0FUnit.Open;
  
  //列表數據集初始化
  FThis.dtsList.Connection := dm.DBConnection;
  FThis.dtsList.Close;
  FThis.dtsList.SQL.Text := 'Select FInterID from Basic_Item';
  FThis.dtsList.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
  • PageSwitch:頁面編輯狀態切換的子程式。
procedure TMyHandler.PageSWitch;
//頁面切換子程式
begin
  FThis.dts0.Close;
  FThis.dts0.ParamByName('FInterID').AsString := FThis.dtsList.FieldByName('FInterID').AsString;
  FThis.dts0.Open;

  FThis.dts1.Close;
  FThis.dts1.ParamByName('FInterID').AsString := FThis.dtsList.FieldByName('FInterID').AsString;
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
10
11
  • btnFirstClick:首項按鈕,點選以切換數據集至首項。
procedure TMyHandler.btnFirstClick;
//首項
begin
  FThis.dtsList.First;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnPriorClick:前項按鈕,點選以切換數據集至前項。
procedure TMyHandler.btnPriorClick;
//前項
begin
  FThis.dtsList.Prior;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnNextClick:後項按鈕,點選以切換數據集至後項。
procedure TMyHandler.btnNextClick;
//後項
begin
  FThis.dtsList.Next;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnLastClick:末項按鈕,點選以切換數據集至末項。
procedure TMyHandler.btnLastClick;
//末項
begin
  FThis.dtsList.Last;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnNewClick:新建按鈕。
procedure TMyHandler.btnNewClick;
//新增
var
  vGroupID: String;
begin
  //獲取分組ID並賦值
  vGroupID := FThis.dts0.FieldByName('FGroupID').AsString;
  FThis.dts0.Append;
  FThis.dts0.FieldByName('FInterID').AsInteger := dm.GetNodeID;
  FThis.dts0.FieldByName('FGroupID').AsString := vGroupID;
  FThis.dts0.Post;
  
  FThis.dts1.Close;
  FThis.dts1.ParamByName('FInterID').AsString := FThis.dts0.FieldByName('FInterID').AsString;
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  • btnSaveClick:儲存數據。
procedure TMyHandler.btnSaveClick;
//儲存
Var
  vdts: TRFDataSet;
begin
  vdts := TRFDataSet.Create(Nil);
  vdts.Connection := dm.DBConnection;
  try
  	//檢查物料資訊必填欄位是否為空
    if (Trim(FThis.dts0.FieldByName('FItemCode').AsString) = '')
    or (Trim(FThis.dts0.FieldByName('FItemName').AsString) = '')
    Then
    Begin
      ShowMessage(FThis.siLang1.GetTextW('物料程式碼或者物料名稱不能為空!'));
      exit;
    end;
    if (Trim(FThis.dts0.FieldByName('FUnitName').AsString) = '')
    or (Trim(FThis.dts0.FieldByName('FUnitID').AsString) = '')
    or (Trim(FThis.dts0.FieldByName('FUnitCode').AsString) = '')
    or (Trim(FThis.dts0.FieldByName('FUnitPiece').AsString) = '')
    Then
    Begin
      ShowMessage(FThis.siLang1.GetTextW('計量單位或者件單位不能為空,請重新選擇計量單位。'));
      exit;
    end;
    
    //檢查物料程式碼是否有重複
    vdts.Close;
    vdts.SQL.Text := 'SELECT FInterID FROM Basic_Item WHERE FTypeID = 1 AND FItemCode = ' + '''' + FThis.dts0.FieldByName('FItemCode').AsString + '''';
    vdts.Open;
    if (vdts.RecordCount > 0) and (vdts.FieldByName('FInterID').AsInteger <> FThis.dts0.FieldByName('FInterID').AsInteger) Then
    Begin
      ShowMessage(FThis.siLang1.GetTextW('物料程式碼重複,請對物料程式碼重新編號。'));
      exit;
    end;
    
    //檢查無誤后執行儲存
     
    if FThis.dts1.RecordCount > 0 Then
    Begin
      FThis.dts1.Edit;
      FThis.dts1.Post;
      FThis.dts1.ApplyUpdates(-1);
    End;
    FThis.dts0.Edit;
    FThis.dts0.Post;
    FThis.dts0.ApplyUpdates(-1);
    ShowMessage(FThis.siLang1.GetTextW('數據儲存成功!'));
  Finally
    vdts.Free;
  end;
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
  • btnDeleteClick:刪除目前顯示的客戶資料。
procedure TMyHandler.btnDeleteClick;
//刪除
var
  AStoredProc: TRFStoredProc;
  vRAISEMSG,vMSG: String;
  i, j: Integer;
begin
  //彈出視窗提示是否刪除
  if paxfunc.YesNoMsg(FThis.siLang1.GetTextW('是否刪除該資料?'),FThis.siLang1.GetTextW('提示'))  then 
  begin
  AStoredProc := TRFStoredProc.Create(nil);
  AStoredProc.Connection := dm.DBConnection;
  try
    //預存程序初始化
    AStoredProc.StoredProcName := 'sp_Basic_Item';
    AStoredProc.Prepare;
    if AStoredProc.Prepared then
    begin
      //參數賦值
      AStoredProc.ParamByName('FDataID').AsString := FThis.dts0.FieldByName('FInterID').AsString;
      AStoredProc.ParamByName('Flag').AsString := 'Delete';
      AStoredProc.ParamByName('FUserCode').AsString := FThis.siLang1.GetTextW('admin');
      if AStoredProc.FindParam('FMsg') <> nil then
        AStoredProc.ParamByName('FMsg').AsString := '';
      try
      //執行預存程序
        AStoredProc.ExecProc;
        //意外情況的資訊處理並顯示
       Except on ExceptionMessage:Exception do
       begin
          vRAISEMSG:=ExceptionMessage.Message;
     
          i := Pos('SQMESSAGE', vRAISEMSG);
          j := Pos('[SQL Server]', vRAISEMSG);
          vMSG := Copy(vRAISEMSG, i, Length(vRAISEMSG) - i + 1);
    

          // 非格式化訊息提示
          if i = 0 then
          begin
            ShowMessage(Copy(vRAISEMSG, j + 12, Length(vRAISEMSG) - j + 1));
            Exit;
          end;
        end;
        end;
        //處理完成後重新打開數據集
        FThis.dts0.Open;
        FThis.dts1.Open;
    end;
  finally
    AStoredProc.Free;
  end;  
  
  end;
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
  • btnExitClick:退出目前視窗。
procedure TMyHandler.btnExitClick;
//退出
begin
  FThis.Close;
end;
1
2
3
4
5
  • btnItemSpecAppendRowClick:規格明細欄新增行。
procedure TMyHandler.btnItemSpecAppendRowClick;
//新增行
begin
  FThis.dts1.Append;
end;
1
2
3
4
5
  • dts1NewRecord:規格明細欄新增行初始化。
procedure TMyHandler.dts1NewRecord;
//新增行初始化資訊FInterID,FEntryID賦值
begin
  //FThis.dts1.Edit;
  FThis.dts1.FieldByName('FInterID').AsString := FThis.dts0.FieldByName('FInterID').AsString;
  FThis.dts1.FieldByName('FEntryID').AsInteger := FThis.dts1.RecordCount + 1;
  FThis.dts1.Post;
end;
1
2
3
4
5
6
7
8
  • btnItemSpecDelRowClick:規格明細欄刪除行。
procedure TMyHandler.btnItemSpecDelRowClick;
//刪除行
begin
  if FThis.dts1.RecordCount > 0 Then
    FThis.dts1.Delete;
end;
1
2
3
4
5
6
  • lkupFUnitNameClick:計量單位更新。
procedure TMyHandler.lkupFUnitNameClick;
//計量單位切換時更新相應欄位資訊
begin
  FThis.dts0.Edit;
  FThis.dts0.FieldByName('FUnitID').AsString := FThis.dts0FUnit.FieldByName('FUnitID').AsString;
  FThis.dts0.FieldByName('FUnitCode').AsString := FThis.dts0FUnit.FieldByName('FUnitCode').AsString;  
  FThis.dts0.Post;
end;
1
2
3
4
5
6
7
8

# 3.5.5. 多語言設定

  在功能表欄點選語言-語言設定,打開多語言設定對話方塊,根據提示進行多語言的設定。

# 3.5.6. 運行效果

# 4. 業務單據頁面設定

# 4.1. 銷售訂單查詢-多筆數據主從表單

  銷售訂單頁面設定如下。

# 4.1.1. 功能簡述

  此頁面用於查詢銷售訂單資訊,功能涉及到查詢條件的引入,初始化單據等。

# 4.1.2. 窗體設定

屬性 取值 說明
Caption 銷售訂單 主窗體的標題名稱
Height 768 主窗體的高度(畫素)
Name SalOrder 主窗體模組的名稱
Width 1024 主窗體的寬度(畫素)

# 4.1.3. 控制元件設定

  各表結構欄位及對應的數據感知控制元件名稱如下:

  • 控制元件說明

其中的TBitBtn、TDateTimePicker型別的控制元件需修改Font.Size為12。其中的部分查詢條件需配備對應的TLabel控制元件,設定其Caption屬性,同時設定Font.Size為12,TPanel型別的控制元件需要清除Caption屬性中原有的字元內容。

控制元件名稱 控制元件型別 說明
Panel1 TPanel 面板控制元件,控制元件置於左側,用於放置查詢條件使用的控制元件以及按鈕
dtpBegin TDateTimePicker 設定訂單的起始日期
dtpEnd TDateTimePicker 設定訂單的截止日期
edQuery TEdit 編輯查詢條件客戶程式碼或名稱
edFBillNo TEdit 編輯查詢條件,單據編號
ComboBox1 TComboBox 覈取方塊,單據狀態
btnQuery TBitBtn 查詢按鈕
Caption:查詢
btnClear TBitBtn 清除按鈕
Caption:清除
btnEditor TBitBtn 編輯按鈕
Caption:編輯
btnNew TBitBtn 新建按鈕
Caption:新建
dts1 TRFDataSet 查詢表數據集
ds1 TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dts1
DBGrid1 TDBGrid 銷售訂單數據表格
DataSource:ds1
  • DBGrid1數據表格說明

  在設定表格列之前,使用滑鼠右鍵點選表格,在選項中選擇Custom Columns,轉換為自定義表格後進行設定。點選Columns屬性打開對話方塊,在此處新增欄位。選擇新增的欄位進行屬性的更改。

FieldName
欄位名
Font.Size
字型大小
Title.Caption
標題文字
Title.Font.Size
標題字型大小
Width
列寬度
FStatus 10 狀態 12 60
FBillNo 10 單據編號 12 100
FDate 10 訂單日期 12 80
FSignDate 10 簽訂日期 12 80
FCustCode 10 客戶程式碼 12 80
FCustName 10 客戶名稱 12 140
FDeptName 10 部門名稱 12 80
FEmpName 10 業務員 12 80
FItemCode 10 布種程式碼 12 80
FItemName 10 布種名稱 12 100
FItemSpec 10 規格 12 80
FAuxQty 10 數量 12 64
FUnitName 10 計量單位 12 80
FContractNo 10 合同號 12 80
FBiller 10 制單人 12 80
FCreateDate 10 制單日期 12 140
FChecker 10 審覈人 12 80
FCheckDate 10 審覈日期 12 140
FAuxPrice 10 單價 12 80
FAmount 10 金額 12 80
FDeliverDate 10 交貨日期 12 100

# 4.1.4. 指令碼設計

type
  TMyHandler = class(TForm)
private 
  FThis:TBaseForm; 
Public 
  constructor Create(AOwner: TComponent); override;
  procedure resume;
  procedure ComboBoxSelect;
{模組聲明  MODULE-DECLARE}
  procedure btnQueryClick(Sender: TObject);
  procedure btnClearClick(Sender: TObject);
  procedure btnNewClick(Sender: TObject);
  procedure btnEditorClick(Sender: TObject);
end;

//...

var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
{事件繫結  MODULE-BIND}
  this.btnQuery.OnContextPopup := FMyHandler.btnQueryContextPopup;
  this.btnQuery.OnClick := FMyHandler.btnQueryClick;
  this.btnClear.OnClick := FMyHandler.btnClearClick;
  this.btnNew.OnClick := FMyHandler.btnNewClick;
  this.btnEditor.OnClick := FMyHandler.btnEditorClick;
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
  • 程式模組列表
程式模組名稱 說明
Create 構造器,啟動后運行需初始化設定的內容
resume 恢復查詢條件
ComboBoxSelect 選擇單據狀態
btnQueryClick 查詢按鈕點選,新增查詢條件視窗的資訊執行查詢
btnClearClick 清除按鈕點選,清除查詢條件視窗,並執行查詢
btnNewClick 新建按鈕點選,打開新視窗
btnEditorClick 編輯按鈕點選
  • Create:構造器,啟動后運行需初始化設定的內容。
constructor TMyHandler.Create(AOwner: TComponent);
//設定查詢數據集資訊
begin
  FThis :=TBaseForm(AOwner);
  FThis.dts1.Connection := dm.DBConnection;
  resume;
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
  • resume:恢復查詢條件。
procedure TMyHandler.resume;
//設定數據集SQL,新增查詢條件
begin
  FThis.dts1.SQL.Text := 'select b.FID,b.FInterID,a.FBillID,a.FBillNo,a.FDate,a.FSignDate,' + 
  'a.FCustCode,a.FCustName,a.FDeptName,a.FEmpName,FProductItemCode,FProductItemName,' + 
  'b.FItemCode,b.FItemName,b.FItemSpec,b.FUnitName,b.FAuxQty,a.FContractNo,FSeason,' + 
  'a.FBiller,a.FCreateDate,a.FChecker,a.FCheckDate, case a.FStatus WHEN 0 THEN ''' + FThis.siLang1.GetTextW('已作廢') + 
  ''' WHEN 1 THEN ''' + FThis.siLang1.GetTextW('草 稿') + ''' WHEN 2 THEN ''' + FThis.siLang1.GetTextW('已審覈') + 
  ''' END AS FStatus,a.FClosed,' + 
  'b.FAuxPrice,b.FAmount,FDeliverRemark as FDeliverDate,c.FPrintCount ' + 
  'from SAL_Order a(NOLOCK) ' + 
  'inner join SAL_OrderEntry b(NOLOCK)  on a.FInterID = b.FInterID ' + 
  'Left join (select FDataID,isnull(COUNT(1),0) as FPrintCount from Dict_PrintRecord Group By FDataID) C ' + 
  'on b.FInterID = c.FDataID ' + 
  'Where 1 = 1  ' +
  'Order by a.FDate desc';
  FThis.dts1.AddWhere('a.FDate between ''' + DateToStr(FThis.dtpBegin.DateTime) +  ''' and ''' + 
  DateToStr(FThis.dtpEnd.DateTime) + '''');
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  • ComboBoxSelect:選擇單據狀態。
procedure TMyHandler.ComboBoxSelect;
//選擇單據狀態
begin
   if FThis.ComboBox1.ItemIndex = 0 then
    FThis.dts1.AddWhere('a.FStatus IN (0,1,2)');
  IF FThis.ComboBox1.ItemIndex = 1 Then
    FThis.dts1.AddWhere('a.FStatus = 2' );
  If FThis.ComboBox1.ItemIndex = 2 Then
    FThis.dts1.AddWhere('a.FStatus = 1');
  If FThis.ComboBox1.ItemIndex = 3 Then
    FThis.dts1.AddWhere('a.FStatus = 0'); 
end;
1
2
3
4
5
6
7
8
9
10
11
12
  • btnQueryClick:查詢按鈕點選,新增查詢條件視窗的資訊執行查詢。
procedure TMyHandler.btnQueryClick;
//新增查詢條件視窗的資訊執行查詢
begin
  FThis.dts1.Close;
  resume;
  if FThis.edQuery.Text <> '' Then
    FThis.dts1.AddWhere('a.FCustCode LIKE ''%' + FThis.edQuery.Text + '%'' or a.FCustName LIKE ''%' + FThis.edQuery.Text + '%''');
  if FThis.edFBillNo.Text <> '' Then
    FThis.dts1.AddWhere('a.FBillNo LIKE ''%' + FThis.edFBillNo.Text + '%''');
  ComboBoxSelect;
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
10
11
12
  • btnClearClick:清除按鈕點選,清除查詢條件視窗,並執行查詢。
procedure TMyHandler.btnClearClick;
//清除查詢條件資訊並初始化查詢
begin
  FThis.edQuery.Text :=  '';
  FThis.edFBillNo.Text := '';
  FThis.dts1.Close;
  resume;
  ComboBoxSelect;
  FThis.dts1.Open;  
end;
1
2
3
4
5
6
7
8
9
10
  • btnNewClick:新建按鈕點選,打開新視窗。
procedure TMyHandler.btnNewClick;
//新建
var
  F: TBaseForm;
  vInterID: Integer;
begin
  //打開編輯視窗
  F := paxfunc.OpenForm('SalOrderEdit');
  //與目前視窗建立連線
  F.TagObject := FThis;
  //設定初始狀態為草稿編輯狀態
  F.Tag := -1;
  //啟用目標視窗的定時器功能
  TTimer(F.FindComponent('Timer1')).Enabled := True;  
  //獲取唯一ID
  vInterID := dm.GetNodeID;
  //打開目標視窗數據集
  TRFDataSet(F.FindComponent('dts0')).ParamByName('FInterID').AsInteger :=  vInterID;
  TRFDataSet(F.FindComponent('dts0')).Open;
  TRFDataSet(F.FindComponent('dts0')).Append;
  //初始賦值
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FBillID').AsInteger := 12020002;
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FBillNo').AsString := dm.GetBillNo('12020002',now,True);
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FDate').AsDateTime := Date;
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FSignDate').AsDateTime := Date;
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FContractNo').AsString := TRFDataSet(F.FindComponent('dts0')).FieldByName('FBillNo').AsString;
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FExchangeRate').AsInteger := 1;
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FStatus').AsInteger := 1;
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FClosed').AsInteger  :=  0;
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FBiller').AsString := FThis.siLang1.GetTextW('admin');
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FCreateDate').AsDateTime := now;
  //明細數據集初始賦值
  TRFDataSet(F.FindComponent('dts1')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dts1')).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
  • btnEditorClick:編輯按鈕點選。
procedure TMyHandler.btnEditorClick;
//編輯
var
  F: TBaseForm;
  vInterID: Integer;
begin
  //打開編輯視窗
  F := paxfunc.OpenForm('SalOrderEdit');
  //與目前視窗建立連線
  F.TagObject := FThis;
  //數據集初始賦值
  TRFDataSet(F.FindComponent('dts0')).ParamByName('FInterID').AsInteger :=  FThis.dts1.FieldByName('FInterID').AsInteger;
  TRFDataSet(F.FindComponent('dts0')).Open;
  //獲取單據狀態,根據狀態設定視窗的編輯模式
  F.Tag := TRFDataSet(F.FindComponent('dts0')).FieldByName('FStatus').AsInteger;
  TTimer(F.FindComponent('Timer1')).Enabled := True; 
   //數據集獲取
  TRFDataSet(F.FindComponent('dts1')).ParamByName('FInterID').AsInteger := FThis.dts1.FieldByName('FInterID').AsInteger;
  TRFDataSet(F.FindComponent('dts1')).Open;
  //獲取單據列表資訊並定位單據位置
  While TRFDataSet(F.FindComponent('dtsList')).FieldByName('FInterID').AsString <> FThis.dts1.FieldByName('FInterID').AsString do
  begin
    TRFDataSet(F.FindComponent('dtsList')).Next;
  end;
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

# 4.1.5. 多語言設定

  在功能表欄點選語言-語言設定,打開多語言設定對話方塊,根據提示進行多語言的設定。

# 4.1.6. 運行效果

# 4.2. 銷售訂單編輯-多筆數據主從表單

  銷售訂單編輯頁面設定如下。

# 4.2.1. 功能簡述

  此頁面用於編輯銷售訂單的資訊,執行審覈、列印等操作,功能涉及到視窗數據集的數據匯入、查詢表數據的引入、審覈、消審功能的預存程序的引入、視窗列印與Flying列印的引入。

# 4.2.2. 窗體設定

屬性 取值 說明
Caption 銷售訂單編輯 主窗體的標題名稱
Height 768 主窗體的高度(畫素)
Name SalOrderEdit 主窗體模組的名稱
Width 1024 主窗體的寬度(畫素)

# 4.2.3. 控制元件設定

  各表結構欄位及對應的控制元件名稱如下:

  • 主視窗控制元件說明

  其中的TBitBtn、TGroupBox、TComboBox、TDateTimePicker型別的控制元件需修改Font.Size為12,TPanel型別的控制元件需要清除Caption屬性中原有的字元內容。

控制元件名稱 控制元件型別 說明
MainMenu1 TMainMenu 功能表控制元件,用於建立功能表欄目
Panel1 TPanel 面板控制元件,頂部按鈕佈局容器
Panle2 TPanel 面板控制元件,訂單資訊佈局容器
Panel3 TPanel 面板控制元件,頂部佈局,顯示訂單日期,狀態資訊等控制元件的佈局容器
GroupBox1 TGroupBox 分組框控制元件,設定顯示訂單資訊的數據感知控制元件
PageControl1 TPageControl 標籤頁面分組控制元件,設定頁面訂單的資訊在頁面空白處右鍵單擊選擇New Page新增標籤頁TabSheet
TabSheet1 TTabSheet PageControl1中的標籤頁面1
Caption:訂單明細
TabSheet2 TTabSheet PageControl1中的標籤頁面2
Caption:訂單要求
TabSheet3 TTabSheet PageControl1中的標籤頁面3
Caption:裝運及包裝要求
TabSheet4 TTabSheet PageControl1中的標籤頁面4
Caption:附件
btnNew TBitBtn 新建按鈕,點選以新建銷售訂單
Caption:新建
btnFirst TBitBtn 首項按鈕,點選跳轉至記錄的首頁
Caption:首項
btnPrior TBitBtn 前項按鈕,點選跳轉至記錄的前項
Caption:前項
btnNext TBitBtn 後項按鈕,點選跳轉至記錄的後項
Caption:後項
btnLast TBitBtn 末項按鈕,點選跳轉至記錄的末項
Caption:末項
btnSave TBitBtn 儲存按鈕,點選以儲存單據的更改
Caption:儲存
btnExit TBitBtn 退出按鈕,點選以退出視窗
Caption:退出
ComboBoxPrinter TComboBox 用於顯示印表機列表
Visible:控制元件是否可見,設定為False
btnNew TBitBtn 新建按鈕,點選以新建客戶資料
Caption:新建
dtpdts0FDate TDateTimePicker 顯示訂單日期
dts0 TRFDataSet 銷售訂單主表數據集
ds0 TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dts0
dtsFStatus TRFDataSet 狀態表數據集
dsFStatus TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsFStatus
dtsFStatus TRFDataSet 狀態表數據集
dsFStatus TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsFStatus
dtsFSaleType TRFDataSet 銷售型別數據集
dsFSaleType TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsFSaleType
dtsFCustID TRFDataSet 客戶名稱數據集
dsFCustID TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsFCustID
dtsFCurrencyID TRFDataSet 幣種資料數據集
dsFCurrencyID TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsFCurrencyID
dtsFDeptID TRFDataSet 部門名稱數據集
dsFDpetID TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsFDeptID
dtsFEmpID TRFDataSet 業務員名稱數據集
dsFEmpID TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsFDeptEmpID
dtsList TRFDataSet 銷售訂單單據資訊數據集
dtsCompany TRFDataSet 公司資料數據集資訊
Timer1 TTimer 定時器
Timer2 TTimer 定時器
  • MainMenu1設計內容

  選擇功能表控制元件,右鍵點選選擇Edit,打開視窗設計頁面。在此頁面中,點選功能表項,然後點選+按鈕,會在選擇的功能表目錄下方新增一個功能表專案。最終新增的功能表專案如下圖所示。每新增一個功能表專案后,可選擇此功能表專案,在左側的屬性檢視器中修改控制元件的Caption屬性。

控制元件名稱 功能表名稱 說明
MenuItem1 功能 功能分組功能表欄
  miCheck 審覈 審覈功能表欄
  miUnCheck 消審 消審功能表欄
  miRevoke 作廢 作廢功能表欄
  miRecover 還原 還原功能表欄
  miDelete 刪除 刪除功能表欄
FlyingPrint Flying列印 執行Flying列印
  miReportDesign 設計列印格式 列印格式設計
  miReportPrint 列印 列印
  • 主視窗數據感知控制元件說明

  此頁面中首頁繫結的數據源DataSource為ds0,所有涉及到文字顯示的控制元件的文字大小屬性Font.Size修改爲12。由於數據感知控制元件不包含標籤顯示,故每放置一個字元編輯型別的數據感知控制元件前,需要先放置一個TLabel控制元件,並將其Caption屬性設定為數據欄位對應的中文名稱,同樣也需要將其 Font.Size修改爲12。

數據欄位名稱 中文名稱 對應控制元件型別 控制元件名稱 備註
FSaleType 銷售型別 TDBLookupComboBox lkupdts0FSaleType 列表繫結的數據源
ListSource:dsFSaleType
列表顯示的欄位名
ListField:FName
列表對應返回的欄位值
KeyField: FName
FStatus 狀態 TDBLookupComboBox lkupdts0FSaleType 列表繫結的數據源
ListSource:dsFStatus
列表顯示的欄位名
ListField:FName
列表對應返回的欄位值
KeyField: FID
FBillNo 單據編號 TDBEdit eddts0FBillNo ReadOnly:False
FCustID 客戶名稱 TDBLookupComboBox lkupdts0FCustID 列表繫結的數據源
ListSource:dsFCustID
列表顯示的欄位名
ListField:FCustName
列表對應返回的欄位值
KeyField:FCustID
FContractNo 合同號 TDBEdit eddts0FContractNo
FCurrencyID 幣種 TDBLookupComboBox lkupdts0FCurrencyID 列表繫結的數據源
ListSource:dsFCurrencyID
列表顯示的欄位名
ListField:FCurrencyName
列表對應返回的欄位值
KeyField:FCurrencyID
FDeptID 部門名稱 TDBLookupComboBox lkupdts0FDeptID 列表繫結的數據源
ListSource:dsFDeptID
列表顯示的欄位名
ListField:FDeptName
列表對應返回的欄位值
KeyField:FDeptID
FEmpID 部門名稱 TDBLookupComboBox lkupdts0FEmpID 列表繫結的數據源
ListSource:dsFEmpID
列表顯示的欄位名
ListField:FEmpName
列表對應返回的欄位值
KeyField:FEmpID
FExchangeRate 匯率 TDBEdit eddts0FExchangeRate
FNote 備註 TDBMemo mmdts0FNote
  • TabSheet1控制元件說明

  其中的TBitBtn型別的控制元件需修改Font.Size為12。TPanel型別的控制元件需要清除Caption屬性中原有的字元內容。

控制元件名稱 控制元件型別 說明
Panel4 TPanel 佈局控制元件,佈局于頂部位置,放置按鈕
btnDelRow TBitBtn 刪除行
btnCopyRow TBitBtn 複製行
btnImportItem TBitBtn 匯入物料
dts1 TRFDataSet 銷售訂單明細數據集
ds1 TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dts1
DBGrid1 TDBGrid 銷售訂單明細數據表格
DataSource:ds1
  • DBGrid1數據表格說明

  在設定表格列之前,使用滑鼠右鍵點選表格,在選項中選擇Custom Columns,轉換為自定義表格後進行設定。點選Columns屬性打開對話方塊,在此處新增欄位。選擇新增的欄位進行屬性的更改。

FieldName
欄位名
Font.Size
字型大小
Title.Caption
標題文字
Title.Font.Size
標題字型大小
Width
列寬度
FEntryID 10 序號 12 64
FItemCode 10 布種程式碼 12 80
FItemName 10 布種名稱 12 100
FItemSpec 10 規格 12 100
FUnitName 10 計量單位 12 64
FColorName 10 顏色名稱 12 80
FColorNo 10 色號 12 80
FWidth 10 門幅 12 80
FWidthInfo 10 門幅說明 12 80
FWeightOfLength 10 克重 12 80
FQtyPiece 10 件數 12 80
FUnitPiece 10 件單位 12 64
FAuxQty 10 數量 12 80
FAuxPrice 10 單價 12 80
FAmount 10 金額 12 80
FNote 10 備註 12 80
FDeliverDate 10 交貨日期 12 100
  • TabSheet2控制元件說明
控制元件名稱 控制元件型別 說明
Panel5 TPanel 佈局控制元件,佈局于頂部位置,放置說明資訊
Caotion;訂單要求
Alignment(對齊方式):taLeftJustify
  • TabSheet2數據感知控制元件說明

  此頁面中首頁繫結的數據源DataSource為ds0,控制元件的文字大小屬性Font.Size修改爲12。由於數據感知控制元件不包含標籤顯示,需要先放置一個TLabel控制元件,並將其Caption屬性設定為數據欄位對應的中文名稱,同樣也需要將其 Font.Size修改爲12。

數據欄位名稱 中文名稱 對應控制元件型別 控制元件名稱 備註
FOrderRequest 訂單要求 TDBMemo mmdts0FOrderRequest
  • TabSheet3控制元件說明

TDateTimePicker控制元件需設定顯示的文字大小屬性Font.Size為12。

控制元件名稱 控制元件型別 說明
dtsPort TRFDataSet 港口資訊數據集
dsPort TDataSource 數據源控制元件,用於對接數據感知控制元件,其DataSet屬性設定為dtsPort
dtpdts0FSignDate TDateTimePicker 簽訂日期的設定
  • TabSheet3數據感知控制元件說明

  此頁面中首頁繫結的數據源DataSource為ds0,控制元件的文字大小屬性Font.Size修改爲12。由於數據感知控制元件不包含標籤顯示,需要先放置一個TLabel控制元件,並將其Caption屬性設定為數據欄位對應的中文名稱,同樣也需要將其 Font.Size修改爲12。

數據欄位名稱 中文名稱 對應控制元件型別 控制元件名稱 備註
FSignAddr 簽訂地點 TDBEdit eddts0FSignAddr
FBeginPort 出發港口 TDBLookupComboBox lkupdtts0FBeginPort 列表繫結的數據源
ListSource:dsPort
列表顯示的欄位名
ListField:FName
列表對應返回的欄位值
KeyField:FName
FEndPort 目的港口 TDBLookupComboBox lkupdts0FEndPort 列表繫結的數據源
ListSource:dsPort
列表顯示的欄位名
ListField:FName
列表對應返回的欄位值
KeyField:FName
FTrafficType 運輸方式 TDBEdit eddts0FTrafficType
FPacket 包裝方式 TDBMemo mmFPacket
  • TabSheet4控制元件說明

TBitBtn型別的控制元件需設定按鈕文字大小Font.Size為12。

控制元件名稱 控制元件型別 說明
btnUpload TBitBtn 上傳按鈕
btnClear TBitBtn 清除圖片
OpenPictureDialog TOpenPictureDialog 打開圖片對話方塊
  • TabSheet4數據感知控制元件說明

  此頁面中首頁繫結的數據源DataSource為ds0。

數據欄位名稱 中文名稱 對應控制元件型別 控制元件名稱 備註
FImage 訂單圖片 TDBImage DBImage1

  其中需要注意的是DBImage1,需額外設定其Font屬性,將其顏色修改爲白色,並將其Color屬性設定為clWhite以掩蓋控制元件名稱的標識。

# 4.2.4. 指令碼設計

type
  TMyHandler = class(TForm)
private 
  FThis:TBaseForm; 
Public 
  constructor Create(AOwner: TComponent); override;
{模組聲明  MODULE-DECLARE}
  procedure RefState(aState: Integer);
  procedure DataSetRowCopy(QDataSet: TRFDataSet);
  procedure PageSwitch;
  procedure ManuRefresh;
  procedure DoBillBusness(aFlag: String);
  procedure btnNewClick(Sender: TObject);
  procedure btnFirstClick(Sender: TObject);
  procedure btnPriorClick(Sender: TObject);
  procedure btnNextClick(Sender: TObject);
  procedure btnLastClick(Sender: TObject);
  procedure btnSaveClick(Sender: TObject);
  procedure btnExitClick(Sender: TObject);
  procedure miCheckClick(Sender: TObject);
  procedure miUnCheckClick(Sender: TObject);
  procedure miRevokeClick(Sender: TObject);
  procedure miRecoverClick(Sender: TObject);
  procedure miDeleteClick(Sender: TObject);
  procedure FlyingPrintClick(Sender: TObject);
  procedure btnDelRowClick(Sender: TObject);
  procedure btnCopyRowClick(Sender: TObject);
  procedure btnImportItemClick(Sender: TObject);
  procedure miReportDesignClick(Sender: TObject);
  procedure miReportPrintClick(Sender: TObject);
  procedure Timer1Timer(Sender: TObject);
  procedure dts0BeforeEdit(DataSet: TDataSet);
  procedure dts1BeforeEdit(DataSet: TDataSet);
  procedure lkupdts0FCustIDClick(Sender: TObject);
  procedure dtpdts0FDateChange(Sender: TObject);
  procedure dtpdts0FSignDateChange(Sender: TObject);
  procedure dts1NewRecord(DataSet: TDataSet);
  procedure FlyingReceived(ASender: TObject; AType: string; AContent: string);
  procedure Timer2Timer(Sender: TObject);
  procedure btnUploadClick(Sender: TObject);
  procedure btnClearClick(Sender: TObject);
end;

//....

var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
{事件繫結  MODULE-BIND}
  this.btnNew.OnClick := FMyHandler.btnNewClick;
  this.btnFirst.OnClick := FMyHandler.btnFirstClick;
  this.btnPrior.OnClick := FMyHandler.btnPriorClick;
  this.btnNext.OnClick := FMyHandler.btnNextClick;
  this.btnLast.OnClick := FMyHandler.btnLastClick;
  this.btnSave.OnClick := FMyHandler.btnSaveClick;
  this.btnExit.OnClick := FMyHandler.btnExitClick;
  this.miCheck.OnClick := FMyHandler.miCheckClick;
  this.miUnCheck.OnClick := FMyHandler.miUnCheckClick;
  this.miRevoke.OnClick := FMyHandler.miRevokeClick;
  this.miRecover.OnClick := FMyHandler.miRecoverClick;
  this.miDelete.OnClick := FMyHandler.miDeleteClick;
  this.FlyingPrint.OnClick := FMyHandler.FlyingPrintClick;
  this.btnDelRow.OnClick := FMyHandler.btnDelRowClick;
  this.btnCopyRow.OnClick := FMyHandler.btnCopyRowClick;
  this.btnImportItem.OnClick := FMyHandler.btnImportItemClick;
  this.miReportDesign.OnClick := FMyHandler.miReportDesignClick;
  this.miReportPrint.OnClick := FMyHandler.miReportPrintClick;
  this.Timer1.OnTimer := FMyHandler.Timer1Timer;
  this.dts0.BeforeEdit := FMyHandler.dts0BeforeEdit;
  this.dts1.BeforeEdit := FMyHandler.dts1BeforeEdit;
  this.lkupdts0FCustID.OnClick := FMyHandler.lkupdts0FCustIDClick;
  this.dtpdts0FDate.OnChange := FMyHandler.dtpdts0FDateChange;
  this.dtpdts0FSignDate.OnChange := FMyHandler.dtpdts0FSignDateChange;
  this.dts1.OnNewRecord := FMyHandler.dts1NewRecord;
  this.Flying.OnReceived := FMyHandler.FlyingReceived;
  this.Timer2.OnTimer := FMyHandler.Timer2Timer;
  this.btnUpload.OnClick := FMyHandler.btnUploadClick;
  this.btnClear.OnClick := FMyHandler.btnClearClick;
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
  • 程式模組列表
程式模組名稱 說明
Create 構造器,啟動后運行需初始化設定的內容
RefState 重新整理單據的按鈕狀態顯示
DataSetRowCopy 數據集複製行
PageSwitch 頁面切換子程式
ManuRefresh 重新整理顯示
DoBillBusness 執行功能,比如審覈、消審等操作
btnNewClick 新建銷售訂單
btnFirstClick 返回單據首項
btnPriorClick 返回單據的前一項
btnNextClick 返回單據的后一項
btnLastClick 返回單據的末項
btnSaveClick 儲存單據
btnExitClick 退出目前視窗
miCheckClick 審覈功能表項的點選觸發事件
miUnCheckClick 消審功能表項的點選觸發事件
miRevokeClick 作廢功能表項的點選觸發事件
miRecoverClick 還原功能表項的點選觸發事件
miDeleteClick 刪除功能表項的點選觸發事件
FlyingPrintClick Flying列印功能表項的點選觸發事件
btnDelRowClick 刪除行點選觸發事件
btnCopyRowClick 數據集複製行
btnImportItemClick 數據集匯入物料
miReportDesignClick 視窗數據集設計頁面
miReportPrintClick 視窗數據集列印
Timer1Timer 定時器觸發事件,重新整理頁面顯示狀態
dts0BeforeEdit 主數據集啟用編輯前,設定頁面為編輯狀態
dts1BeforeEdit 明細數據集啟用編輯前,設定頁面為編輯狀態
lkupdts0FCustIDClick 客戶名稱在選擇時更新對應的數據集資訊
dtpdts0FDateChange 單據日期變動時變更對應的數據集欄位資訊
dtpdts0FSignDateChange 單據簽訂日期變動時變更對應的數據集欄位資訊
dts1NewRecord 明細數據集新增時進行基礎資料設定
FlyingReceived 當Flying接收到資訊時執行操作
Timer2Timer 定時器觸發事件,執行列印相關的操作
btnUploadClick 上傳圖片按鈕點選事件
btnClearClick 清除圖片按鈕點選事件
  • Create:構造器,啟動后運行需初始化設定的內容。
constructor TMyHandler.Create(AOwner: TComponent);
//數據集初始化
begin
  FThis :=TBaseForm(AOwner);
  //主數據集初始化
  FThis.dts0.Connection := dm.DBConnection;
  FThis.dts0.SQL.Text := 'select a.*,b.FCustName as FCustFullName,b.FAddress,b.FPhone1,' + 
  'b.FHousebank,b.FHouseBnkAct from Sal_Order a(NOLOCK) LEFT JOIN Basic_Cust B ON ' + 
  'A.FCustID = B.FInterID where a.FInterID =:FInterID';
  //明細數據集初始化
  FThis.dts1.Connection := dm.DBConnection;
  FThis.dts1.SQL.Text := 'select a.*,b.FBillNo as FTechnicsNo from Sal_OrderEntry a(NOLOCK) ' + 
  'left join Tex_Technics B on a.FTechnicsID = b.FInterID where a.FInterID =:FInterID  ' + 
  'order by a.FEntryID';
  //單據列表數據集初始化(從主視窗中獲取)
  FThis.dtsList.Connection := dm.DBConnection;
  FThis.dtsList.SQL.Text := 'select FInterID FROM Sal_Order where 1=1';
  FThis.dtsList.Open;
  
  //銷售型別數據集初始化
  FThis.dtsFSaleType.Connection := dm.DBConnection;
  FThis.dtsFSaleType.SQL.Text := 'SELECT a.FName,a.FInterID FROM dbo.Basic_CommonData A ' +
  'INNER JOIN Basic_CommonDataType b ON a.FTypeID = b.FInterID WHERE b.FDataName = ''' + 
  FThis.siLang1.GetTextW('銷售型別') + '''';
  FThis.dtsFSaleType.Open;
  //狀態數據集初始化
  FThis.dtsFStatus.Connection := dm.DBConnection;
  FThis.dtsFStatus.SQL.Text := 'Select FName=''' + FThis.siLang1.GetTextW('已作廢') + 
  ''',FID = 0 union Select FName=''' + FThis.siLang1.GetTextW('草 稿') + 
  ''',FID = 1 union  Select FName=''' + FThis.siLang1.GetTextW('已審覈') + 
  ''',FID = 2 ORDER  BY FID desc';
  FThis.dtsFStatus.Open;
  //客戶資料數據集初始化
  FThis.dtsFCustID.Connection := dm.DBConnection;
  FThis.dtsFCustID.SQL.Text := 'select a.FCustCode,a.FShortName as FCustName,a.FCustName ' + 
  'as FCustFullName,a.FEmpCode,a.FEmpName,a.FAddress,a.FPhone1,a.FPhone2,a.FTel,a.FContacts,' + 
  'a.FHouseBank,a.FHouseBnkAct, A.FDeptCode,A.FDeptName,a.FInterID as FCustID,a.FEmpID,a.FDeptID, ' + 
  'A.FSettleID,A.FSettleName,A.FPayItemID,A.FPayItemName,A.FSaleType, a.FSaleType as FOrderType ' + 
  'from Basic_Cust A left join Basic_employee b on a.FEmpID = b.FInterID where isnull(a.FfrozenFor,0) = 0 ' + 
  'order by FCustCode';
  FThis.dtsFCustID.Open;
  
  //部門數據集初始化
  FThis.dtsFDeptID.Connection := dm.DBConnection;
  FThis.dtsFDeptID.SQL.Text := 'SELECT FGroupID as FDeptID,FGroupCode as FDeptCode,FGroupName as FDeptName ' + 
  'FROM Dict_GroupInfo';
  FThis.dtsFDeptID.Open;
  
  //業務員數據集初始化
  FThis.dtsFEmpID.Connection := dm.DBConnection;
  FThis.dtsFEmpID.SQL.Text := 'SELECT FInterID as FEmpID,FEmpCode,FEmpName FROM Basic_Employee';
  FThis.dtsFEmpID.Open;
  
  //幣種數據集初始化
  FThis.dtsFCurrencyID.Connection := dm.DBConnection;
  FThis.dtsFCurrencyID.SQL.Text := 'SELECT FCode as FCurrencyCode,FName as FCurrencyName,FInterID AS ' +
  'FCurrencyID,FExRate AS FExchangeRate FROM Basic_Currency';
  FThis.dtsFCurrencyID.Open;  
  
  //港口數據集初始化
  FThis.dtsPort.Connection := dm.DBConnection;
  FThis.dtsPort.SQL.Text := 'SELECT a.FName,a.FInterID FROM dbo.Basic_CommonData A INNER JOIN Basic_CommonDataType ' + 
  'b ON a.FTypeID = b.FInterID WHERE b.FDataName = ''' + FThis.siLang1.GetTextW('港口') + '''';
  FThis.dtsPort.Open; 
  
  //公司資料初始化
  FThis.dtsCompany.Connection := dm.DBConnection;
  FThis.dtsCompany.SQL.Text := 'select top 1 * FROM Basic_Company';
  FThis.dtsCompany.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
  • RefState:重新整理單據的按鈕狀態顯示。
//單據狀態發生變化時,啟用或者禁用部分按鈕
procedure TMyHandler.RefState(aState: Integer);
begin
  FThis.Tag := aState;
  if aState = -1 then
  //草稿編輯狀態
  begin
    FThis.btnFirst.Enabled := False;
    FThis.btnPrior.Enabled := False;
    FThis.btnNext.Enabled := False;
    FThis.btnLast.Enabled := False;
    FThis.btnNew.Enabled := False;
    FThis.btnSave.Enabled := True;
    FThis.btnUpload.Enabled := True;
    FThis.btnDelRow.Enabled := True;
    FThis.btnCopyRow.Enabled := True;
    FThis.btnImportItem.Enabled := True;
    FThis.btnClear.Enabled := True;
    
    //控制元件控制
    FThis.ds0.AutoEdit := True;
    FThis.ds1.AutoEdit := True;  
  end;
  if aState = 1 then
  //草稿狀態
  begin
    FThis.btnFirst.Enabled := True;
    FThis.btnPrior.Enabled := True;
    FThis.btnNext.Enabled := True;
    FThis.btnLast.Enabled := True;
    FThis.btnNew.Enabled := True;
    FThis.btnSave.Enabled := False;
    FThis.btnUpload.Enabled := True;
    FThis.btnDelRow.Enabled := True;
    FThis.btnCopyRow.Enabled := True;
    FThis.btnImportItem.Enabled := True;
    FThis.btnClear.Enabled := True;
    
    //控制元件控制
    FThis.ds0.AutoEdit := True;
    FThis.ds1.AutoEdit := True;  
  end;
  if aState = 2 then
  //審覈狀態
  begin
    FThis.btnFirst.Enabled := True;
    FThis.btnPrior.Enabled := True;
    FThis.btnNext.Enabled := True;
    FThis.btnLast.Enabled := True;
    FThis.btnNew.Enabled := True;
    FThis.btnSave.Enabled := False;
    FThis.btnUpload.Enabled := False;
    FThis.btnDelRow.Enabled := False;
    FThis.btnCopyRow.Enabled := False;
    FThis.btnImportItem.Enabled := False;
    FThis.btnClear.Enabled := False;
    
    //控制元件控制
    FThis.ds0.AutoEdit := False;
    FThis.ds1.AutoEdit := False;  
  end;
  if aState = 0 then
  //作廢狀態
  begin
    FThis.btnFirst.Enabled := True;
    FThis.btnPrior.Enabled := True;
    FThis.btnNext.Enabled := True;
    FThis.btnLast.Enabled := True;
    FThis.btnNew.Enabled := True;
    FThis.btnSave.Enabled := False;
    FThis.btnUpload.Enabled := False;
    FThis.btnDelRow.Enabled := False;
    FThis.btnCopyRow.Enabled := False;
    FThis.btnImportItem.Enabled := False;
    FThis.btnClear.Enabled := False;
    
    //控制元件控制
    FThis.ds0.AutoEdit := False;
    FThis.ds1.AutoEdit := False;  
  end;
  ManuRefresh;
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
  • DataSetRowCopy:數據集複製行。
//複製行功能
procedure TMyHandler.DataSetRowCopy(QDataSet: TRFDataSet);
var
  curRec: array of Variant;
  i: Integer;
begin
  if QDataSet.IsEmpty then
    Exit;
  //設定長度
  SetLength(curRec, QDataSet.FieldCount);
  for i := 0 to length(curRec)-1 do
    curRec[i] := QDataSet.Fields[i].value;
  QDataSet.Edit;
  try
    QDataSet.Append;
    for i := 0 to length(curRec)-1 do
    begin
      QDataSet.Edit;
      if (curRec[i] <> null) and (QDataSet.Fields[i].IsNull) then
        QDataSet.Fields[i].value := curRec[i];
    end;
    QDataSet.Post;
  finally
  end;
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
  • PageSwitch:頁面切換子程式。
procedure TMyHandler.PageSwitch;
//切換頁面的相關準備
begin
  FThis.dts0.Close;
  FThis.dts0.ParamByName('FInterID').AsString := FThis.dtsList.FieldByName('FInterID').AsString;
  FThis.dts0.Open;
  FThis.dts1.Close;
  FThis.dts1.ParamByName('FInterID').AsString := FThis.dtsList.FieldByName('FInterID').AsString;
  FThis.dts1.Open;
  
  ManuRefresh;
  
  RefState(FThis.dts0.FieldByName('FStatus').AsInteger);  
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  • ManuRefresh:重新整理顯示。
//未設定數據感知的控制元件顯示資料庫數據資訊。
procedure TMyHandler.ManuRefresh;
begin
  FThis.dtpdts0FDate.DateTime := FThis.dts0.FieldByName('FDate').AsDateTime;
  FThis.dtpdts0FSignDate.DateTime := FThis.dts0.FieldByName('FDate').AsDateTime;
end;
1
2
3
4
5
6
  • DoBillBusness:執行功能,比如審覈、消審等操作。
//審覈、消審等操作
procedure TMyHandler.DoBillBusness(aFlag: String);
var
  ADataSet: TRFDataSet;
  AStoredProc: TRFStoredProc;
  sOptName: String;
  strSQL: String;
  iReturnFlag: Integer;
  iReturnMsg: String;
  i, j: Integer;
  vRAISEMSG: string;
  vMSG: string;
  Field: TField;
begin
  { 執行預存程序 sp_XXXX }
  { sp_XXXX @ProcID, @DataID, @UserID }
    sOptName := AFlag;

  AStoredProc := TRFStoredProc.Create(nil);
  AStoredProc.Connection := dm.DBConnection;
  try
    //預存程序準備
    AStoredProc.StoredProcName := 'sp_Sal_Order';
    AStoredProc.Prepare;
    if AStoredProc.Prepared then
    begin
    //參數賦值
      AStoredProc.ParamByName('ProcID').AsString := sOptName;
      AStoredProc.ParamByName('DataID').AsString := FThis.dts0.FieldByName('FInterID').AsString;
      AStoredProc.ParamByName('UserID').AsString := FThis.siLang1.GetTextW('admin');
      if AStoredProc.FindParam('SQResult') <> nil then
        AStoredProc.ParamByName('SQResult').AsString := '';
      try
      //執行預存程序
        AStoredProc.ExecProc;
        //意外情況資訊反饋的字串處理
       Except on ExceptionMessage: Exception do
       begin 
          vRAISEMSG:=ExceptionMessage.Message;
     
          i := Pos('SQMESSAGE', vRAISEMSG);
          j := Pos('[SQL Server]', vRAISEMSG);
          vMSG := Copy(vRAISEMSG, i, Length(vRAISEMSG) - i + 1);
    

          // 非格式化訊息提示
          if i = 0 then
          begin
            ShowMessage(Copy(vRAISEMSG, j + 12, Length(vRAISEMSG) - j + 1));
            Exit;
          end;
          end;
        end;
    end;
  finally
    AStoredProc.Free;
  end;
  //重新整理數據集顯示,更新單據編輯狀態
  FThis.dts0.Open;
  FThis.dts1.Open;
  RefState(FThis.dts0.FieldByName('FStatus').AsInteger);
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
  • btnNewClick:新建銷售訂單。
procedure TMyHandler.btnNewClick;
//新建單據
Var
  FInterID: Integer;
begin
  //預留區,如果單據處於編輯狀態,新建按鈕會變成灰色
  FInterID := DM.GetNodeID;
  FThis.dts0.Close;
  FThis.dts0.ParamByName('FInterID').AsInteger := FInterID;
  FThis.dts0.Open;
  FThis.dts0.Append;
  //產生單據號初始賦值
  FThis.dts0.FieldByName('FInterID').AsInteger := FInterID;
  FThis.dts0.FieldByName('FBillID').AsInteger := 12020002;
  FThis.dts0.FieldByName('FBillNo').AsString := dm.GetBillNo('12020002',now,True);
  FThis.dts0.FieldByName('FDate').AsDateTime := Date;
  FThis.dts0.FieldByName('FSignDate').AsDateTime := Date;
  FThis.dts0.FieldByName('FContractNo').AsString := FThis.dts0.FieldByName('FBillNo').AsString;
  FThis.dts0.FieldByName('FExchangeRate').AsInteger := 1;
  FThis.dts0.FieldByName('FStatus').AsInteger := 1;
  FThis.dts0.FieldByName('FClosed').AsInteger := 0;
  FThis.dts0.FieldByName('FBiller').AsString := FThis.siLang1.GetTextW('admin');
  FThis.dts0.FieldByName('FCreateDate').AsDateTime := now; 
  FThis.dts0.Post;
  //明細數據集賦值
  FThis.dts1.Close;
  FThis.dts1.ParamByName('FInterID').AsString := FThis.dts0.FieldByName('FInterID').AsString;
  FThis.dts1.Open;
  //更新編輯狀態
  RefState(-1);
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
  • btnFirstClick:返回單據首項。
procedure TMyHandler.btnFirstClick;
//首頁
begin
  FThis.dtsList.First;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnPriorClick:返回單據的前一項。
//前項
procedure TMyHandler.btnPriorClick;
begin
  FThis.dtsList.Prior;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnNextClick:返回單據的后一項。
//後項
procedure TMyHandler.btnNextClick;
begin
  FThis.dtsList.Next;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnLastClick:返回單據的末項。
//末項
procedure TMyHandler.btnLastClick;
begin
  FThis.dtsList.Last;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnSaveClick:儲存單據。
//儲存
procedure TMyHandler.btnSaveClick;
//儲存
Var
  vdts: TRFDataSet;
  vSQL: String;
Begin
    //檢查明細數據集是否為空,以及必填欄位資訊是否為空
    FThis.dts1.Edit;
    FThis.dts1.Post;
    if FThis.dts1.RecordCount = 0 Then
    Begin 
      ShowMessage(FThis.siLang1.GetTextW('明細數據不能為空!'));
      Exit;
    End;
    if (Trim(FThis.dts0.FieldByName('FCustID').AsString) = '')
    or (Trim(FThis.dts0.FieldByName('FDeptID').AsString) = '')
  	Then
  	Begin
    	ShowMessage(FThis.siLang1.GetTextW('客戶名稱不能為空!'));
    	exit;
  	end;
   //檢查明細數據集中的各記錄的必填欄位是否為空
    FThis.dts1.First;
    While not FThis.dts1.Eof Do
    Begin
      if (Trim(FThis.dts1.FieldByName('FItemID').AsString)='')
      or (Trim(FThis.dts1.FieldByName('FAmount').AsString)='')
      Then
      Begin
        ShowMessage(FThis.siLang1.GetTextW('物料資訊不能為空!'));
        Exit;
      End;
      FThis.dts1.Next;
    End;
    
    //執行儲存,檢查是否有重複單據存在
    vdts :=TRFDataSet.Create(Nil);
    try
      vdts.Connection := dm.DBConnection;
      vdts.SQL.Text := 'SELECT FInterID FROM Sal_Order WHERE FInterID =' + FThis.dts0.FieldByName('FInterID').AsString;
      vdts.Open;
      if vdts.RecordCount = 0 Then
        FThis.dts0.FieldByName('FBillNo').AsString := dm.GetBillNo('12020002',now,False);

      DataSetSort(FThis.dts1,'FEntryID'); 
      //儲存明細資訊
      if FThis.dts1.RecordCount > 0 Then
      Begin
        FThis.dts1.Edit;
        FThis.dts1.Post;
    	FThis.dts1.ApplyUpdates(-1);
      End;
      //儲存主數據集資訊
      FThis.dts0.Edit;
      FThis.dts0.Post;
      FThis.dts0.ApplyUpdates(-1);
      ShowMessage(FThis.siLang1.GetTextW('數據儲存成功!'));
      RefState(1);
    Finally
      vdts.Free;
    End;
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
  • btnExitClick:退出目前視窗。
//退出視窗
procedure TMyHandler.btnExitClick;
begin
  FThis.Close;
end;
1
2
3
4
5
  • miCheckClick:審覈功能表項的點選觸發事件。
//審覈
procedure TMyHandler.miCheckClick;
begin
  DoBillBusness('Check');
end;
1
2
3
4
5
  • miUnCheckClick:消審功能表項的點選觸發事件。
//消審
procedure TMyHandler.miUnCheckClick;
begin
  DoBillBusness('UnCheck');
end;
1
2
3
4
5
  • miRevokeClick:作廢功能表項的點選觸發事件。
//作廢
procedure TMyHandler.miRevokeClick;
begin
  DoBillBusness('Revoke');
end;
1
2
3
4
5
  • miRecoverClick:還原功能表項的點選觸發事件。
//還原
procedure TMyHandler.miRecoverClick;
begin
  DoBillBusness('Recover');
end;
1
2
3
4
5
  • miDeleteClick:刪除功能表項的點選觸發事件。
procedure TMyHandler.miDeleteClick;
begin
//刪除
  DoBillBusness('Delete');
end;
1
2
3
4
5
  • FlyingPrintClick:Flying列印功能表項的點選觸發事件。
//執行Flying列印,獲取列印列表
procedure TMyHandler.FlyingPrintClick;
begin
  FThis.Flying.GetPrintList;
end;
1
2
3
4
5
  • btnDelRowClick:刪除行點選觸發事件。
//刪除行
procedure TMyHandler.btnDelRowClick;
begin
  //啟用編輯狀態
  RefState(-1);
  if FThis.dts1.RecordCount = 0 then
  Begin
    ShowMessage(FThis.siLang1.GetTextW('無可刪除的明細數據!'));
    Exit;
  End;
  FThis.dts1.Delete;
end;
1
2
3
4
5
6
7
8
9
10
11
12
  • btnCopyRowClick:數據集複製行。
//複製行
procedure TMyHandler.btnCopyRowClick;
begin
  //啟用編輯狀態
  RefState(-1);
  DataSetRowCopy(FThis.dts1);
end;
1
2
3
4
5
6
7
  • btnImportItemClick:數據集匯入物料。
procedure TMyHandler.btnImportItemClick;
//匯入窗體設定
var
  F: TBaseForm;
begin
  //打開匯入物料編輯頁面
  F := paxfunc.OpenForm('ImportItem');
  //建立連線
  F.TagObject := FThis;
end;
1
2
3
4
5
6
7
8
9
10
  • miReportDesignClick:視窗數據集設計頁面。
procedure TMyHandler.miReportDesignClick;
//設計列印格式
begin
  paxfunc.ShowReport('Smart',FThis,'','',False,False);
end;
1
2
3
4
5
  • miReportPrintClick:視窗數據集列印。
procedure TMyHandler.miReportPrintClick;
//執行列印預覽
begin
  paxfunc.ShowReport('Smart',FThis,'','786BFF0A-2E61-48D3-8E19-8AAE86660B21',False,True);  
end;
1
2
3
4
5
  • Timer1Timer:定時器觸發事件,重新整理頁面顯示狀態。
//設定打開時的模式
procedure TMyHandler.Timer1Timer;
begin
  FThis.Timer1.Enabled := False;
  RefState(FThis.Tag);
end;
1
2
3
4
5
6
  • dts0BeforeEdit:主數據集啟用編輯前,設定頁面為編輯狀態。
//啟用主數據集編輯模式前設定窗體為編輯模式
procedure TMyHandler.dts0BeforeEdit;
begin
  RefState(-1);
end;
1
2
3
4
5
  • dts1BeforeEdit:明細數據集啟用編輯前,設定頁面為編輯狀態。
//啟用明細數據集編輯模式前設定窗體為編輯模式
procedure TMyHandler.dts1BeforeEdit;
begin
  RefState(-1);
end;
1
2
3
4
5
  • lkupdts0FCustIDClick:客戶名稱在選擇時更新對應的數據集資訊。
procedure TMyHandler.lkupdts0FCustIDClick;
//客戶資訊更新時更新相關聯的欄位,比如部門,業務員,銷售型別等資訊
begin
  if FThis.ds0.AutoEdit then
  begin
    FThis.dts0.Edit;
    FThis.dts0.FieldByName('FCustCode').AsString := FThis.dtsFCustID.FieldByName('FCustCode').AsString;
    FThis.dts0.FieldByName('FCustName').AsString := FThis.dtsFCustID.FieldByName('FCustName').AsString;
    FThis.dts0.FieldByName('FDeptID').AsString := FThis.dtsFCustID.FieldByName('FDeptID').AsString;
    FThis.dts0.FieldByName('FDeptCode').AsString := FThis.dtsFCustID.FieldByName('FDeptCode').AsString;
    FThis.dts0.FieldByName('FDeptName').AsString := FThis.dtsFCustID.FieldByName('FDeptName').AsString;
    FThis.dts0.FieldByName('FEmpID').AsString := FThis.dtsFCustID.FieldByName('FEmpID').AsString;
    FThis.dts0.FieldByName('FEmpCode').AsString := FThis.dtsFCustID.FieldByName('FEmpCode').AsString;
    FThis.dts0.FieldByName('FEmpName').AsString := FThis.dtsFCustID.FieldByName('FEmpName').AsString;
    FThis.dts0.FieldByName('FSaleType').AsString := FThis.dtsFCustID.FieldByName('FSaleType').AsString;
  end;  
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  • dtpdts0FDateChange:單據日期變動時變更對應的數據集欄位資訊。
procedure TMyHandler.dtpdts0FDateChange;
//將日期資訊更新至數據集中
begin
  if FThis.ds0.AutoEdit then
  begin
    FThis.dts0.FieldByName('FDate').AsDateTime := FThis.dtpdts0FDate.DateTime;
  end; 
end;
1
2
3
4
5
6
7
8
  • dtpdts0FSignDateChange:單據簽訂日期變動時變更對應的數據集欄位資訊。
procedure TMyHandler.dtpdts0FSignDateChange;
//將日期資訊更新至數據集中
begin
  if FThis.ds0.AutoEdit then
  begin
    FThis.dts0.FieldByName('FSignDate').AsDateTime := FThis.dtpdts0FSignDate.DateTime;
  end; 
end;
1
2
3
4
5
6
7
8
  • dts1NewRecord:明細數據集新增時進行基礎資料設定。
procedure TMyHandler.dts1NewRecord;
//新增行時進行初始化賦值
begin
  FThis.dts1.FieldByName('FID').AsInteger := dm.GetNodeID;
  FThis.dts1.FieldByName('FInterID').AsInteger := FThis.dts0.FieldByName('FInterID').AsInteger;
  FThis.dts1.FieldByName('FEntryID').AsInteger := FThis.dts1.RecordCount + 1;
  FThis.dts1.FieldByName('FClosed').AsInteger := 0;
  FThis.dts1.FieldByName('FState').AsInteger := 0;
end;
1
2
3
4
5
6
7
8
9
  • FlyingReceived:當Flying接收到資訊時執行操作。
procedure TMyHandler.FlyingReceived;
//Flying接收資訊並執行
var
  F: TBaseForm;
begin
  //獲取列印列表
  if AType='GetPrintList' then
  begin
    FThis.ComboBoxPrinter.Items.CommaText := AContent;
    if FThis.ComboBoxPrinter.Items.Count <> 0  Then
    FThis.ComboBoxPrinter.ItemIndex := 0;
    //FThis.ComboBoxPrinter.DroppedDown := True;
    FThis.Timer2.Enabled := True;
  end
  //獲取檔案的地址資訊
  else if AType='GetFileUrl' then
  begin
    paxfunc.DownLoadFile(AContent,'report.pdf');
    F := paxfunc.OpenForm('PDFViewer');
    F.TagObject := FThis;
    TPDFViewer(F.FindComponent('PDFViewer')).LoadFromFile('report.pdf');
  end
  //返回錯誤資訊
  else if AType='Error' then
    Showmessage(AContent);
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
  • Timer2Timer:定時器觸發事件,執行列印相關的操作。
procedure TMyHandler.Timer2Timer;   
//定時器事件,用於載入數據集併發送至Flying執行列印預覽
begin
  FThis.Timer2.Enabled := False;
  FThis.Flying.PrinterName := FThis.ComboBoxPrinter.Items.Strings[FThis.ComboBoxPrinter.ItemIndex];
  FThis.Flying.AddPrintData(FThis.dts0,'A');
  FThis.Flying.AddPrintData(FThis.dts1,'B');
  FThis.Flying.AddPrintData(FThis.dtsCompany,'C');
  FThis.Flying.ReportPreview;
end;
1
2
3
4
5
6
7
8
9
10
  • btnUploadClick:上傳圖片按鈕點選事件。
procedure TMyHandler.btnUploadClick;
//上傳圖片
begin
  if FThis.OpenPictureDialog.Execute(0) then
  begin
    FThis.dts0.Edit;
    TBlobField(FThis.dts0.FieldByName('FImage')).LoadFromFile(FThis.OpenPictureDialog.FileName);
    FThis.dts0.Post;
  end;
end;
1
2
3
4
5
6
7
8
9
10
  • btnClearClick:清除圖片按鈕點選事件。
procedure TMyHandler.btnClearClick; 
//清空圖片
begin
  FThis.dts0.Edit;
  TBlobField(FThis.dts0.FieldByName('FImage')).Clear;
  FThis.dts0.Post;
end;
1
2
3
4
5
6
7

# 4.2.5. 多語言設定

  在功能表欄點選語言-語言設定,打開多語言設定對話方塊,根據提示進行多語言的設定。

# 4.2.6. 報表設定

  Smart中使用兩種方式來實現報表的引入。

  • 窗體引入:使用Smart的自定程式paxfunc.ShowReport來匯入視窗。如果是要打開設計模式的視窗,在指令碼中引入如下所示的指令碼即可打開列印格式管理界面。
  paxfunc.ShowReport('Smart',FThis,'','',False,False);
1

使用以上方式打開對應的界面。

  在界面中會顯示目前頁面對應的可用列印格式的資訊,如需要新增列印格式,點選新建按鈕新增一行,新增的行中修改報表的名稱,修改後點選儲存按鈕。然後點選設計格式進入到報表設計頁面中進行報表設計。

  如需要引用設計的列印格式執行列印或列印預覽操作,在設計完成後返回至報表設計的界面,複製報表的報表ID欄位,在指令碼中執行如下的程式碼。以下程式碼以列印預覽為例。

  paxfunc.ShowReport('Smart',FThis,'','786BFF0A-2E61-48D3-8E19-8AAE86660B21',False,True);  
1
  • Flying引入

  單據支援Flying引入,實體中已經介紹過指令碼中的使用方式,在Flying服務端需要引入列印格式進行設計。

  打開Flying服務端,點選列印設定-HTTP列印,檢查設定是否與客戶端的保持一致,點選應用儲存設定。

  點選列印設定-報表設計按鈕,在右側的報表列表中右鍵單擊,選擇新建報表。

  在對話方塊中輸入報表的名稱,此處輸入Sal_Order,然後點選OK按鈕。

  在列表中選擇剛才建立的報表項,右鍵點選,在選項中選擇數據構造,打開數據構造界面。首先設定好連線設定,點選連線按鈕。

  待連線按鈕變成灰色后,在SQL中輸入使用的數據集的SQL指令碼。

--dts0
select TOP 1 a.*,b.FCustName as FCustFullName,
b.FAddress,b.FPhone1,
b.FHousebank,b.FHouseBnkAct 
from Sal_Order a(NOLOCK) 
LEFT JOIN Basic_Cust B ON 
A.FCustID = B.FInterID   


--dts1
SELECT TOP 1 * FROM Sal_OrderEntry

--dtsCompany
SELECT TOP 1 * FROM Basic_Company
1
2
3
4
5
6
7
8
9
10
11
12
13
14

  輸入完成後,點選執行SQL,等待下方的編輯框中出現欄位資訊后,點選應用返回至上一界面,在界面中點選儲存數據。

  在報表設計界面中雙擊Sal_Order,打開報表設計界面進行設計。

  設計完成後,Smart端可直接使用指定的設定執行列印設定操作。

# 4.2.7. 運行效果

# 5. 匯入窗體設定

# 5.1. 匯入布種資料-多筆數據表單

  此頁面為匯入窗體,由其他窗體來呼叫打開。

# 5.1.1. 功能簡述

  此匯入視窗頁面顯示布種資料的相關資訊,該頁面涉及到主從表的設計相關的資訊以及選擇按鈕點選后的數據傳遞方式的設計說明。

# 5.1.2. 窗體設定

屬性 取值 說明
Caption 匯入布種資料 主窗體的標題名稱
Height 600 主窗體的高度(畫素)
Name ImportItem 主窗體模組的名稱
Width 800 主窗體的寬度(畫素)

  各表結構欄位及對應的數據感知控制元件名稱如下,其中的TBitBtn、TLabeledEdit型別的控制元件需修改Font.Size為12,TPanel型別的控制元件需要清除Caption屬性中原有的字元內容。

# 5.1.3. 控制元件設定

  • 控制元件說明
控制元件名稱 控制元件型別 說明
Panel1 TPanel 頂部面板顯示,用於放置控制元件容器
edQuery TLabeledEdit 查詢輸入框,用於輸入布種程式碼與名稱
TextHint:輸入布種程式碼或名稱
EditLabel.Caption:布種程式碼或名稱
btnQuery TBitBtn 查詢按鈕,點選以根據條件進行查詢。
Caption:查詢
btnClear TBitBtn 清除按鈕,點選以清除查詢內容恢復至初始狀態。
Caption:清除
btnRefresh TBitBtn 重新整理按鈕,點選以重新整理顯示。
Caption:重新整理
btnShowAll TBitBtn 顯示全部按鈕,點選以顯示全部內容。
Caption:顯示全部
btnExit TBitBtn 退出按鈕,點選以退出目前窗體。
Caption:退出
dts0 TRFDataSet 數據集控制元件,展示布種分類 Basic_ItemGroup
dts1 TRFDataSet 數據集控制元件,展示布種資料 Basic_Item
ds0 TDataSource 數據源控制元件,繫結數據集
DataSet:dts0
ds1 TDataSource 數據源控制元件,繫結數據集
DataSet:dts1
Spliter1 TSpliter 分隔控制元件,用於分隔數據表格控制元件
DBGrid1 TDBGrid 布種分組數據表格
DataSource:ds0
DBGrid2 TDBGrid 布種資訊數據表格
DataSource:ds1
  • DBGrid1數據表格說明

  在設定表格列之前,使用滑鼠右鍵點選表格,在選項中選擇Custom Columns,轉換為自定義表格後進行設定。點選Columns屬性打開對話方塊,在此處新增欄位。選擇新增的欄位進行屬性的更改。

FieldName
欄位名
Font.Size
字型大小
Title.Caption
標題文字
Title.Font.Size
標題字型大小
Width
列寬度
FGroupName 10 分組名稱 12 90
FGroupCode 10 分組程式碼 12 80
  • DBGrid2數據表格說明

  在設定表格列之前,使用滑鼠右鍵點選表格,在選項中選擇Custom Columns,轉換為自定義表格後進行設定。點選Columns屬性打開對話方塊,在此處新增欄位。選擇新增的欄位進行屬性的更改。

FieldName
欄位名
Font.Size
字型大小
Title.Caption
標題文字
Title.Font.Size
標題字型大小
Width
列寬度
FItemCode 10 物料程式碼 12 80
FItemName 10 物料名稱 12 140
FItemSpec 10 規格 12 80
FUnitName 10 單位 12 80
FUnitPiece 10 件單位 12 64
FforzenFor 10 凍結 12 64

# 5.1.4. 指令碼設計

type
  TMyHandler = class(TForm)
private 
  FThis:TBaseForm; 
Public 
  constructor Create(AOwner: TComponent); override;
{模組聲明  MODULE-DECLARE}

  procedure btnSelectClick(Sender: TObject);
  procedure btnQueryClick(Sender: TObject);
  procedure btnClearClick(Sender: TObject);
  procedure btnRefreshClick(Sender: TObject);
  procedure btnShowAllClick(Sender: TObject);
  procedure btnExitClick(Sender: TObject);
  procedure DBGrid1CellClick(Column: TColumn);
end;

//...

var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
{事件繫結  MODULE-BIND}

  this.btnSelect.OnClick := FMyHandler.btnSelectClick;
  this.btnQuery.OnClick := FMyHandler.btnQueryClick;
  this.btnClear.OnClick := FMyHandler.btnClearClick;
  this.btnRefresh.OnClick := FMyHandler.btnRefreshClick;
  this.btnShowAll.OnClick := FMyHandler.btnShowAllClick;
  this.btnExit.OnClick := FMyHandler.btnExitClick;
  this.DBGrid1.OnCellClick := FMyHandler.DBGrid1CellClick;
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
  • 程式模組列表
程式模組名稱 說明
Create 構造器,啟動后運行需初始化設定的內容
btnSelectClick 選擇按鈕點選
btnQueryClick 查詢按鈕點選
btnClearClick 清除按鈕點選
btnRefershClick 重新整理按鈕點選
btnShowAll 顯示全部按鈕點選
btnExitClick 退出按鈕點選
DBGrid1CellClick 點選切換分類顯示
  • Create:構造器,啟動后運行需初始化設定的內容。
constructor TMyHandler.Create(AOwner: TComponent);
//初始化數據集(物料分類與物料資訊)
begin
  FThis :=TBaseForm(AOwner);
  FThis.dts0.Connection := dm.DBConnection;
  FThis.dts1.Connection := dm.DBConnection;
  FThis.dts0.SQL.Text := 'Select FInterID,FGroupCode,FGroupName,FNote,FTreeKeyID,FTreeParenteID,' + 
  'FAbsoluteIndex From Basic_ItemGroup WHERE FTypeID = 1 Order by FGroupCode';
  FThis.dts0.Open;
  FThis.dts0.First;
  FThis.dts1.SQL.Text := 'SELECT * FROM Basic_Item WHERE FTypeID = 1';
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
  • btnSelectClick:選擇按鈕點選。
//選擇
procedure TMyHandler.btnSelectClick;
//選擇后將選項中的欄位資訊傳遞至主視窗的數據集中
var
  i: Integer;
begin
  //數據集不能為空
  if FThis.dts1.RecordCount = 0 then
    exit;
  //目標數據集新增記錄並進行數據集資訊傳遞
  TRFDataSet(TBaseForm(FThis.TagObject).FindComponent('dts1')).Append;
  TRFDataSet(TBaseForm(FThis.TagObject).FindComponent('dts1')).FieldByName('FItemID').AsString := FThis.dts1.FieldByName('FInterID').AsString;
  TRFDataSet(TBaseForm(FThis.TagObject).FindComponent('dts1')).FieldByName('FItemCode').AsString := FThis.dts1.FieldByName('FItemCode').AsString;
  TRFDataSet(TBaseForm(FThis.TagObject).FindComponent('dts1')).FieldByName('FItemName').AsString := FThis.dts1.FieldByName('FItemName').AsString;
  TRFDataSet(TBaseForm(FThis.TagObject).FindComponent('dts1')).FieldByName('FItemSpec').AsString := FThis.dts1.FieldByName('FItemSpec').AsString;
  TRFDataSet(TBaseForm(FThis.TagObject).FindComponent('dts1')).FieldByName('FUnitID').AsString := FThis.dts1.FieldByName('FUnitID').AsString;
  TRFDataSet(TBaseForm(FThis.TagObject).FindComponent('dts1')).FieldByName('FUnitCode').AsString := FThis.dts1.FieldByName('FUnitCode').AsString;
  TRFDataSet(TBaseForm(FThis.TagObject).FindComponent('dts1')).FieldByName('FUnitName').AsString := FThis.dts1.FieldByName('FUnitName').AsString;
  TRFDataSet(TBaseForm(FThis.TagObject).FindComponent('dts1')).Post;
  //現視窗中將已選擇的記錄刪除
  FThis.dts1.Delete;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  • btnQueryClick:查詢按鈕點選。
//查詢,將編輯框中輸入的內容作為查詢條件進行查詢
procedure TMyHandler.btnQueryClick;
begin
  FThis.dts1.Close;
  FThis.dts1.SQL.Text :=  'SELECT * FROM Basic_Item WHERE (FItemCode LIKE  ''%' + 
  FThis.edQuery.Text + '%'' or FItemName LIKE ''%' + FThis.edQuery.Text + 
  '%'')  AND FTypeID = 1 Order by FItemCode';
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
  • btnClearClick:清除按鈕點選。
//清除查詢條件資訊
procedure TMyHandler.btnClearClick;
begin
   FThis.edQuery.Text := '';
   FThis.dts1.SQL.Text := 'SELECT * FROM Basic_Item WHERE FTypeID = 1';
   FThis.dts1.Open;
end;
1
2
3
4
5
6
7
  • btnRefershClick:重新整理按鈕點選。
//重新整理顯示,功能與初次查詢的功能類似
procedure TMyHandler.btnRefreshClick;
begin
  FThis.dts0.SQL.Text := 'Select FInterID,FGroupCode,FGroupName,FNote,FTreeKeyID,FTreeParenteID,' +
  'FAbsoluteIndex From Basic_ItemGroup WHERE FTypeID = 1 Order by FGroupCode';
  FThis.dts0.Open;
  FThis.dts0.First;
  FThis.dts1.SQL.Text := 'SELECT * FROM Basic_Item WHERE FTypeID = 1';
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
10
  • btnShowAll:顯示全部按鈕點選。
//顯示全部記錄,取消篩選
procedure TMyHandler.btnShowAllClick;
begin
  FThis.dts1.Filtered := False;
end;
1
2
3
4
5
  • btnExitClick:退出按鈕點選。
//退出視窗
procedure TMyHandler.btnExitClick;
begin
  FThis.Close;
end;

1
2
3
4
5
6
  • DBGrid1CellClick:切換分類顯示。
procedure TMyHandler.DBGrid1CellClick;
begin
//分類檢視
  FThis.dts1.Filtered := False;
  FThis.dts1.Filter := 'FGroupID = ' + FThis.dts0.FieldByName('FInterID').AsString;
  FThis.dts1.Filtered := True;
end;
1
2
3
4
5
6
7

# 5.1.5. 多語言設定

  在功能表欄點選語言-語言設定,打開多語言設定對話方塊,根據提示進行多語言的設定。

# 5.1.6. 運行效果

# 5.2. 文件檢視

  該頁面用於顯示文件內容。

# 5.2.1. 功能簡述

  此頁面不能單獨運行,需要由其他視窗呼叫並傳遞PDF的相關參數才可以正常運行。

# 5.2.2. 窗體設定

屬性 取值 說明
Caption 文件檢視 主窗體的標題名稱
Height 768 主窗體的高度(畫素)
Name PDFViewer 主窗體模組的名稱
Width 1024 主窗體的寬度(畫素)

# 5.2.3. 控制元件設定

  • 控制元件說明
控制元件名稱 控制元件型別 說明
PDFViewer TPDFViewer 設定PDF檢視
Align:alClient

# 5.2.4. 指令碼設計

  目前視窗無額外指令碼設計內容。

# 5.2.5. 多語言設定

  在功能表欄點選語言-語言設定,打開多語言設定對話方塊,根據提示進行多語言的設定。

# 5.2.6. 運行效果

RestAPI
系統函式

← RestAPI 系統函式→

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