业务单据窗体开发步骤

C/S快速开发框架-旗舰版V5.1-业务单据窗体开发步骤

业务单据窗体开发比较反正,建议使用代码生成器工具生成窗体原型,然后二次修改。

以【销售订单】窗体举例说明,窗体名称:frmSO,以下是业务单据窗体开发步骤。

1.1.1 新建业务窗体

在【销售模块】新建【frmSO】窗体。

在【销售模块】点右键,【添加】à【新建项】à打开【新建项对话框】。

【添加新项】对话框

在【名称】输入框输入【frmSO】,点【添加】按钮弹出【继承选择器】窗体。

如找不到frmBaseBusinessForm基类窗体,请点击【浏览】按钮,在debug目录内选择CSFrameworkV5.Library.dll文件,点【确定】加载类库。

选择【frmBaseBusinessForm】组件名称,点【确定】按钮。

1.1.2 界面布局设计

【数据查询页】:用于展示查询结果的数据,表格只读,不可修改。

【数据编辑页】:用于展示详细资料,用户在【数据编辑页】可以修改数据。

1.1.3 数据查询页设计

设计查询条件;

从工具箱拖放PanelControl 组件,Dock设为Top,在PanelControl内拖放一组查询条件输入框及查询按钮;

1.1.4 设计主表表格

从工具箱拖放PanelControl 组件,Dock设为Client;

在PanelControl内拖放一个GridControl组件,然后改名,如下图: 

GridControl可以从其它窗体复制过来,节省开发时间。

在GridView(gvSummary)内定义表格的列。

表格的列设计页面

新增一个列

列的属性设置。主要修改(Name),Caption,FieldName三个属性。

属性名称

说明

(Name)

列名称(列名)。建议用col+字段名命名,如:colCustomerCode

Caption

列的标题。如:客户编号

FieldName

列对应的字段名,用于绑定数据。如字段名:CustomerCode

关闭设计器,表格内定义了以下列:

1.1.5 数据编辑页面设计(主/从表输入区域)

 

一般情况下业务单据只有一个明细表,设计效果如下:

有的业务单据比较复杂,【收回委托加工单】有3个明细表,其中两个明细表用TabPage整合到一起,参考设计:

1.1.6 主表输入组件设计

 

输入框 (文本框)必须以txt+字段名命名,如:SONO 销售订单编号的文本框命名为txtSONO, CheckBox用缩写chk,如:chkFlagAPP审核。

 

1.1.7 使用代码生成器工具生成ORM、BLL、DAL代码

代码生成器可生成Model、DAL和BLL层的代码,业务单据窗体开放比较复杂,除框架实现的功能以外还需要扩展少量方法,如:【销售单据】扩展的方法有CheckNoExists,GetSummaryByParam,GetReportData等方法。

跟据业务需求进行二次开发,或者修改代码生成器生成模板代码,增强功能,提高效率。 

 

视频下载:http://www.csframework.com/cs-code-generator.htm

 

 

1.1.8 BLL继承关系图

 

bllBase是所有业务层的基类,bllBaseBusiness是【业务单据】的业务逻辑层基类,所有【业务单据】的业务逻辑层从bllBaseBusiness派生,如bllPO,bllSO。

 

1.1.9 bllBaseBusiness类

      bllBaseBusiness类是业务单据的业务逻辑层基类,实现了业务单据所需的公共方法。该类中定义的虚方法便于派生类重写。

bllBaseBusiness类说明:

ID

名称

类型

说明

1

AllowWriteLog

标记允许写入修改日志。

2

ApprovalBusiness

审核功能的方法。

3

BusinessTables

对应当前业务单据的数据. DataTableCollection类型, 第1个表(Index为0)为主表,其它为明细表。

4

ClearAppInfo

清空审核功能相关字段的数据。

5

CreateSaveData

创建用于保存的临时数据。

6

CurrentBusiness

       

当前业务单据的数据。

7

DataBinder

       

对应当前单据的主表数据 (DataTable),

该表只有一条记录,用于绑定[数据修改页面]输入组件的数据源。

8

DataBindRow

DataRow类型,对应DataBinder的第一条记录。

9

Delete

      

删除单据。

10

DoCreateTempData

创建用于保存的临时数据。该方法由CreateSaveData方法调用。

11

GetAttachedFiles

获取单据附件数据。

12

GetDataByKey

      

下载指定单号的业务数据。

13

IsApproved

      

检查业务单据是否审核。

14

IsOwnerChange

比较当前登录用户与制单人是否一致。

15

KeyFieldName

业务单据的主键字段名。

16

SummaryTableName

业务单据的主表名称。

17

NewBusiness

新增业务数据。

18

NotifyUser

当单据被修改发送手机短信或Email给制单人。

