爱招飞帮助手册 爱招飞帮助手册
首页
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 系统工具
    • 系统管理
    • 数据库工具
    • 专用模板
    • 外部功能
    • 开发流程
    • 函数代码
  • 开发手册
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 开发手册
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 开发手册
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • 报表设计
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • RestAPI
    • WebSocket
  • 学习手册

    • 安装配置
    • 快速上手
    • 程序架构
    • 界面介绍
    • 功能介绍
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • 预设资料
    • RestAPI说明
    • WebSocket说明
    • MQTT说明
    • Python说明
    • 自定程序
    • 运行卫士
    • 自动化作业
    • 函数程序
    • 控件使用
  • 开发手册
  • FastERP
  • FastWeb
  • Smart
  • PinToo
  • Flying
  • TARS
  • 通用功能

    • Report
    • Script
    • Echarts
    • Chart
    • DB Install
    • HiDesk
    • HiNAT
    • FastBPM
    • ReportBuilder
首页
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 系统工具
    • 系统管理
    • 数据库工具
    • 专用模板
    • 外部功能
    • 开发流程
    • 函数代码
  • 开发手册
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 开发手册
  • 学习手册

    • 基本入门
    • 功能介绍
    • 控件说明
    • 功能用法
    • 专用模板
    • 开发流程
    • 函数程序
  • 开发手册
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • 报表设计
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • RestAPI
    • WebSocket
  • 学习手册

    • 安装配置
    • 快速上手
    • 程序架构
    • 界面介绍
    • 功能介绍
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
  • 学习手册

    • 安装配置
    • 快速上手
    • 界面介绍
    • 功能介绍
    • 预设资料
    • RestAPI说明
    • WebSocket说明
    • MQTT说明
    • Python说明
    • 自定程序
    • 运行卫士
    • 自动化作业
    • 函数程序
    • 控件使用
  • 开发手册
  • FastERP
  • FastWeb
  • Smart
  • PinToo
  • Flying
  • TARS
  • 通用功能

    • Report
    • Script
    • Echarts
    • Chart
    • DB Install
    • HiDesk
    • HiNAT
    • FastBPM
    • ReportBuilder
  • Smart帮助主页
  • 学习手册

    • 基本入门

    • 功能介绍

    • 控件说明

    • 功能用法

    • 专用模板

    • 开发流程

      • 纺织印染业ERP设计实务
        • 1. 系统组成
        • 2. 主页
          • 2.1. 功能简述
          • 2.2. 窗体设置
          • 2.3. 控件设置
          • 2.4. 脚本设计
          • 2.5. 多语言设置
          • 2.6. 运行效果
        • 3. 基础资料页面设置
          • 3.1. 公司资料编辑-单笔数据表单
          • 3.1.1. 功能简述
          • 3.1.2. 窗体设置
          • 3.1.3. 控件设置
          • 3.1.4. 脚本设计
          • 3.1.5. 多语言设置
          • 3.1.6. 运行效果
          • 3.2. 客户资料查询-多笔数据表单
          • 3.2.1. 功能简述
          • 3.2.2. 窗体设置
          • 3.2.3. 控件设置
          • 3.2.4. 脚本设计
          • 3.2.5. 多语言设置
          • 3.2.6. 运行效果
          • 3.3. 客户资料编辑-多笔数据表单
          • 3.3.1. 功能简述
          • 3.3.2. 窗体设置
          • 3.3.3. 控件设置
          • 3.3.4. 脚本设计
          • 3.3.5. 多语言设置
          • 3.3.6. 运行效果
          • 3.4. 布种资料查询-多笔数据表单
          • 3.4.1. 功能简述
          • 3.4.2. 窗体设置
          • 3.4.3. 控件设置
          • 3.4.4. 脚本设计
          • 3.4.5. 多语言设置
          • 3.4.6. 运行效果
          • 3.5. 布种资料编辑-多笔数据表单
          • 3.5.1. 功能简述
          • 3.5.2. 窗体设置
          • 3.5.3. 控件设置
          • 3.5.4. 脚本设计
          • 3.5.5. 多语言设置
          • 3.5.6. 运行效果
        • 4. 业务单据页面设置
          • 4.1. 销售订单查询-多笔数据主从表单
          • 4.1.1. 功能简述
          • 4.1.2. 窗体设置
          • 4.1.3. 控件设置
          • 4.1.4. 脚本设计
          • 4.1.5. 多语言设置
          • 4.1.6. 运行效果
          • 4.2. 销售订单编辑-多笔数据主从表单
          • 4.2.1. 功能简述
          • 4.2.2. 窗体设置
          • 4.2.3. 控件设置
          • 4.2.4. 脚本设计
          • 4.2.5. 多语言设置
          • 4.2.6. 报表设置
          • 4.2.7. 运行效果
        • 5. 导入窗体设置
          • 5.1. 导入布种资料-多笔数据表单
          • 5.1.1. 功能简述
          • 5.1.2. 窗体设置
          • 5.1.3. 控件设置
          • 5.1.4. 脚本设计
          • 5.1.5. 多语言设置
          • 5.1.6. 运行效果
          • 5.2. 文档查看
          • 5.2.1. 功能简述
          • 5.2.2. 窗体设置
          • 5.2.3. 控件设置
          • 5.2.4. 脚本设计
          • 5.2.5. 多语言设置
          • 5.2.6. 运行效果
    • 函数程序

  • 开发手册

目录

纺织印染业ERP设计实务

# Smart 纺织印染业ERP设计实务

  该文档将指导实现在Smart中的单据相关功能。本次我们将在Smart中实现业务系统的功能。

# 1. 系统组成

  以下图片描述本系统的模块组成,其中公司资料、客户资料以及布种资料为对应的基础资料,销售订单为引用以上基础资料生成的单据。除公司资料外,其他的每个模块均包含查询页面以及编辑页面。销售订单中还包括打印的相关设置内容。

  本系统主要实现的功能为在建立公司资料、客户资料、布种资料等基础资料后,实现销售订单的单据的新增、编辑、审核等相关单据功能,并实现单据的打印。

# 2. 主页

  主页页面,其中主要包含主页显示的相关内容。

# 2.1. 功能简述

  主页页面将需要使用到的功能以菜单的形式展现出来,通过与各个对应的模块对接链接,点击功能图标打开对应的功能界面。

# 2.2. 窗体设置

属性 取值 说明
BorderStyle bsDialog 设定窗体边框的类型
Caption 系统展示 主窗体的标题名称
Height 768 主窗体的高度(像素)
Name Main 主窗体模块的名称
Width 1024 主窗体的宽度(像素)

# 2.3. 控件设置

  各结构控件说明如下,所有涉及到文字显示的控件的Font.Size修改为12,TPanel类型的控件需要清除Caption属性中原有的字符内容。

控件名称 控件类型 说明
Panel1 TPanel 顶部面板布局控件。
Caption:欢迎使用爱招飞演示系统
Color:clGradientInactiveCaption
Panel2 TPanel 左侧面板布局控件。作为按钮的容器
BitBtn6 TBitBtn 图片按钮控件。
Align:对齐方式alTop
Caption:快捷入口
Glyph: 图片选择
BitBtn5 TBitBtn 图片按钮控件。
Align:对齐方式alTop
Caption:基础资料
Glyph: 图片选择
BitBtn4 TBitBtn 图片按钮控件。
Align:对齐方式alTop
Caption:销售管理
Glyph: 图片选择
BitBtn3 TBitBtn 图片按钮控件。
Align:对齐方式alTop
Caption:采购管理
Glyph: 图片选择
BitBtn2 TBitBtn 图片按钮控件。
Align:对齐方式alTop
Caption:生产管理
Glyph: 图片选择
BitBtn1 TBitBtn 图片按钮控件。
Align:对齐方式alTop
Caption:财务管理
Glyph: 图片选择
pnCompany TPanel 面板控件,存放公司资料图片按钮
imgbtnCompany TImage 图片控件,显示公司资料图片。
Picture:点击打开图片选择对话框。
Label2 TLabel 显示标签(公司资料)
Caption:公司资料
pnCust TPanel 面板控件,存放客户资料图片按钮
imgbtnCust TImage 图片控件,显示客户资料图片。
Picture:点击打开图片选择对话框。
Label3 TLabel 显示标签(客户资料)
Caption:客户资料
pnItem TPanel 面板控件,存放布种资料图片按钮
imgbtnItem TImage 图片控件,显示布种资料图片。
Picture:点击打开图片选择对话框。
Label4 TLabel 显示标签(布种资料)
Caption:布种资料
pnSalOrder TPanel 面板控件,存放销售订单图片按钮
imgbtnSalOrder TImage 图片控件,显示销售订单资料图片。
Picture:点击打开图片选择对话框。
Label5 TLabel 显示标签(销售订单)
Caption:销售订单

# 2.4. 脚本设计

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

//...

var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
{事件绑定  MODULE-BIND}
  this.imgbtnCompany.OnClick := FMyHandler.imgbtnCompanyClick;
  this.imgbtnCust.OnClick := FMyHandler.imgbtnCustClick;
  this.imgbtnItem.OnClick := FMyHandler.imgbtnItemClick;
  this.imgbtnSalOrder.OnClick := FMyHandler.imgbtnSalOrderClick;
end.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
程序模块名称 说明
Create 构造器,启动后运行需初始化设置的内容
imgbtnCompanyClick 公司资料按钮点击
imgbtnCustClick 客户资料按钮点击
imgbtnItemClick 布种资料按钮点击
imgbtnSalOrderClick 销售订单资料点击
  • Create:构造器,启动后运行需初始化设置的内容。
constructor TMyHandler.Create(AOwner: TComponent);
begin
  FThis :=TBaseForm(AOwner);
end;
1
2
3
4
  • imgbtnCompanyClick:公司资料按钮点击。
procedure TMyHandler.imgbtnCompanyClick;
//点击打开公司资料模块页面
var
//定义一个基类窗体
  F: TBaseForm;
begin
  //打开窗体名称为Company的窗口
  F := paxfunc.OpenForm('Company');
  //打开的窗口与当前窗口建立链接
  F.TagObject := FThis;
end;
1
2
3
4
5
6
7
8
9
10
11
  • imgbtnCustClick:客户资料按钮点击。
procedure TMyHandler.imgbtnCustClick;
//打开客户资料
var
  F: TBaseForm;
begin
  F := paxfunc.OpenForm('Cust');
  F.TagObject := FThis;
end;
1
2
3
4
5
6
7
8
  • imgbtnItemClick:布种资料按钮点击。
procedure TMyHandler.imgbtnItemClick;
//打开布种资料
var
  F: TBaseForm;
begin
  F := paxfunc.OpenForm('Item');
  F.TagObject := FThis;
end;
1
2
3
4
5
6
7
8
  • imgbtnSalOrderClick: 销售订单资料点击。
procedure TMyHandler.imgbtnSalOrderClick;
//打开销售订单
var
  F: TBaseForm;
begin
  F := paxfunc.OpenForm('SalOrder');
  F.TagObject := FThis;
end;
1
2
3
4
5
6
7
8

# 2.5. 多语言设置

  在菜单栏点击语言-语言设置,打开多语言设置对话框,根据提示进行多语言的设置。

# 2.6. 运行效果

# 3. 基础资料页面设置

  基础资料的页面,除公司资料仅包含编辑页面,其余的模块均包含查询页面以及编辑页面。

# 3.1. 公司资料编辑-单笔数据表单

  公司资料编辑页面设置如下。

# 3.1.1. 功能简述

  公司资料用于对公司资料的内容进行编辑,此页面中包含了单笔数据的表单设计模式,数据库图片的展示与引用,图片的对话框引入模式的设计说明。

# 3.1.2. 窗体设置

属性 取值 说明
Caption 公司资料 主窗体的标题名称
Height 768 主窗体的高度(像素)
Name Company 主窗体模块的名称
Width 1024 主窗体的宽度(像素)

# 3.1.3. 控件设置

  各表结构字段及对应的数据感知控件名称如下:

  • 非数据控件说明

  所有涉及到文字显示的控件的Font.Size修改为12,TPanel类型的控件需要清除Caption属性中原有的字符内容。

控件名称 控件类型 说明
Panel1 TPanel 用于顶部的布局,放置单据的操作按钮(保存、修改、退出)
GroupBox1 TGroupBox 左下侧的布局控件,作为公司资料中公司信息部分的数据感知控件的容器
GroupBox2 TGroupBox 右下侧的布局控件,作为公司资料中公司图标的数据感知控件以及配套控件的容器
btnSave TBitBtn 保存按钮,点击此按钮以执行数据集保存程序
Caption:保存
btnEdit TBitBtn 修改按钮,用于启用单据编辑模式
Caption:修改
btnExit TBitBtn 退出按钮,用于退出当前单据页面
Caption:退出
btnUpload TBitBtn 上传按钮,用于打开图片上传对话框页面
Caption:上传图片
btnClearPicture TBitBtn 清除按钮,用于清除数据集中的图片
Caption:清除
OpenPictureDialog TOpenPictureDialog 对话框控件,用于打开图片选择对话框
dts0 TRFDataSet Basic_Company表对应的数据集
ds0 TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dts0
  • 数据控件说明 Basic_Company

  以下数据感知控件在设置时需将DataSource控件指定为ds0,所有涉及到文字显示的控件的Font.Size修改为12。由于数据感知控件不包含标签显示,故每放置一个字符编辑类型的数据感知控件前,需要先放置一个TLabel控件,并将其Caption属性设置为数据字段对应的中文名称,同样也需要将其 Font.Size修改为12。

数据字段名称 中文名称 对应控件类型 控件名称 备注
FCompanyID 公司编号 TDBEdit edtFCompanyID
FCompanyCode 公司代号 TDBEdit edtFCompanyCode
FComanyName 简体名称 TDBEdit edtFCompanyName
FComanyNameTW 繁体名称 TDBEdit edtFCompanyNameTW
FCompanyNameEn 英文名称 TDBEdit edtFCompanyNameEn
FContact 负责人 TDBEdit edtFContact
FCurrenty 本位币 TDBComboBox cbFCurrenty
FPhone1 电话1 TDBEdit edtFPhone1
FRemovedDate 结账日期 TDBEdit edtFRemovedDate
FPhone2 电话2 TDBEdit edtFPhone2
FTaxType 税率类别 TDBComboBox cbFTaxType
FFax 传真号码 TDBEdit edtFFax
FTaxRate 税率 TDBEdit edtFTaxRate
FEmail 邮箱 TDBEdit edtFEmail
FCompanyAddr 简体地址 TDBEdit edtFCompanyAddr
FCompanyAddrTW 繁体地址 TDBEdit edtFCompanyAddrTW
FCompanyAddrEn 英文地址 TDBEdit edtFCompanyAddrEn
FUrl 公司主页 TDBEdit edtFUrl
FBank 开户银行 TDBEdit edtFBank
FAccountNo 开户账号 TDBEdit edtFAccountNo
FZip 邮编号码 TDBEdit edtFZip
FTaxID 税号 TDBEdit edtFTaxID
FCompanyLogo 公司图标 TDBImage CompanyLogo

  其中需要注意的是FCompanyLogo,需额外设置其Font属性,将其颜色修改为白色,并将其Color属性设置为clWhite以掩盖控件名称的标识。

# 3.1.4. 脚本设计

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

//...

var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
{事件绑定  MODULE-BIND}
  this.btnSave.OnClick := FMyHandler.btnSaveClick;
  this.btnEdit.OnClick := FMyHandler.btnEditClick;
  this.btnExit.OnClick := FMyHandler.btnExitClick;
  this.btnUpload.OnClick := FMyHandler.btnUploadClick;
  this.btnClearPicture.OnClick := FMyHandler.btnClearPictureClick;
end.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  • 程序模块列表
程序模块名称 说明
Create 构造器,启动后运行需初始化设置的内容
RefState 用于更新单据页面按钮的状态
btnSaveClick 保存按钮的点击事件
btnEditClick 编辑按钮的点击事件
btnExitClick 退出按钮的点击事件
btnUploadClick 上传图片按钮的点击事件
btnClearPictureClick 清除按钮的点击事件
  • Create:构造器,启动后运行需初始化设置的内容。
constructor TMyHandler.Create(AOwner: TComponent);
begin
  FThis :=TBaseForm(AOwner);
  
  //指定使用帐套设置中的连接设置
  FThis.dts0.Connection := dm.DBConnection;
  //数据集SQL赋值
  FThis.dts0.SQL.Text := 'SELECT * FROM Basic_Company';
  //打开数据集
  FThis.dts0.Open;
  
  //初始化,设置复选框多语言的设置选项(货币类型) 
  FThis.cbFCurrenty.Items.CommaText := FThis.siLang1.GetTextW('人民币,美元,新台币,港币');
  //初始化,设置复选框多语言的设置选项(税收类型)
  FThis.cbFTaxType.Items.CommaText := FThis.siLang1.GetTextW('增值税,营业税,免税');
  //更新页面状态
  RefState(False);
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
  • RefState:更新单据页面按钮的状态。
procedure TMyHandler.RefState(Bool: Boolean);
//更新页面状态,当页面设定为True时启用页面的编辑模式,按钮根据编辑模式调整禁用或启用。
begin
  //数据集、保存、上传图片、清除按钮在编辑模式下启用
  FThis.ds0.AutoEdit := Bool;
  FThis.btnEdit.Enabled := not Bool;
  FThis.btnSave.Enabled := Bool;
  FThis.btnUpload.Enabled := Bool;
  FThis.btnClearPicture.Enabled := Bool;   
end;
1
2
3
4
5
6
7
8
9
10
  • btnSaveClick:保存按钮的点击事件。
procedure TMyHandler.btnSaveClick;
//保存
begin
  //保存
  FThis.dts0.Edit;
  FThis.dts0.Post;
  FThis.dts0.ApplyUpdates(-1);
  //刷新状态
  RefState(False);  
end;
1
2
3
4
5
6
7
8
9
10
  • btnEditClick:编辑按钮的点击事件。
procedure TMyHandler.btnEditClick;
//修改
begin
  RefState(True);  
end;
1
2
3
4
5
  • btnExitClick:退出按钮的点击事件。
procedure TMyHandler.btnExitClick;
//退出
begin
  FThis.Close;
end;
1
2
3
4
5
  • btnUploadClick:上传图片按钮的点击事件。
procedure TMyHandler.btnUploadClick;
//上传图片
begin
  //调用打开图片的对话框,选择图片后执行下面的脚本
  if FThis.OpenPictureDialog.Execute(0) then
  begin
   //数据集编辑,将图片加载至数据集中
   FThis.dts0.Edit;
   TBlobField(FThis.dts0.FieldByName('FCompanyLogo')).Clear;
   TBlobField(FThis.dts0.FieldByName('FCompanyLogo')).LoadFromFile(FThis.OpenPictureDialog.FileName);
   FThis.dts0.Post;
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
  • btnClearPictureClick:清除按钮的点击事件。
procedure TMyHandler.btnClearPictureClick;
//清空图片
begin
  //数据集开启编辑,将图片所在的字段清空并提交。
   FThis.dts0.Edit;
   TBlobField(FThis.dts0.FieldByName('FCompanyLogo')).Clear;
   FThis.dts0.Post;
end;
1
2
3
4
5
6
7
8

# 3.1.5. 多语言设置

  在菜单栏点击语言-语言设置,打开多语言设置对话框,根据提示进行多语言的设置。

# 3.1.6. 运行效果

# 3.2. 客户资料查询-多笔数据表单

  客户资料查询页面设置如下:

# 3.2.1. 功能简述

  客户资料的页面按照客户分类进行客户信息的分类展示,此页面包含分组显示表单的模式设计,表格查询等相关的模块设计内容。

# 3.2.2. 窗体设置

属性 取值 说明
Caption 客户资料 主窗体的标题名称
Height 768 主窗体的高度(像素)
Name Cust 主窗体模块的名称
Width 1024 主窗体的宽度(像素)

# 3.2.3. 控件设置

  各表结构字段及对应的数据感知控件名称如下,其中的TBitBtn、TLabeledEdit类型的控件需修改Font.Size为12,TPanel类型的控件需要清除Caption属性中原有的字符内容。

  • 控件说明
控件名称 控件类型 说明
Panel1 TPanel 顶部面板显示,用于放置控件容器
edQuery TLabeledEdit 查询输入框,用于输入客户代码与名称
TextHint:输入客户代码或名称
EditLabel.Caption:客户代码或名称
btnQuery TBitBtn 查询按钮,点击以根据条件进行查询。
Caption:查询
btnClear TBitBtn 清除按钮,点击以清除查询内容恢复至初始状态。
Caption:清除
btnAppend TBitBtn 新建按钮,点击以新建单据。
Caption:新建
btnDelete TBitBtn 删除按钮,点击以删除。
Caption:删除
btnEditor TBitBtn 编辑按钮,点击以进入编辑模式。
Caption:编辑
btnRefresh TBitBtn 刷新按钮,点击以刷新显示。
Caption:刷新
btnShowAll TBitBtn 显示全部按钮,点击以显示全部内容。
Caption:显示全部
btnExit TBitBtn 退出按钮,点击以退出当前窗体。
Caption:退出
dts0 TRFDataSet 数据集控件,展示客户分类 Basic_CustGroup
dts1 TRFDataSet 数据集控件,展示客户信息 Basic_Cust
ds0 TDataSource 数据源控件,绑定数据集
DataSet:dts0
ds1 TDataSource 数据源控件,绑定数据集
DataSet:dts1
Spliter1 TSpliter 分隔控件,用于分隔数据表格控件
DBGrid1 TDBGrid 客户分组数据表格
DataSource:ds0
DBGrid2 TDBGrid 客户信息数据表格
DataSource:ds1
  • DBGrid1数据表格说明

  在设置表格列之前,使用鼠标右键点击表格,在选项中选择Custom Columns,转换为自定义表格后进行设置。点击Columns属性打开对话框,在此处添加字段。选择添加的字段进行属性的更改。

