纺织印染业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.
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;
2
3
4
- imgbtnCompanyClick:公司资料按钮点击。
procedure TMyHandler.imgbtnCompanyClick;
//点击打开公司资料模块页面
var
//定义一个基类窗体
F: TBaseForm;
begin
//打开窗体名称为Company的窗口
F := paxfunc.OpenForm('Company');
//打开的窗口与当前窗口建立链接
F.TagObject := FThis;
end;
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;
2
3
4
5
6
7
8
- imgbtnItemClick:布种资料按钮点击。
procedure TMyHandler.imgbtnItemClick;
//打开布种资料
var
F: TBaseForm;
begin
F := paxfunc.OpenForm('Item');
F.TagObject := FThis;
end;
2
3
4
5
6
7
8
- imgbtnSalOrderClick: 销售订单资料点击。
procedure TMyHandler.imgbtnSalOrderClick;
//打开销售订单
var
F: TBaseForm;
begin
F := paxfunc.OpenForm('SalOrder');
F.TagObject := FThis;
end;
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.
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;
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;
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;
2
3
4
5
6
7
8
9
10
- btnEditClick:编辑按钮的点击事件。
procedure TMyHandler.btnEditClick;
//修改
begin
RefState(True);
end;
2
3
4
5
- btnExitClick:退出按钮的点击事件。
procedure TMyHandler.btnExitClick;
//退出
begin
FThis.Close;
end;
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;
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;
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.
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;
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;
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;
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;
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;
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;
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;
2
3
4
5
6
7
8
9
10
- btnShowAllClick:显示全部的点击事件,去除所有分类显示条目。
procedure TMyHandler.btnShowAllClick;
//设置数据集筛选,取消筛选条件
begin
FThis.dts1.Filtered := False;
end;
2
3
4
5
- btnExitClick:退出的点击事件,退出并关闭当前窗口。
procedure TMyHandler.btnExitClick;
//退出
begin
FThis.Close;
end;
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;
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 中的标签页面1Caption :概览 |
TabSheet2 | TTabSheet | PageControl1 中的标签页面2Caption :客户收货地址 |
TabSheet3 | TTabSheet | PageControl1 中的标签页面3Caption :关系人员 |
TabSheet4 | TTabSheet | PageControl1 中的标签页面3Caption :客户产品 |
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.
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;
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;
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;
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;
2
3
4
5
6
- btnPriorClick:前项按钮,点击以切换数据集至前项
//切换前项
procedure TMyHandler.btnPriorClick;
begin
FThis.dtsList.Prior;
PageSwitch;
end;
2
3
4
5
6
- btnNextClick:后项按钮,点击以切换数据集至后项。
//切换后项
procedure TMyHandler.btnNextClick;
begin
FThis.dtsList.Next;
PageSwitch;
end;
2
3
4
5
6
- btnLastClick:末项按钮,点击以切换数据集至末项 。
//切换末项
procedure TMyHandler.btnLastClick;
begin
FThis.dtsList.Last;
PageSwitch;
end;
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;
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;
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;
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;
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;
2
3
4
5
- btnCustAddrsAppendRowClick:客户收货地址新增行。
procedure TMyHandler.btnCustAddrsAppendRowClick;
//新增行
begin
FThis.dtsCustAddrs.Append;
end;
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;
2
3
4
5
6
7
- btnCustAddrsDelRowClick:客户收货地址删除当前选择行。
procedure TMyHandler.btnCustAddrsDelRowClick;
//删除
begin
FThis.dtsCustAddrs.Delete;
end;
2
3
4
5
- btnCustRelationAppendRowClick:客户关系人员新增行。
procedure TMyHandler.btnCustRelationAppendRowClick;
//客户关系新增行
begin
FThis.dtsCustRelation.Append;
end;
2
3
4
5
- btnCustRelationDelRowClick:客户关系人人员删除行。
procedure TMyHandler.btnCustRelationDelRowClick;
//客户关系删除行
begin
FThis.dtsCustRelation.Delete;
end;
2
3
4
5
- btnCustMaterialAppendRowClick:客户产品新增行。
procedure TMyHandler.btnCustMaterialAppendRowClick;
//客户物料新增行
begin
FThis.dtsCustMaterial.Append;
end;
2
3
4
5
- btnCustMaterialDelRowClick:客户产品删除行。
procedure TMyHandler.btnCustMaterialDelRowClick;
//客户物料删除行
begin
FThis.dtsCustMaterial.Delete;
end;
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;
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;
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;
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;
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;
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;
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.
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;
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;
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;
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;
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;
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;
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;
2
3
4
5
6
7
8
9
10
- btnShowAllClick:显示全部的点击事件,去除所有分类显示条目。
procedure TMyHandler.btnShowAllClick;
//显示全部
begin
FThis.dts1.Filtered := False;
end;
2
3
4
5
- btnExitClick:退出的点击事件,退出并关闭当前窗口。
procedure TMyHandler.btnExitClick;
//退出窗口
begin
FThis.Close;
end;
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;
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.
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;
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;
2
3
4
5
6
7
8
9
10
11
- btnFirstClick:首项按钮,点击以切换数据集至首项。
procedure TMyHandler.btnFirstClick;
//首项
begin
FThis.dtsList.First;
PageSwitch;
end;
2
3
4
5
6
- btnPriorClick:前项按钮,点击以切换数据集至前项。
procedure TMyHandler.btnPriorClick;
//前项
begin
FThis.dtsList.Prior;
PageSwitch;
end;
2
3
4
5
6
- btnNextClick:后项按钮,点击以切换数据集至后项。
procedure TMyHandler.btnNextClick;
//后项
begin
FThis.dtsList.Next;
PageSwitch;
end;
2
3
4
5
6
- btnLastClick:末项按钮,点击以切换数据集至末项。
procedure TMyHandler.btnLastClick;
//末项
begin
FThis.dtsList.Last;
PageSwitch;
end;
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;
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;
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;
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;
2
3
4
5
- btnItemSpecAppendRowClick:规格明细栏新增行。
procedure TMyHandler.btnItemSpecAppendRowClick;
//新增行
begin
FThis.dts1.Append;
end;
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;
2
3
4
5
6
7
8
- btnItemSpecDelRowClick:规格明细栏删除行。
procedure TMyHandler.btnItemSpecDelRowClick;
//删除行
begin
if FThis.dts1.RecordCount > 0 Then
FThis.dts1.Delete;
end;
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;
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.
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;
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;
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;
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;
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;
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;
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;
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 中的标签页面1Caption :订单明细 |
TabSheet2 | TTabSheet | PageControl1 中的标签页面2Caption :订单要求 |
TabSheet3 | TTabSheet | PageControl1 中的标签页面3Caption :装运及包装要求 |
TabSheet4 | TTabSheet | PageControl1 中的标签页面4Caption :附件 |
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.
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;
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;
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;
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;
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;
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;
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;
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;
2
3
4
5
6
- btnPriorClick:返回单据的前一项。
//前项
procedure TMyHandler.btnPriorClick;
begin
FThis.dtsList.Prior;
PageSwitch;
end;
2
3
4
5
6
- btnNextClick:返回单据的后一项。
//后项
procedure TMyHandler.btnNextClick;
begin
FThis.dtsList.Next;
PageSwitch;
end;
2
3
4
5
6
- btnLastClick:返回单据的末项。
//末项
procedure TMyHandler.btnLastClick;
begin
FThis.dtsList.Last;
PageSwitch;
end;
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;
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;
2
3
4
5
- miCheckClick:审核菜单项的点击触发事件。
//审核
procedure TMyHandler.miCheckClick;
begin
DoBillBusness('Check');
end;
2
3
4
5
- miUnCheckClick:消审菜单项的点击触发事件。
//消审
procedure TMyHandler.miUnCheckClick;
begin
DoBillBusness('UnCheck');
end;
2
3
4
5
- miRevokeClick:作废菜单项的点击触发事件。
//作废
procedure TMyHandler.miRevokeClick;
begin
DoBillBusness('Revoke');
end;
2
3
4
5
- miRecoverClick:还原菜单项的点击触发事件。
//还原
procedure TMyHandler.miRecoverClick;
begin
DoBillBusness('Recover');
end;
2
3
4
5
- miDeleteClick:删除菜单项的点击触发事件。
procedure TMyHandler.miDeleteClick;
begin
//删除
DoBillBusness('Delete');
end;
2
3
4
5
- FlyingPrintClick:Flying打印菜单项的点击触发事件。
//执行Flying打印,获取打印列表
procedure TMyHandler.FlyingPrintClick;
begin
FThis.Flying.GetPrintList;
end;
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;
2
3
4
5
6
7
8
9
10
11
12
- btnCopyRowClick:数据集复制行。
//复制行
procedure TMyHandler.btnCopyRowClick;
begin
//启用编辑状态
RefState(-1);
DataSetRowCopy(FThis.dts1);
end;
2
3
4
5
6
7
- btnImportItemClick:数据集导入物料。
procedure TMyHandler.btnImportItemClick;
//导入窗体设置
var
F: TBaseForm;
begin
//打开导入物料编辑页面
F := paxfunc.OpenForm('ImportItem');
//建立连接
F.TagObject := FThis;
end;
2
3
4
5
6
7
8
9
10
- miReportDesignClick:窗口数据集设计页面。
procedure TMyHandler.miReportDesignClick;
//设计打印格式
begin
paxfunc.ShowReport('Smart',FThis,'','',False,False);
end;
2
3
4
5
- miReportPrintClick:窗口数据集打印。
procedure TMyHandler.miReportPrintClick;
//执行打印预览
begin
paxfunc.ShowReport('Smart',FThis,'','786BFF0A-2E61-48D3-8E19-8AAE86660B21',False,True);
end;
2
3
4
5
- Timer1Timer:定时器触发事件,刷新页面显示状态。
//设置打开时的模式
procedure TMyHandler.Timer1Timer;
begin
FThis.Timer1.Enabled := False;
RefState(FThis.Tag);
end;
2
3
4
5
6
- dts0BeforeEdit:主数据集启用编辑前,设置页面为编辑状态。
//启用主数据集编辑模式前设置窗体为编辑模式
procedure TMyHandler.dts0BeforeEdit;
begin
RefState(-1);
end;
2
3
4
5
- dts1BeforeEdit:明细数据集启用编辑前,设置页面为编辑状态。
//启用明细数据集编辑模式前设置窗体为编辑模式
procedure TMyHandler.dts1BeforeEdit;
begin
RefState(-1);
end;
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;
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;
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;
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;
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;
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;
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;
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;
2
3
4
5
6
7
# 4.2.5. 多语言设置
在菜单栏点击语言
-语言设置
,打开多语言设置对话框,根据提示进行多语言的设置。