19

Save

      

保存业务数据。

20

SaveAttachedFile

      

保存附件。

21

Update

 

保存数据,虚方法,具体类必须重写。

22

UpdateCommonFieldsValue

      

更新业务单据明细表的公共字段数据。

23

WriteLog

      

保存修改日志。

24

CreateAttachFileBridge

 

创建业务单据附件管理的数据层桥接实例。

1.1.10 bllSO类

 

ID

名称

类型

说明

1

ApprovalBusiness

重载的方法,用于审核单据。

2

CheckNoExists

检查单据号码是否存在。

3

CreateSaveData

重载的方法,创建用于保存的临时数据。

4

Delete

重载的方法,删除单据。

5

FuzzySearch

产品资料模糊查询。实现IfuzzySearchSupportable接口,

在 frmFuzzySearch窗体中使用。

6

FuzzySearchName

模糊查询功能的名称,如:产品资料查询。在frmFuzzySearch窗体的标题显示。

7

QueryReportData

获取报表数据。

8

GetDataByKey

重载的方法,下载指定单号的业务数据。

9

GetSummaryByParam

查询销售订单的主表数据,查询结果在主表格中显示。

10

NewBusiness

重载的方法,新增业务数据。

11

Update

重载的方法,保存数据。

类成员截图:

 

1.1.11 DAL继承关系图

 

上图所示,dalBase是数据访问层的基类,dalBaseBusiness是【业务单据】数据层的基类,业务单据的DAL从dalBaseBusiness类继承,如dalPO,dalSO。

 

1.1.12 dalBaseBusiness类

 

ID

名称

类型

说明

1

_ReplaceString

提交数据前去左右空格、全角转半角,若设置此值会有性能损失!

2

_SummaryKeyName

主表主键字段名。

3

_SummaryTableName

主表表名。

4

_UpdateSummaryKeyMode

业务单据号码更新类型(自动生成流水号或GUID)。

5

ApprovalBusiness

单据审核/批准功能。。

6

CheckNoExists

检查业务数据是否存在。

7

CreateSqlGenerator

虚方法,根据表名获取该表的ORM及对应的SQL命令生成器。

8

GetNumber

获取单据流水号码。

9

Update

保存数据,对应BLL.Save方法

10

UpdateDetailKey

更新明细表的外键。

11

UpdateSummaryKey

更新主表主键。

类成员截图:

 

1.1.13 dalSO类

 

ID

名称

类型

说明

1

CreateSqlGenerator

重载的方法,根据表名获取该表的ORM及对应的SQL命令生成器。

2

Delete

删除单据,开发框架的模板窗体仅删除明细表,将主表数字类型的字段清零,如金额,数量等关键字段,保留主表的记录避免断号。

3

GetDataByKey

获取一张业务单据的数据。

4

GetNumber

获取单据流水号码, 首先在sys_DocSN表设置单据的超始号。

5

QueryReportData

根据查询条件获取报表数据。

类成员截图:

 

1.1.14 编写窗体的代码

 

完成界面布局设计,使用【代码生成器】工具生成ORM,BLL,DAL层的代码,针对需求调整代码二次开发。开发框架提供两种数据窗体模板,为了提高开放效率,可以复制frmSO或frmPO窗体中相关代码。

 

窗体与业务逻辑层的引用关系:

作为标准三层开发框架,用户界面与业务逻辑代码相互分离,业务逻辑相关数据处理的代码建议封装到业务层,这样减少用户界面的代码量,降低界面与业务层代码藕合程度。

1.1.14.1 初始化业务窗体(重写InitializeForm方法)

 

InitializeForm方法是frmBaseDataForm窗体中定义的虚方法,派生窗体必须在Form.Load事件中调用。

 

InitializeForm方法主要功能:

1) 实例化业务层_BLL变量。

2) 调用公共方法设置表格样式。

3) 绑定主表表格及明细表表格的事件。

4) 绑定数据参照组件(LookupEdit)的数据源。

5) 加载一个空的业务对象,用于测试网络环境及初始化数据。

 请参考frmSO. InitializeForm方法

 

1.1.14.2 Form.Load事件调用InitializeForm方法

 private void frmSO_Load(object sender, EventArgs e)
        {
            this.InitializeForm(); //初始化主窗体                      
        }

 

1.1.14.3 实现查询功能

实现查询功能的目的是显示主表的数据,参考frmPO.cs的btnQuery_Click时间,调用BLL层的Query方法,该方法的参数跟据查询条件定义逐个对应,常用的查询条件有【单据号码】,【日期范围】等。

 

流程如下:

 请参考frmPO. btnQuery_Click事件以及BLL,DAL层的实现思路。

 