FieldName
字段名
Font.Size
字体大小
Title.Caption
标题文字
Title.Font.Size
标题字体大小
Width
列宽度
FGroupName 10 分组名称 12 90
FGroupCode 10 分组代码 12 80
  • DBGrid2数据表格说明

  在设置表格列之前,使用鼠标右键点击表格,在选项中选择Custom Columns,转换为自定义表格后进行设置。点击Columns属性打开对话框,在此处添加字段。选择添加的字段进行属性的更改。

FieldName
字段名
Font.Size
字体大小
Title.Caption
标题文字
Title.Font.Size
标题字体大小
Width
列宽度
FCustCode 10 客户代码 12 80
FCustName 10 客户名称 12 140
FShortName 10 客户简称 12 80
FDeptName 10 部门名称 12 80
FEmpName 10 业务员 12 80
FforzenFor 10 冻结 12 60
FCreater 10 创建用户 12 90
FLstModDate 10 最后修改日期 12 130

# 3.2.4. 脚本设计

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

//....

var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
{事件绑定  MODULE-BIND}
  this.btnQuery.OnClick := FMyHandler.btnQueryClick;
  this.btnClear.OnClick := FMyHandler.btnClearClick;
  this.btnAppend.OnClick := FMyHandler.btnAppendClick;
  this.btnDelete.OnClick := FMyHandler.btnDeleteClick;
  this.btnEditor.OnClick := FMyHandler.btnEditorClick;
  this.btnRefresh.OnClick := FMyHandler.btnRefreshClick;
  this.btnShowAll.OnClick := FMyHandler.btnShowAllClick;
  this.btnExit.OnClick := FMyHandler.btnExitClick;
  this.DBGrid1.OnCellClick := FMyHandler.DBGrid1CellClick;
end.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
  • 程序模块列表
程序模块名称 说明
Create 构造器,启动后运行需初始化设置的内容
btnQueryClick 查询按钮的点击事件,根据查询的内容显示结果
btnClearClick 清除按钮的点击事件,清除查询内容并恢复至初始查询状态
btnAppendClick 新建按钮的点击事件,新建基础资料单据
btnDeleteClick 删除按钮的点击事件,删除基础资料单据
btnEditorClick 编辑按钮的点击事件,编辑基础资料单据
btnRefreshClick 刷新按钮的点击事件,刷新基础资料页面的显示
btnShowAllClick 显示全部的点击事件,去除所有分类显示条目
btnExitClick 退出的点击事件,退出并关闭当前窗口
DBGrid1CellClick 表格单元的点击事件,点击以按当前分类进行显示
  • Create:构造器,启动后运行需初始化设置的内容。
constructor TMyHandler.Create(AOwner: TComponent);
//构造器
begin
  FThis :=TBaseForm(AOwner);
  //客户分类与客户资料数据集设置连接类型为帐套设置
  FThis.dts0.Connection := dm.DBConnection;
  FThis.dts1.Connection := dm.DBConnection;
  //客户资料分类数据集SQL赋值
  FThis.dts0.SQL.Text := 'Select FInterID,FGroupCode,FGroupName,FNote,FTreeKeyID,' + 
  'FTreeParenteID,FAbsoluteIndex From Basic_CustGroup Order by FGroupCode';
  //客户资料分类数据集打开
  FThis.dts0.Open;
  //客户资料分类数据集定位至第一条记录
  FThis.dts0.First;
  //客户资料数据集SQL赋值
  FThis.dts1.SQL.Text := 'SELECT * FROM Basic_Cust';
  //客户资料数据集打开
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  • btnQueryClick:查询按钮的点击事件,根据查询的内容显示结果。
procedure TMyHandler.btnQueryClick;
//查询
begin
  //客户资料数据集关闭
  FThis.dts1.Close;
  //客户资料数据集SQL重新赋值,引入查询窗口的内容
  FThis.dts1.SQL.Text :=  'SELECT * FROM Basic_Cust WHERE FCustCode LIKE  ''%' + 
  FThis.edQuery.Text + '%'' or FCustName LIKE ''%' + FThis.edQuery.Text + 
  '%'' Order by FCustCode';
  //客户资料数据集打开
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
10
11
12
  • btnClearClick:清除按钮的点击事件,清除查询内容并恢复至初始查询状态。
procedure TMyHandler.btnClearClick;
//清除,清除查询窗口中的内容,并重新为客户资料数据集SQL赋值
begin
   FThis.edQuery.Text := '';
   FThis.dts1.SQL.Text := 'SELECT * FROM Basic_Cust';
   FThis.dts1.Open;
end;
1
2
3
4
5
6
7
  • btnAppendClick:新建按钮的点击事件,新建基础资料单据。
procedure TMyHandler.btnAppendClick;
//新建,在新的窗口中打开此页面
var
  F: TBaseForm;
  vInterID: Integer;