# 4.2.6. 报表设置
Smart中使用两种方式来实现报表的引入。
- 窗体引入:使用Smart的自定程序
paxfunc.ShowReport
来导入窗口。如果是要打开设计模式的窗口,在脚本中引入如下所示的脚本即可打开打印格式管理界面。
paxfunc.ShowReport('Smart',FThis,'','',False,False);
使用以上方式打开对应的界面。

在界面中会显示当前页面对应的可用打印格式的信息,如需要新增打印格式,点击新建
按钮新增一行,新增的行中修改报表的名称,修改后点击保存
按钮。然后点击设计
格式进入到报表设计页面中进行报表设计。

如需要引用设计的打印格式执行打印或打印预览操作,在设计完成后返回至报表设计的界面,复制报表的报表ID字段,在脚本中执行如下的代码。以下代码以打印预览为例。
paxfunc.ShowReport('Smart',FThis,'','786BFF0A-2E61-48D3-8E19-8AAE86660B21',False,True);
- 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
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.
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;
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;
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;
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;
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;
2
3
4
5
6
7
8
9
10
- btnShowAll:显示全部按钮点击。
//显示全部记录,取消筛选
procedure TMyHandler.btnShowAllClick;
begin
FThis.dts1.Filtered := False;
end;
2
3
4
5
- btnExitClick:退出按钮点击。
//退出窗口
procedure TMyHandler.btnExitClick;
begin
FThis.Close;
end;
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;
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. 运行效果