1.1.14.4 绑定主表输入组件数据源(DoBindingSummaryEditor方法)

在【数据编辑】页面,主表的资料用文本框展示,重写DoBindingSummaryEditor方法自动绑定文本框的数据源。

 请参考frmPO. DoBindingSummaryEditor方法

1.1.14.5绑定明细表格的数据源(DoBindingDetailGrid方法)

重写DoBindingDetailGrid方法绑定销售订单明细表的数据源。

该方法是frmBaseBusinessForm窗体中定义的虚方法。

 请参考frmPO. DoBindingDetailGrid方法

 

1.1.14.6 增加(DoAdd方法)

【销售订单】不需要实现DoAdd方法,在frmBaseBusinessForm窗体该方法调用业务层的虚方法,在派生类bllSO中重写相关方法就行。

【销售订单】的新增功能处理流程:

1) 调用业务层的GetDataByKey方法,下载一个空的业务单据DataSet。

2) 调用业务层的NewBusiness方法,新增一条记录并初始化数据,如【单据日期】,

【制单人】等预设值。

3) 绑定主表,明细表的数据源。

4) 将状态改为UpdateType.Add。

5) 显示详细资料页面。

 请参考frmBaseBusinessForm. DoBindingDetailGrid方法及bllSO. GetDataByKey, NewBusiness

 

1.1.14.7 删除(DoDelete方法)

【销售订单】不需要实现DoDelete方法,在frmBaseBusinessForm窗体中该方法调用业务层的Delete虚方法,在派生类bllSO中重写Delete方法就行。

【销售订单】删除功能处理流程:

1) 调用BLL的IsApproved方法检查单据是否已经审核,已审核的单据禁止删除。

2) 调用BLL的Delete方法删除【销售订单】的数据。

3) 如后台数据删除成功,要同步删除表格中缓存的记录。

 请参考frmBaseBusinessForm. DoDelete方法及bllSO. IsApproved, Delete

1.1.14.8 修改(DoEdit方法)

【销售订单】不需要实现DoEdit方法,在frmBaseBusinessForm窗体中已经完成该方法的所有功能,调用BLL.GetDataByKey方法获取数据。

【销售订单】的修改功能处理流程:

1) 调用BLL的IsOwnerChange方法检查制单人,不能修改他人创建的单据。

2) 调用BLL的IsApproved方法检查单据是否已经审核,已审核的单据禁止修改。

3) 调用DoViewContent方法显示当前单据的详细资料。

4) 将状态改为UpdateType.Modify。

5) 显示详细资料页面。

 请参考frmBaseBusinessForm. DoEdit方法 及bllSO. IsApproved, IsOwnerChange

1.1.14.9 查看(DoViewContent方法)

【销售订单】不需要实现DoViewContent方法,在frmBaseBusinessForm窗体中该方法调用业务层的GetDataByKey虚方法,在派生类bllSO重写GetDataByKey方法就行。

【销售订单】的查看功能处理流程:

1) 调用业务层的GetDataByKey方法下载业务单据的数,返回DataSet。

2) 绑定主表及明细表的数据源。

3) 将状态改为UpdateType.None。

4) 显示详细资料页面。

 请参考frmBaseBusinessForm. DoViewContent方法

 及bllSO. GetDataByKey

1.1.14.10 取消(DoCancel方法)

【销售订单】不需要实现DoCancel方法,在frmBaseBusinessForm窗体中已实现具体功能。

【销售订单】的取消功能处理流程:

1) 调用DoViewContent方法重新显示当前单据。

2) 将状态改为UpdateType.None。

 请参考frmBaseBusinessForm. DoCancel方法

1.1.14.11 打印(DoPrint方法)

打开打印预览窗体。

 请参考frmSO. DoPrint方法

1.1.14.12 审核(DoApproval方法)

【销售订单】不需要实现DoApproval方法,在frmBaseBusinessForm窗体中该方法调用业务层的虚方法,在业务层bllSO重写ApprovalBusiness方法就行。

 【销售订单】的审核功能处理流程:

a) 调用BLL的IsApproved方法检查单据是否已经审核,已审核的单据不能重复审核。

b) 调用BLL的ApprovalBusiness方法审核单据。

 请参考frmBaseBusinessForm. DoApproval方法及bllSO. ApprovalBusiness

 

1.1.14.13 保存(DoSave方法)

【销售订单】保存功能流程:

1) 更新最后获得焦点输入框的数据及主表的汇总金额。

2) 检查主从表的数据合法性。

3) 保存本次修改日志记录。

4) 数据采集:创建用于保存的临时数据。 bllBaseBusiness类的_CurrentBusiness变量存储当前正在处理的业务数据,在保存前要做特殊处理,如设置【最后修改人】、【修改日期】或其他关联数据,为了不影响原始数据,复制一个副本用于保存,若保存失败也不影响当前正在处理的业务数据。