begin
  //获取生成唯一ID,并存入变量中
  vInterID := dm.GetNodeID;
  //客户资料编辑窗口打开
  F := paxfunc.OpenForm('CustEdit');
  //新打开的窗口建立链接
  F.TagObject := FThis;
  //客户资料数据集参数赋值并打开
  TRFDataSet(F.FindComponent('dtsGeneral')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dtsGeneral')).Open;
  //客户地址数据集参数赋值并打开
  TRFDataSet(F.FindComponent('dtsCustAddrs')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dtsCustAddrs')).Open; 
  //客户关系数据集参数赋值并打开 
  TRFDataSet(F.FindComponent('dtsCustRelation')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dtsCustRelation')).Open; 
  //客户物料数据集参数赋值并打开
  TRFDataSet(F.FindComponent('dtsCustMaterial')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dtsCustMaterial')).Open;
  //客户资料数据集新增行
  TRFDataSet(F.FindComponent('dtsGeneral')).Append;
  //初始内容新增赋值。FInterID,FGroupID,FCreater字段赋值
  TRFDataSet(F.FindComponent('dtsGeneral')).FieldByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dtsGeneral')).FieldByName('FGroupID').AsString := FThis.dts0.FieldByName('FInterID').AsString;
  TRFDataSet(F.FindComponent('dtsGeneral')).FieldByName('FCreater').AsString := FThis.siLang1.GetTextW('admin');   
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  • btnDeleteClick:删除按钮的点击事件,删除基础资料单据。
procedure TMyHandler.btnDeleteClick;
//删除
var
  AStoredProc: TRFStoredProc;
  vRAISEMSG,vMSG: String;
  i, j: Integer;
begin
  //调用选择窗口提示删除客户信息
  if paxfunc.YesNoMsg(FThis.siLang1.GetTextW('是否删除该客户?'),FThis.siLang1.GetTextW('提示'))  then 
  begin
  //存储过程控件创建并设置帐套连接
  AStoredProc := TRFStoredProc.Create(nil);
  AStoredProc.Connection := dm.DBConnection;
  try
    //调用存储过程sp_Basic_Cust
    AStoredProc.StoredProcName := 'sp_Basic_Cust';
    //存储过程准备以载入所需参数
    AStoredProc.Prepare;
    if AStoredProc.Prepared then
    begin
      //参数赋值
      AStoredProc.ParamByName('FDataID').AsString := FThis.dts1.FieldByName('FInterID').AsString;
      AStoredProc.ParamByName('Flag').AsString := 'Delete';
      AStoredProc.ParamByName('FUserCode').AsString := FThis.siLang1.GetTextW('admin');
      //输出参数,确认
      if AStoredProc.FindParam('FMsg') <> nil then
        AStoredProc.ParamByName('FMsg').AsString := '';
      try
      //运行执行存储过程
        AStoredProc.ExecProc;
      //如果有意外情况,此处收集意外信息
       Except on ExceptionMessage:Exception do
       begin
          //获取存储过程执行意外的信息内容
          vRAISEMSG:=ExceptionMessage.Message;
          //文字信息处理以获取意外信息的主干内容
     
          i := Pos('SQMESSAGE', vRAISEMSG);
          j := Pos('[SQL Server]', vRAISEMSG);
          vMSG := Copy(vRAISEMSG, i, Length(vRAISEMSG) - i + 1);
    

          // 非格式化消息提示
          if i = 0 then
          begin
            ShowMessage(Copy(vRAISEMSG, j + 12, Length(vRAISEMSG) - j + 1));
            Exit;
          end;
        end;
        end;
        //存储过程执行成功后重新执行查询点击事件以刷新表格
        btnQueryClick(sender);
    end;
  finally
    AStoredProc.Free;
  end;  
  
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
  • btnEditorClick:编辑按钮的点击事件,编辑基础资料单据。
procedure TMyHandler.btnEditorClick;
//编辑客户
var
  F: TBaseForm;
  vInterID: Integer;
begin
  //获取客户记录的唯一ID
  vInterID := FThis.dts1.FieldByName('FInterID').AsInteger;
  //客户资料编辑窗口打开
  F := paxfunc.OpenForm('CustEdit');
  //与当前窗口建立链接
  F.TagObject := FThis;
  //客户资料数据集参数赋值并打开
  TRFDataSet(F.FindComponent('dtsGeneral')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dtsGeneral')).Open;
  //客户地址数据集参数赋值并打开
  TRFDataSet(F.FindComponent('dtsCustAddrs')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dtsCustAddrs')).Open; 
  //客户关系数据集参数赋值并打开 
  TRFDataSet(F.FindComponent('dtsCustRelation')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dtsCustRelation')).Open; 
  //客户物料数据集参数赋值并打开
  TRFDataSet(F.FindComponent('dtsCustMaterial')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dtsCustMaterial')).Open;
  //客户列表定位,查询当前唯一ID在列表中的位置,并进行循环移动定位
  TRFDataSet(F.FindComponent('dtsList')).First;
  While TRFDataSet(F.FindComponent('dtsList')).FieldByName('FInterID').AsString <> FThis.dts1.FieldByName('FInterID').AsString do
  begin
    TRFDataSet(F.FindComponent('dtsList')).Next;
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  • btnRefreshClick:刷新按钮的点击事件,刷新基础资料页面的显示
procedure TMyHandler.btnRefreshClick;
//刷新
begin
  //刷新状态显示,功能与初次打开类似
  FThis.dts0.SQL.Text := 'Select FInterID,FGroupCode,FGroupName,FNote,FTreeKeyID,FTreeParenteID,FAbsoluteIndex From Basic_CustGroup Order by FGroupCode';
  FThis.dts0.Open;
  FThis.dts0.First;
  FThis.dts1.SQL.Text := 'SELECT * FROM Basic_Cust';
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
10
  • btnShowAllClick:显示全部的点击事件,去除所有分类显示条目。
procedure TMyHandler.btnShowAllClick;
//设置数据集筛选,取消筛选条件
begin
  FThis.dts1.Filtered := False;
end;
1
2
3
4
5
  • btnExitClick:退出的点击事件,退出并关闭当前窗口。
procedure TMyHandler.btnExitClick;
//退出
begin
  FThis.Close;
end;
1
2
3
4
5
  • DBGrid1CellClick:表格单元的点击事件,点击以按当前分类进行显示。
procedure TMyHandler.DBGrid1CellClick;
//分类查看,添加筛选条件,并开启筛选功能
begin
  FThis.dts1.Filtered := False;
  FThis.dts1.Filter := 'FGroupID = ' + FThis.dts0.FieldByName('FInterID').AsString;
  FThis.dts1.Filtered := True;
end;
1
2
3
4
5
6
7

# 3.2.5. 多语言设置

  在菜单栏点击语言-语言设置,打开多语言设置对话框,根据提示进行多语言的设置。

# 3.2.6. 运行效果

# 3.3. 客户资料编辑-多笔数据表单

  客户资料编辑页面设置如下:

# 3.3.1. 功能简述

  客户资料编辑用于对客户资料的信息进行详细设置,其中引用了部分查找表需要使用的业务员资料、币种资料、客户分组、布种资料等数据集信息,也包括了数据库图片的上传与修改,清除等设置方式。

# 3.3.2. 窗体设置

属性 取值 说明
Caption 客户资料编辑 主窗体的标题名称
Height 768 主窗体的高度(像素)
Name CustEdit 主窗体模块的名称
Width 1024 主窗体的宽度(像素)

# 3.3.3. 控件设置

  各表结构字段及对应的控件名称如下:

  • 非数据感知控件说明

  页面中注意修改TBitBtn、TGroupBox类型的控件的文字大小Font.Size属性为12,TPanel类型的控件需要清除Caption属性中原有的字符内容。

控件名称 控件类型 说明
Panel1 TPanel 面板控件,作为布局容器使用,位于顶部位置
GroupBox1 TGroupBox 分组框控件,作为布局容器使用,位于Panel下方的置顶位置
PageControl1 TPageControl 页面控件,占据除顶部空间外所有的位置
在页面空白处右键单击选择New Page新增标签页TabSheet
TabSheet1 TTabSheet PageControl1中的标签页面1
Caption:概览
TabSheet2 TTabSheet PageControl1中的标签页面2
Caption:客户收货地址
TabSheet3 TTabSheet PageControl1中的标签页面3
Caption:关系人员
TabSheet4 TTabSheet PageControl1中的标签页面3
Caption:客户产品
btnFirst TBitBtn 首项按钮,点击跳转至记录的首页
Caption:首项
btnPrior TBitBtn 前项按钮,点击跳转至记录的前项
Caption:前项
btnNext TBitBtn 后项按钮,点击跳转至记录的后项
Caption:后项
btnLast TBitBtn 末项按钮,点击跳转至记录的末项
Caption:末项
btnNew TBitBtn 新建按钮,点击以新建客户资料
Caption:新建
btnSave TBitBtn 保存按钮,点击以保存资料的更改
Caption:保存
btnDelete TBitBtn 删除按钮,点击以删除当前的客户资料
Caption:删除
btnUpdate TBitBtn 更新按钮,点击以更新单据中的客户资料
Caption:更新
btnExit TBitBtn 退出按钮,点击以退出窗口
Caption:退出
btnUpload TBitBtn 上传图片按钮,点击以打开图片选择对话框
Caption:上传图片
btnClearPicyure TBitBtn 删除图片按钮,点击清除图片
Caption:清除
OpenPictureDialog TOpenPictureDialog 打开图片对话框
dtsGeneral TRFDataSet 客户资料信息数据集
dsGeneral TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsGeneral
dtsCustGroup TRFDataSet 客户分组信息数据集
dsCustGroup TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsCustGroup
dtsInvoiceCust TRFDataSet 结账客户信息数据集
dsInvoiceCust TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsInvoiceCust
dtsFDistrict TRFDataSet 区域信息数据集
dsFDistrict TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsFDistrict
dtsList TRFDataSet 客户信息唯一ID列表
  • GroupBox1数据感知控件说明

  此页面中首页绑定的数据源DataSource为dsGeneral,所有涉及到文字显示的控件的文字大小属性Font.Size修改为12。由于数据感知控件不包含标签显示,故每放置一个字符编辑类型的数据感知控件前,需要先放置一个TLabel控件,并将其Caption属性设置为数据字段对应的中文名称,同样也需要将其 Font.Size修改为12。

数据字段名称 中文名称 对应控件类型 控件名称 备注
FGroupID 分组 TDBLookupComboBox lkupGroupID 列表绑定的数据源
ListSource:dsCustGroup
列表显示的字段名
ListField:FGroupName
列表对应返回的字段值
KeyField: FGroupID
FCustCode 客户代码 TDBEdit edtFCustCode
FShortName 客户简称 TDBEdit edtFShortName
FCustName 客户简称 TDBEdit edtFCustName
FCorporation 法人代表 TDBEdit edtFCorporation
FInvoiceCustName 结账客户 TDBLookupComboBox lkupFInvoiceCustName 列表绑定的数据源
ListSource:dsInvoiceCust
列表显示的字段名
ListField:FInvoiceCustName
列表对应返回的字段值
KeyField: FInvoiceCustName
FDistrict 区域 TDBLookupComboBox lkupFDistrict 列表绑定的数据源
ListSource:dsFDistrict
列表显示的字段名
ListField:FName
列表对应返回的字段值
KeyField: FName
FForeignName 外语描述 TDBEdit edtFForeignName
FCustLogo 公司图标 TDBImage CustLogo
FCustomerType 客户类型 TDBRadioGroup rgFCustomerType 设置选项Items.CommaText := '国内客户,国外客户'

  其中需要注意的是FCustLogo,需额外设置其Font属性,将其颜色修改为白色,并将其Color属性设置为clWhite以掩盖控件名称的标识。

  • TTabSheet1非数据感知控件说明
控件名称 控件类型 说明
dtsFCurrency TRFDataSet 货币资料信息数据集
dsFCurrency TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsFCurrency
dtsEmp TRFDataSet 员工资料信息数据集
dsEmp TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsEmp
dtsInvoiceType TRFDataSet 发票类型信息数据集
dsInvoiceType TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsInvoiceType
dtsSaleType TRFDataSet 发票类型信息数据集
dsSaleType TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsSaleType
dtsPayItem TRFDataSet 付款方式信息数据集
dsPayItem TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsPayItem
dtsSettleName TRFDataSet 结算方式信息数据集
dsSettleName TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsSettleName
  • TTabSheet1数据感知控件说明

  此页面中首页绑定的数据源DataSource为dsGeneral,所有涉及到文字显示的控件的文字大小属性Font.Size修改为12。由于数据感知控件不包含标签显示,故每放置一个字符编辑类型的数据感知控件前,需要先放置一个TLabel控件,并将其Caption属性设置为数据字段对应的中文名称,同样也需要将其 Font.Size修改为12。

数据字段名称 中文名称 对应控件类型 控件名称 备注
FCurrencyID 币别 TDBLookupComboBox lkupFCurrencyID 列表绑定的数据源
ListSource:dsFCurrency
列表显示的字段名
ListField:FCurrencyName
列表对应返回的字段值
KeyField: FCurrencyID
FExchangeRate 汇率 TDBEdit edtFExchangeRate
FEmpName 业务员 TDBLookupComboBox lkupFEmpName 列表绑定的数据源
ListSource:dsEmp
列表显示的字段名
ListField:FEmpName
列表对应返回的字段值
KeyField: FEmpName
FDeptName 部门名称 TDBEdit edtFDeptName 设定此控件为只读
ReadOnly:True
FPhone1 电话1 TDBEdit edtFPhone1
FPhone2 电话2 TDBEdit edtFPhone2
FContacts 联系人 TDBEdit edtFContacts
FFax 传真 TDBEdit edtFFax
FTel 移动电话 TDBEdit edtFTel
FZipCode 邮政编码 TDBEdit edtFZipCode
FEmail 电子邮箱 TDBEdit edtFEmail
FSaleType 销售类型 TDBLookupComboBox lkupFSaleType 列表绑定的数据源
ListSource:dsSaleType
列表显示的字段名
ListField:FName
列表对应返回的字段值
KeyField: FName
FInvoiceType 发票类型 TDBLookupComboBox lkupFInvoiceType 列表绑定的数据源
ListSource:dsInvoiceType
列表显示的字段名
ListField:FName
列表对应返回的字段值
KeyField: FName
FCreditLine 信用额度 TDBEdit edtFCreditLine
FCreditLineDay 信用天数 TDBEdit edtFCreditLineDay
FAddress 地址 TDBEdit edtFAddress
FHouseBank 开户银行 TDBEdit edtFHouseBank
FHouseBnkAct 开户账号 TDBEdit edtFHouseBnkAct
FTaxCode 税号 TDBEdit edtFTaxCode
FPayItemName 付款方式 TDBLookupComboBox lkupFPayItemName 列表绑定的数据源
ListSource:dsPayItem
列表显示的字段名
ListField:FName
列表对应返回的字段值
KeyField: FName
FSettleName 结算方式 TDBLookupComboBox lkupFPayItemName 列表绑定的数据源
ListSource:dsSettle
列表显示的字段名
ListField:FName
列表对应返回的字段值
KeyField: FName
FNote 备注 TDBMemo mmFNote
FCreater 创建用户 TDBText lbCreater
FLstModDate 最后修改日期 TDBText lbLstModDate
  • TTabSheet2控件说明

  页面中注意修改TBitBtn类型的控件的文字大小Font.Size属性为12,TPanel类型的控件需要清除Caption属性中原有的字符内容。

控件名称 控件类型 说明
dtsFCustAddrs TRFDataSet 客户收货地址资料信息数据集
dsFCustAddrs TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsFCustAddrs
Panel2 TPanel 页面中置顶的布局控件容器,用于放置按钮
btnCustAddrsAppendRow TBitBtn 新增行按钮
Caption:新增行
btnCustAddrsDelRow TBitBtn 删除行按钮
Caption:删除行
DBGrid1 TDBGrid 客户收货地址表格
DataSource:dsCustAddrs
  • DBGrid1数据表格说明

  在设置表格列之前,使用鼠标右键点击表格,在选项中选择Custom Columns,转换为自定义表格后进行设置。点击Columns属性打开对话框,在此处添加字段。选择添加的字段进行属性的更改。

FieldName
字段名
Font.Size
字体大小
Title.Caption
标题文字
Title.Font.Size
标题字体大小
Width
列宽度
FCompany 10 收货公司 12 128
FAddress 10 收货地址 12 256
FPerson 10 收货人 12 64
FEmail 10 邮箱 12 128
FPhone 10 电话 12 128
FFax 10 传真 12 128
  • TTabSheet3控件说明

  页面中注意修改TBitBtn类型的控件的文字大小Font.Size属性为12,TPanel类型的控件需要清除Caption属性中原有的字符内容。

控件名称 控件类型 说明
dtsFCustRelation TRFDataSet 关系人员信息数据集
dsFCustRelation TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsFCustRelation
Panel3 TPanel 页面中置顶的布局控件容器,用于放置按钮
btnCustRelationAppendRow TBitBtn 新增行按钮
Caption:新增行
btnCustRelationDelRow TBitBtn 删除行按钮
Caption:删除行
DBGrid2 TDBGrid 关系人员表格
DataSource:dsCustRelation
  • DBGrid2数据表格说明

  在设置表格列之前,使用鼠标右键点击表格,在选项中选择Custom Columns,转换为自定义表格后进行设置。点击Columns属性打开对话框,在此处添加字段。选择添加的字段进行属性的更改。

FieldName
字段名
Font.Size
字体大小
Title.Caption
标题文字
Title.Font.Size
标题字体大小
Width
列宽度
FEmpName 10 姓名 12 78
FDeptName 10 部门 12 128
FPosition 10 职务 12 78
FTel 10 移动电话 12 128
  • TTabSheet4控件说明

  页面中注意修改TBitBtn类型的控件的文字大小Font.Size属性为12,TPanel类型的控件需要清除Caption属性中原有的字符内容。

控件名称 控件类型 说明
dtsFCustMaterial TRFDataSet 客户产品信息数据集
dsFCustMaterial TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsFCustMaterial
Panel4 TPanel 页面中置顶的布局控件容器,用于放置按钮
btnCustMaterialAppendRow TBitBtn 新增行按钮
Caption:新增行
btnCustMaterialDelRow TBitBtn 删除行按钮
Caption:删除行
DBGrid3 TDBGrid 关系人员表格
DataSource:dsCustRelation
  • DBGrid3数据表格说明

  在设置表格列之前,使用鼠标右键点击表格,在选项中选择Custom Columns,转换为自定义表格后进行设置。点击Columns属性打开对话框,在此处添加字段。选择添加的字段进行属性的更改。

FieldName
字段名
Font.Size
字体大小
Title.Caption
标题文字
Title.Font.Size
标题字体大小
Width
列宽度
FItemCode 10 物料代码 12 80
FItemName 10 物料名称 12 80
FCustItemCode 10 客户物料代码 12 100
FCustItemName 10 客户物料名称 12 100

# 3.3.4. 脚本设计

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

//...

var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
{事件绑定  MODULE-BIND}
  this.btnFirst.OnClick := FMyHandler.btnFirstClick;
  this.btnPrior.OnClick := FMyHandler.btnPriorClick;
  this.btnNext.OnClick := FMyHandler.btnNextClick;
  this.btnLast.OnClick := FMyHandler.btnLastClick;
  this.btnNew.OnClick := FMyHandler.btnNewClick;
  this.dtsGeneral.OnNewRecord := FMyHandler.dtsGeneralNewRecord;
  this.btnSave.OnClick := FMyHandler.btnSaveClick;
  this.btnDelete.OnClick := FMyHandler.btnDeleteClick;
  this.btnUpdate.OnClick := FMyHandler.btnUpdateClick;
  this.btnExit.OnClick := FMyHandler.btnExitClick;
  this.btnCustAddrsAppendRow.OnClick := FMyHandler.btnCustAddrsAppendRowClick;
  this.dtsCustAddrs.OnNewRecord := FMyHandler.dtsCustAddrsNewRecord;
  this.btnCustAddrsDelRow.OnClick := FMyHandler.btnCustAddrsDelRowClick;
  this.btnCustRelationAppendRow.OnClick := FMyHandler.btnCustRelationAppendRowClick;
  this.btnCustRelationDelRow.OnClick := FMyHandler.btnCustRelationDelRowClick;
  this.btnCustMaterialAppendRow.OnClick := FMyHandler.btnCustMaterialAppendRowClick;
  this.btnCustMaterialDelRow.OnClick := FMyHandler.btnCustMaterialDelRowClick;
  this.dtsCustRelation.OnNewRecord := FMyHandler.dtsCustRelationNewRecord;
  this.dtsCustMaterial.OnNewRecord := FMyHandler.dtsCustMaterialNewRecord;
  this.lkupFEmpName.OnClick := FMyHandler.lkupFEmpNameClick;
  this.lkupFInvoiceCustName.OnClick := FMyHandler.lkupFInvoiceCustNameClick;
  this.btnUpload.OnClick := FMyHandler.btnUploadClick;
  this.btnClearPicture.OnClick := FMyHandler.btnClearPictureClick;
end.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
  • 程序模块列表
程序模块名称 说明
Create 构造器,启动后运行需初始化设置的内容
UpdateCustDetail 更新客户资料明细的相关内容
PageSwitch 页面编辑状态切换的子程序
btnFirstClick 首项按钮,点击以切换数据集至首项
btnPriorClick 前项按钮,点击以切换数据集至前项
btnNextClick 后项按钮,点击以切换数据集至后项
btnLastClick 末项按钮,点击以切换数据集至末项
btnNewClick 新建按钮
btnSaveClick 保存数据
btnDeleteClick 删除当前显示的客户资料
btnUpdateClick 更新客户资料
btnExitClick 退出当前窗口
btnCustAddrsAppendRowClick 客户收货地址新增行
dtsCustAddrsNewRecord 客户收货地址新增数据初始化
btnCustAddrsDelRowClick 客户收货地址删除当前选择行
btnCustRelationAppendRowClick 客户关系人员新增行
btnCustRelationDelRowClick 客户关系人人员删除行
btnCustMaterialAppendRowClick 客户产品新增行
btnCustMaterialDelRowClick 客户产品删除行
dtsCustRelationNewRecord 客户关系人员新增数据初始化
dtsCustMaterialNewRecord 客户产品新增数据初始化
lkupFEmpNameClick 业务员变更时传递事件
lkupFInvoiceCustNameClick 结账客户变更时传递数据
btnUploadClick 上传图片按钮
btnClearPictureClick 清空图片
  • Create:构造器,启动后运行需初始化设置的内容
constructor TMyHandler.Create(AOwner: TComponent);
begin
  FThis :=TBaseForm(AOwner);
  
  //客户分类查找数据集初始化
  FThis.dtsCustGroup.Connection := dm.DBConnection;
  FThis.dtsCustGroup.SQL.Text := 'SELECT FInterID AS FGroupID,FGroupName FROM Basic_CustGroup';
  FThis.dtsCustGroup.Open;
  
  //主表数据集初始化,在调用窗口时打开
  FThis.dtsGeneral.Connection := dm.DBConnection;
  FThis.dtsGeneral.SQL.Text := 'SELECT * FROM Basic_Cust WHERE FInterID = :FInterID';
  
  
  //客户地址数据集初始化
  FThis.dtsCustAddrs.Connection := dm.DBConnection;
  FThis.dtsCustAddrs.SQL.Text := 'SELECT * FROM Basic_CustAddrs WHERE FInterID = :FInterID';

  //客户关系数据集初始化
  FThis.dtsCustRelation.Connection := dm.DBConnection;
  FThis.dtsCustRelation.SQL.Text := 'SELECT * FROM Basic_CustRelation WHERE FInterID = :FInterID';
  
  //客户物料数据集初始化
  FThis.dtsCustMaterial.Connection := dm.DBConnection;
  FThis.dtsCustMaterial.SQL.Text := 'SELECT * FROM Basic_CustMaterial WHERE FInterID = :FInterID';
  
  //结账客户查找数据集表初始化
  FThis.dtsInvoiceCust.Connection := dm.DBConnection;
  FThis.dtsInvoiceCust.SQL.Text := 'SELECT FInterID AS FInVoiceCustID,FCustCode AS ' + 
  'FInvoiceCustCode,FCustName AS FInvoiceCustName FROM Basic_Cust';
  FThis.dtsInvoiceCust.Open; 
  
  //区域信息数据集初始化
  FThis.dtsFDistrict.Connection := dm.DBConnection;
  FThis.dtsFDistrict.SQL.Text := 'SELECT a.FName,a.FCode '
	+ 'FROM dbo.Basic_CommonData A '
	+ 'INNER JOIN Basic_CommonDataType b ON a.FTypeID = b.FInterID '
	+ 'WHERE b.FDataName = ''' + FThis.siLang1.GetTextW('地区') + '''';
  FThis.dtsFDistrict.Open;
  
  //业务员查找数据集初始化
  FThis.dtsEmp.Connection := dm.DBConnection;
  FThis.dtsEmp.SQL.Text := 'SELECT FInterID AS FEmpID,FEmpCode,FEmpName,FDeptID,FDeptCode,' + 
  'FDeptName FROM Basic_Employee';
  FThis.dtsEmp.Open;
  
  //币种资料查找数据集初始化
  FThis.dtsFCurrency.Connection := dm.DBConnection;
  FThis.dtsFCurrency.SQL.Text := 'SELECT FCode as FCurrencyCode,FName as FCurrencyName,FInterID ' + 
  'AS FCurrencyID,FExRate AS FExchangeRate FROM Basic_Currency';
  FThis.dtsFCurrency.Open;
  
  //销售类型查找数据集初始化
  FThis.dtsSaleType.Connection := dm.DBConnection;
  FThis.dtsSaleType.SQL.Text := 'SELECT a.FName,a.FInterID '
	+ 'FROM dbo.Basic_CommonData A '
	+ 'INNER JOIN Basic_CommonDataType b ON a.FTypeID = b.FInterID '
	+ 'WHERE b.FDataName = ''' + FThis.siLang1.GetTextW('销售类型') + '''';
  FThis.dtsSaleType.Open;
 
   //发票类型查找数据集初始化
  FThis.dtsInvoiceType.Connection := dm.DBConnection;
  FThis.dtsInvoiceType.SQL.Text := 'SELECT a.FName,a.FInterID '
	+ 'FROM dbo.Basic_CommonData A '
	+ 'INNER JOIN Basic_CommonDataType b ON a.FTypeID = b.FInterID '
	+ 'WHERE b.FDataName = ''' + FThis.siLang1.GetTextW('发票类型') + '''';
  FThis.dtsInvoiceType.Open;
  
  //付款方式查找数据集初始化
  FThis.dtsPayItem.Connection := dm.DBConnection;
  FThis.dtsPayItem.SQL.Text := 'SELECT a.FName,a.FInterID '
	+ 'FROM dbo.Basic_CommonData A '
	+ 'INNER JOIN Basic_CommonDataType b ON a.FTypeID = b.FInterID '
	+ 'WHERE b.FDataName = ''' + FThis.siLang1.GetTextW('付款方式') + '''';
  FThis.dtsPayItem.Open;
  
  //结算方式查找数据集初始化
  FThis.dtsSettle.Connection := dm.DBConnection;
  FThis.dtsSettle.SQL.Text := 'SELECT a.FName,a.FInterID '
	+ 'FROM dbo.Basic_CommonData A '
	+ 'INNER JOIN Basic_CommonDataType b ON a.FTypeID = b.FInterID '
	+ 'WHERE b.FDataName = ''' + FThis.siLang1.GetTextW('结算方式') + '''';
  FThis.dtsSettle.Open;
  
  //列表查找数据集初始化
  FThis.dtsList.Connection := dm.DBConnection;
  FThis.dtsList.SQL.Text := 'SELECT FInterID FROM Basic_Cust';
  FThis.dtsList.Open;
  
  //RadioGroup控件初始设置
  FThis.rgFCustomerType.Items.CommaText := FThis.siLang1.GetTextW('国内客户,国外客户');
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
  • UpdateCustDetail:更新客户资料明细的相关内容。
//更新客户资料的其他明细信息
Procedure TMyHandler.UpdateCustDetail;
Begin
  //客户地址数据集不为空的话则检查更新
  if FThis.dtsCustAddrs.RowCount > 0 Then
  Begin
    FThis.dtsCustAddrs.Edit;
    FThis.dtsCustAddrs.Post;
    FThis.dtsCustAddrs.ApplyUpdates(-1);      
  End;
  //客户关系数据集不为空的话则检查更新    
  if FThis.dtsCustRelation.RowCount > 0 Then
  Begin
    FThis.dtsCustRelation.Edit;
    FThis.dtsCustRelation.Post;
    FThis.dtsCustRelation.ApplyUpdates(-1);
  End;
  //客户材料数据集不为空的话则检查更新    
  if FThis.dtsCustMaterial.RowCount > 0 Then
  Begin
    FThis.dtsCustMaterial.Edit;
    FThis.dtsCustMaterial.Post;
    FThis.dtsCustMaterial.ApplyUpdates(-1);
  End;
End;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  • PageSwitch:页面编辑状态切换的子程序。
procedure TMyHandler.PageSwitch;
//切换页面使用的子程序,客户资料,客户地址,客户关系,客户物料数据集参数重新从客户ID列表数据集中获取。
begin
  
  FThis.dtsGeneral.Close;
  FThis.dtsGeneral.ParamByName('FInterID').AsString := FThis.dtsList.FieldByName('FInterID').AsString;
  FThis.dtsGeneral.Open;

  FThis.dtsCustAddrs.Close;
  FThis.dtsCustAddrs.ParamByName('FInterID').AsString := FThis.dtsList.FieldByName('FInterID').AsString;
  FThis.dtsCustAddrs.Open;  
  
  FThis.dtsCustRelation.Close;
  FThis.dtsCustRelation.ParamByName('FInterID').AsString := FThis.dtsList.FieldByName('FInterID').AsString;
  FThis.dtsCustRelation.Open; 
  
  FThis.dtsCustMaterial.Close;
  FThis.dtsCustMaterial.ParamByName('FInterID').AsString := FThis.dtsList.FieldByName('FInterID').AsString;
  FThis.dtsCustMaterial.Open;  
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  • btnFirstClick:首项按钮,点击以切换数据集至首项。
//切换首项
procedure TMyHandler.btnFirstClick;
begin
  FThis.dtsList.First;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnPriorClick:前项按钮,点击以切换数据集至前项
//切换前项
procedure TMyHandler.btnPriorClick;
begin
  FThis.dtsList.Prior;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnNextClick:后项按钮,点击以切换数据集至后项。
//切换后项
procedure TMyHandler.btnNextClick;
begin
  FThis.dtsList.Next;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnLastClick:末项按钮,点击以切换数据集至末项 。
//切换末项
procedure TMyHandler.btnLastClick;
begin
  FThis.dtsList.Last;
  PageSwitch;
end;
1
2
3
4
5
6
  • **btnNewClick **:新建按钮。
procedure TMyHandler.btnNewClick;
//新增项目
var
  vGroupID: String;
begin
  //获取当前分组的信息
  vGroupID := FThis.dtsGeneral.FieldByName('FGroupID').AsString;
  //主表数据集新增并为特殊字段FInterID,FGroupID,FCreater初始赋值
  FThis.dtsGeneral.Append;
  FThis.dtsGeneral.FieldByName('FInterID').AsInteger := dm.GetNodeID;
  FThis.dtsGeneral.FieldByName('FGroupID').AsString := vGroupID;
  FThis.dtsGeneral.FieldByName('FCreater').AsString := FThis.siLang1.GetTextW('admin');
  FThis.dtsGeneral.Post;
  //明细数据集重新获取参数并打开
  FThis.dtsCustAddrs.Close;
  FThis.dtsCustRelation.Close;
  FThis.dtsCustMaterial.Close;
  FThis.dtsCustAddrs.ParamByName('FInterID').AsString := FThis.dtsGeneral.FieldByName('FInterID').AsString;
  FThis.dtsCustRelation.ParamByName('FInterID').AsString := FThis.dtsGeneral.FieldByName('FInterID').AsString;
  FThis.dtsCustMaterial.ParamByName('FInterID').AsString := FThis.dtsGeneral.FieldByName('FInterID').AsString;
  FThis.dtsCustAddrs.Open;
  FThis.dtsCustRelation.Open;
  FThis.dtsCustMaterial.Open;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  • btnSaveClick:保存数据。
procedure TMyHandler.btnSaveClick;
//保存
Var
  vdts: TRFDataSet;
  t: TDateTime;
begin
  t := now;
  vdts := TRFDataSet.Create(Nil);
  vdts.Connection := dm.DBConnection;
  try
     //检查客户资料中的部分必填字段是否为空。
	if (FThis.dtsGeneral.FieldByName('FCustCode').AsString = '')
  	or (FThis.dtsGeneral.FieldByName('FCustName').AsString = '')
  	Then
  	Begin
    	ShowMessage(FThis.siLang1.GetTextW('客户代码或者客户名称不能为空!'));
    	exit;
  	end;
  	if (FThis.dtsGeneral.FieldByName('FEmpName').AsString = '')
  	or (FThis.dtsGeneral.FieldByName('FSaleType').AsString = '')
  	Then
  	Begin
    	ShowMessage(FThis.siLang1.GetTextW('业务员名称或销售类型不能为空!'));
    	exit;  
  	End;
      //检查新增的客户资料中填写的客户代码是否与数据库中的客户代码重复,如果重复则提示并退出保存流程,修改的流程则不受影响
      vdts.Close;
      vdts.SQL.Text := 'SELECT FInterID FROM Basic_Cust WHERE FCustCode = ''' + FThis.dtsGeneral.FieldByName('FCustCode').AsString + '''';
      vdts.Open;
      if (vdts.RecordCount > 0) and (vdts.FieldByName('FInterID').AsString <> FThis.dtsGeneral.FieldByName('FInterID').AsString) Then
      Begin
        ShowMessage(FThis.siLang1.GetTextW('客户代码重复,请重新选择客户代码输入!'));
        Exit;
      end;
  
  	//检查主表是否有进行修改,被修改的主表客户是否已经在系统内产生了单据,如有则不允许修改
    vdts.Close;
    vdts.SQL.Text := 'SELECT 1 FROM Basic_Cust WHERE FInterID = ' + FThis.dtsGeneral.FieldByName('FInterID').AsString;
    vdts.Open;
    if vdts.RecordCount > 0 Then
    Begin
    	vdts.Close;
        //查询客户ID在业务单据的表中是否存在
    	vdts.SQL.Text := ' if exists(select 1 from Sal_Order where FCustID = ' + FThis.dtsGeneral.FieldByName('FInterID').AsString +') '
   		+' select 1 as FInterID '
    	+' else if exists(select 1 from Inv_CLstockBill where FCustID = ' + FThis.dtsGeneral.FieldByName('FInterID').AsString +') '
    	+' select 1 as FInterID '
    	+' else if exists(select 1 from Inv_CLInvBal where FCustID = ' + FThis.dtsGeneral.FieldByName('FInterID').AsString +') '
    	+' select 1 as FInterID '
    	+' else if exists(select 1 from Man_Mo where FCustID = ' + FThis.dtsGeneral.FieldByName('FInterID').AsString +') '
    	+' select 1 as FInterID '
    	+' else if exists(select 1 from Man_Contact where FCustID = ' + FThis.dtsGeneral.FieldByName('FInterID').AsString +') '
    	+' select 1 as FInterID '
    	+'else '
    	+' select 0 as FInterID ';
    	vdts.Open;
    	IF vdts.FieldByName('FInterID').AsInteger > 0 Then
    	Begin
      	//不保存客户资料,仅更新明细表中的相关信息
        if paxfunc.YesNoMsg(FThis.siLang1.GetTextW('检测到该客户资料概览部分已被单据引用,' + 
        '是否仅更新收货地址,关系和产品信息?'),FThis.siLang1.GetTextW('提示'))  then
        begin
           UpdateCustDetail;
           ShowMessage(FThis.siLang1.GetTextW('仅更新送货地址,关系和产品信息成功。'));  
        end
    	End
      Else
      Begin
      //未被引用的直接进行保存
      FThis.dtsGeneral.Edit;
      FThis.dtsGeneral.FieldByName('FLstModDate').AsDateTime := t;
      //数据集是否处于编辑模式,提交		
      if DM.DataSetIsEdit(FThis.dtsGeneral) Then
      	  FThis.dtsGeneral.Post;
          
	FThis.dtsGeneral.ApplyUpdates(-1);
        UpdateCustDetail;
    	ShowMessage(FThis.siLang1.GetTextW('数据保存成功!'));       
      End;
    End
    Else
    //新增的直接进行保存
    Begin
    	FThis.dtsGeneral.Edit;
    	FThis.dtsGeneral.FieldByName('FLstModDate').AsDateTime := t;
    	FThis.dtsGeneral.Post;
	FThis.dtsGeneral.ApplyUpdates(-1);
        UpdateCustDetail;
    	ShowMessage(FThis.siLang1.GetTextW('数据保存成功!'));
    End;			
    //btnAppend.Enabled := True;
    //btnSave.Enabled := False;
	Finally
  	vdts.Free;
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
  • btnDeleteClick:删除当前显示的客户资料。
procedure TMyHandler.btnDeleteClick;
//删除
Var
  AStoredProc: TRFStoredProc;
  vRAISEMSG,vMSG: String;
  i, j: Integer;
begin
  //确认对话框弹出
  if paxfunc.YesNoMsg(FThis.siLang1.GetTextW('确认要删除此客户资料吗?'),FThis.siLang1.GetTextW('提示'))  then
  begin
  //存储过程控件创建
  AStoredProc := TRFStoredProc.Create(nil);
  AStoredProc.Connection := dm.DBConnection;
  try
    //存储过程指定并准备获取参数
    AStoredProc.StoredProcName := 'sp_Basic_Cust';
    AStoredProc.Prepare;
    if AStoredProc.Prepared then
    begin
      //参数赋值
      AStoredProc.ParamByName('FDataID').AsString := FThis.dtsGeneral.FieldByName('FInterID').AsString;
      AStoredProc.ParamByName('Flag').AsString := 'Delete';
      AStoredProc.ParamByName('FUserCode').AsString := FThis.siLang1.GetTextW('admin');
      if AStoredProc.FindParam('FMsg') <> nil then
        AStoredProc.ParamByName('FMsg').AsString := '';
      try
        AStoredProc.ExecProc;
        //获取异常信息并处理显示
       Except on ExceptionMessage:Exception do
       begin
          vRAISEMSG:=ExceptionMessage.Message;
     
          i := Pos('SQMESSAGE', vRAISEMSG);
          j := Pos('[SQL Server]', vRAISEMSG);
          vMSG := Copy(vRAISEMSG, i, Length(vRAISEMSG) - i + 1);
    
          // 非格式化消息提示
          if i = 0 then
          begin
            ShowMessage(Copy(vRAISEMSG, j + 12, Length(vRAISEMSG) - j + 1));
            Exit;
          end;
        end;
        end;
    end;
  finally
    AStoredProc.Free;
  end;
  //所有数据集刷新显示
  FThis.dtsGeneral.Open;
  FThis.dtsCustAddrs.Open;
  FThis.dtsCustRelation.Open;
  FThis.dtsCustMaterial.Open;  
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  • btnUpdateClick:更新客户资料。
procedure TMyHandler.btnUpdateClick;
//更新
Var
  AStoredProc: TRFStoredProc;
  vRAISEMSG,vMSG: String;
  i, j: Integer;
begin
  //弹出窗口确认
  if paxfunc.YesNoMsg(FThis.siLang1.GetTextW('确认要更新此客户资料吗?'),FThis.siLang1.GetTextW('提示'))  then
  begin
  AStoredProc := TRFStoredProc.Create(nil);
  AStoredProc.Connection := dm.DBConnection;
  try
    //存储过程准备
    AStoredProc.StoredProcName := 'sp_Basic_Cust';
    AStoredProc.Prepare;
    if AStoredProc.Prepared then
    begin
      //参数赋值
      AStoredProc.ParamByName('FDataID').AsString := FThis.dtsGeneral.FieldByName('FInterID').AsString;
      AStoredProc.ParamByName('Flag').AsString := 'Update';
      AStoredProc.ParamByName('FUserCode').AsString := FThis.siLang1.GetTextW('admin');
      if AStoredProc.FindParam('FMsg') <> nil then
        AStoredProc.ParamByName('FMsg').AsString := '';
      try
        //执行存储过程
        AStoredProc.ExecProc;
        //意外情况的文字处理
       Except on ExceptionMessage:Exception do
       begin
          vRAISEMSG:=ExceptionMessage.Message;
     
          i := Pos('SQMESSAGE', vRAISEMSG);
          j := Pos('[SQL Server]', vRAISEMSG);
          vMSG := Copy(vRAISEMSG, i, Length(vRAISEMSG) - i + 1);
    
          // 非格式化消息提示
          if i = 0 then
          begin
            ShowMessage(Copy(vRAISEMSG, j + 12, Length(vRAISEMSG) - j + 1));
            Exit;
          end;
        end;
        end;
    end;
  finally
    AStoredProc.Free;
  end;
  //数据集刷新
  FThis.dtsGeneral.Open;
  FThis.dtsCustAddrs.Open;
  FThis.dtsCustRelation.Open;
  FThis.dtsCustMaterial.Open;  
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  • btnExitClick:退出当前窗口。
procedure TMyHandler.btnExitClick;
//退出窗口
begin
  FThis.Close;
end;
1
2
3
4
5
  • btnCustAddrsAppendRowClick:客户收货地址新增行。
procedure TMyHandler.btnCustAddrsAppendRowClick;
//新增行
begin
  FThis.dtsCustAddrs.Append; 
end;
1
2
3
4
5
  • dtsCustAddrsNewRecord: 客户收货地址新增数据初始化。
procedure TMyHandler.dtsCustAddrsNewRecord;
//客户资料地址新增行
begin
  FThis.dtsCustAddrs.FieldByName('FInterID').AsString := FThis.dtsGeneral.FieldByName('FInterID').AsString;
  FThis.dtsCustAddrs.FieldByName('FentryID').AsInteger := FThis.dtsCustAddrs.RecordCount + 1;
  FThis.dtsCustAddrs.Post;
end;
1
2
3
4
5
6
7
  • btnCustAddrsDelRowClick:客户收货地址删除当前选择行。
procedure TMyHandler.btnCustAddrsDelRowClick;
//删除
begin
  FThis.dtsCustAddrs.Delete;
end;
1
2
3
4
5
  • btnCustRelationAppendRowClick:客户关系人员新增行。
procedure TMyHandler.btnCustRelationAppendRowClick;
//客户关系新增行
begin
  FThis.dtsCustRelation.Append;
end;
1
2
3
4
5
  • btnCustRelationDelRowClick:客户关系人人员删除行。
procedure TMyHandler.btnCustRelationDelRowClick;
//客户关系删除行
begin
  FThis.dtsCustRelation.Delete;
end;
1
2
3
4
5
  • btnCustMaterialAppendRowClick:客户产品新增行。
procedure TMyHandler.btnCustMaterialAppendRowClick;
//客户物料新增行
begin
  FThis.dtsCustMaterial.Append;
end;
1
2
3
4
5
  • btnCustMaterialDelRowClick:客户产品删除行。
procedure TMyHandler.btnCustMaterialDelRowClick;
//客户物料删除行
begin
  FThis.dtsCustMaterial.Delete;
end;
1
2
3
4
5
  • dtsCustRelationNewRecord:客户关系人员新增数据初始化。
procedure TMyHandler.dtsCustRelationNewRecord;
//客户关系新增行时初始化字段信息
begin
  FThis.dtsCustRelation.FieldByName('FInterID').AsString := FThis.dtsGeneral.FieldByName('FInterID').AsString;
  FThis.dtsCustRelation.FieldByName('FentryID').AsInteger := FThis.dtsCustRelation.RecordCount + 1;
  FThis.dtsCustRelation.Post;
end;
1
2
3
4
5
6
7
  • dtsCustMaterialNewRecord:客户产品新增数据初始化。
procedure TMyHandler.dtsCustMaterialNewRecord;
//客户物料新增行时初始化字段信息
begin
  FThis.dtsCustMaterial.FieldByName('FInterID').AsString := FThis.dtsGeneral.FieldByName('FInterID').AsString;
  FThis.dtsCustMaterial.FieldByName('FentryID').AsInteger := FThis.dtsCustMaterial.RecordCount + 1;
  FThis.dtsCustMaterial.Post;
end;
1
2
3
4
5
6
7
  • lkupFEmpNameClick:业务员变更时传递事件。
procedure TMyHandler.lkupFEmpNameClick;
//变更业务员信息时变更关联字段信息
begin
  FThis.dtsGeneral.Edit;
  FThis.dtsGeneral.FieldByName('FEmpID').AsString := FThis.dtsEmp.FieldByName('FEmpID').AsString;
  FThis.dtsGeneral.FieldByName('FEmpCode').AsString := FThis.dtsEmp.FieldByName('FEmpCode').AsString; 
  FThis.dtsGeneral.FieldByName('FDeptID').AsString := FThis.dtsEmp.FieldByName('FDeptID').AsString;
  FThis.dtsGeneral.FieldByName('FDeptCode').AsString := FThis.dtsEmp.FieldByName('FDeptCode').AsString;
  FThis.dtsGeneral.FieldByName('FDeptName').AsString := FThis.dtsEmp.FieldByName('FDeptName').AsString;
end;
1
2
3
4
5
6
7
8
9
10
  • lkupFInvoiceCustNameClick:结账客户变更时传递数据。
//变更结账客户时更新相关信息
procedure TMyHandler.lkupFInvoiceCustNameClick;
begin
  FThis.dtsGeneral.Edit;  
  FThis.dtsGeneral.FieldByName('FInvoiceCustID').AsString := FThis.dtsInvoiceCust.FieldByName('FInVoiceCustID').AsString;
  FThis.dtsGeneral.FieldByName('FInvoiceCustCode').AsString := FThis.dtsInvoiceCust.FieldByName('FInVoiceCustCode').AsString;
end;
1
2
3
4
5
6
7
  • btnUploadClick:上传图片按钮。
//上传图片
procedure TMyHandler.btnUploadClick;
begin
  if FThis.OpenPictureDialog.Execute(0) then
  begin
    FThis.dtsGeneral.Edit;
    TBlobField(FThis.dtsGeneral.FieldByName('FCustLogo')).LoadFromFile(FThis.OpenPictureDialog.FileName);
    FThis.dtsGeneral.Post;
  end;
end;
1
2
3
4
5
6
7
8
9
10
  • btnClearPictureClick:清空图片。
procedure TMyHandler.btnClearPictureClick;
//清空图片
begin
    FThis.dtsGeneral.Edit;
    TBlobField(FThis.dtsGeneral.FieldByName('FCustLogo')).Clear;
    FThis.dtsGeneral.Post;
end;
1
2
3
4
5
6
7

# 3.3.5. 多语言设置

  在菜单栏点击语言-语言设置,打开多语言设置对话框,根据提示进行多语言的设置。

# 3.3.6. 运行效果

# 3.4. 布种资料查询-多笔数据表单

  布种资料页面设置如下:

# 3.4.1. 功能简述

  布种资料的页面按照布种分类进行信息的分类展示,此页面包含分组显示表单的模式设计,表格查询等相关的模块设计内容。

# 3.4.2. 窗体设置

属性 取值 说明
Caption 布种资料 主窗体的标题名称
Height 768 主窗体的高度(像素)
Name Item 主窗体模块的名称
Width 1024 主窗体的宽度(像素)

# 3.4.3. 控件设置

  各表结构字段及对应的数据感知控件名称如下,其中的TBitBtn、TLabeledEdit类型的控件需修改Font.Size为12,TPanel类型的控件需要清除Caption属性中原有的字符内容。

  • 控件说明
控件名称 控件类型 说明
Panel1 TPanel 顶部面板显示,用于放置控件容器
edQuery TLabeledEdit 查询输入框,用于输入布种代码与名称
TextHint:输入布种代码或名称
EditLabel.Caption:布种代码或名称
btnQuery TBitBtn 查询按钮,点击以根据条件进行查询。
Caption:查询
btnClear TBitBtn 清除按钮,点击以清除查询内容恢复至初始状态。
Caption:清除
btnAppend TBitBtn 新建按钮,点击以新建单据。
Caption:新建
btnDelete TBitBtn 删除按钮,点击以删除。
Caption:删除
btnEditor TBitBtn 编辑按钮,点击以进入编辑模式。
Caption:编辑
btnRefresh TBitBtn 刷新按钮,点击以刷新显示。
Caption:刷新
btnShowAll TBitBtn 显示全部按钮,点击以显示全部内容。
Caption:显示全部
btnExit TBitBtn 退出按钮,点击以退出当前窗体。
Caption:退出
dts0 TRFDataSet 数据集控件,展示布种分类 Basic_ItemGroup
dts1 TRFDataSet 数据集控件,展示布种资料 Basic_Item
ds0 TDataSource 数据源控件,绑定数据集
DataSet:dts0
ds1 TDataSource 数据源控件,绑定数据集
DataSet:dts1
Spliter1 TSpliter 分隔控件,用于分隔数据表格控件
DBGrid1 TDBGrid 布种分组数据表格
DataSource:ds0
DBGrid2 TDBGrid 布种信息数据表格
DataSource:ds1
  • DBGrid1数据表格说明

  在设置表格列之前,使用鼠标右键点击表格,在选项中选择Custom Columns,转换为自定义表格后进行设置。点击Columns属性打开对话框,在此处添加字段。选择添加的字段进行属性的更改。

FieldName
字段名
Font.Size
字体大小
Title.Caption
标题文字
Title.Font.Size
标题字体大小
Width
列宽度
FGroupName 10 分组名称 12 90
FGroupCode 10 分组代码 12 80
  • DBGrid2数据表格说明

  在设置表格列之前,使用鼠标右键点击表格,在选项中选择Custom Columns,转换为自定义表格后进行设置。点击Columns属性打开对话框,在此处添加字段。选择添加的字段进行属性的更改。

FieldName
字段名
Font.Size
字体大小
Title.Caption
标题文字
Title.Font.Size
标题字体大小
Width
列宽度
FItemCode 10 物料代码 12 80
FItemName 10 物料名称 12 140
FItemSpec 10 规格 12 80
FUnitName 10 单位 12 80
FUnitPiece 10 件单位 12 64
FforzenFor 10 冻结 12 64

# 3.4.4. 脚本设计

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

//...
var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
{事件绑定  MODULE-BIND}
  this.btnQuery.OnClick := FMyHandler.btnQueryClick;
  this.btnClear.OnClick := FMyHandler.btnClearClick;
  this.btnAppend.OnClick := FMyHandler.btnAppendClick;
  this.btnDelete.OnClick := FMyHandler.btnDeleteClick;
  this.btnEditor.OnClick := FMyHandler.btnEditorClick;
  this.btnRefresh.OnClick := FMyHandler.btnRefreshClick;
  this.btnShowAll.OnClick := FMyHandler.btnShowAllClick;
  this.btnExit.OnClick := FMyHandler.btnExitClick;
  this.DBGrid1.OnCellClick := FMyHandler.DBGrid1CellClick;
end.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  • 程序模块列表
程序模块名称 说明
Create 构造器,启动后运行需初始化设置的内容
btnQueryClick 查询按钮的点击事件,根据查询的内容显示结果
btnClearClick 清除按钮的点击事件,清除查询内容并恢复至初始查询状态
btnAppendClick 新建按钮的点击事件,新建基础资料单据
btnDeleteClick 删除按钮的点击事件,删除基础资料单据
btnEditorClick 编辑按钮的点击事件,编辑基础资料单据
btnRefreshClick 刷新按钮的点击事件,刷新基础资料页面的显示
btnShowAllClick 显示全部的点击事件,去除所有分类显示条目
btnExitClick 退出的点击事件,退出并关闭当前窗口
DBGrid1CellClick 表格单元的点击事件,点击以按当前分类进行显示
  • Create:构造器,启动后运行需初始化设置的内容。
constructor TMyHandler.Create(AOwner: TComponent);
//物料分类、物料信息数据集初始赋值
begin
  FThis :=TBaseForm(AOwner);
  FThis.dts0.Connection := dm.DBConnection;
  FThis.dts1.Connection := dm.DBConnection;
  FThis.dts0.SQL.Text := 'Select FInterID,FGroupCode,FGroupName,FNote,FTreeKeyID,FTreeParenteID,' + 
  'FAbsoluteIndex From Basic_ItemGroup WHERE FTypeID = 1 Order by FGroupCode';
  FThis.dts0.Open;
  FThis.dts0.First;
  FThis.dts1.SQL.Text := 'SELECT * FROM Basic_Item WHERE FTypeID = 1';
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
  • btnQueryClick:查询按钮的点击事件,根据查询的内容显示结果。
procedure TMyHandler.btnQueryClick;
//查询,获取查询编辑库中信息并进行查询
begin
  FThis.dts1.Close;
  FThis.dts1.SQL.Text :=  'SELECT * FROM Basic_Item WHERE FTypeID = 1 AND (FItemCode LIKE  ''%' + FThis.edQuery.Text + 
  '%'' or FItemName LIKE ''%' + FThis.edQuery.Text + '%'') Order by FItemCode';
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
  • btnClearClick:清除按钮的点击事件,清除查询内容并恢复至初始查询状态。
procedure TMyHandler.btnClearClick;
//清除编辑框中的内容并初始化查询
begin
   FThis.edQuery.Text := '';
   FThis.dts1.SQL.Text := 'SELECT * FROM Basic_Item WHERE FTypeID = 1';
   FThis.dts1.Open;
end;
1
2
3
4
5
6
7
  • btnAppendClick:新建按钮的点击事件,新建基础资料单据。
procedure TMyHandler.btnAppendClick;
//新建单据
var
  F: TBaseForm;
  vInterID: Integer;
begin
  //获取唯一ID
  vInterID := dm.GetNodeID;
  //打开物料编辑页面
  F := paxfunc.OpenForm('ItemEdit');
  //与主窗口建立连接
  F.TagObject := FThis;  
  //目标窗口数据集初始赋值并新增记录
  TRFDataSet(F.FindComponent('dts0')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dts0')).Open;
  TRFDataSet(F.FindComponent('dts1')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dts1')).Open;  
  TRFDataSet(F.FindComponent('dts0')).Append;
  //新增记录并初始赋值
 
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FGroupID').AsString := FThis.dts0.FieldByName('FInterID').AsString;
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FTypeID').AsString := '1';//FThis.dts0.FieldByName('FTypeID').AsString; 
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  • btnDeleteClick:删除按钮的点击事件,删除基础资料单据。
procedure TMyHandler.btnDeleteClick;
//删除
var
  AStoredProc: TRFStoredProc;
  vRAISEMSG,vMSG: String;
  i, j: Integer;
begin
  //弹出窗口确认是否进行删除
  if paxfunc.YesNoMsg(FThis.siLang1.GetTextW('是否删除该资料?'),FThis.siLang1.GetTextW('提示'))  then 
  begin
  //存储过程控件创建
  AStoredProc := TRFStoredProc.Create(nil);
  AStoredProc.Connection := dm.DBConnection;
  try
    //存储过程准备
    AStoredProc.StoredProcName := 'sp_Basic_Item';
    AStoredProc.Prepare;
    if AStoredProc.Prepared then
    begin
      //存储过程参数赋值
      AStoredProc.ParamByName('FDataID').AsString := FThis.dts1.FieldByName('FInterID').AsString;
      AStoredProc.ParamByName('Flag').AsString := 'Delete';
      AStoredProc.ParamByName('FUserCode').AsString := FThis.siLang1.GetTextW('admin');
      if AStoredProc.FindParam('FMsg') <> nil then
        AStoredProc.ParamByName('FMsg').AsString := '';
      try
        //执行存储过程
        AStoredProc.ExecProc;
        //意外情况字符串处理
       Except on ExceptionMessage:Exception do
       begin
          vRAISEMSG:=ExceptionMessage.Message;
     
          i := Pos('SQMESSAGE', vRAISEMSG);
          j := Pos('[SQL Server]', vRAISEMSG);
          vMSG := Copy(vRAISEMSG, i, Length(vRAISEMSG) - i + 1);
    

          // 非格式化消息提示
          if i = 0 then
          begin
            ShowMessage(Copy(vRAISEMSG, j + 12, Length(vRAISEMSG) - j + 1));
            Exit;
          end;
        end;
        end;
        //刷新表格显示
        btnQueryClick(sender);
    end;
  finally
    AStoredProc.Free;
  end;  
  
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  • btnEditorClick:编辑按钮的点击事件,编辑基础资料单据。
procedure TMyHandler.btnEditorClick;
//编辑资料
var
  F: TBaseForm;
  vInterID: Integer;
begin
  //获取当前选择的物料唯一ID
  vInterID := FThis.dts1.FieldByName('FInterID').AsInteger;
  //打开物料编辑窗口
  F := paxfunc.OpenForm('ItemEdit');
  //打开窗口与主窗口建立连接
  F.TagObject := FThis;
  //为窗口中的数据集赋值
  TRFDataSet(F.FindComponent('dts0')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dts0')).Open;
  TRFDataSet(F.FindComponent('dts1')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dts1')).Open;  
  //列表数据集打开并根据唯一ID进行定位
  TRFDataSet(F.FindComponent('dtsList')).First;
  While TRFDataSet(F.FindComponent('dtsList')).FieldByName('FInterID').AsString <> FThis.dts1.FieldByName('FInterID').AsString do
  begin
    TRFDataSet(F.FindComponent('dtsList')).Next;
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
  • btnRefreshClick:刷新按钮的点击事件,刷新基础资料页面的显示。
procedure TMyHandler.btnRefreshClick;
//刷新显示
begin
  FThis.dts0.SQL.Text := 'Select FInterID,FGroupCode,FGroupName,FNote,FTreeKeyID,FTreeParenteID,' + 
  'FAbsoluteIndex From Basic_ItemGroup WHERE FTypeID = 1 Order by FGroupCode';
  FThis.dts0.Open;
  FThis.dts0.First;
  FThis.dts1.SQL.Text := 'SELECT * FROM Basic_Item WHERE FTypeID = 1';
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
10
  • btnShowAllClick:显示全部的点击事件,去除所有分类显示条目。
procedure TMyHandler.btnShowAllClick;
//显示全部
begin
  FThis.dts1.Filtered := False;
end;
1
2
3
4
5
  • btnExitClick:退出的点击事件,退出并关闭当前窗口。
procedure TMyHandler.btnExitClick;
//退出窗口
begin
  FThis.Close;
end;
1
2
3
4
5
  • DBGrid1CellClick:表格单元的点击事件,点击以按当前分类进行显示。
procedure TMyHandler.DBGrid1CellClick;
//分类查看
begin
  FThis.dts1.Filtered := False;
  FThis.dts1.Filter := 'FGroupID = ' + FThis.dts0.FieldByName('FInterID').AsString;
  FThis.dts1.Filtered := True;
end;
1
2
3
4
5
6
7

# 3.4.5. 多语言设置

  在菜单栏点击语言-语言设置,打开多语言设置对话框,根据提示进行多语言的设置。

# 3.4.6. 运行效果

# 3.5. 布种资料编辑-多笔数据表单

  布种资料页面设置如下。

# 3.5.1. 功能简述

  布种资料编辑用于对布种资料的信息进行详细设置,其中引用了部分查找表需要使用的计量单位,布种分类,仓库等数据集信息。

# 3.5.2. 窗体设置

属性 取值 说明
Caption 布种资料编辑 主窗体的标题名称
Height 768 主窗体的高度(像素)
Name ItemEdit 主窗体模块的名称
Width 1024 主窗体的宽度(像素)

# 3.5.3. 控件设置

  • 控件说明

  页面中注意修改TBitBtn类型的控件的文字大小Font.Size属性为12,TPanel类型的控件需要清除Caption属性中原有的字符内容。

控件名称 控件类型 说明
Panel1 TPanel 面板控件,作为布局容器使用,位于顶部位置
Panel2 TPanel 面板控件,作为布局容器使用,位于第二个顶部位置,放置布种资料的主要数据感知控件
Panel3 TPanel 面板控件,作为布局容器使用,占据居顶控件之后的所有位置,放置数据表格与备注栏
Panel4 TPanel 面板控件,位于Panel3中居左位置,用于放置表格及按钮
Panel5 TPanel 面板控件,位于Panel4中顶部位置,用于放置按钮
Panel6 TPanel 面板控件,位于Panel3中居右位置,用于放置备注的数据感知控件
Panel7 TPanel 面板控件,位于Panel6中居顶位置,用于放置备注标签
btnFirst TBitBtn 首项按钮,点击跳转至记录的首页
Caption:首项
btnPrior TBitBtn 前项按钮,点击跳转至记录的前项
Caption:前项
btnNext TBitBtn 后项按钮,点击跳转至记录的后项
Caption:后项
btnLast TBitBtn 末项按钮,点击跳转至记录的末项
Caption:末项
btnNew TBitBtn 新建按钮,点击以新建客户资料
Caption:新建
btnSave TBitBtn 保存按钮,点击以保存资料的更改
Caption:保存
btnDelete TBitBtn 删除按钮,点击以删除当前的客户资料
Caption:删除
btnExit TBitBtn 退出按钮,点击以退出窗口
Caption:退出
btnItemSpecAppendRow TBitBtn 新增行按钮,用于新增规格
btnItemSpecDelRow TBitBtn 删除行按钮,用于删除规格
dts0 TRFDataSet 主数据集,显示布种信息
ds0 TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dts0
dts0FGroup TRFDataSet 布种分类数据集
ds0FGroup TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dts0FGroup
dts0FStockID TRFDataSet 仓库信息数据集
ds0FStockID TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dts0FStockID
dts0FPackUnit TRFDataSet 仓库信息数据集
ds0FPackUnit TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dts0FPackUnit
dts0FUnit TRFDataSet 仓库信息数据集
ds0FUnit TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dts0FUnit
dts1 TRFDataSet 明细数据集,显示布种规格
ds1 TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dts1
dtsList TRFDataSet 数据列表,用于显示数据信息唯一ID
DBGrid1 TDBGrid 布种规格数据表格
DataSource:ds0
  • 数据感知控件说明

  此页面中首页绑定的数据源DataSource为ds0,所有涉及到文字显示的控件的文字大小属性Font.Size修改为12。由于数据感知控件不包含标签显示,故每放置一个字符编辑类型的数据感知控件前,需要先放置一个TLabel控件,并将其Caption属性设置为数据字段对应的中文名称,同样也需要将其 Font.Size修改为12。

数据字段名称 中文名称 对应控件类型 控件名称 备注
FGroupID 布种分类 TDBLookupComboBox lkupGroupID 列表绑定的数据源
ListSource:ds0FGroup
列表显示的字段名
ListField:FGroupName
列表对应返回的字段值
KeyField: FGroupID
FfrozenFor 冻结 TDBCheckBox chkFforzenFor
FItemCode 布种代码 TDBEdit edFItemCode
FMax 最大安全库存 TDBEdit edFMax
FItemName 布种名称 TDBEdit edFItemName
FMin 最小安全库存 TDBEdit edFMin
FItemSpec 规格 TDBEdit edFItemSpec
FStockID 默认仓库 TDBLookupComboBox lkupFStockID 列表绑定的数据源
ListSource:ds0FStockID
列表显示的字段名
ListField:FWHSName
列表对应返回的字段值
KeyField: FStockID
FWidth 门幅 TDBEdit edFWidth
FWeightOflength 克重 TDBEdit edFWeightOflength
FColorName 颜色名称 TDBEdit edFColorName
FPackQty 包装数量 TDBEdit edFPackQty
FPackUnit 包装单位 TDBLookupComboBox lkupFPackUnit 列表绑定的数据源
ListSource:ds0FPackUnit
列表显示的字段名
ListField:FName
列表对应返回的字段值
KeyField: FName
FUnitPiece 件单位 TDBLookupComboBox lkupFUnitPiece 列表绑定的数据源
ListSource:ds0FPackUnit
列表显示的字段名
ListField:FName
列表对应返回的字段值
KeyField: FName
FUnitName 计量单位 TDBLookupComboBox lkupFUnitName 列表绑定的数据源
ListSource:ds0FUnit
列表显示的字段名
ListField:FUnitName
列表对应返回的字段值
KeyField: FUnitName
FStandPrice 标准价 TDBEdit edFStandPrice
FPurPrice 采购价 TDBEdit edFPurPrice
FYarn 纱支 TDBEdit edFYarn
FSalePrice 销售价 TDBEdit edFSalePrice
FMachine 机台 TDBEdit edFMachine
FYarnLine 线长 TDBEdit edFYarnLine
FNote 备注 TDBMemo mmFNote
  • DBGrid1数据表格说明

  在设置表格列之前,使用鼠标右键点击表格,在选项中选择Custom Columns,转换为自定义表格后进行设置。点击Columns属性打开对话框,在此处添加字段。选择添加的字段进行属性的更改。

FieldName
字段名
Font.Size
字体大小
Title.Caption
标题文字
Title.Font.Size
标题字体大小
Width
列宽度
FEntryID 10 序 12 64
FItemSpec 10 规格 12 400

# 3.5.4. 脚本设计

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

//...

var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
{事件绑定  MODULE-BIND}
  this.btnFirst.OnClick := FMyHandler.btnFirstClick;
  this.btnPrior.OnClick := FMyHandler.btnPriorClick;
  this.btnNext.OnClick := FMyHandler.btnNextClick;
  this.btnLast.OnClick := FMyHandler.btnLastClick;
  this.btnNew.OnClick := FMyHandler.btnNewClick;
  this.btnSave.OnClick := FMyHandler.btnSaveClick;
  this.btnDelete.OnClick := FMyHandler.btnDeleteClick;
  this.btnExit.OnClick := FMyHandler.btnExitClick;
  this.btnItemSpecAppendRow.OnClick := FMyHandler.btnItemSpecAppendRowClick;
  this.dts1.OnNewRecord := FMyHandler.dts1NewRecord;
  this.btnItemSpecDelRow.OnClick := FMyHandler.btnItemSpecDelRowClick;
  this.lkupFUnitName.OnClick := FMyHandler.lkupFUnitNameClick;
end.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
  • 程序模块列表
程序模块名称 说明
Create 构造器,启动后运行需初始化设置的内容
PageSwitch 页面编辑状态切换的子程序
btnFirstClick 首项按钮,点击以切换数据集至首项
btnPriorClick 前项按钮,点击以切换数据集至前项
btnNextClick 后项按钮,点击以切换数据集至后项
btnLastClick 末项按钮,点击以切换数据集至末项
btnNewClick 新建按钮
btnSaveClick 保存数据
btnDeleteClick 删除当前显示的客户资料
btnUpdateClick 更新客户资料
btnExitClick 退出当前窗口
btnItemSpecAppendRowClick 规格明细栏新增行
dts1NewRecord 规格明细栏新增行初始化
btnItemSpecDelRowClick 规格明细栏删除行
lkupFUnitNameClick 计量单位更新
  • Create:构造器,启动后运行需初始化设置的内容。
constructor TMyHandler.Create(AOwner: TComponent);
begin
  FThis :=TBaseForm(AOwner);
  
  //主数据与明细数据初始赋值
  FThis.dts0.Connection :=dm.DBConnection;
  FThis.dts0.SQL.Text := 'SELECT * FROM Basic_Item WHERE FInterID = :FInterID';
  
  FThis.dts1.Connection := DM.DBConnection;
  FThis.dts1.SQL.Text := 'SELECT * FROM Basic_ItemSpec WHERE FInterID = :FInterID';
  
  //分组信息数据集初始化
  FThis.dts0FGroup.Connection := dm.DBConnection;
  FThis.dts0FGroup.Close;
  FThis.dts0FGroup.SQL.Text := 'Select FGroupCode + '' '' + FGroupName as FGroupName,FInterID as FGroupID from Basic_ItemGroup where FTypeID = 1';
  FThis.dts0FGroup.Open;
  
  //包装单位数据集初始化
  FThis.dts0FPackUnit.Connection := dm.DBConnection;
  FThis.dts0FPackUnit.Close;
  FThis.dts0FPackUnit.SQL.Text := 'SELECT a.FName,A.FInterID '
	+ 'FROM dbo.Basic_CommonData A '	
	+ 'INNER JOIN Basic_CommonDataType b ON a.FTypeID = b.FInterID '
	+ 'WHERE b.FDataName = ''' + FThis.siLang1.GetTextW('件单位') + '''';
  FThis.dts0FPackUnit.Open;
  
  //默认仓库数据集初始化
  FThis.dts0FStockID.Connection := dm.DBConnection;
  FThis.dts0FStockID.Close;
  FThis.dts0FStockID.SQL.Text := 'select FWhsName,FInterID as FStockID from Basic_WHS WHERE isnull(FIsSWH,0)=0';
  FThis.dts0FStockID.Open;
  
  //计量单位数据集初始化
  FThis.dts0FUnit.Connection := dm.DBConnection;
  FThis.dts0FUnit.Close;
  FThis.dts0FUnit.SQL.Text := 'Select FInterID as FUnitID,FUnitCode,FUnitName,FCoefficient from Basic_Unit';
  FThis.dts0FUnit.Open;
  
  //列表数据集初始化
  FThis.dtsList.Connection := dm.DBConnection;
  FThis.dtsList.Close;
  FThis.dtsList.SQL.Text := 'Select FInterID from Basic_Item';
  FThis.dtsList.Open;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
  • PageSwitch:页面编辑状态切换的子程序。
procedure TMyHandler.PageSWitch;
//页面切换子程序
begin
  FThis.dts0.Close;
  FThis.dts0.ParamByName('FInterID').AsString := FThis.dtsList.FieldByName('FInterID').AsString;
  FThis.dts0.Open;

  FThis.dts1.Close;
  FThis.dts1.ParamByName('FInterID').AsString := FThis.dtsList.FieldByName('FInterID').AsString;
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
10
11
  • btnFirstClick:首项按钮,点击以切换数据集至首项。
procedure TMyHandler.btnFirstClick;
//首项
begin
  FThis.dtsList.First;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnPriorClick:前项按钮,点击以切换数据集至前项。
procedure TMyHandler.btnPriorClick;
//前项
begin
  FThis.dtsList.Prior;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnNextClick:后项按钮,点击以切换数据集至后项。
procedure TMyHandler.btnNextClick;
//后项
begin
  FThis.dtsList.Next;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnLastClick:末项按钮,点击以切换数据集至末项。
procedure TMyHandler.btnLastClick;
//末项
begin
  FThis.dtsList.Last;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnNewClick:新建按钮。
procedure TMyHandler.btnNewClick;
//新增
var
  vGroupID: String;
begin
  //获取分组ID并赋值
  vGroupID := FThis.dts0.FieldByName('FGroupID').AsString;
  FThis.dts0.Append;
  FThis.dts0.FieldByName('FInterID').AsInteger := dm.GetNodeID;
  FThis.dts0.FieldByName('FGroupID').AsString := vGroupID;
  FThis.dts0.Post;
  
  FThis.dts1.Close;
  FThis.dts1.ParamByName('FInterID').AsString := FThis.dts0.FieldByName('FInterID').AsString;
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
  • btnSaveClick:保存数据。
procedure TMyHandler.btnSaveClick;
//保存
Var
  vdts: TRFDataSet;
begin
  vdts := TRFDataSet.Create(Nil);
  vdts.Connection := dm.DBConnection;
  try
  	//检查物料信息必填字段是否为空
    if (Trim(FThis.dts0.FieldByName('FItemCode').AsString) = '')
    or (Trim(FThis.dts0.FieldByName('FItemName').AsString) = '')
    Then
    Begin
      ShowMessage(FThis.siLang1.GetTextW('物料代码或者物料名称不能为空!'));
      exit;
    end;
    if (Trim(FThis.dts0.FieldByName('FUnitName').AsString) = '')
    or (Trim(FThis.dts0.FieldByName('FUnitID').AsString) = '')
    or (Trim(FThis.dts0.FieldByName('FUnitCode').AsString) = '')
    or (Trim(FThis.dts0.FieldByName('FUnitPiece').AsString) = '')
    Then
    Begin
      ShowMessage(FThis.siLang1.GetTextW('计量单位或者件单位不能为空,请重新选择计量单位。'));
      exit;
    end;
    
    //检查物料代码是否有重复
    vdts.Close;
    vdts.SQL.Text := 'SELECT FInterID FROM Basic_Item WHERE FTypeID = 1 AND FItemCode = ' + '''' + FThis.dts0.FieldByName('FItemCode').AsString + '''';
    vdts.Open;
    if (vdts.RecordCount > 0) and (vdts.FieldByName('FInterID').AsInteger <> FThis.dts0.FieldByName('FInterID').AsInteger) Then
    Begin
      ShowMessage(FThis.siLang1.GetTextW('物料代码重复,请对物料代码重新编号。'));
      exit;
    end;
    
    //检查无误后执行保存
     
    if FThis.dts1.RecordCount > 0 Then
    Begin
      FThis.dts1.Edit;
      FThis.dts1.Post;
      FThis.dts1.ApplyUpdates(-1);
    End;
    FThis.dts0.Edit;
    FThis.dts0.Post;
    FThis.dts0.ApplyUpdates(-1);
    ShowMessage(FThis.siLang1.GetTextW('数据保存成功!'));
  Finally
    vdts.Free;
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
  • btnDeleteClick:删除当前显示的客户资料。
procedure TMyHandler.btnDeleteClick;
//删除
var
  AStoredProc: TRFStoredProc;
  vRAISEMSG,vMSG: String;
  i, j: Integer;
begin
  //弹出窗口提示是否删除
  if paxfunc.YesNoMsg(FThis.siLang1.GetTextW('是否删除该资料?'),FThis.siLang1.GetTextW('提示'))  then 
  begin
  AStoredProc := TRFStoredProc.Create(nil);
  AStoredProc.Connection := dm.DBConnection;
  try
    //存储过程初始化
    AStoredProc.StoredProcName := 'sp_Basic_Item';
    AStoredProc.Prepare;
    if AStoredProc.Prepared then
    begin
      //参数赋值
      AStoredProc.ParamByName('FDataID').AsString := FThis.dts0.FieldByName('FInterID').AsString;
      AStoredProc.ParamByName('Flag').AsString := 'Delete';
      AStoredProc.ParamByName('FUserCode').AsString := FThis.siLang1.GetTextW('admin');
      if AStoredProc.FindParam('FMsg') <> nil then
        AStoredProc.ParamByName('FMsg').AsString := '';
      try
      //执行存储过程
        AStoredProc.ExecProc;
        //意外情况的信息处理并显示
       Except on ExceptionMessage:Exception do
       begin
          vRAISEMSG:=ExceptionMessage.Message;
     
          i := Pos('SQMESSAGE', vRAISEMSG);
          j := Pos('[SQL Server]', vRAISEMSG);
          vMSG := Copy(vRAISEMSG, i, Length(vRAISEMSG) - i + 1);
    

          // 非格式化消息提示
          if i = 0 then
          begin
            ShowMessage(Copy(vRAISEMSG, j + 12, Length(vRAISEMSG) - j + 1));
            Exit;
          end;
        end;
        end;
        //处理完成后重新打开数据集
        FThis.dts0.Open;
        FThis.dts1.Open;
    end;
  finally
    AStoredProc.Free;
  end;  
  
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  • btnExitClick:退出当前窗口。
procedure TMyHandler.btnExitClick;
//退出
begin
  FThis.Close;
end;
1
2
3
4
5
  • btnItemSpecAppendRowClick:规格明细栏新增行。
procedure TMyHandler.btnItemSpecAppendRowClick;
//新增行
begin
  FThis.dts1.Append;
end;
1
2
3
4
5
  • dts1NewRecord:规格明细栏新增行初始化。
procedure TMyHandler.dts1NewRecord;
//新增行初始化信息FInterID,FEntryID赋值
begin
  //FThis.dts1.Edit;
  FThis.dts1.FieldByName('FInterID').AsString := FThis.dts0.FieldByName('FInterID').AsString;
  FThis.dts1.FieldByName('FEntryID').AsInteger := FThis.dts1.RecordCount + 1;
  FThis.dts1.Post;
end;
1
2
3
4
5
6
7
8
  • btnItemSpecDelRowClick:规格明细栏删除行。
procedure TMyHandler.btnItemSpecDelRowClick;
//删除行
begin
  if FThis.dts1.RecordCount > 0 Then
    FThis.dts1.Delete;
end;
1
2
3
4
5
6
  • lkupFUnitNameClick:计量单位更新。
procedure TMyHandler.lkupFUnitNameClick;
//计量单位切换时更新相应字段信息
begin
  FThis.dts0.Edit;
  FThis.dts0.FieldByName('FUnitID').AsString := FThis.dts0FUnit.FieldByName('FUnitID').AsString;
  FThis.dts0.FieldByName('FUnitCode').AsString := FThis.dts0FUnit.FieldByName('FUnitCode').AsString;  
  FThis.dts0.Post;
end;
1
2
3
4
5
6
7
8

# 3.5.5. 多语言设置

  在菜单栏点击语言-语言设置,打开多语言设置对话框,根据提示进行多语言的设置。

# 3.5.6. 运行效果

# 4. 业务单据页面设置

# 4.1. 销售订单查询-多笔数据主从表单

  销售订单页面设置如下。

# 4.1.1. 功能简述

  此页面用于查询销售订单信息,功能涉及到查询条件的引入,初始化单据等。

# 4.1.2. 窗体设置

属性 取值 说明
Caption 销售订单 主窗体的标题名称
Height 768 主窗体的高度(像素)
Name SalOrder 主窗体模块的名称
Width 1024 主窗体的宽度(像素)

# 4.1.3. 控件设置

  各表结构字段及对应的数据感知控件名称如下:

  • 控件说明

其中的TBitBtn、TDateTimePicker类型的控件需修改Font.Size为12。其中的部分查询条件需配备对应的TLabel控件,设置其Caption属性,同时设置Font.Size为12,TPanel类型的控件需要清除Caption属性中原有的字符内容。

控件名称 控件类型 说明
Panel1 TPanel 面板控件,控件置于左侧,用于放置查询条件使用的控件以及按钮
dtpBegin TDateTimePicker 设定订单的起始日期
dtpEnd TDateTimePicker 设定订单的截止日期
edQuery TEdit 编辑查询条件客户代码或名称
edFBillNo TEdit 编辑查询条件,单据编号
ComboBox1 TComboBox 复选框,单据状态
btnQuery TBitBtn 查询按钮
Caption:查询
btnClear TBitBtn 清除按钮
Caption:清除
btnEditor TBitBtn 编辑按钮
Caption:编辑
btnNew TBitBtn 新建按钮
Caption:新建
dts1 TRFDataSet 查询表数据集
ds1 TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dts1
DBGrid1 TDBGrid 销售订单数据表格
DataSource:ds1
  • DBGrid1数据表格说明

  在设置表格列之前,使用鼠标右键点击表格,在选项中选择Custom Columns,转换为自定义表格后进行设置。点击Columns属性打开对话框,在此处添加字段。选择添加的字段进行属性的更改。

FieldName
字段名
Font.Size
字体大小
Title.Caption
标题文字
Title.Font.Size
标题字体大小
Width
列宽度
FStatus 10 状态 12 60
FBillNo 10 单据编号 12 100
FDate 10 订单日期 12 80
FSignDate 10 签订日期 12 80
FCustCode 10 客户代码 12 80
FCustName 10 客户名称 12 140
FDeptName 10 部门名称 12 80
FEmpName 10 业务员 12 80
FItemCode 10 布种代码 12 80
FItemName 10 布种名称 12 100
FItemSpec 10 规格 12 80
FAuxQty 10 数量 12 64
FUnitName 10 计量单位 12 80
FContractNo 10 合同号 12 80
FBiller 10 制单人 12 80
FCreateDate 10 制单日期 12 140
FChecker 10 审核人 12 80
FCheckDate 10 审核日期 12 140
FAuxPrice 10 单价 12 80
FAmount 10 金额 12 80
FDeliverDate 10 交货日期 12 100

# 4.1.4. 脚本设计

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

//...

var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
{事件绑定  MODULE-BIND}
  this.btnQuery.OnContextPopup := FMyHandler.btnQueryContextPopup;
  this.btnQuery.OnClick := FMyHandler.btnQueryClick;
  this.btnClear.OnClick := FMyHandler.btnClearClick;
  this.btnNew.OnClick := FMyHandler.btnNewClick;
  this.btnEditor.OnClick := FMyHandler.btnEditorClick;
end.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
  • 程序模块列表
程序模块名称 说明
Create 构造器,启动后运行需初始化设置的内容
resume 恢复查询条件
ComboBoxSelect 选择单据状态
btnQueryClick 查询按钮点击,添加查询条件窗口的信息执行查询
btnClearClick 清除按钮点击,清除查询条件窗口,并执行查询
btnNewClick 新建按钮点击,打开新窗口
btnEditorClick 编辑按钮点击
  • Create:构造器,启动后运行需初始化设置的内容。
constructor TMyHandler.Create(AOwner: TComponent);
//设置查询数据集信息
begin
  FThis :=TBaseForm(AOwner);
  FThis.dts1.Connection := dm.DBConnection;
  resume;
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
  • resume:恢复查询条件。
procedure TMyHandler.resume;
//设置数据集SQL,添加查询条件
begin
  FThis.dts1.SQL.Text := 'select b.FID,b.FInterID,a.FBillID,a.FBillNo,a.FDate,a.FSignDate,' + 
  'a.FCustCode,a.FCustName,a.FDeptName,a.FEmpName,FProductItemCode,FProductItemName,' + 
  'b.FItemCode,b.FItemName,b.FItemSpec,b.FUnitName,b.FAuxQty,a.FContractNo,FSeason,' + 
  'a.FBiller,a.FCreateDate,a.FChecker,a.FCheckDate, case a.FStatus WHEN 0 THEN ''' + FThis.siLang1.GetTextW('已作废') + 
  ''' WHEN 1 THEN ''' + FThis.siLang1.GetTextW('草 稿') + ''' WHEN 2 THEN ''' + FThis.siLang1.GetTextW('已审核') + 
  ''' END AS FStatus,a.FClosed,' + 
  'b.FAuxPrice,b.FAmount,FDeliverRemark as FDeliverDate,c.FPrintCount ' + 
  'from SAL_Order a(NOLOCK) ' + 
  'inner join SAL_OrderEntry b(NOLOCK)  on a.FInterID = b.FInterID ' + 
  'Left join (select FDataID,isnull(COUNT(1),0) as FPrintCount from Dict_PrintRecord Group By FDataID) C ' + 
  'on b.FInterID = c.FDataID ' + 
  'Where 1 = 1  ' +
  'Order by a.FDate desc';
  FThis.dts1.AddWhere('a.FDate between ''' + DateToStr(FThis.dtpBegin.DateTime) +  ''' and ''' + 
  DateToStr(FThis.dtpEnd.DateTime) + '''');
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
  • ComboBoxSelect:选择单据状态。
procedure TMyHandler.ComboBoxSelect;
//选择单据状态
begin
   if FThis.ComboBox1.ItemIndex = 0 then
    FThis.dts1.AddWhere('a.FStatus IN (0,1,2)');
  IF FThis.ComboBox1.ItemIndex = 1 Then
    FThis.dts1.AddWhere('a.FStatus = 2' );
  If FThis.ComboBox1.ItemIndex = 2 Then
    FThis.dts1.AddWhere('a.FStatus = 1');
  If FThis.ComboBox1.ItemIndex = 3 Then
    FThis.dts1.AddWhere('a.FStatus = 0'); 
end;
1
2
3
4
5
6
7
8
9
10
11
12
  • btnQueryClick:查询按钮点击,添加查询条件窗口的信息执行查询。
procedure TMyHandler.btnQueryClick;
//添加查询条件窗口的信息执行查询
begin
  FThis.dts1.Close;
  resume;
  if FThis.edQuery.Text <> '' Then
    FThis.dts1.AddWhere('a.FCustCode LIKE ''%' + FThis.edQuery.Text + '%'' or a.FCustName LIKE ''%' + FThis.edQuery.Text + '%''');
  if FThis.edFBillNo.Text <> '' Then
    FThis.dts1.AddWhere('a.FBillNo LIKE ''%' + FThis.edFBillNo.Text + '%''');
  ComboBoxSelect;
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
10
11
12
  • btnClearClick:清除按钮点击,清除查询条件窗口,并执行查询。
procedure TMyHandler.btnClearClick;
//清除查询条件信息并初始化查询
begin
  FThis.edQuery.Text :=  '';
  FThis.edFBillNo.Text := '';
  FThis.dts1.Close;
  resume;
  ComboBoxSelect;
  FThis.dts1.Open;  
end;
1
2
3
4
5
6
7
8
9
10
  • btnNewClick:新建按钮点击,打开新窗口。
procedure TMyHandler.btnNewClick;
//新建
var
  F: TBaseForm;
  vInterID: Integer;
begin
  //打开编辑窗口
  F := paxfunc.OpenForm('SalOrderEdit');
  //与当前窗口建立连接
  F.TagObject := FThis;
  //设定初始状态为草稿编辑状态
  F.Tag := -1;
  //启用目标窗口的定时器功能
  TTimer(F.FindComponent('Timer1')).Enabled := True;  
  //获取唯一ID
  vInterID := dm.GetNodeID;
  //打开目标窗口数据集
  TRFDataSet(F.FindComponent('dts0')).ParamByName('FInterID').AsInteger :=  vInterID;
  TRFDataSet(F.FindComponent('dts0')).Open;
  TRFDataSet(F.FindComponent('dts0')).Append;
  //初始赋值
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FBillID').AsInteger := 12020002;
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FBillNo').AsString := dm.GetBillNo('12020002',now,True);
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FDate').AsDateTime := Date;
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FSignDate').AsDateTime := Date;
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FContractNo').AsString := TRFDataSet(F.FindComponent('dts0')).FieldByName('FBillNo').AsString;
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FExchangeRate').AsInteger := 1;
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FStatus').AsInteger := 1;
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FClosed').AsInteger  :=  0;
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FBiller').AsString := FThis.siLang1.GetTextW('admin');
  TRFDataSet(F.FindComponent('dts0')).FieldByName('FCreateDate').AsDateTime := now;
  //明细数据集初始赋值
  TRFDataSet(F.FindComponent('dts1')).ParamByName('FInterID').AsInteger := vInterID;
  TRFDataSet(F.FindComponent('dts1')).Open;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
  • btnEditorClick:编辑按钮点击。
procedure TMyHandler.btnEditorClick;
//编辑
var
  F: TBaseForm;
  vInterID: Integer;
begin
  //打开编辑窗口
  F := paxfunc.OpenForm('SalOrderEdit');
  //与当前窗口建立连接
  F.TagObject := FThis;
  //数据集初始赋值
  TRFDataSet(F.FindComponent('dts0')).ParamByName('FInterID').AsInteger :=  FThis.dts1.FieldByName('FInterID').AsInteger;
  TRFDataSet(F.FindComponent('dts0')).Open;
  //获取单据状态,根据状态设置窗口的编辑模式
  F.Tag := TRFDataSet(F.FindComponent('dts0')).FieldByName('FStatus').AsInteger;
  TTimer(F.FindComponent('Timer1')).Enabled := True; 
   //数据集获取
  TRFDataSet(F.FindComponent('dts1')).ParamByName('FInterID').AsInteger := FThis.dts1.FieldByName('FInterID').AsInteger;
  TRFDataSet(F.FindComponent('dts1')).Open;
  //获取单据列表信息并定位单据位置
  While TRFDataSet(F.FindComponent('dtsList')).FieldByName('FInterID').AsString <> FThis.dts1.FieldByName('FInterID').AsString do
  begin
    TRFDataSet(F.FindComponent('dtsList')).Next;
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# 4.1.5. 多语言设置

  在菜单栏点击语言-语言设置,打开多语言设置对话框,根据提示进行多语言的设置。

# 4.1.6. 运行效果

# 4.2. 销售订单编辑-多笔数据主从表单

  销售订单编辑页面设置如下。

# 4.2.1. 功能简述

  此页面用于编辑销售订单的信息,执行审核、打印等操作,功能涉及到窗口数据集的数据导入、查找表数据的引入、审核、消审功能的存储过程的引入、窗口打印与Flying打印的引入。

# 4.2.2. 窗体设置

属性 取值 说明
Caption 销售订单编辑 主窗体的标题名称
Height 768 主窗体的高度(像素)
Name SalOrderEdit 主窗体模块的名称
Width 1024 主窗体的宽度(像素)

# 4.2.3. 控件设置

  各表结构字段及对应的控件名称如下:

  • 主窗口控件说明

  其中的TBitBtn、TGroupBox、TComboBox、TDateTimePicker类型的控件需修改Font.Size为12,TPanel类型的控件需要清除Caption属性中原有的字符内容。

控件名称 控件类型 说明
MainMenu1 TMainMenu 菜单控件,用于创建菜单栏目
Panel1 TPanel 面板控件,顶部按钮布局容器
Panle2 TPanel 面板控件,订单信息布局容器
Panel3 TPanel 面板控件,顶部布局,显示订单日期,状态信息等控件的布局容器
GroupBox1 TGroupBox 分组框控件,设置显示订单信息的数据感知控件
PageControl1 TPageControl 标签页面分组控件,设置页面订单的信息在页面空白处右键单击选择New Page新增标签页TabSheet
TabSheet1 TTabSheet PageControl1中的标签页面1
Caption:订单明细
TabSheet2 TTabSheet PageControl1中的标签页面2
Caption:订单要求
TabSheet3 TTabSheet PageControl1中的标签页面3
Caption:装运及包装要求
TabSheet4 TTabSheet PageControl1中的标签页面4
Caption:附件
btnNew TBitBtn 新建按钮,点击以新建销售订单
Caption:新建
btnFirst TBitBtn 首项按钮,点击跳转至记录的首页
Caption:首项
btnPrior TBitBtn 前项按钮,点击跳转至记录的前项
Caption:前项
btnNext TBitBtn 后项按钮,点击跳转至记录的后项
Caption:后项
btnLast TBitBtn 末项按钮,点击跳转至记录的末项
Caption:末项
btnSave TBitBtn 保存按钮,点击以保存单据的更改
Caption:保存
btnExit TBitBtn 退出按钮,点击以退出窗口
Caption:退出
ComboBoxPrinter TComboBox 用于显示打印机列表
Visible:控件是否可见,设置为False
btnNew TBitBtn 新建按钮,点击以新建客户资料
Caption:新建
dtpdts0FDate TDateTimePicker 显示订单日期
dts0 TRFDataSet 销售订单主表数据集
ds0 TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dts0
dtsFStatus TRFDataSet 状态表数据集
dsFStatus TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsFStatus
dtsFStatus TRFDataSet 状态表数据集
dsFStatus TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsFStatus
dtsFSaleType TRFDataSet 销售类型数据集
dsFSaleType TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsFSaleType
dtsFCustID TRFDataSet 客户名称数据集
dsFCustID TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsFCustID
dtsFCurrencyID TRFDataSet 币种资料数据集
dsFCurrencyID TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsFCurrencyID
dtsFDeptID TRFDataSet 部门名称数据集
dsFDpetID TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsFDeptID
dtsFEmpID TRFDataSet 业务员名称数据集
dsFEmpID TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsFDeptEmpID
dtsList TRFDataSet 销售订单单据信息数据集
dtsCompany TRFDataSet 公司资料数据集信息
Timer1 TTimer 定时器
Timer2 TTimer 定时器
  • MainMenu1设计内容

  选择菜单控件,右键点击选择Edit,打开窗口设计页面。在此页面中,点击菜单项,然后点击+按钮,会在选择的菜单目录下方新增一个菜单项目。最终新增的菜单项目如下图所示。每新增一个菜单项目后,可选择此菜单项目,在左侧的属性查看器中修改控件的Caption属性。

控件名称 菜单名称 说明
MenuItem1 功能 功能分组菜单栏
  miCheck 审核 审核菜单栏
  miUnCheck 消审 消审菜单栏
  miRevoke 作废 作废菜单栏
  miRecover 还原 还原菜单栏
  miDelete 删除 删除菜单栏
FlyingPrint Flying打印 执行Flying打印
  miReportDesign 设计打印格式 打印格式设计
  miReportPrint 打印 打印
  • 主窗口数据感知控件说明

  此页面中首页绑定的数据源DataSource为ds0,所有涉及到文字显示的控件的文字大小属性Font.Size修改为12。由于数据感知控件不包含标签显示,故每放置一个字符编辑类型的数据感知控件前,需要先放置一个TLabel控件,并将其Caption属性设置为数据字段对应的中文名称,同样也需要将其 Font.Size修改为12。

数据字段名称 中文名称 对应控件类型 控件名称 备注
FSaleType 销售类型 TDBLookupComboBox lkupdts0FSaleType 列表绑定的数据源
ListSource:dsFSaleType
列表显示的字段名
ListField:FName
列表对应返回的字段值
KeyField: FName
FStatus 状态 TDBLookupComboBox lkupdts0FSaleType 列表绑定的数据源
ListSource:dsFStatus
列表显示的字段名
ListField:FName
列表对应返回的字段值
KeyField: FID
FBillNo 单据编号 TDBEdit eddts0FBillNo ReadOnly:False
FCustID 客户名称 TDBLookupComboBox lkupdts0FCustID 列表绑定的数据源
ListSource:dsFCustID
列表显示的字段名
ListField:FCustName
列表对应返回的字段值
KeyField:FCustID
FContractNo 合同号 TDBEdit eddts0FContractNo
FCurrencyID 币种 TDBLookupComboBox lkupdts0FCurrencyID 列表绑定的数据源
ListSource:dsFCurrencyID
列表显示的字段名
ListField:FCurrencyName
列表对应返回的字段值
KeyField:FCurrencyID
FDeptID 部门名称 TDBLookupComboBox lkupdts0FDeptID 列表绑定的数据源
ListSource:dsFDeptID
列表显示的字段名
ListField:FDeptName
列表对应返回的字段值
KeyField:FDeptID
FEmpID 部门名称 TDBLookupComboBox lkupdts0FEmpID 列表绑定的数据源
ListSource:dsFEmpID
列表显示的字段名
ListField:FEmpName
列表对应返回的字段值
KeyField:FEmpID
FExchangeRate 汇率 TDBEdit eddts0FExchangeRate
FNote 备注 TDBMemo mmdts0FNote
  • TabSheet1控件说明

  其中的TBitBtn类型的控件需修改Font.Size为12。TPanel类型的控件需要清除Caption属性中原有的字符内容。

控件名称 控件类型 说明
Panel4 TPanel 布局控件,布局于顶部位置,放置按钮
btnDelRow TBitBtn 删除行
btnCopyRow TBitBtn 复制行
btnImportItem TBitBtn 导入物料
dts1 TRFDataSet 销售订单明细数据集
ds1 TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dts1
DBGrid1 TDBGrid 销售订单明细数据表格
DataSource:ds1
  • DBGrid1数据表格说明

  在设置表格列之前,使用鼠标右键点击表格,在选项中选择Custom Columns,转换为自定义表格后进行设置。点击Columns属性打开对话框,在此处添加字段。选择添加的字段进行属性的更改。

FieldName
字段名
Font.Size
字体大小
Title.Caption
标题文字
Title.Font.Size
标题字体大小
Width
列宽度
FEntryID 10 序号 12 64
FItemCode 10 布种代码 12 80
FItemName 10 布种名称 12 100
FItemSpec 10 规格 12 100
FUnitName 10 计量单位 12 64
FColorName 10 颜色名称 12 80
FColorNo 10 色号 12 80
FWidth 10 门幅 12 80
FWidthInfo 10 门幅说明 12 80
FWeightOfLength 10 克重 12 80
FQtyPiece 10 件数 12 80
FUnitPiece 10 件单位 12 64
FAuxQty 10 数量 12 80
FAuxPrice 10 单价 12 80
FAmount 10 金额 12 80
FNote 10 备注 12 80
FDeliverDate 10 交货日期 12 100
  • TabSheet2控件说明
控件名称 控件类型 说明
Panel5 TPanel 布局控件,布局于顶部位置,放置说明信息
Caotion;订单要求
Alignment(对齐方式):taLeftJustify
  • TabSheet2数据感知控件说明

  此页面中首页绑定的数据源DataSource为ds0,控件的文字大小属性Font.Size修改为12。由于数据感知控件不包含标签显示,需要先放置一个TLabel控件,并将其Caption属性设置为数据字段对应的中文名称,同样也需要将其 Font.Size修改为12。

数据字段名称 中文名称 对应控件类型 控件名称 备注
FOrderRequest 订单要求 TDBMemo mmdts0FOrderRequest
  • TabSheet3控件说明

TDateTimePicker控件需设置显示的文字大小属性Font.Size为12。

控件名称 控件类型 说明
dtsPort TRFDataSet 港口信息数据集
dsPort TDataSource 数据源控件,用于对接数据感知控件,其DataSet属性设置为dtsPort
dtpdts0FSignDate TDateTimePicker 签订日期的设置
  • TabSheet3数据感知控件说明

  此页面中首页绑定的数据源DataSource为ds0,控件的文字大小属性Font.Size修改为12。由于数据感知控件不包含标签显示,需要先放置一个TLabel控件,并将其Caption属性设置为数据字段对应的中文名称,同样也需要将其 Font.Size修改为12。

数据字段名称 中文名称 对应控件类型 控件名称 备注
FSignAddr 签订地点 TDBEdit eddts0FSignAddr
FBeginPort 出发港口 TDBLookupComboBox lkupdtts0FBeginPort 列表绑定的数据源
ListSource:dsPort
列表显示的字段名
ListField:FName
列表对应返回的字段值
KeyField:FName
FEndPort 目的港口 TDBLookupComboBox lkupdts0FEndPort 列表绑定的数据源
ListSource:dsPort
列表显示的字段名
ListField:FName
列表对应返回的字段值
KeyField:FName
FTrafficType 运输方式 TDBEdit eddts0FTrafficType
FPacket 包装方式 TDBMemo mmFPacket
  • TabSheet4控件说明

TBitBtn类型的控件需设置按钮文字大小Font.Size为12。

控件名称 控件类型 说明
btnUpload TBitBtn 上传按钮
btnClear TBitBtn 清除图片
OpenPictureDialog TOpenPictureDialog 打开图片对话框
  • TabSheet4数据感知控件说明

  此页面中首页绑定的数据源DataSource为ds0。

数据字段名称 中文名称 对应控件类型 控件名称 备注
FImage 订单图片 TDBImage DBImage1

  其中需要注意的是DBImage1,需额外设置其Font属性,将其颜色修改为白色,并将其Color属性设置为clWhite以掩盖控件名称的标识。

# 4.2.4. 脚本设计

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

//....

var
  FMyHandler:TMyHandler;
begin
  FMyHandler := TMyHandler.Create(this);
{事件绑定  MODULE-BIND}
  this.btnNew.OnClick := FMyHandler.btnNewClick;
  this.btnFirst.OnClick := FMyHandler.btnFirstClick;
  this.btnPrior.OnClick := FMyHandler.btnPriorClick;
  this.btnNext.OnClick := FMyHandler.btnNextClick;
  this.btnLast.OnClick := FMyHandler.btnLastClick;
  this.btnSave.OnClick := FMyHandler.btnSaveClick;
  this.btnExit.OnClick := FMyHandler.btnExitClick;
  this.miCheck.OnClick := FMyHandler.miCheckClick;
  this.miUnCheck.OnClick := FMyHandler.miUnCheckClick;
  this.miRevoke.OnClick := FMyHandler.miRevokeClick;
  this.miRecover.OnClick := FMyHandler.miRecoverClick;
  this.miDelete.OnClick := FMyHandler.miDeleteClick;
  this.FlyingPrint.OnClick := FMyHandler.FlyingPrintClick;
  this.btnDelRow.OnClick := FMyHandler.btnDelRowClick;
  this.btnCopyRow.OnClick := FMyHandler.btnCopyRowClick;
  this.btnImportItem.OnClick := FMyHandler.btnImportItemClick;
  this.miReportDesign.OnClick := FMyHandler.miReportDesignClick;
  this.miReportPrint.OnClick := FMyHandler.miReportPrintClick;
  this.Timer1.OnTimer := FMyHandler.Timer1Timer;
  this.dts0.BeforeEdit := FMyHandler.dts0BeforeEdit;
  this.dts1.BeforeEdit := FMyHandler.dts1BeforeEdit;
  this.lkupdts0FCustID.OnClick := FMyHandler.lkupdts0FCustIDClick;
  this.dtpdts0FDate.OnChange := FMyHandler.dtpdts0FDateChange;
  this.dtpdts0FSignDate.OnChange := FMyHandler.dtpdts0FSignDateChange;
  this.dts1.OnNewRecord := FMyHandler.dts1NewRecord;
  this.Flying.OnReceived := FMyHandler.FlyingReceived;
  this.Timer2.OnTimer := FMyHandler.Timer2Timer;
  this.btnUpload.OnClick := FMyHandler.btnUploadClick;
  this.btnClear.OnClick := FMyHandler.btnClearClick;
end.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
  • 程序模块列表
程序模块名称 说明
Create 构造器,启动后运行需初始化设置的内容
RefState 刷新单据的按钮状态显示
DataSetRowCopy 数据集复制行
PageSwitch 页面切换子程序
ManuRefresh 刷新显示
DoBillBusness 执行功能,比如审核、消审等操作
btnNewClick 新建销售订单
btnFirstClick 返回单据首项
btnPriorClick 返回单据的前一项
btnNextClick 返回单据的后一项
btnLastClick 返回单据的末项
btnSaveClick 保存单据
btnExitClick 退出当前窗口
miCheckClick 审核菜单项的点击触发事件
miUnCheckClick 消审菜单项的点击触发事件
miRevokeClick 作废菜单项的点击触发事件
miRecoverClick 还原菜单项的点击触发事件
miDeleteClick 删除菜单项的点击触发事件
FlyingPrintClick Flying打印菜单项的点击触发事件
btnDelRowClick 删除行点击触发事件
btnCopyRowClick 数据集复制行
btnImportItemClick 数据集导入物料
miReportDesignClick 窗口数据集设计页面
miReportPrintClick 窗口数据集打印
Timer1Timer 定时器触发事件,刷新页面显示状态
dts0BeforeEdit 主数据集启用编辑前,设置页面为编辑状态
dts1BeforeEdit 明细数据集启用编辑前,设置页面为编辑状态
lkupdts0FCustIDClick 客户名称在选择时更新对应的数据集信息
dtpdts0FDateChange 单据日期变动时变更对应的数据集字段信息
dtpdts0FSignDateChange 单据签订日期变动时变更对应的数据集字段信息
dts1NewRecord 明细数据集新增时进行基础资料设置
FlyingReceived 当Flying接收到信息时执行操作
Timer2Timer 定时器触发事件,执行打印相关的操作
btnUploadClick 上传图片按钮点击事件
btnClearClick 清除图片按钮点击事件
  • Create:构造器,启动后运行需初始化设置的内容。
constructor TMyHandler.Create(AOwner: TComponent);
//数据集初始化
begin
  FThis :=TBaseForm(AOwner);
  //主数据集初始化
  FThis.dts0.Connection := dm.DBConnection;
  FThis.dts0.SQL.Text := 'select a.*,b.FCustName as FCustFullName,b.FAddress,b.FPhone1,' + 
  'b.FHousebank,b.FHouseBnkAct from Sal_Order a(NOLOCK) LEFT JOIN Basic_Cust B ON ' + 
  'A.FCustID = B.FInterID where a.FInterID =:FInterID';
  //明细数据集初始化
  FThis.dts1.Connection := dm.DBConnection;
  FThis.dts1.SQL.Text := 'select a.*,b.FBillNo as FTechnicsNo from Sal_OrderEntry a(NOLOCK) ' + 
  'left join Tex_Technics B on a.FTechnicsID = b.FInterID where a.FInterID =:FInterID  ' + 
  'order by a.FEntryID';
  //单据列表数据集初始化(从主窗口中获取)
  FThis.dtsList.Connection := dm.DBConnection;
  FThis.dtsList.SQL.Text := 'select FInterID FROM Sal_Order where 1=1';
  FThis.dtsList.Open;
  
  //销售类型数据集初始化
  FThis.dtsFSaleType.Connection := dm.DBConnection;
  FThis.dtsFSaleType.SQL.Text := 'SELECT a.FName,a.FInterID FROM dbo.Basic_CommonData A ' +
  'INNER JOIN Basic_CommonDataType b ON a.FTypeID = b.FInterID WHERE b.FDataName = ''' + 
  FThis.siLang1.GetTextW('销售类型') + '''';
  FThis.dtsFSaleType.Open;
  //状态数据集初始化
  FThis.dtsFStatus.Connection := dm.DBConnection;
  FThis.dtsFStatus.SQL.Text := 'Select FName=''' + FThis.siLang1.GetTextW('已作废') + 
  ''',FID = 0 union Select FName=''' + FThis.siLang1.GetTextW('草 稿') + 
  ''',FID = 1 union  Select FName=''' + FThis.siLang1.GetTextW('已审核') + 
  ''',FID = 2 ORDER  BY FID desc';
  FThis.dtsFStatus.Open;
  //客户资料数据集初始化
  FThis.dtsFCustID.Connection := dm.DBConnection;
  FThis.dtsFCustID.SQL.Text := 'select a.FCustCode,a.FShortName as FCustName,a.FCustName ' + 
  'as FCustFullName,a.FEmpCode,a.FEmpName,a.FAddress,a.FPhone1,a.FPhone2,a.FTel,a.FContacts,' + 
  'a.FHouseBank,a.FHouseBnkAct, A.FDeptCode,A.FDeptName,a.FInterID as FCustID,a.FEmpID,a.FDeptID, ' + 
  'A.FSettleID,A.FSettleName,A.FPayItemID,A.FPayItemName,A.FSaleType, a.FSaleType as FOrderType ' + 
  'from Basic_Cust A left join Basic_employee b on a.FEmpID = b.FInterID where isnull(a.FfrozenFor,0) = 0 ' + 
  'order by FCustCode';
  FThis.dtsFCustID.Open;
  
  //部门数据集初始化
  FThis.dtsFDeptID.Connection := dm.DBConnection;
  FThis.dtsFDeptID.SQL.Text := 'SELECT FGroupID as FDeptID,FGroupCode as FDeptCode,FGroupName as FDeptName ' + 
  'FROM Dict_GroupInfo';
  FThis.dtsFDeptID.Open;
  
  //业务员数据集初始化
  FThis.dtsFEmpID.Connection := dm.DBConnection;
  FThis.dtsFEmpID.SQL.Text := 'SELECT FInterID as FEmpID,FEmpCode,FEmpName FROM Basic_Employee';
  FThis.dtsFEmpID.Open;
  
  //币种数据集初始化
  FThis.dtsFCurrencyID.Connection := dm.DBConnection;
  FThis.dtsFCurrencyID.SQL.Text := 'SELECT FCode as FCurrencyCode,FName as FCurrencyName,FInterID AS ' +
  'FCurrencyID,FExRate AS FExchangeRate FROM Basic_Currency';
  FThis.dtsFCurrencyID.Open;  
  
  //港口数据集初始化
  FThis.dtsPort.Connection := dm.DBConnection;
  FThis.dtsPort.SQL.Text := 'SELECT a.FName,a.FInterID FROM dbo.Basic_CommonData A INNER JOIN Basic_CommonDataType ' + 
  'b ON a.FTypeID = b.FInterID WHERE b.FDataName = ''' + FThis.siLang1.GetTextW('港口') + '''';
  FThis.dtsPort.Open; 
  
  //公司资料初始化
  FThis.dtsCompany.Connection := dm.DBConnection;
  FThis.dtsCompany.SQL.Text := 'select top 1 * FROM Basic_Company';
  FThis.dtsCompany.Open;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
  • RefState:刷新单据的按钮状态显示。
//单据状态发生变化时,启用或者禁用部分按钮
procedure TMyHandler.RefState(aState: Integer);
begin
  FThis.Tag := aState;
  if aState = -1 then
  //草稿编辑状态
  begin
    FThis.btnFirst.Enabled := False;
    FThis.btnPrior.Enabled := False;
    FThis.btnNext.Enabled := False;
    FThis.btnLast.Enabled := False;
    FThis.btnNew.Enabled := False;
    FThis.btnSave.Enabled := True;
    FThis.btnUpload.Enabled := True;
    FThis.btnDelRow.Enabled := True;
    FThis.btnCopyRow.Enabled := True;
    FThis.btnImportItem.Enabled := True;
    FThis.btnClear.Enabled := True;
    
    //控件控制
    FThis.ds0.AutoEdit := True;
    FThis.ds1.AutoEdit := True;  
  end;
  if aState = 1 then
  //草稿状态
  begin
    FThis.btnFirst.Enabled := True;
    FThis.btnPrior.Enabled := True;
    FThis.btnNext.Enabled := True;
    FThis.btnLast.Enabled := True;
    FThis.btnNew.Enabled := True;
    FThis.btnSave.Enabled := False;
    FThis.btnUpload.Enabled := True;
    FThis.btnDelRow.Enabled := True;
    FThis.btnCopyRow.Enabled := True;
    FThis.btnImportItem.Enabled := True;
    FThis.btnClear.Enabled := True;
    
    //控件控制
    FThis.ds0.AutoEdit := True;
    FThis.ds1.AutoEdit := True;  
  end;
  if aState = 2 then
  //审核状态
  begin
    FThis.btnFirst.Enabled := True;
    FThis.btnPrior.Enabled := True;
    FThis.btnNext.Enabled := True;
    FThis.btnLast.Enabled := True;
    FThis.btnNew.Enabled := True;
    FThis.btnSave.Enabled := False;
    FThis.btnUpload.Enabled := False;
    FThis.btnDelRow.Enabled := False;
    FThis.btnCopyRow.Enabled := False;
    FThis.btnImportItem.Enabled := False;
    FThis.btnClear.Enabled := False;
    
    //控件控制
    FThis.ds0.AutoEdit := False;
    FThis.ds1.AutoEdit := False;  
  end;
  if aState = 0 then
  //作废状态
  begin
    FThis.btnFirst.Enabled := True;
    FThis.btnPrior.Enabled := True;
    FThis.btnNext.Enabled := True;
    FThis.btnLast.Enabled := True;
    FThis.btnNew.Enabled := True;
    FThis.btnSave.Enabled := False;
    FThis.btnUpload.Enabled := False;
    FThis.btnDelRow.Enabled := False;
    FThis.btnCopyRow.Enabled := False;
    FThis.btnImportItem.Enabled := False;
    FThis.btnClear.Enabled := False;
    
    //控件控制
    FThis.ds0.AutoEdit := False;
    FThis.ds1.AutoEdit := False;  
  end;
  ManuRefresh;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
  • DataSetRowCopy:数据集复制行。
//复制行功能
procedure TMyHandler.DataSetRowCopy(QDataSet: TRFDataSet);
var
  curRec: array of Variant;
  i: Integer;
begin
  if QDataSet.IsEmpty then
    Exit;
  //设定长度
  SetLength(curRec, QDataSet.FieldCount);
  for i := 0 to length(curRec)-1 do
    curRec[i] := QDataSet.Fields[i].value;
  QDataSet.Edit;
  try
    QDataSet.Append;
    for i := 0 to length(curRec)-1 do
    begin
      QDataSet.Edit;
      if (curRec[i] <> null) and (QDataSet.Fields[i].IsNull) then
        QDataSet.Fields[i].value := curRec[i];
    end;
    QDataSet.Post;
  finally
  end;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
  • PageSwitch:页面切换子程序。
procedure TMyHandler.PageSwitch;
//切换页面的相关准备
begin
  FThis.dts0.Close;
  FThis.dts0.ParamByName('FInterID').AsString := FThis.dtsList.FieldByName('FInterID').AsString;
  FThis.dts0.Open;
  FThis.dts1.Close;
  FThis.dts1.ParamByName('FInterID').AsString := FThis.dtsList.FieldByName('FInterID').AsString;
  FThis.dts1.Open;
  
  ManuRefresh;
  
  RefState(FThis.dts0.FieldByName('FStatus').AsInteger);  
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
  • ManuRefresh:刷新显示。
//未设置数据感知的控件显示数据库数据信息。
procedure TMyHandler.ManuRefresh;
begin
  FThis.dtpdts0FDate.DateTime := FThis.dts0.FieldByName('FDate').AsDateTime;
  FThis.dtpdts0FSignDate.DateTime := FThis.dts0.FieldByName('FDate').AsDateTime;
end;
1
2
3
4
5
6
  • DoBillBusness:执行功能,比如审核、消审等操作。
//审核、消审等操作
procedure TMyHandler.DoBillBusness(aFlag: String);
var
  ADataSet: TRFDataSet;
  AStoredProc: TRFStoredProc;
  sOptName: String;
  strSQL: String;
  iReturnFlag: Integer;
  iReturnMsg: String;
  i, j: Integer;
  vRAISEMSG: string;
  vMSG: string;
  Field: TField;
begin
  { 执行存储过程 sp_XXXX }
  { sp_XXXX @ProcID, @DataID, @UserID }
    sOptName := AFlag;

  AStoredProc := TRFStoredProc.Create(nil);
  AStoredProc.Connection := dm.DBConnection;
  try
    //存储过程准备
    AStoredProc.StoredProcName := 'sp_Sal_Order';
    AStoredProc.Prepare;
    if AStoredProc.Prepared then
    begin
    //参数赋值
      AStoredProc.ParamByName('ProcID').AsString := sOptName;
      AStoredProc.ParamByName('DataID').AsString := FThis.dts0.FieldByName('FInterID').AsString;
      AStoredProc.ParamByName('UserID').AsString := FThis.siLang1.GetTextW('admin');
      if AStoredProc.FindParam('SQResult') <> nil then
        AStoredProc.ParamByName('SQResult').AsString := '';
      try
      //执行存储过程
        AStoredProc.ExecProc;
        //意外情况信息反馈的字符串处理
       Except on ExceptionMessage: Exception do
       begin 
          vRAISEMSG:=ExceptionMessage.Message;
     
          i := Pos('SQMESSAGE', vRAISEMSG);
          j := Pos('[SQL Server]', vRAISEMSG);
          vMSG := Copy(vRAISEMSG, i, Length(vRAISEMSG) - i + 1);
    

          // 非格式化消息提示
          if i = 0 then
          begin
            ShowMessage(Copy(vRAISEMSG, j + 12, Length(vRAISEMSG) - j + 1));
            Exit;
          end;
          end;
        end;
    end;
  finally
    AStoredProc.Free;
  end;
  //刷新数据集显示,更新单据编辑状态
  FThis.dts0.Open;
  FThis.dts1.Open;
  RefState(FThis.dts0.FieldByName('FStatus').AsInteger);
End;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
  • btnNewClick:新建销售订单。
procedure TMyHandler.btnNewClick;
//新建单据
Var
  FInterID: Integer;
begin
  //预留区,如果单据处于编辑状态,新建按钮会变成灰色
  FInterID := DM.GetNodeID;
  FThis.dts0.Close;
  FThis.dts0.ParamByName('FInterID').AsInteger := FInterID;
  FThis.dts0.Open;
  FThis.dts0.Append;
  //生成单据号初始赋值
  FThis.dts0.FieldByName('FInterID').AsInteger := FInterID;
  FThis.dts0.FieldByName('FBillID').AsInteger := 12020002;
  FThis.dts0.FieldByName('FBillNo').AsString := dm.GetBillNo('12020002',now,True);
  FThis.dts0.FieldByName('FDate').AsDateTime := Date;
  FThis.dts0.FieldByName('FSignDate').AsDateTime := Date;
  FThis.dts0.FieldByName('FContractNo').AsString := FThis.dts0.FieldByName('FBillNo').AsString;
  FThis.dts0.FieldByName('FExchangeRate').AsInteger := 1;
  FThis.dts0.FieldByName('FStatus').AsInteger := 1;
  FThis.dts0.FieldByName('FClosed').AsInteger := 0;
  FThis.dts0.FieldByName('FBiller').AsString := FThis.siLang1.GetTextW('admin');
  FThis.dts0.FieldByName('FCreateDate').AsDateTime := now; 
  FThis.dts0.Post;
  //明细数据集赋值
  FThis.dts1.Close;
  FThis.dts1.ParamByName('FInterID').AsString := FThis.dts0.FieldByName('FInterID').AsString;
  FThis.dts1.Open;
  //更新编辑状态
  RefState(-1);
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
  • btnFirstClick:返回单据首项。
procedure TMyHandler.btnFirstClick;
//首页
begin
  FThis.dtsList.First;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnPriorClick:返回单据的前一项。
//前项
procedure TMyHandler.btnPriorClick;
begin
  FThis.dtsList.Prior;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnNextClick:返回单据的后一项。
//后项
procedure TMyHandler.btnNextClick;
begin
  FThis.dtsList.Next;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnLastClick:返回单据的末项。
//末项
procedure TMyHandler.btnLastClick;
begin
  FThis.dtsList.Last;
  PageSwitch;
end;
1
2
3
4
5
6
  • btnSaveClick:保存单据。
//保存
procedure TMyHandler.btnSaveClick;
//保存
Var
  vdts: TRFDataSet;
  vSQL: String;
Begin
    //检查明细数据集是否为空,以及必填字段信息是否为空
    FThis.dts1.Edit;
    FThis.dts1.Post;
    if FThis.dts1.RecordCount = 0 Then
    Begin 
      ShowMessage(FThis.siLang1.GetTextW('明细数据不能为空!'));
      Exit;
    End;
    if (Trim(FThis.dts0.FieldByName('FCustID').AsString) = '')
    or (Trim(FThis.dts0.FieldByName('FDeptID').AsString) = '')
  	Then
  	Begin
    	ShowMessage(FThis.siLang1.GetTextW('客户名称不能为空!'));
    	exit;
  	end;
   //检查明细数据集中的各记录的必填字段是否为空
    FThis.dts1.First;
    While not FThis.dts1.Eof Do
    Begin
      if (Trim(FThis.dts1.FieldByName('FItemID').AsString)='')
      or (Trim(FThis.dts1.FieldByName('FAmount').AsString)='')
      Then
      Begin
        ShowMessage(FThis.siLang1.GetTextW('物料信息不能为空!'));
        Exit;
      End;
      FThis.dts1.Next;
    End;
    
    //执行保存,检查是否有重复单据存在
    vdts :=TRFDataSet.Create(Nil);
    try
      vdts.Connection := dm.DBConnection;
      vdts.SQL.Text := 'SELECT FInterID FROM Sal_Order WHERE FInterID =' + FThis.dts0.FieldByName('FInterID').AsString;
      vdts.Open;
      if vdts.RecordCount = 0 Then
        FThis.dts0.FieldByName('FBillNo').AsString := dm.GetBillNo('12020002',now,False);

      DataSetSort(FThis.dts1,'FEntryID'); 
      //保存明细信息
      if FThis.dts1.RecordCount > 0 Then
      Begin
        FThis.dts1.Edit;
        FThis.dts1.Post;
    	FThis.dts1.ApplyUpdates(-1);
      End;
      //保存主数据集信息
      FThis.dts0.Edit;
      FThis.dts0.Post;
      FThis.dts0.ApplyUpdates(-1);
      ShowMessage(FThis.siLang1.GetTextW('数据保存成功!'));
      RefState(1);
    Finally
      vdts.Free;
    End;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
  • btnExitClick:退出当前窗口。
//退出窗口
procedure TMyHandler.btnExitClick;
begin
  FThis.Close;
end;
1
2
3
4
5
  • miCheckClick:审核菜单项的点击触发事件。
//审核
procedure TMyHandler.miCheckClick;
begin
  DoBillBusness('Check');
end;
1
2
3
4
5
  • miUnCheckClick:消审菜单项的点击触发事件。
//消审
procedure TMyHandler.miUnCheckClick;
begin
  DoBillBusness('UnCheck');
end;
1
2
3
4
5
  • miRevokeClick:作废菜单项的点击触发事件。
//作废
procedure TMyHandler.miRevokeClick;
begin
  DoBillBusness('Revoke');
end;
1
2
3
4
5
  • miRecoverClick:还原菜单项的点击触发事件。
//还原
procedure TMyHandler.miRecoverClick;
begin
  DoBillBusness('Recover');
end;
1
2
3
4
5
  • miDeleteClick:删除菜单项的点击触发事件。
procedure TMyHandler.miDeleteClick;
begin
//删除
  DoBillBusness('Delete');
end;
1
2
3
4
5
  • FlyingPrintClick:Flying打印菜单项的点击触发事件。
//执行Flying打印,获取打印列表
procedure TMyHandler.FlyingPrintClick;
begin
  FThis.Flying.GetPrintList;
end;
1
2
3
4
5
  • btnDelRowClick:删除行点击触发事件。
//删除行
procedure TMyHandler.btnDelRowClick;
begin
  //启用编辑状态
  RefState(-1);
  if FThis.dts1.RecordCount = 0 then
  Begin
    ShowMessage(FThis.siLang1.GetTextW('无可删除的明细数据!'));
    Exit;
  End;
  FThis.dts1.Delete;
end;
1
2
3
4
5
6
7
8
9
10
11
12
  • btnCopyRowClick:数据集复制行。
//复制行
procedure TMyHandler.btnCopyRowClick;
begin
  //启用编辑状态
  RefState(-1);
  DataSetRowCopy(FThis.dts1);
end;
1
2
3
4
5
6
7
  • btnImportItemClick:数据集导入物料。
procedure TMyHandler.btnImportItemClick;
//导入窗体设置
var
  F: TBaseForm;
begin
  //打开导入物料编辑页面
  F := paxfunc.OpenForm('ImportItem');
  //建立连接
  F.TagObject := FThis;
end;
1
2
3
4
5
6
7
8
9
10
  • miReportDesignClick:窗口数据集设计页面。
procedure TMyHandler.miReportDesignClick;
//设计打印格式
begin
  paxfunc.ShowReport('Smart',FThis,'','',False,False);
end;
1
2
3
4
5
  • miReportPrintClick:窗口数据集打印。
procedure TMyHandler.miReportPrintClick;
//执行打印预览
begin
  paxfunc.ShowReport('Smart',FThis,'','786BFF0A-2E61-48D3-8E19-8AAE86660B21',False,True);  
end;
1
2
3
4
5
  • Timer1Timer:定时器触发事件,刷新页面显示状态。
//设置打开时的模式
procedure TMyHandler.Timer1Timer;
begin
  FThis.Timer1.Enabled := False;
  RefState(FThis.Tag);
end;
1
2
3
4
5
6
  • dts0BeforeEdit:主数据集启用编辑前,设置页面为编辑状态。
//启用主数据集编辑模式前设置窗体为编辑模式
procedure TMyHandler.dts0BeforeEdit;
begin
  RefState(-1);
end;
1
2
3
4
5
  • dts1BeforeEdit:明细数据集启用编辑前,设置页面为编辑状态。
//启用明细数据集编辑模式前设置窗体为编辑模式
procedure TMyHandler.dts1BeforeEdit;
begin
  RefState(-1);
end;
1
2
3
4
5
  • lkupdts0FCustIDClick:客户名称在选择时更新对应的数据集信息。
procedure TMyHandler.lkupdts0FCustIDClick;
//客户信息更新时更新相关联的字段,比如部门,业务员,销售类型等信息
begin
  if FThis.ds0.AutoEdit then
  begin
    FThis.dts0.Edit;
    FThis.dts0.FieldByName('FCustCode').AsString := FThis.dtsFCustID.FieldByName('FCustCode').AsString;
    FThis.dts0.FieldByName('FCustName').AsString := FThis.dtsFCustID.FieldByName('FCustName').AsString;
    FThis.dts0.FieldByName('FDeptID').AsString := FThis.dtsFCustID.FieldByName('FDeptID').AsString;
    FThis.dts0.FieldByName('FDeptCode').AsString := FThis.dtsFCustID.FieldByName('FDeptCode').AsString;
    FThis.dts0.FieldByName('FDeptName').AsString := FThis.dtsFCustID.FieldByName('FDeptName').AsString;
    FThis.dts0.FieldByName('FEmpID').AsString := FThis.dtsFCustID.FieldByName('FEmpID').AsString;
    FThis.dts0.FieldByName('FEmpCode').AsString := FThis.dtsFCustID.FieldByName('FEmpCode').AsString;
    FThis.dts0.FieldByName('FEmpName').AsString := FThis.dtsFCustID.FieldByName('FEmpName').AsString;
    FThis.dts0.FieldByName('FSaleType').AsString := FThis.dtsFCustID.FieldByName('FSaleType').AsString;
  end;  
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
  • dtpdts0FDateChange:单据日期变动时变更对应的数据集字段信息。
procedure TMyHandler.dtpdts0FDateChange;
//将日期信息更新至数据集中
begin
  if FThis.ds0.AutoEdit then
  begin
    FThis.dts0.FieldByName('FDate').AsDateTime := FThis.dtpdts0FDate.DateTime;
  end; 
end;
1
2
3
4
5
6
7
8
  • dtpdts0FSignDateChange:单据签订日期变动时变更对应的数据集字段信息。
procedure TMyHandler.dtpdts0FSignDateChange;
//将日期信息更新至数据集中
begin
  if FThis.ds0.AutoEdit then
  begin
    FThis.dts0.FieldByName('FSignDate').AsDateTime := FThis.dtpdts0FSignDate.DateTime;
  end; 
end;
1
2
3
4
5
6
7
8
  • dts1NewRecord:明细数据集新增时进行基础资料设置。
procedure TMyHandler.dts1NewRecord;
//新增行时进行初始化赋值
begin
  FThis.dts1.FieldByName('FID').AsInteger := dm.GetNodeID;
  FThis.dts1.FieldByName('FInterID').AsInteger := FThis.dts0.FieldByName('FInterID').AsInteger;
  FThis.dts1.FieldByName('FEntryID').AsInteger := FThis.dts1.RecordCount + 1;
  FThis.dts1.FieldByName('FClosed').AsInteger := 0;
  FThis.dts1.FieldByName('FState').AsInteger := 0;
end;
1
2
3
4
5
6
7
8
9
  • FlyingReceived:当Flying接收到信息时执行操作。
procedure TMyHandler.FlyingReceived;
//Flying接收信息并执行
var
  F: TBaseForm;
begin
  //获取打印列表
  if AType='GetPrintList' then
  begin
    FThis.ComboBoxPrinter.Items.CommaText := AContent;
    if FThis.ComboBoxPrinter.Items.Count <> 0  Then
    FThis.ComboBoxPrinter.ItemIndex := 0;
    //FThis.ComboBoxPrinter.DroppedDown := True;
    FThis.Timer2.Enabled := True;
  end
  //获取文件的地址信息
  else if AType='GetFileUrl' then
  begin
    paxfunc.DownLoadFile(AContent,'report.pdf');
    F := paxfunc.OpenForm('PDFViewer');
    F.TagObject := FThis;
    TPDFViewer(F.FindComponent('PDFViewer')).LoadFromFile('report.pdf');
  end
  //返回错误信息
  else if AType='Error' then
    Showmessage(AContent);
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
  • Timer2Timer:定时器触发事件,执行打印相关的操作。
procedure TMyHandler.Timer2Timer;   
//定时器事件,用于加载数据集并发送至Flying执行打印预览
begin
  FThis.Timer2.Enabled := False;
  FThis.Flying.PrinterName := FThis.ComboBoxPrinter.Items.Strings[FThis.ComboBoxPrinter.ItemIndex];
  FThis.Flying.AddPrintData(FThis.dts0,'A');
  FThis.Flying.AddPrintData(FThis.dts1,'B');
  FThis.Flying.AddPrintData(FThis.dtsCompany,'C');
  FThis.Flying.ReportPreview;
end;
1
2
3
4
5
6
7
8
9
10
  • btnUploadClick:上传图片按钮点击事件。
procedure TMyHandler.btnUploadClick;
//上传图片
begin
  if FThis.OpenPictureDialog.Execute(0) then
  begin
    FThis.dts0.Edit;
    TBlobField(FThis.dts0.FieldByName('FImage')).LoadFromFile(FThis.OpenPictureDialog.FileName);
    FThis.dts0.Post;
  end;
end;
1
2
3
4
5
6
7
8
9
10
  • btnClearClick:清除图片按钮点击事件。
procedure TMyHandler.btnClearClick; 
//清空图片
begin
  FThis.dts0.Edit;
  TBlobField(FThis.dts0.FieldByName('FImage')).Clear;
  FThis.dts0.Post;
end;
1
2
3
4
5
6
7

# 4.2.5. 多语言设置

  在菜单栏点击语言-语言设置,打开多语言设置对话框,根据提示进行多语言的设置。

# 4.2.6. 报表设置

  Smart中使用两种方式来实现报表的引入。

  • 窗体引入:使用Smart的自定程序paxfunc.ShowReport来导入窗口。如果是要打开设计模式的窗口,在脚本中引入如下所示的脚本即可打开打印格式管理界面。
  paxfunc.ShowReport('Smart',FThis,'','',False,False);
1

使用以上方式打开对应的界面。

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

  如需要引用设计的打印格式执行打印或打印预览操作,在设计完成后返回至报表设计的界面,复制报表的报表ID字段,在脚本中执行如下的代码。以下代码以打印预览为例。

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

  单据支持Flying引入,实例中已经介绍过脚本中的使用方式,在Flying服务端需要引入打印格式进行设计。

  打开Flying服务端,点击打印设置-HTTP打印,检查设置是否与客户端的保持一致,点击应用保存设置。

  点击打印设置-报表设计按钮,在右侧的报表列表中右键单击,选择新建报表。

  在对话框中输入报表的名称,此处输入Sal_Order,然后点击OK按钮。

  在列表中选择刚才创建的报表项,右键点击,在选项中选择数据构造,打开数据构造界面。首先设定好连接设置,点击连接按钮。

  待连接按钮变成灰色后,在SQL中输入使用的数据集的SQL脚本。

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


--dts1
SELECT TOP 1 * FROM Sal_OrderEntry

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

  输入完成后,点击执行SQL,等待下方的编辑框中出现字段信息后,点击应用返回至上一界面,在界面中点击保存数据。

  在报表设计界面中双击Sal_Order,打开报表设计界面进行设计。

  设计完成后,Smart端可直接使用指定的设置执行打印设置操作。

# 4.2.7. 运行效果

# 5. 导入窗体设置

# 5.1. 导入布种资料-多笔数据表单

  此页面为导入窗体,由其他窗体来调用打开。

# 5.1.1. 功能简述

  此导入窗口页面显示布种资料的相关信息,该页面涉及到主从表的设计相关的信息以及选择按钮点击后的数据传递方式的设计说明。

# 5.1.2. 窗体设置

属性 取值 说明
Caption 导入布种资料 主窗体的标题名称
Height 600 主窗体的高度(像素)
Name ImportItem 主窗体模块的名称
Width 800 主窗体的宽度(像素)

  各表结构字段及对应的数据感知控件名称如下,其中的TBitBtn、TLabeledEdit类型的控件需修改Font.Size为12,TPanel类型的控件需要清除Caption属性中原有的字符内容。

# 5.1.3. 控件设置

  • 控件说明
控件名称 控件类型 说明
Panel1 TPanel 顶部面板显示,用于放置控件容器
edQuery TLabeledEdit 查询输入框,用于输入布种代码与名称
TextHint:输入布种代码或名称
EditLabel.Caption:布种代码或名称
btnQuery TBitBtn 查询按钮,点击以根据条件进行查询。
Caption:查询
btnClear TBitBtn 清除按钮,点击以清除查询内容恢复至初始状态。
Caption:清除
btnRefresh TBitBtn 刷新按钮,点击以刷新显示。
Caption:刷新
btnShowAll TBitBtn 显示全部按钮,点击以显示全部内容。
Caption:显示全部
btnExit TBitBtn 退出按钮,点击以退出当前窗体。
Caption:退出
dts0 TRFDataSet 数据集控件,展示布种分类 Basic_ItemGroup
dts1 TRFDataSet 数据集控件,展示布种资料 Basic_Item
ds0 TDataSource 数据源控件,绑定数据集
DataSet:dts0
ds1 TDataSource 数据源控件,绑定数据集
DataSet:dts1
Spliter1 TSpliter 分隔控件,用于分隔数据表格控件
DBGrid1 TDBGrid 布种分组数据表格
DataSource:ds0
DBGrid2 TDBGrid 布种信息数据表格
DataSource:ds1
  • DBGrid1数据表格说明

  在设置表格列之前,使用鼠标右键点击表格,在选项中选择Custom Columns,转换为自定义表格后进行设置。点击Columns属性打开对话框,在此处添加字段。选择添加的字段进行属性的更改。

FieldName
字段名
Font.Size
字体大小
Title.Caption
标题文字
Title.Font.Size
标题字体大小
Width
列宽度
FGroupName 10 分组名称 12 90
FGroupCode 10 分组代码 12 80
  • DBGrid2数据表格说明

  在设置表格列之前,使用鼠标右键点击表格,在选项中选择Custom Columns,转换为自定义表格后进行设置。点击Columns属性打开对话框,在此处添加字段。选择添加的字段进行属性的更改。

FieldName
字段名
Font.Size
字体大小
Title.Caption
标题文字
Title.Font.Size
标题字体大小
Width
列宽度
FItemCode 10 物料代码 12 80
FItemName 10 物料名称 12 140
FItemSpec 10 规格 12 80
FUnitName 10 单位 12 80
FUnitPiece 10 件单位 12 64
FforzenFor 10 冻结 12 64

# 5.1.4. 脚本设计

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

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

//...

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

  this.btnSelect.OnClick := FMyHandler.btnSelectClick;
  this.btnQuery.OnClick := FMyHandler.btnQueryClick;
  this.btnClear.OnClick := FMyHandler.btnClearClick;
  this.btnRefresh.OnClick := FMyHandler.btnRefreshClick;
  this.btnShowAll.OnClick := FMyHandler.btnShowAllClick;
  this.btnExit.OnClick := FMyHandler.btnExitClick;
  this.DBGrid1.OnCellClick := FMyHandler.DBGrid1CellClick;
end.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
  • 程序模块列表
程序模块名称 说明
Create 构造器,启动后运行需初始化设置的内容
btnSelectClick 选择按钮点击
btnQueryClick 查询按钮点击
btnClearClick 清除按钮点击
btnRefershClick 刷新按钮点击
btnShowAll 显示全部按钮点击
btnExitClick 退出按钮点击
DBGrid1CellClick 点击切换分类显示
  • Create:构造器,启动后运行需初始化设置的内容。
constructor TMyHandler.Create(AOwner: TComponent);
//初始化数据集(物料分类与物料信息)
begin
  FThis :=TBaseForm(AOwner);
  FThis.dts0.Connection := dm.DBConnection;
  FThis.dts1.Connection := dm.DBConnection;
  FThis.dts0.SQL.Text := 'Select FInterID,FGroupCode,FGroupName,FNote,FTreeKeyID,FTreeParenteID,' + 
  'FAbsoluteIndex From Basic_ItemGroup WHERE FTypeID = 1 Order by FGroupCode';
  FThis.dts0.Open;
  FThis.dts0.First;
  FThis.dts1.SQL.Text := 'SELECT * FROM Basic_Item WHERE FTypeID = 1';
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
  • btnSelectClick:选择按钮点击。
//选择
procedure TMyHandler.btnSelectClick;
//选择后将选项中的字段信息传递至主窗口的数据集中
var
  i: Integer;
begin
  //数据集不能为空
  if FThis.dts1.RecordCount = 0 then
    exit;
  //目标数据集新增记录并进行数据集信息传递
  TRFDataSet(TBaseForm(FThis.TagObject).FindComponent('dts1')).Append;
  TRFDataSet(TBaseForm(FThis.TagObject).FindComponent('dts1')).FieldByName('FItemID').AsString := FThis.dts1.FieldByName('FInterID').AsString;
  TRFDataSet(TBaseForm(FThis.TagObject).FindComponent('dts1')).FieldByName('FItemCode').AsString := FThis.dts1.FieldByName('FItemCode').AsString;
  TRFDataSet(TBaseForm(FThis.TagObject).FindComponent('dts1')).FieldByName('FItemName').AsString := FThis.dts1.FieldByName('FItemName').AsString;
  TRFDataSet(TBaseForm(FThis.TagObject).FindComponent('dts1')).FieldByName('FItemSpec').AsString := FThis.dts1.FieldByName('FItemSpec').AsString;
  TRFDataSet(TBaseForm(FThis.TagObject).FindComponent('dts1')).FieldByName('FUnitID').AsString := FThis.dts1.FieldByName('FUnitID').AsString;
  TRFDataSet(TBaseForm(FThis.TagObject).FindComponent('dts1')).FieldByName('FUnitCode').AsString := FThis.dts1.FieldByName('FUnitCode').AsString;
  TRFDataSet(TBaseForm(FThis.TagObject).FindComponent('dts1')).FieldByName('FUnitName').AsString := FThis.dts1.FieldByName('FUnitName').AsString;
  TRFDataSet(TBaseForm(FThis.TagObject).FindComponent('dts1')).Post;
  //现窗口中将已选择的记录删除
  FThis.dts1.Delete;
end;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
  • btnQueryClick:查询按钮点击。
//查询,将编辑框中输入的内容作为查询条件进行查询
procedure TMyHandler.btnQueryClick;
begin
  FThis.dts1.Close;
  FThis.dts1.SQL.Text :=  'SELECT * FROM Basic_Item WHERE (FItemCode LIKE  ''%' + 
  FThis.edQuery.Text + '%'' or FItemName LIKE ''%' + FThis.edQuery.Text + 
  '%'')  AND FTypeID = 1 Order by FItemCode';
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
  • btnClearClick:清除按钮点击。
//清除查询条件信息
procedure TMyHandler.btnClearClick;
begin
   FThis.edQuery.Text := '';
   FThis.dts1.SQL.Text := 'SELECT * FROM Basic_Item WHERE FTypeID = 1';
   FThis.dts1.Open;
end;
1
2
3
4
5
6
7
  • btnRefershClick:刷新按钮点击。
//刷新显示,功能与初次查询的功能类似
procedure TMyHandler.btnRefreshClick;
begin
  FThis.dts0.SQL.Text := 'Select FInterID,FGroupCode,FGroupName,FNote,FTreeKeyID,FTreeParenteID,' +
  'FAbsoluteIndex From Basic_ItemGroup WHERE FTypeID = 1 Order by FGroupCode';
  FThis.dts0.Open;
  FThis.dts0.First;
  FThis.dts1.SQL.Text := 'SELECT * FROM Basic_Item WHERE FTypeID = 1';
  FThis.dts1.Open;
end;
1
2
3
4
5
6
7
8
9
10
  • btnShowAll:显示全部按钮点击。
//显示全部记录,取消筛选
procedure TMyHandler.btnShowAllClick;
begin
  FThis.dts1.Filtered := False;
end;
1
2
3
4
5
  • btnExitClick:退出按钮点击。
//退出窗口
procedure TMyHandler.btnExitClick;
begin
  FThis.Close;
end;

1
2
3
4
5
6
  • DBGrid1CellClick:切换分类显示。
procedure TMyHandler.DBGrid1CellClick;
begin
//分类查看
  FThis.dts1.Filtered := False;
  FThis.dts1.Filter := 'FGroupID = ' + FThis.dts0.FieldByName('FInterID').AsString;
  FThis.dts1.Filtered := True;
end;
1
2
3
4
5
6
7

# 5.1.5. 多语言设置

  在菜单栏点击语言-语言设置,打开多语言设置对话框,根据提示进行多语言的设置。

# 5.1.6. 运行效果

# 5.2. 文档查看

  该页面用于显示文档内容。

# 5.2.1. 功能简述

  此页面不能单独运行,需要由其他窗口调用并传递PDF的相关参数才可以正常运行。

# 5.2.2. 窗体设置

属性 取值 说明
Caption 文档查看 主窗体的标题名称
Height 768 主窗体的高度(像素)
Name PDFViewer 主窗体模块的名称
Width 1024 主窗体的宽度(像素)

# 5.2.3. 控件设置

  • 控件说明
控件名称 控件类型 说明
PDFViewer TPDFViewer 设置PDF查看
Align:alClient

# 5.2.4. 脚本设计

  当前窗口无额外脚本设计内容。

# 5.2.5. 多语言设置

  在菜单栏点击语言-语言设置,打开多语言设置对话框,根据提示进行多语言的设置。

# 5.2.6. 运行效果

RestAPI
系统函数

← RestAPI 系统函数→

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