资源描述
用友软件股份有限公司
地址:北京市海淀区北清路68号
用友软件园
电话:010-62436688
网址:
客户化开发UAP业务提升手册
起草单位 :ERP咨-客户化开发部
修正单位 :
批 准 :
批准日期 :
目 录
1 摘要 7
2 样例开发前提 8
3 建立UAP项目 8
4 表单、档案开发 11
4.1 建立表单模型 11
4.1.1 新建实体 12
4.1.2 新建实体属性 14
4.2 建立表单布局 23
4.3 行为对象开发 23
4.3.1 表单开发 26
4.3.2 列表开发 63
4.3.3 生单二次开发 72
4.3.4 联查报表 78
4.3.5 联查UAP列表 82
4.3.6 UAP列表联查U8单据 82
4.3.7 用户自定义控件开发 88
4.3.8 U8单据引用UAP档案 91
4.3.9 行为对象注册 111
5 报表开发 115
5.1 摘要 115
5.2 基本操作 116
5.2.1 新增报表 116
5.2.2 新增数据源 131
5.2.3 报表查询 138
5.2.4 分组 138
5.3 报表设计开发实例 141
5.3.1 存储过程模式开发实例(整体条件串) 141
5.3.2 复杂报表开发实例 148
5.3.3 图形化报表开发实例 174
5.3.4 UAP报表脚本抽取 193
6 建立数据引擎 195
6.1 功能介绍 195
6.2 使用说明 197
6.2.1 登陆UAP环境 197
6.2.2 配制实体 198
6.2.3 业务对象 207
6.3 应用技巧 219
7 设置过滤条件 219
7.1 功能介绍 219
7.2 使用说明 220
7.3 应用技巧 226
8 设置栏目 226
8.1 功能介绍 226
8.2 使用说明 226
8.3 应用技巧 229
9 UAP参照 229
9.1 功能介绍 229
9.2 使用说明 229
10 权限 239
10.1 功能权限 239
10.2 记录级权限 240
10.3 字段级权限 241
11 部署 243
11.1 UAP表单导出与导入 243
11.2 UAP项目导出与导入 245
11.3 行为对象部署 246
11.4 报表部署 246
12 附录:功能介绍 247
12.1 行为对象升级说明 247
12.1.1 ReceiptPluginBase新增接口(与872版本的IReceipt接口相比) 247
12.1.2 ReceiptPluginBase新增接口(与871版本的IReceipt接口相比) 250
12.2 LoginInfo 对象介绍 254
1 摘要
本文以U8-ERP中的销售订单为应用原型,介绍了如何通过UAP平台进行软件开发,文中给出了开发方法和丰富的样例。内容包括:
l UAP表单开发原理
l UAP项目的建立和导入、导出
l UAP表单的模型设计和布局设计
l UAP表单的行为对象开发
l UAP表单列表设计与开发
l UAP表单列表的行为对象开发
l 如何对UAP表单的缺省按钮进行扩展性开发
l 如何对UAP表单的缺省按钮进行取代性开发
l 如何为UAP表单增加新的按钮及行为
l 如何用程序代码调用UAP报表
l 如何用程序代码调用UAP表单列表
l 如何在UAP表单中增加权限控制:功能权限、字段权限、记录权限
l 如何为UAP表单开发自定义控件
l 如何开发树形档案
l 如何维护UAP数据引擎
l 如何维护栏目
l 如何维护过滤条件
l 如何调用U8API
l U8单据自定义项如何引用UAP档案
本文档中使用的示例文件为“销售订单二次开发”,可以通过UAP将该文件导入到帐套中。项目名称为“ SaleVoucher ”,导入后在项目中包括几个自定义单据:“销售订单”为二次开发的Demo示例;“零售日报”为自定义空间二次开发的Demo示例;“列表档案示例”、“树形编辑档案示例”、“树形导航档案示例”分别为各个对应的档案类型的示例。
项目源代码:
2 样例开发前提
首先,需要安装U8(890)产品,并建立一个帐套。
其次,您需要向用友公司购买UAP表单设计许可;不过您可以使用UAP的演示版本,但是演示版本不能新建UAP项目,也不能注册行为对象。
3 建立UAP项目
使用UAP登录帐套后,在系统界面上的新建项目选项卡,选中“供应链”后,在右边的列表中选择“销售管理”,在界面下方的几个文本框中输入项目名称,编号,描述等;顺序选择框使用“默认”即可。点击“确定”如果输入信息与先前创建的项目信息不冲突,项目就可被成功创建。
您也可以导入我们为您提供的UAP样例项目,导入方法如下。
1、登录UAP;
2、打开菜单“文件-导入和导出”;
3、选中“导入项目数据到目前的服务器”,点“确定”按钮;
4、点“导入”按钮,选取培训目录下的 “Samplefile”;
5、导入成功后;
6、在UAP已存在的项目中产生了一个名称为“SaleVoucher”的项目;
4 表单、档案开发
4.1 建立表单模型
选中“自定义表单”节点,单击右键,使用“新建自定义表单”功能创建一个新的表单。然后在弹出的选择界面中选择“表单类型”下的“单据”,在名称文本框中输入一个表单名字,不要与以前创建的表单名字重复。在成功创建后,系统界面如下图所示:
图表 1
在上图所示的实体节点,默认有两个子节点,分别为:主表、第一子表,根据当前表单的需要设计实体,包括增加实体和实体属性等。
4.1.1 新建实体
需要为实体填写“实体名称”,和选择“实体类型”。除此以外,还可以通过实体的属性编辑窗口为实体设置各项信息。
实体的相关属性:
名称:实体显示的名称,仅用于设计时。
发布状态:实体是否已发布,只读。
功能:为实体定义自定义功能,在运行时显示为表格对应的工具栏按钮。
状态设置:设置实体属性、功能在表单运行时的状态,决定实体属性、功能在不同的环境下是否可用。
物理表模式:设置实体物理表的创建模式,默认为由UAP在发布时自动创建。在特殊的应用场景中可以使用“使用已存在的对象”或“无”。后两种情况下UAP不负责实体物理表的维护。
物理表:设置该实体在数据库存储时使用的物理表,一般情况下一个实体对应一个物理表。
数据引擎模式:设置实体运行时数据的访问方式。默认为UAP系统在发布时自动创建,特殊的应用场景中可以使用“使用已存在的对象”或“无”,这两种情况下系统不负责实体数据的读取,只能通过用户定义的接口获取数据集。
数据引擎:当数据引擎模式为“使用已存在的对象”时,设置要使用的数据引擎对象。
主键:设置实体物理表的主键字段名。
主键类型:设置实体物理表主键字段的类型,可选“整数”或“GUID”或“字符串”。
行模式:多行或单行。一般主表设置为单行。
4.1.2 新建实体属性
实体必须包含实体属性时才有效。可以在UAP界面“表单”窗口中,右键点击实体对应的节点,选择“新建实体属性”菜单向实体添加实体属性:
实体属性通用属性:
l 类型:该实体属性的类型。
l 描述:对该实体属性的单体描述。
l 属性名称:实体属性的名称。
l 默认值:实体属性的默认值。
l 使用默认值:用户未提供数据时,是否使用实体属性的默认值。
l 发布:该实体属性是否已经发布。
l 常用条件:该实体属性是否可以在过滤中作为常用条件使用。
l 区间条件:该实体属性是否可以在过滤中作为区间条件使用。
l 值更新事件:设置该实体属性值更新时需要处理的脚本列表。
基础资料类型字段共有三种类型的值更新事件:“携带当前字段相关参照属性到指定列”、“计算定义公式的值到指定列”、“表达式为真/假时改变指定栏目编辑状态”;其余类型字段比基础资料类型字段缺少第一种类型的值更新事件。
1. 携带当前字段相关参照属性到指定列
2. 计算定义公式的值到指定列
3. 表达式为真/假时改变指定栏目编辑状态
表达式为真\假时修改指定栏目的编辑状态
表达式为真\假时修改指定栏目的显示状态
表达式为真\假时修改指定功能状态
表单功能
实体功能
l 唯一约束:是否检查该实体属性的值在整个表单范围内唯一。
l 文本对齐:实体属性文本的显示位置。
l 显示文本:实体属性的不同语言环境中显示的文本。
l 允许空值:实体属性的值是否可以为空。
l 物理表:实体属性对应物理字段的表名,即该实体属性所属实体的物理表。
l 字段:实体属性对应的物理字段名。
除了支持以上通用属性外,不同类型的实体属性还具有不同的特性:
1. 表单编号
表单编号只能出现的主表实体中,并且只能有一个表单编号类型的实体属性。
2. 表单名称
表单名称类型的实体属性只能在档案类型的表单中使用,同表单编号一样,表单名称类型的实体属性只能出现主表实体中,并且只能出现一次。
3. 整数和正整数
l 可否为0:数值型的值是否可为0。
l 录入长度:限制用户可录入数值的最多位数。
l 数据格式:数值类型的显示格式。
l 最大值和最小值:数据的有效范围。正整数的最小值必须等于或大于0。
4. 小数和正小数
l 可否为0:数值型的值是否可为0。
l 录入长度:限制用户可录入数值的最多位数。
l 数据格式:数值类型的显示格式。
l 最大值和最小值:数据的有效范围。正小数的最小值必须等于或大于0。
l 小数位数:数据保留的小数位数。
5. 文本
l 多行输入:运行时是否支持录入多行文本。
l 最大长度:最多可录入的文本长度。
6. 日期和日期时间
日期类型运行短日期格式,即只包含年月日。日期时间类型包含年月日和时分秒。
7. 枚举
枚举类型的实体属性需要设置枚举值列表,枚举值的显示值为在界面显示的文本,保存值为实际保存到数据库的数据,如枚举类型的实体属性“销售类型”的枚举值可设置为如下图所示:
U890中枚举字段支持选择“枚举模式”:使用已存在枚举、新创建枚举。选择“使用已存在枚举”后,需要为“枚举类型”选择一个U8系统中现有的枚举中的一个。
8. 基础资料
基础资料类型的值来自指定参照档案的对照值。
l 参照对象:设置基础资料类型实体属性的参照档案对象,可以从U8档案列表中选择,包含UAP中定义为档案类型的表单。
l 参照显示值:该属性是设置当前就“基础资料”字段在运行时的文本框里显示参照的那个字段的值。如“参照对象”属性选择的存货档案,如果不设参照显示值,则运行时默认显示为存货编码,如果将“参照显示值”属性设置为存货档案的“存货”名称,运行时该字段就会显示为存货的名称。
l 选择方式:设置在运行时的对照选择方式。
l 自动校验:是否对录入的值进行检验以确定数据是否来自指定的参照对象。选择“否”时允许用户录入参照对象中不存在的值。
9. 基础资料属性
基础资料属性类型的实体属性必须和基础资料类型的实体属性结合使用。
l 参照属性:设置基础资料属性类型的实体属性要绑定的基础资料类型实体属性,并指定关联的参照字段。当基础资料类型的实体属性值变化时,基础资料属性类型的实体属性值随之改变。
10. 数量、价格和金额
数量、价格和金额类型的实体属性实质上为小数类型,设置等同于小数类型的实体属性。
11. 复选框
特殊类型的整数值,运行时显示为复选框,保存的数据为0(未选择)或1(选择)。
12. 制单人
当前单据的作者,一般设为登录用户。
13. 制单日期和修改日期
制单日期保存当前表单生成的日期;修改日期保存表单最后一次修改的日期。这两种类型的实体属性实质上为日期时间类型,设置等同于日期时间类型的实体属性。
4.2 建立表单布局
在完成实体的设计后,可以设计表单布局,UAP支持一个表单多个布局视图,用户可根据自己的使用习惯选择一种布局视图。布局视图的设计与普通window界面的布局设计基本一致。
4.3 行为对象开发
行为对象开发是指增加表单或列表的功能按钮,除了UAP系统自带的功能按钮外,还可以增加按钮,这些增加的功能按钮是UAP表单开发的基础。
UAP提供了多种增加功能的途径,首先通过设计界面的树形菜单中的“功能”节点下的表单功能和列表功能的“功能管理”(图表2)添加功能按钮,这些功能按钮最终在运行时会被加载到U8产品的门户上;其次可以为每个表单实体添加功能按钮(图表3),为实体添加完成这些功能按钮后,还需要在布局视图上为该表单实体的“功能”属性设置使用这些功能(图表4),这些功能按钮最终在运行时会被加载到该实体的工具栏按钮上。
图表 2 图表 3 图表 4
图表 5
增加功能按钮时,很多工作都可以通过上图(图5)的设计界面完成,开发人员关心的仅仅是表单开发业务逻辑的实现。这些按钮的作用主要是通过在运行时对模型对象中数据的修改以及最终将修改的数据持久化来完成的。
UAP表单开发分为表单开发和列表开发两种。因此对应了两种不同的开发类型定义了两种不同的访问模型对象数据的接口。
4.3.1 表单开发
表单开发访问模型对象的接口
UFIDA.U8.UAP.UI.Runtime.Model.ReceiptPluginBase,该接口被定义在UFIDA.U8.UAP.UI.Runtime.Model.dll中,所以在做表单开发前,你需要为新建的表单开发项目添加UFIDA.U8.UAP.UI.Runtime.Model.dll的引用。
表单开发又可细分为表单功能开发和表单实体功能开发,每个不同部分的开发又都分为UAP已有按钮的功能修改开发和新增按钮的功能开发。目前为止,只要是表单开发,只需要实现上述类即可。在继承ReceiptPluginBase后,在子类中会重写(override)以下这些方法:
public virtual IButtonEventHandler GetButtonEventHandler(UFIDA.U8.UAP.UI.Runtime.Common.VoucherButtonArgs ButtonArgs, VoucherProxy voucherObject)
{
return null;
}
/// <summary>
/// 运行时表单加载之前调用的接口,可以处理表单加载之前的业务要求。
/// </summary>
/// <param name="login">U8登录对象</param>
/// <param name="netLogin">.Net登录对象</param>
/// <param name="Cardnumber">表单编号</param>
/// <param name="ds">表单数据</param>
/// <param name="state">表单状态</param>
/// <param name="voucherParameter">表单数据</param>
public virtual void ReceiptLoading(U8Login.clsLogin login, string Cardnumber, System.Data.DataSet ds, UFIDA.U8.UAP.UI.Runtime.Common.VoucherStateEnum state, UFIDA.U8.UAP.UI.Runtime.Common.ReceiptLoadingParas loadingParas)
{
}
/// <summary>
/// 运行时表单加载之后调用的接口,可以处理表单加载之后的业务要求。
/// </summary>
/// <param name="ReceiptObject">所属表单对象</param>
public virtual void ReceiptLoaded(VoucherProxy ReceiptObject)
{
}
/// <summary>
/// 值更新之前的接口,对值的合法性检查在这里进行
/// <param name="para">Cell的值变动参数</param>
/// <param name="businessObject">所属业务对象</param>
/// <param name="voucherObject">所属表单对象</param>
/// <return>是否允许更新单元格的值,false--不允许更新,将保持原值</return>
/// </summary>
public virtual bool CellChanging(UFIDA.U8.UAP.UI.Runtime.Common.CellChangeEventArgs para, BusinessProxy businessObject, VoucherProxy voucherObject)
{
return false;
}
/// <summary>
/// 值更新之后的接口,对值的后续处理(如对其他Cell值的变更)在这里进行
/// <param name="para">Cell的值变动参数</param>
/// <param name="businessObject">所属业务对象</param>
/// <param name="voucherObject">所属表单对象</param>
/// </summary>
public virtual void CellChanged(UFIDA.U8.UAP.UI.Runtime.Common.CellChangeEventArgs para, BusinessProxy businessObject, VoucherProxy voucherObject)
{
}
/// <summary>
/// 增加行之前的接口,对行的合法性检查在这里进行
/// <param name="para">新增的行参数</param>
/// <param name="businessObject">所属业务对象</param>
/// <param name="voucherObject">所属表单对象</param>
/// <returns>是否允许增加新行,false-不允许增加新的行</returns>
/// </summary>
public virtual bool RowAdding(UFIDA.U8.UAP.UI.Runtime.Common.RowChangeEventArgs para, BusinessProxy businessObject, VoucherProxy voucherObject)
{
return false;
}
/// <summary>
/// 增加行之后的接口,对新增行的后续处理在这里进行
/// <param name="para">新增的行参数</param>
/// <param name="businessObject">所属业务对象</param>
/// <param name="voucherObject">所属表单对象</param>
/// </summary>
public virtual void RowAdded(UFIDA.U8.UAP.UI.Runtime.Common.RowChangeEventArgs para, BusinessProxy businessObject, VoucherProxy voucherObject)
{
}
/// <summary>
/// 删除行之前的接口,对行的合法性检查在这里进行
/// <param name="para">RowChangeEventArgs[]类型,要删除的行参数</param>
/// <param name="businessObject">所属业务对象</param>
/// <param name="voucherObject">所属表单对象</param>
/// <returns>是否允许删除这些行,false--不允许删除这些行</returns>
/// </summary>
public virtual bool RowsDeleting(UFIDA.U8.UAP.UI.Runtime.Common.RowChangeEventArgs[] para, BusinessProxy businessObject, VoucherProxy voucherObject)
{
return false;
}
/// <summary>
/// 删除行之后的接口,对删除行的后续处理在这里进行
/// <param name="para">RowChangeEventArgs[]类型,要删除的行参数</param>
/// <param name="businessObject">所属业务对象</param>
/// <param name="voucherObject">所属表单对象</param>
/// </summary>
public virtual void RowsDeleted(UFIDA.U8.UAP.UI.Runtime.Common.RowChangeEventArgs[] para, BusinessProxy businessObject, VoucherProxy voucherObject)
{
}
/// <summary>
/// 观察者视图工具条按钮单击事件的接口
/// <param name="para">被单击的按钮参数</param>
/// <param name="businessObject">所属业务对象</param>
/// <param name="voucherObject">所属表单对象</param>
/// <returns>true表示实现了相应按钮的方法;false表示没有实现相应按钮的方法。</returns>
/// </summary>
public virtual bool ClickToolBarButton(UFIDA.U8.UAP.UI.Runtime.Common.ToolBarActionEventArgs para, BusinessProxy businessObject, VoucherProxy voucherObject)
{
return false;
}
/// <summary>
/// 设置为当前行之前的接口
/// <param name="para">被选择的行参数</param>
/// <param name="businessObject">所属业务对象</param>
/// <param name="voucherObject">所属表单对象</param>
/// <returns>是否允许选择新行,false--不允许选择新行,当前行不发生改变</returns>
/// </summary>
public virtual bool RowSelecting(UFIDA.U8.UAP.UI.Runtime.Common.RowSelectEventArgs para, BusinessProxy businessObject, VoucherProxy voucherObject)
{
return false;
}
/// <summary>
/// 设置为当前行之后的接口
/// <param name="para">被选择的行参数</param>
/// <param name="businessObject">所属业务对象</param>
/// <param name="voucherObject">所属表单对象</param>
/// </summary>
public virtual void RowSelected(UFIDA.U8.UAP.UI.Runtime.Common.RowSelectEventArgs para, BusinessProxy businessObject, VoucherProxy voucherObject)
{
}
/// <summary>
/// 业务数据合法性检查之前的接口
/// <param name="businessObject">所属业务对象</param>
/// <param name="voucherObject">所属表单对象</param>
/// <returns>检查是否通过,false--不通过</returns>
/// </summary>
public virtual bool DataChecking(BusinessProxy businessObject, VoucherProxy voucherObject)
{
return false;
}
/// <summary>
/// 业务数据合法性检查之后的接口
/// <param name="businessObject">所属业务对象</param>
/// <param name="voucherObject">所属表单对象</param>
/// </summary>
public virtual void DataChecked(BusinessProxy businessObject, VoucherProxy voucherObject)
{
}
/// <summary>
/// 观察者视图填充数据前的接口
/// <param name="view">观察者视图接口(IEditWindow)对象</param>
/// <param name="fillDataTable">即将要填充的数据</param>
/// </summary>
public virtual void EditWindowFilling(UFIDA.U8.UAP.UI.Runtime.Common.IEditWindow view, System.Data.DataTable fillDataTable, BusinessProxy businessObject, VoucherProxy voucherObject)
{
}
/// <summary>
/// 观察者视图填充数据后的接口
/// <param name="view">观察者视图接口(IEditWindow)对象</param>
/// <param name="fillDataTable">已经填充的数据</param>
/// </summary>
public virtual void EditWindowFilled(UFIDA.U8.UAP.UI.Runtime.Common.IEditWindow view, System.Data.DataTable fillDataTable, BusinessProxy businessObject, VoucherProxy voucherObject)
{
}
/// <summary>
/// 参照打开前的接口
/// <param name="view">观察者视图接口(IEditWindow)对象</param>
/// <param name="para">ReferOpenEventArgs参照信息</param>
/// <param name="businessObject">所属业务对象</param>
/// <param name="voucherObject">所属表单对象</param>
/// <returns>是否允许参照,false--不允许参照,将不弹出参照界面,参照操作终止</returns>
/// </summary>
public virtual bool ReferOpening(UFIDA.U8.UAP.UI.Runtime.Common.ReferOpenEventArgs para, BusinessProxy businessObject, VoucherProxy voucherObject)
{
return false;
}
/// <summary>
/// 参照返回(关闭)后的接口
/// <param name="view">观察者视图接口(IEditWindow)对象</param>
/// <param name="para">ReferCloseEventArgs参照信息</param>
/// <param name="businessObject">所属业务对象</param>
/// <param name="voucherObject">所属表单对象</param>
/// </summary>
public virtual void ReferClosed(UFIDA.U8.UAP.UI.Runtime.Common.ReferCloseEventArgs para, BusinessProxy businessObject, VoucherProxy voucherObject)
{
}
/// <summary>
/// 创建用户自定义控件接口,开发人员可以在这里创建用户自定义控件。运行时会把这个控件加载到布局视图中。(版本新增)
/// </summary>
/// <param name="businessObject">所属业务对象</param>
/// <param name="voucherObject">所属表单对象</param>
/// <param name="ID">布局视图中指定的自定义控件“控件ID”</param>
/// <returns>用户自定义控件对象</returns>
public virtual System.Windows.Forms.Control CreateControl(BusinessProxy businessObject, VoucherProxy voucherObject, string ID)
{
return null;
}
/// <summary>
/// 表单状态更新之前的接口
/// <param name="para">状态的变动参数</param>
/// <param name="voucherObject">所属表单对象</param>
/// <returns>是否允许改变状态false-不允许改变状态,表单仍将处于当前状态</returns>
/// </summary>
public virtual bool StateChanging(UFIDA.U8.UAP.UI.Runtime.Common.V
展开阅读全文