5) 调用BLL.Save方法。

6) 如保存成功,前台相关处理。

7) 将状态改为UpdateType.None。

 请参考frmSO. DoSave方法及bllSO. Save

1.1.14.14 主表数据合法性检查(ValidatingSummaryData方法)

 请参考frmSO. ValidatingSummaryData方法

 

1.1.14.15 明细表数据合法性检查(ValidatingDetailData方法)

 请参考frmSO. ValidatingDetailData方法

 

1.1.14.16 显示修改历史记录(DoShowModifyHistory方法)

打开frmModifyLog窗体显示修改历史记录。

 请参考frmSO. DoShowModifyHistory方法

 

1.1.14.17 其它细节处理

ID

名称

类型

说明

1

ButtonAuthorized

frmBaseChild窗体中定义的虚方法。派生类通过重写该方法可以检查按钮的权限并隐藏工具栏的按钮。

2

ButtonStateChanged

frmBaseDataForm窗体中定义的虚方法。当按钮状态发生变化时调用,可以重写此事件禁用某些输入组件。

3

CreateOneDetail

创建一条明细记录,适用于有明细表的业务窗体。此方法由

OnEmbeddedNavigatorButtonClick事件调用。

 

 明细表格的导航按钮新增了三个自定义按钮,如下图:

 

分别是新增,插入,删除。在InitializeForm方法中调用

DevStyle.SetGridControlLayout(gcDetail, true)方法创建3个按钮,但必须将第2个参数allowEdittrue

 

CreateOneDetail方法的buttonIndex参数对应按钮的序号,分别为0:Add,1:Insert,2:Delete,在枚举类型DetailButtons中定义。

 

插入记录功能需要定义Queue字段,带符号的数字类型,用于排序。

 

4

OnCellValueChanged

明细表格的OnCellValueChanged事件,当用户修改明细表单元格的数据时触发该事件。可以在此事件内计算总金额(金额=单价*数量)

5

OnStockCode_ButtonClick

明细表的货品列支持选择功能,将列设置为ButtonEdit类型。

运行效果图如下:

 

ButtonEdit的按钮触发OnStockCode_ButtonClick事件。

InitializeForm方法中绑定OnStockCode_ButtonClick事件。

6

OnStockCode_Validating

用户可以选择或输入货品编码,当用户输入货品编码后离开当前单元格时触发OnStockCode_Validating事件。

InitializeForm方法中绑定OnStockCode_Validating事件。

7

SearchStockCallBack

跟据货品编号获取货品详细资料,该方法由

OnStockCode_ButtonClickOnStockCode_Validating事件调用。

8

SetDetailEditorsAccessable

frmBaseDataForm窗体中定义的虚方法,用于控制明细页面上的控件可被编辑,同时禁用或启用明细表三个自定义按钮。

9

UpdateDetailAmount

自动计算明细表的金额合计,在OnCellValueChanged事件中调用。

10

UpdateTotalAmount

自动计算主表的总金额。

主表的总金额=SUM(明细表的金额)

通常在保存前会重新计算主表的总金额。

 

1.1.15 相关文章及视频参考

视频下载:http://www.csframework.com/cs-code-generator.htm

 

1.1.16 几个标准模板窗体参考

开发框架内提供了几个标准数据模板窗体:

1) 【数据字典】窗体请参考《客户管理》和《产品管理》

2) 【业务单据】窗体请参考【采购模块】的《采购订单》及【销售模块】的《销售订单》

 

C/S结构快速开发框架/软件快速开发平台   CSFrameworkV5.1旗舰版  原创软件@csframework.com

C/S框架网|原创精神.创造价值.打造精品

版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
C/S框架网
发表评论

评论内容
昵称:
关联文章

业务单据开发步骤
业务单据基类介绍
什么是业务单据?什么是业务数据?什么是业务?
《CS框架V2.2-3.0业务单据_主从表_快速开发指南》
业务单据开发实例-销售订单的表结构设计
指定单据号码自动打开业务单据并显示数据
开发技巧-Winform自动生成下一个业务流程的单据|C/S框架网
数据字典开发步骤
CS开发框架 - 业务单据自动生成功能设计(原)
业务命名规范
业务单据上下级权限控制实现
新建Winform业务数据
C/S系统快速开发框架 - 新增业务(视频)
CS开发框架Toolbar与数据字典,业务单据的关系
业务设计-实现查询功能
开发平台最新版生成器V4.5,生成业务界面效果图
CS开发框架提供那些模板
2.10生成业务 (主从表数据管理界面)
开发框架新增单据自动生成功能
业务单据主表字段命名规范