1、 用友软件股份有限公司 地址:北京市海淀区北清路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 建立表单
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 报表设计开发实例 14
3、1 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
4、 应用技巧 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 ReceiptP
5、luginBase新增接口(与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表单增加新的
6、按钮及行为 l 如何用程序代码调用UAP报表 l 如何用程序代码调用UAP表单列表 l 如何在UAP表单中增加权限控制:功能权限、字段权限、记录权限 l 如何为UAP表单开发自定义控件 l 如何开发树形档案 l 如何维护UAP数据引擎 l 如何维护栏目 l 如何维护过滤条件 l 如何调用U8API l U8单据自定义项如何引用UAP档案 本文档中使用的示例文件为“销售订单二次开发”,可以通过UAP将该文件导入到帐套中。项目名称为“ SaleVoucher ”,导入后在项目中包括几个自定义单据:“销售订单”为二次开发的Demo示例;“零售日报”为自定义空间二次开发的De
7、mo示例;“列表档案示例”、“树形编辑档案示例”、“树形导航档案示例”分别为各个对应的档案类型的示例。 项目源代码: 2 样例开发前提 首先,需要安装U8(890)产品,并建立一个帐套。 其次,您需要向用友公司购买UAP表单设计许可;不过您可以使用UAP的演示版本,但是演示版本不能新建UAP项目,也不能注册行为对象。 3 建立UAP项目 使用UAP登录帐套后,在系统界面上的新建项目选项卡,选中“供应链”后,在右边的列表中选择“销售管理”,在界面下方的几个文本框中输入项目名称,编号,描述等;顺序选择框使用“默认”即可。点击“确定”如果输入信息与先前创建的项目信息不冲突,项目就可被
8、成功创建。 您也可以导入我们为您提供的UAP样例项目,导入方法如下。 1、登录UAP; 2、打开菜单“文件-导入和导出”; 3、选中“导入项目数据到目前的服务器”,点“确定”按钮; 4、点“导入”按钮,选取培训目录下的 “Samplefile”; 5、导入成功后; 6、在UAP已存在的项目中产生了一个名称为“SaleVoucher”的项目; 4 表单、档案开发 4.1 建立表单模型 选中“自定义表单”节点,单击右键,使用“新建自定义表单”功能创建一个新的表单。然后在弹出的选择界面中选择“表单类型”下的“单据”,在名称文本框中输入一个表单名字,不要与
9、以前创建的表单名字重复。在成功创建后,系统界面如下图所示: 图表 1 在上图所示的实体节点,默认有两个子节点,分别为:主表、第一子表,根据当前表单的需要设计实体,包括增加实体和实体属性等。 4.1.1 新建实体 需要为实体填写“实体名称”,和选择“实体类型”。除此以外,还可以通过实体的属性编辑窗口为实体设置各项信息。 实体的相关属性: 名称:实体显示的名称,仅用于设计时。 发布状态:实体是否已发布,只读。 功能:为实体定义自定义功能,在运行时显示为表格对应的工具栏按钮。 状态设置:设置实体属性、功能在表单运行时的状态,决定实体属性、功能在不同的环境下是否可用。
10、 物理表模式:设置实体物理表的创建模式,默认为由UAP在发布时自动创建。在特殊的应用场景中可以使用“使用已存在的对象”或“无”。后两种情况下UAP不负责实体物理表的维护。 物理表:设置该实体在数据库存储时使用的物理表,一般情况下一个实体对应一个物理表。 数据引擎模式:设置实体运行时数据的访问方式。默认为UAP系统在发布时自动创建,特殊的应用场景中可以使用“使用已存在的对象”或“无”,这两种情况下系统不负责实体数据的读取,只能通过用户定义的接口获取数据集。 数据引擎:当数据引擎模式为“使用已存在的对象”时,设置要使用的数据引擎对象。 主键:设置实体物理表的主键字段名。 主键类型:设置
11、实体物理表主键字段的类型,可选“整数”或“GUID”或“字符串”。 行模式:多行或单行。一般主表设置为单行。 4.1.2 新建实体属性 实体必须包含实体属性时才有效。可以在UAP界面“表单”窗口中,右键点击实体对应的节点,选择“新建实体属性”菜单向实体添加实体属性: 实体属性通用属性: l 类型:该实体属性的类型。 l 描述:对该实体属性的单体描述。 l 属性名称:实体属性的名称。 l 默认值:实体属性的默认值。 l 使用默认值:用户未提供数据时,是否使用实体属性的默认值。 l 发布:该实体属性是否已经发布。 l 常用条件:该实体属性是否可以在过滤中作为常用条件
12、使用。 l 区间条件:该实体属性是否可以在过滤中作为区间条件使用。 l 值更新事件:设置该实体属性值更新时需要处理的脚本列表。 基础资料类型字段共有三种类型的值更新事件:“携带当前字段相关参照属性到指定列”、“计算定义公式的值到指定列”、“表达式为真/假时改变指定栏目编辑状态”;其余类型字段比基础资料类型字段缺少第一种类型的值更新事件。 1. 携带当前字段相关参照属性到指定列 2. 计算定义公式的值到指定列 3. 表达式为真/假时改变指定栏目编辑状态 表达式为真\假时修改指定栏目的编辑状态 表达式为真\假时修改指定栏目的显示状态 表达式为真\假时修改指定功
13、能状态 表单功能 实体功能 l 唯一约束:是否检查该实体属性的值在整个表单范围内唯一。 l 文本对齐:实体属性文本的显示位置。 l 显示文本:实体属性的不同语言环境中显示的文本。 l 允许空值:实体属性的值是否可以为空。 l 物理表:实体属性对应物理字段的表名,即该实体属性所属实体的物理表。 l 字段:实体属性对应的物理字段名。 除了支持以上通用属性外,不同类型的实体属性还具有不同的特性: 1. 表单编号 表单编号只能出现的主表实体中,并且只能有一个表单编号类型的实体属性。 2. 表单名称 表单名称类型的实体属性只能在档案类型的表单中使用,同表单编号一样,表单
14、名称类型的实体属性只能出现主表实体中,并且只能出现一次。 3. 整数和正整数 l 可否为0:数值型的值是否可为0。 l 录入长度:限制用户可录入数值的最多位数。 l 数据格式:数值类型的显示格式。 l 最大值和最小值:数据的有效范围。正整数的最小值必须等于或大于0。 4. 小数和正小数 l 可否为0:数值型的值是否可为0。 l 录入长度:限制用户可录入数值的最多位数。 l 数据格式:数值类型的显示格式。 l 最大值和最小值:数据的有效范围。正小数的最小值必须等于或大于0。 l 小数位数:数据保留的小数位数。 5. 文本 l 多行输入:运行时是否支持录入多行文本。 l
15、 最大长度:最多可录入的文本长度。 6. 日期和日期时间 日期类型运行短日期格式,即只包含年月日。日期时间类型包含年月日和时分秒。 7. 枚举 枚举类型的实体属性需要设置枚举值列表,枚举值的显示值为在界面显示的文本,保存值为实际保存到数据库的数据,如枚举类型的实体属性“销售类型”的枚举值可设置为如下图所示: U890中枚举字段支持选择“枚举模式”:使用已存在枚举、新创建枚举。选择“使用已存在枚举”后,需要为“枚举类型”选择一个U8系统中现有的枚举中的一个。 8. 基础资料 基础资料类型的值来自指定参照档案的对照值。 l 参照对象:设置基础资料类型实体属性的参照档案对象,
16、可以从U8档案列表中选择,包含UAP中定义为档案类型的表单。 l 参照显示值:该属性是设置当前就“基础资料”字段在运行时的文本框里显示参照的那个字段的值。如“参照对象”属性选择的存货档案,如果不设参照显示值,则运行时默认显示为存货编码,如果将“参照显示值”属性设置为存货档案的“存货”名称,运行时该字段就会显示为存货的名称。 l 选择方式:设置在运行时的对照选择方式。 l 自动校验:是否对录入的值进行检验以确定数据是否来自指定的参照对象。选择“否”时允许用户录入参照对象中不存在的值。 9. 基础资料属性 基础资料属性类型的实体属性必须和基础资料类型的实体属性结合使用。 l 参照属性:
17、设置基础资料属性类型的实体属性要绑定的基础资料类型实体属性,并指定关联的参照字段。当基础资料类型的实体属性值变化时,基础资料属性类型的实体属性值随之改变。 10. 数量、价格和金额 数量、价格和金额类型的实体属性实质上为小数类型,设置等同于小数类型的实体属性。 11. 复选框 特殊类型的整数值,运行时显示为复选框,保存的数据为0(未选择)或1(选择)。 12. 制单人 当前单据的作者,一般设为登录用户。 13. 制单日期和修改日期 制单日期保存当前表单生成的日期;修改日期保存表单最后一次修改的日期。这两种类型的实体属性实质上为日期时间类型,设置等同于日期时间类型的实体属性。
18、4.2 建立表单布局 在完成实体的设计后,可以设计表单布局,UAP支持一个表单多个布局视图,用户可根据自己的使用习惯选择一种布局视图。布局视图的设计与普通window界面的布局设计基本一致。 4.3 行为对象开发 行为对象开发是指增加表单或列表的功能按钮,除了UAP系统自带的功能按钮外,还可以增加按钮,这些增加的功能按钮是UAP表单开发的基础。 UAP提供了多种增加功能的途径,首先通过设计界面的树形菜单中的“功能”节点下的表单功能和列表功能的“功能管理”(图表2)添加功能按钮,这些功能按钮最终在运行时会被加载到U8产品的门户上;其次可以为每个表单实体添加功能按钮(图表3),为实体添
19、加完成这些功能按钮后,还需要在布局视图上为该表单实体的“功能”属性设置使用这些功能(图表4),这些功能按钮最终在运行时会被加载到该实体的工具栏按钮上。 图表 2 图表 3 图表 4 图表 5 增加功能按钮时,很多工作都可以通过上图(图5)的设计界面完成,开发人员关心的仅仅是表单开发业务逻辑的实现。这些按钮的作用主要是通过在运行时对模型对象中数据的修改以及最终将修改的数据持久化来完成的。 UAP表单开发分为表单开发和列表开发两种。因此对应了两种不同的开发类型定义了两种不同的
20、访问模型对象数据的接口。 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已有按钮的功能修改开发和新增按钮的功能开发。目前为止,只要是表单开发,只需要实现上述类即可。在继承ReceiptPlugin
21、Base后,在子类中会重写(override)以下这些方法:
public virtual IButtonEventHandler GetButtonEventHandler(UFIDA.U8.UAP.UI.Runtime.Common.VoucherButtonArgs ButtonArgs, VoucherProxy voucherObject)
{
return null;
}
///
22、 /// /// U8登录对象 /// .Net登录对象 /// 表单编号 /// 表单数据 /// 表单状态 /// 表单数据 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) { } ///
24、
25、进行
/// Cell的值变动参数
/// 所属业务对象
/// 所属表单对象
///
26、U8.UAP.UI.Runtime.Common.CellChangeEventArgs para, BusinessProxy businessObject, VoucherProxy voucherObject)
{
return false;
}
/// 27、 name="businessObject">所属业务对象
/// 所属表单对象
///
28、 }
///
29、
public virtual bool RowAdding(UFIDA.U8.UAP.UI.Runtime.Common.RowChangeEventArgs para, BusinessProxy businessObject, VoucherProxy voucherObject)
{
return false;
}
/// 30、"para">新增的行参数
/// 所属业务对象
/// 所属表单对象
///
31、herObject)
{
}
///
32、 /// 33、mary>
/// 删除行之后的接口,对删除行的后续处理在这里进行
/// RowChangeEventArgs[]类型,要删除的行参数
/// 所属业务对象
/// 所属表单对象
///
public virtual void RowsDeleted(UFIDA.U8 34、UAP.UI.Runtime.Common.RowChangeEventArgs[] para, BusinessProxy businessObject, VoucherProxy voucherObject)
{
}
/// 35、aram>
/// 所属表单对象
/// 36、Proxy voucherObject)
{
return false;
}
/// 37、ns>是否允许选择新行,false--不允许选择新行,当前行不发生改变
/// 38、
/// 设置为当前行之后的接口
/// 被选择的行参数
/// 所属业务对象
/// 所属表单对象
///
public virtual void RowSelected(UFIDA.U8.UAP.UI.Runtime.Common.RowSelectEventArgs 39、 para, BusinessProxy businessObject, VoucherProxy voucherObject)
{
}
/// 40、e--不通过
///
public virtual bool DataChecking(BusinessProxy businessObject, VoucherProxy voucherObject)
{
return false;
}
/// 41、
/// 所属表单对象
///
public virtual void DataChecked(BusinessProxy businessObject, VoucherProxy voucherObject)
{
}
/// 42、察者视图接口(IEditWindow)对象
/// 即将要填充的数据
///
public virtual void EditWindowFilling(UFIDA.U8.UAP.UI.Runtime.Common.IEditWindow view, System.Data.DataTable fillDataTable, BusinessProxy businessObject, VoucherProxy voucherObjec 43、t)
{
}
/// 44、time.Common.IEditWindow view, System.Data.DataTable fillDataTable, BusinessProxy businessObject, VoucherProxy voucherObject)
{
}
/// 46、time.Common.ReferOpenEventArgs para, BusinessProxy businessObject, VoucherProxy voucherObject)
{
return false;
}
/// 47、EventArgs参照信息
/// 所属业务对象
/// 所属表单对象
///
public virtual void ReferClosed(UFIDA.U8.UAP.UI.Runtime.Common.ReferCloseEventArgs para, BusinessProxy businessObject, VoucherProxy 48、voucherObject)
{
}
/// 49、m name="ID">布局视图中指定的自定义控件“控件ID”
///






