UAP开发样例指导_uap开发样例指导
UAP开发样例指导由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“uap开发样例指导”。
UAP开发指导文档 of
UAP开发样例指导
用友研发中心 U8平台技术部
UAP开发指导文档
目录
一、摘要...........................................................................................................................3
二、样例开发前提...........................................................................................................3
三、建立UAP项目.........................................................................................................4
四、建立表单模型...........................................................................................................5
(一)新建实体...............................................................................................................6(二)新建实体属性.......................................................................................................8
五、建立表单布局.........................................................................................................14
六、行为对象开发.........................................................................................................15
(一)表单开发.............................................................................................................17(二)列表开发.............................................................................................................33(三)生单二次开发.....................................................................................................39(四)联查报表.............................................................................................................40(五)联查UAP列表...................................................................................................41(六)UAP列表联查U8单据.....................................................................................42(七)用户自定义控件开发.........................................................................................45(八)U8单据引用UAP档案.....................................................................................46
七、行为对象注册.........................................................................................................59
功能介绍:.....................................................................................................................59 使用说明:.....................................................................................................................59 应用技巧:.....................................................................................................................61
八、建立数据引擎.........................................................................................................62
功能介绍:.....................................................................................................................62 使用说明:.....................................................................................................................63 应用技巧:.....................................................................................................................85
九、设置过滤条件.........................................................................................................85
功能介绍:.....................................................................................................................85 使用说明:.....................................................................................................................85 应用技巧:.....................................................................................................................90
十、设置栏目.................................................................................................................91
功能介绍.........................................................................................................................91 使用说明.........................................................................................................................91 应用技巧.........................................................................................................................92
十一、权限.....................................................................................................................92
功能权限.........................................................................................................................92 记录级权限.....................................................................................................................93 字段级权限.....................................................................................................................94
十二、部署.....................................................................................................................95 附录:功能介绍.....................................................................................................................961、行为对象升级说明...................................................................................................962、LoginInfo 对象介绍.................................................................................................99 of
UAP开发指导文档
一、摘要
本文以U8-ERP中的销售订单为应用原型,介绍了如何通过UAP进行软件开发,文中给出了开发方法和丰富样例。内容包括:
UAP表单开发原理
UAP项目的建立和导入、导出
UAP表单的模型设计和布局设计
UAP表单的行为对象开发
UAP表单列表设计与开发
UAP表单列表的行为对象开发
如何对UAP表单的缺省按钮进行扩展性开发
如何对UAP表单的缺省按钮进行取代性开发
如何为UAP表单增加新的按钮及行为
如何用程序代码调用UAP报表
如何用程序代码调用UAP表单列表
如何在UAP表单中增加权限控制:功能权限、字段权限、记录权限
如何为UAP表单开发自定义控件
如何开发树形档案
如何维护UAP数据引擎
如何维护栏目
如何维护过滤条件
如何调用U8API U8单据自定义项如何引用UAP档案
本文档中使用的示例文件为“销售订单二次开发”,可以通过UAP将该文件导入到帐套中。项目名称为“ SaleVoucher ”,导入后在项目中包括几个自定义单据:“销售订单”为二次开发的Demo示例;“零售日报”为自定义空间二次开发的Demo示例;“列表档案示例”、“树形编辑档案示例”、“树形导航档案示例”分别为各个对应的档案类型的示例。
项目源代码:
二、样例开发前提
首先,需要安装U8产品,并建立一个帐套。
其次,您需要向用友公司购买UAP表单设计许可;不过您可以使用UAP的演示版本,但是演示版本不能新建UAP项目,也不能注册行为对象。of
UAP开发指导文档
三、建立UAP项目
使用UAP登录您的帐套后,在系统界面上的新建项目选项卡,选中“供应链”后,在右边的列表中选择“销售管理”,在界面下方的几个文本框中输入项目名称,编号,描述等;顺序选择框使用“默认”即可。点击“确定”如果输入信息与先前创建的项目信息不冲突,项目就可被成功创建。
您也可以导入我们为您提供的UAP样例项目,导入方法如下。
1、登录UAP;
2、打开菜单“文件-导入和导出”;
3、选中“导入项目数据到目前的服务器”,点“确定”按钮; of
UAP开发指导文档
4、点“导入”按钮,选取U8安装目录下的“uapsdk”目录中的文件“Samplefile”;
5、导入成功后;
6、在UAP已存在的项目中产生了一个名称为“SaleVoucher”的项目;
四、建立表单模型
选中“自定义表单”节点,单击右键,使用“新建自定义表单”功能创建一个新的表单。然后在弹出的选择界面中选择“表单类型”下的“单据”,在名称文本框中输入一个表单名字,不要与以前创建的表单名字重复。在成功创建后,系统界面会如下图(图表1)所示: of
UAP开发指导文档
图表 1 在上图所示的实体节点,默认有两个子节点,分别为“主表和第一子表”,根据当前表单的需要设计实体,包括增加实体和实体属性等。
(一)新建实体
需要为实体填写“实体名称”,和选择“实体类型”。除此以外,还可以通过实体的属性编辑窗口为实体设置各项信息。of
UAP开发指导文档
实体的相关属性:
名称:实体显示的名称,仅用于设计时。 发布状态:实体是否已发布,只读。
功能:为实体定义自定义功能,在运行时显示为表格对应的工具栏按钮。 状态设置:设置实体属性、功能在表单运行时的状态,决定实体属性、功能在不同的环境下是否可用。 物理表模式:设置实体物理表的创建模式,默认为由UAP在发布时自动创建。在特殊的应用场景中可以使用“使用已存在的对象”或“无”。后两种情况下UAP不负责实体物理表的维护。 物理表:设置该实体在数据库存储时使用的物理表,一般情况下一个实体对应一个物理表。 数据引擎模式:设置实体运行时数据的访问方式。默认为UAP系统在发布时自动创建,特殊的应用场景中可以使用“使用已存在的对象”或“无”,这两种情况下系统不负责实体数据的读取,只能通过用户定义的接口获取数据集。 数据引擎:当数据引擎模式为“使用已存在的对象”时,设置要使用的数据引擎对象。of
UAP开发指导文档
主键:设置实体物理表的主键字段名。
主键类型:设置实体物理表主键字段的类型,可选“整数”或“GUID”或“字符串”。 行模式:多行或单行。一般主表设置为单行。
(二)新建实体属性
实体必须包含实体属性时才有效。可以在UAP界面“表单”窗口中,右键点击实体对应的节点,选择“新建实体属性”菜单向实体添加实体属性:
实体属性通用属性:
类型:该实体属性的类型。 描述:对该实体属性的单体描述。 属性名称:实体属性的名称。 默认值:实体属性的默认值。
使用默认值:用户未提供数据时,是否使用实体属性的默认值。 发布:该实体属性是否已经发布。
常用条件:该实体属性是否可以在过滤中作为常用条件使用。 区间条件:该实体属性是否可以在过滤中作为区间条件使用。 值更新事件:设置该实体属性值更新时需要处理的脚本列表。
基础资料类型字段共有三种类型的值更新事件:“携带当前字段相关参照属性到指定列”、“计算定义公式的值到指定列”、“表达式为真/假时改变指定栏目编辑状态”;其余类型字段比基础资料类型字段缺少第一种类型的值更新事件。1.携带当前字段相关参照属性到指定列 of
UAP开发指导文档
2.计算定义公式的值到指定列
3.表达式为真/假时改变指定栏目编辑状态 of
UAP开发指导文档
表单式为真假时修改指定栏目的编辑状态
表单式为真假时修改指定栏目的显示状态 of
UAP开发指导文档
表单式为真假时修改指定功能状态 表单功能 of
UAP开发指导文档
实体功能
唯一约束:是否检查该实体属性的值在整个表单范围内唯一。 文本对齐:实体属性文本的显示位置。
显示文本:实体属性的不同语言环境中显示的文本。 允许空值:实体属性的值是否可以为空。
物理表:实体属性对应物理字段的表名,即该实体属性所属实体的物理表。 字段:实体属性对应的物理字段名。
除了支持以上通用属性外,不同类型的实体属性还具有不同的特性: 1.表单编号
表单编号只能出现的主表实体中,并且只能有一个表单编号类型的实体属性。2.表单名称
表单名称类型的实体属性只能在档案类型的表单中使用,同表单编号一样,表单名称类型的实体属性只能出现主表实体中,并且只能出现一次。3.整数和正整数
可否为0:数值型的值是否可为0。
录入长度:限制用户可录入数值的最多位数。of
UAP开发指导文档
数据格式:数值类型的显示格式。
最大值和最小值:数据的有效范围。正整数的最小值必须等于或大于0。4.小数和正小数
可否为0:数值型的值是否可为0。
录入长度:限制用户可录入数值的最多位数。 数据格式:数值类型的显示格式。
最大值和最小值:数据的有效范围。正小数的最小值必须等于或大于0。 小数位数:数据保留的小数位数。5.文本
多行输入:运行时是否支持录入多行文本。 最大长度:最多可录入的文本长度。6.日期和日期时间
日期类型运行短日期格式,即只包含年月日。日期时间类型包含年月日和时分秒。7.枚举
枚举类型的实体属性需要设置枚举值列表,枚举值的显示值为在界面显示的文本,保存值为实际保存到数据库的数据,如枚举类型的实体属性“销售类型”的枚举值可设置为如下图所示:
U872中枚举字段支持选择“枚举模式”:使用已存在枚举、新创建枚举。选择“使用已存在枚举”后,需要为“枚举类型”选择一个U8系统中现有的枚举中的一个。
8.基础资料 of
UAP开发指导文档
基础资料类型的值来自指定参照档案的对照值。
参照对象:设置基础资料类型实体属性的参照档案对象,可以从U8档案列表中选择,包含UAP中定义为档案类型的表单。 参照显示值:该属性是设置当前就“基础资料”字段在运行时的文本框里显示参照的那个字段的值。如上面的“参照对象”属性选择的存货档案,如果不设参照显示值,则运行时默认显示为存货编码,如果将“参照显示值”属性设置为存货档案的“存货”名称,运行是该字段就会显示为存货的名称。 选择方式:设置在运行时的对照选择方式。
自动校验:是否对录入的值进入检验以确定数据是否来自指定的参照对象。选择“否”时允许用户录入参照对象中不存在的值。9.基础资料属性
基础资料属性类型的实体属性必须和基础资料类型的实体属性结合使用。 参照属性:设置基础资料属性类型实体属性要绑定的基础资料类型实体属性,并指定关联的参照字段。当基础资料类型的实体属性值变化时,基础资料属性类型的实体属性值随之改变。10.数量、价格和金额
数量、价格和金额类型的实体属性实质上为小数类型,设置等同于小数类型的实体属性。11.复选框
特殊类型的整数值,运行时显示为复选框,保存的数据为0(未选择)或1(选择)。12.制单人
当前单据的作者,一般设为登录用户。13.制单日期和修改日期
制单日期保存当前表单生成的日期,修改日期保存表单最后一次修改的日期。这两种类型的实体属性实质上为日期时间类型,设置等同于日期时间类型的实体属性。
五、建立表单布局
在完成实体的设计后,可以设计表单布局,UAP支持一个表单多个布局视图,用户可根据自己的使用习惯选择一种布局视图。布局视图的设计与普通window界面的布局设计基本一致。of
UAP开发指导文档
六、行为对象开发
行为对象开发是指增加表单或列表的功能按钮,除了UAP系统自带的功能按钮外,还可以增加按钮,这些增加的功能按钮是UAP表单开发的基础。
UAP提供了多种增加功能的途径,首先通过设计界面的树形菜单中的“功能”节点下的表单功能和列表功能的“功能管理”(图表2)添加功能按钮,这些功能按钮最终在运行时会被加载到U8产品的门户上;其次可以为每个表单实体添加功能按钮(图表3),为实体添加完成这些功能按钮后,还需要在布局视图上为该表单实体的“功能”属性设置使用这些功能(图表4),这些功能按钮最终在运行时会被加载到该实体的工具栏按钮上。
图表 2
图表 3
图表 4 15 of
UAP开发指导文档
图表 5
增加功能按钮时,很多工作都可以通过上图(图5)的设计界面完成,开发人员关心的仅仅是表单开发业务逻辑的实现。这些按钮的作用主要是通过在运行时对模型对象中数据的修改以及最终将修改的数据持久化来完成的。
UAP表单开发分为表单开发和列表开发两种。因此对应了两种不同的开发类型定义了两种不同的访问模型对象数据的接口。
新增功能开发(锁定、解锁、关闭、打开)表单功能开发表单开发已有功能修改(审核、弃审等)新增功能开发(复制选中行、查询订单对应报价单、订单追溯查询)UAP分层开发列表开发表单实体功能开发新增功能开发(批审、批弃、批量关闭、批量打开)已有功能修改(暂无)已有功能修改(暂无)of
UAP开发指导文档
(一)表单开发
表单开
发
访
问
模
型
对
象的接
口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;}
/// /// 运行时表单加载之前调用的接口,可以处理表单加载之前的业务要求。
/// ///
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){ } /// /// 运行时表单加载之后调用的接口,可以处理表单加载之后的业务要求。
/// ///
所属表单对象 public virtual void ReceiptLoaded(VoucherProxy ReceiptObject){ }
/// /// 值更新之前的接口,对值的合法性检查在这里进行 17 of
UAP开发指导文档
///
Cell的值变动参数 ///
所属业务对象 ///
所属表单对象 /// 是否允许更新单元格的值,false--不允许更新,将保持原值 /// public virtual bool CellChanging(UFIDA.U8.UAP.UI.Runtime.Common.CellChangeEventArgs para, BusineProxy busineObject, VoucherProxy voucherObject){ return false;} /// /// 值更新之后的接口,对值的后续处理(如对其他Cell值的变更)在这里进行
///
Cell的值变动参数 ///
所属业务对象 ///
所属表单对象 /// public virtual void CellChanged(UFIDA.U8.UAP.UI.Runtime.Common.CellChangeEventArgs para, BusineProxy busineObject, VoucherProxy voucherObject){ }
/// /// 增加行之前的接口,对行的合法性检查在这里进行
///
新增的行参数 ///
所属业务对象 ///
所属表单对象 /// 是否允许增加新行,false-不允许增加新的行 /// public virtual bool RowAdding(UFIDA.U8.UAP.UI.Runtime.Common.RowChangeEventArgs para, BusineProxy busineObject, VoucherProxy voucherObject){ return false;}
/// /// 增加行之后的接口,对新增行的后续处理在这里进行
///
新增的行参数 ///
所属业务对象 ///
所属表单对象 /// public virtual void RowAdded(UFIDA.U8.UAP.UI.Runtime.Common.RowChangeEventArgs para, BusineProxy busineObject, VoucherProxy voucherObject){ 18 of
UAP开发指导文档
}
/// /// 删除行之前的接口,对行的合法性检查在这里进行
///
RowChangeEventArgs[]类型,要删除的行参数 ///
所属业务对象 ///
所属表单对象 /// 是否允许删除这些行,false--不允许删除这些行 /// public virtual bool RowsDeleting(UFIDA.U8.UAP.UI.Runtime.Common.RowChangeEventArgs[] para, BusineProxy busineObject, VoucherProxy voucherObject){ return false;}
/// /// 删除行之后的接口,对删除行的后续处理在这里进行
///
RowChangeEventArgs[]类型,要删除的行参数 ///
所属业务对象 ///
所属表单对象 /// public virtual void RowsDeleted(UFIDA.U8.UAP.UI.Runtime.Common.RowChangeEventArgs[] para, BusineProxy busineObject, VoucherProxy voucherObject){ }
/// /// 观察者视图工具条按钮单击事件的接口
///
被单击的按钮参数 ///
所属业务对象 ///
所属表单对象 /// true表示实现了相应按钮的方法;false表示没有实现相应按钮的方法。/// public virtual bool
ClickToolBarButton(UFIDA.U8.UAP.UI.Runtime.Common.ToolBarActionEventArgs para, BusineProxy busineObject, VoucherProxy voucherObject){ return false;}
/// /// 设置为当前行之前的接口 of
UAP开发指导文档
///
被选择的行参数 ///
所属业务对象 ///
所属表单对象 /// 是否允许选择新行,false--不允许选择新行,当前行不发生改变 /// public virtual bool RowSelecting(UFIDA.U8.UAP.UI.Runtime.Common.RowSelectEventArgs para, BusineProxy busineObject, VoucherProxy voucherObject){ return false;}
/// /// 设置为当前行之后的接口
///
被选择的行参数 ///
所属业务对象 ///
所属表单对象 /// public virtual void RowSelected(UFIDA.U8.UAP.UI.Runtime.Common.RowSelectEventArgs para, BusineProxy busineObject, VoucherProxy voucherObject){ }
/// /// 业务数据合法性检查之前的接口
///
所属业务对象 ///
所属表单对象 /// 检查是否通过,false--不通过 /// public virtual bool DataChecking(BusineProxy busineObject, VoucherProxy voucherObject){ return false;}
/// /// 业务数据合法性检查之后的接口
///
所属业务对象 ///
所属表单对象 /// public virtual void DataChecked(BusineProxy busineObject, VoucherProxy voucherObject){ of
UAP开发指导文档
}
/// /// 观察者视图填充数据前的接口
///
观察者视图接口(IEditWindow)对象 ///
即将要填充的数据 /// public virtual void EditWindowFilling(UFIDA.U8.UAP.UI.Runtime.Common.IEditWindow view, System.Data.DataTable fillDataTable, BusineProxy busineObject, VoucherProxy voucherObject){ }
/// /// 观察者视图填充数据后的接口
///
观察者视图接口(IEditWindow)对象 ///
已经填充的数据 /// public virtual void EditWindowFilled(UFIDA.U8.UAP.UI.Runtime.Common.IEditWindow view, System.Data.DataTable fillDataTable, BusineProxy busineObject, VoucherProxy voucherObject){ }
/// /// 参照打开前的接口
///
观察者视图接口(IEditWindow)对象 ///
ReferOpenEventArgs参照信息 ///
所属业务对象 ///
所属表单对象 /// 是否允许参照,false--不允许参照,将不弹出参照界面,参照操作终止 /// public virtual bool ReferOpening(UFIDA.U8.UAP.UI.Runtime.Common.ReferOpenEventArgs para, BusineProxy busineObject, VoucherProxy voucherObject){ return false;}
/// /// 参照返回(关闭)后的接口
///
观察者视图接口(IEditWindow)对象 ///
ReferCloseEventArgs参照信息 ///
所属业务对象 ///
所属表单对象 21 of
UAP开发指导文档
/// public virtual void ReferClosed(UFIDA.U8.UAP.UI.Runtime.Common.ReferCloseEventArgs para, BusineProxy busineObject, VoucherProxy voucherObject){ }
/// /// 创建用户自定义控件接口,开发人员可以在这里创建用户自定义控件。运行时会把这个控件加载到布局视图中。(版本新增)
/// ///
所属业务对象 ///
所属表单对象 ///
布局视图中指定的自定义控件“控件ID” /// 用户自定义控件对象 public virtual System.Windows.Forms.Control CreateControl(BusineProxy busineObject, VoucherProxy voucherObject, string ID){ return null;}
/// /// 表单状态更新之前的接口
///
状态的变动参数 ///
所属表单对象 /// 是否允许改变状态false-不允许改变状态,表单仍将处于当前状态 /// public virtual bool
StateChanging(UFIDA.U8.UAP.UI.Runtime.Common.VoucherStateChangeEventArgs para, VoucherProxy voucherObject){ return false;}
/// /// 表单状态更新之后的接口
///
状态的变动参数 ///
所属表单对象 /// public virtual void
StateChanged(UFIDA.U8.UAP.UI.Runtime.Common.VoucherStateChangeEventArgs para, VoucherProxy voucherObject){ of
UAP开发指导文档
}
/// /// 鼠标左键双击数据行的接口
/// ///
鼠标双击信息 ///
///
public virtual void
RowDoubleClick(UFIDA.U8.UAP.UI.Runtime.Common.RowDoubleClickEventArgs para, BusineProxy busineObject, VoucherProxy voucherObject){ }
/// /// 鼠标左键双击数据单元格的接口
/// ///
鼠标双击信息 ///
所属业务对象 ///
所属表单对象 public virtual void
CellDoubleClick(UFIDA.U8.UAP.UI.Runtime.Common.CellDoubleClickEventArgs para, BusineProxy busineObject, VoucherProxy voucherObject){ }
/// /// 鼠标左键双击表格的标题的接口
/// ///
鼠标双击信息 ///
所属业务对象 ///
所属表单对象 public virtual void
HeaderDoubleClick(UFIDA.U8.UAP.UI.Runtime.Common.HeaderDoubleClickEventArgs para, BusineProxy busineObject, VoucherProxy voucherObject){ }
/// /// 设置当前列之后的接口
/// 23 of
UAP开发指导文档
///
单元格信息 ///
所属业务对象 ///
所属表单对象 public virtual void CellSelected(UFIDA.U8.UAP.UI.Runtime.Common.CellSelectEventArgs para, BusineProxy busineObject, VoucherProxy voucherObject){ }
////890 /// /// 在进入单元格编辑状态之前判断单元格是否可编辑
/// ///
单元格信息 ///
所属业务对象 ///
所属表单对象 /// 是否可编辑,true:可编辑,false:不可编辑 public virtual bool CellEditing(CellSelectEventArgs para, BusineProxy busineObject, VoucherProxy voucherObject){ return true;} /// /// 行选择框的值发生变化之前的接口
/// ///
行选择框信息 /// 是否可改变,true:值可变化,false:值不可变化 public virtual bool RowChecking(RowCheckEventArgs para, BusineProxy busineObject, VoucherProxy voucherObject){ return true;} /// /// 行选择框的值发生变化之后的接口
/// ///
行选择框信息 public virtual void RowChecked(RowCheckEventArgs para, BusineProxy busineObject, VoucherProxy voucherObject){ }
/// /// 运行时表单关闭之前调用的接口,可以处理表单关闭之前的业务要求,如判断是否需要关闭等 of
UAP开发指导文档
/// ///
所属表单对象 ///
退出按钮的参数,可以通过IsCanceled来决定是否关闭表单IsCanceled=true表示不关闭,=false表示关闭 public virtual void ReceiptUnLoading(VoucherProxy ReceiptObject, VoucherButtonArgs exitCommand){
} /// /// 运行时表单关闭之后调用的接口,可以处理表单关闭之后的业务要求,如释放已经申请到的功能
/// ///
所属表单对象 ///
退出按钮的参数,可以通过IsCanceled判断是否成功关闭表单,也可以通过IsCanceled来决定是否关闭表单IsCanceled=true表示不关闭,=false表示关闭 public virtual void ReceiptUnLoaded(VoucherProxy ReceiptObject, VoucherButtonArgs exitCommand){
1、说明 表单功能开发(门户工具栏按钮功能开发)ReceiptPluginBase类中的方法
/// /// 门户工具栏按钮被点击时触发该方法,可以根据参数判断是哪个按钮被触发 ///
被点击门户工具栏按钮参数 /// public
virtual
IButtonEventHandler
ButtonArgs,VoucherProxy GetButtonEventHandler(VoucherButtonArgs
voucherObject);这个方法是表单功能按钮执行的入口,根据在UAP表单功能的功能管理(见图2)里添加的不同功能按钮的ButtonKey来区别不同的功能。返回值类型为UFIDA.U8.UAP.UI.Runtime.Model.IButtonEventHandler接口,该返回值对象会被UAP运行时调用来执行该对象中的方法。IButtonEventHandler接口定义了三个方法,按照运行时被调用执行的先后顺序分别为:
string Excuting(VoucherProxy ReceiptObject)、string Excute(VoucherProxy ReceiptObject, string PreExcuteResult)、string Excuted(VoucherProxy ReceiptObject, string PreExcuteResult)。注:
(1)三个方法的返回值为xml字符串,其格式为
“”,该返回值用来标示当前方法是否成功执行,记录在result属性里,errinfo属性用来记录任何可能的信息。Excuting25 of
UAP开发指导文档
方法的返回值可以作为Excute方法的第二个参数PreExcuteResult传入Excute,你可以在Excute方法体重分析传入的信息决定程序是否继续执行,或作出其他处理等,同样,Excute方法的返回值也可作为Excuted方法的参数传入,并作必要检查。另外,你可以在保证上面规定的xml结构的前提下,在节点内扩展该xml结构,以适应你的应用逻辑的需要。
(2)三个方法共有的参数就是当前表单功能按钮可以操作的表单模型。可以从该对象中取到当前可以操作的任何数据。
示例
[IsImplementAttribute(true)] Public override
IButtonEventHandler
GetButtonEventHandler(VoucherButtonArgs ButtonArgs){
//保存按钮----UAP已有功能的部分修改开发
if(ButtonArgs.ButtonKey == “btnSaveVoucher”){ return new AcceptOrderButton();}
//审核按钮----UAP已有功能替代修改开发
if(ButtonArgs.ButtonKey == “btnAudit”){ return new AuditButton(AuditType.Audit);}
//锁定按钮----新增功能开发
if(ButtonArgs.ButtonKey == “SenDevLock”){ return new LockVoucherButton(LockType.Lock);} }
这个方法是表单功能按钮执行的入口,IsImplementAttribute属性需要手工添加到方法上面。根据在UAP表单的功能管理里不同功能按钮的ButtonKey来区别不同的功能。上述代码的返回值类型AcceptOrderButton、AuditButton、LockVoucherButton都是继承自UFIDA.U8.UAP.UI.Runtime.Model.IButtonEventHandler接口。
注意项
1)新增功能开发 说明
在使用UAP进行表单开发时,UAP已经提供的功能都是一些公共功能,而一些表单可能需要很多特别的功能,此时就需要进行新增功能的开发。新增功能开发需要开发者要完全理解当前功能的实际业务,并在实现业务的基础上将对表单相关数据的修改持久化到数据库中,持久化的操作及可能的事务控制等完全由开发人员自己来做。of
UAP开发指导文档
示例
//锁定按钮----新增功能开发 双击查看代码 #region 锁定按钮----新增功能开发 using System;using System.Collections.Generic;using System.Text;using UFIDA.U8.UAP.UI.Runtime.Model;using System.Windows.Forms;using System.Data.SqlClient;namespace ufida.u8.uap.plugin.SalesVoucher { public cla LockVoucherButton : IButtonEventHandler { public LockVoucherButton(){ } #region IButtonEventHandler 成员 public string Excute(VoucherProxy ReceiptObject, string PreExcuteResult){ bool result = false;SqlConnection conn=new SqlConnection(ReceiptObject.LoginInfo.UFDataSqlConSt SqlTransaction tran = null;SqlDataReader rd = null;try { conn.Open();tran=conn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted);SqlCommand cmd = conn.CreateCommand();Busine b = ReceiptObject.Businees[“SaleVouche_0001_E001”] as Busine;BusineCell cell = b.Cells[“cSOCode”] as BusineCell;string pkValue = cell.Value;cmd.CommandText = “select cVerifier, cCloser,cLocker from so_somain where cSOCode = '” + pkValue + “'”;cmd.Transaction = tran;rd = cmd.ExecuteReader();if(rd.Read()){ string auditMan = “”;string closeMan = “”;string lockMan = “”;if(!rd.IsDBNull(0)){ auditMan = rd.GetString(0);} if(!rd.IsDBNull(1)){ closeMan = rd.GetString(1);} if(!rd.IsDBNull(2)){ lockMan = rd.GetString(2);of
UAP开发指导文档
注意项
2)UAP已有功能的修改开发 说明
UAP已经实现了新增表单的保存方法,但是我们可能在使用UAP保存逻辑的基础之上,在保存之前或保存之后对表单的某些数据做一定的修改。具体就是对表单模型中的某些实体属性的值根据业务逻辑的需要做必要的修改再执行已有的表单保存。of
UAP开发指导文档
示例
using System;using System.Collections.Generic;using System.Text;using UFIDA.U8.UAP.UI.Runtime.Model;using UFIDA.U8.UAP.UI.Runtime.Common;using System.Xml;namespace ufida.u8.uap.plugin.SalesVoucher { /// /// 接受订单按钮处理 /// public cla AcceptOrderButton : IButtonEventHandler { #region IButtonEventHandler 成员 public string Excute(VoucherProxy ReceiptObject, string PreExcuteResult){ return null;} public string Excuted(VoucherProxy ReceiptObject, string PreExcuteResult){ if(!ReadExcuteState(PreExcuteResult)){ if(ReceiptObject.VoucherState == VoucherStateEnum.New){ if(ReceiptObject.Businees.ContainsKey(“SaleVouche_0001_E001”)){ Busine b = ReceiptObject.Businees[“SaleVouche_0001_E001”] as Busine;if(b.Rows.Count > 0){ if(b.Columns.ContainsKey(“iStatus”)){ BusineCell cell = b.Cells[“iStatus”] as BusineCell;cell.Value = “”;} } } } return null;} return MakeExcuteState(true, “保存成功”);} public string Excuting(VoucherProxy ReceiptObject){ if(ReceiptObject.VoucherState == VoucherStateEnum.New){ if(ReceiptObject.Businees.ContainsKey(“SaleVouche_0001_E001”)){ Busine b = ReceiptObject.Businees[“SaleVouche_0001_E001”] as Busine;if(b.Rows.Count > 0)双击查看代码 of
UAP开发指导文档
注意项
3)UAP已有功能的替代开发 说明
UAP系统中已经实现了一些公共功能,但这些功能并不一定适用于每种不同表单的具体情况,所以有些时候我们可能需要对UAP的已经实现的功能进行替代开发。替代开发分为两种:在实现业务基础上直接操作数据库、调用U8已经实现的该表单审核功能的API方法。
直接操作数据库:直接操作数据库的开发方法与下面的“新增功能开发”的开发方法大体一致,此处不再细述。
调用业务API:调用业务API方法避免了开发人员必须去了解当前功能的具体业务,降低了开发的复杂程度,有利于快速而准确的开发。但是在使用业务API之前,必须首先掌握在.Net中调用U8中API的方法,其次需要知道有那些API可以使用,各个API方法的参数和返回值代表的意义,以及根据API的参数和返回值确定你的表单开发过程的业务流程等。
Net中如何调用U8中的API 参照U8API资源管理器中为每个已有的API生成的调用代码示例
示例
Busine b = ReceiptObject.Businees[“SaleVouche_0001_E001”] as Busine;if(b.Cells[“iswfcontrolled”].Value == “1”)return null;DataSet ds = b.Rows[0].RowData.Table.DataSet;MSXML2.DOMDocument dom = BusineInterfaceUtil.ConvertDataSetToDOM(ds, b.TableName);
U8EnvContext envContext = new U8EnvContext();envContext.U8Login = ReceiptObject.VBLoginObject;
envContext.SetApiContext(“VoucherType”, 12);
U8ApiAddre myApiAddre = new U8ApiAddre(“U8API/SaleOrder/Audit”);U8ApiBroker broker = new U8ApiBroker(myApiAddre, envContext);broker.AignNormalValue(“domHead”, dom);
if(this.auditType == AuditType.Audit){ //审核处理
broker.AignNormalValue(“bVerify”, true);} 30 of
UAP开发指导文档
else if(this.auditType == AuditType.AbandonAudit){ //弃审处理
broker.AignNormalValue(“bVerify”, false);} if(!broker.Invoke()){ //错误处理
Exception apiEx = broker.GetException();if(apiEx!= null){ if(apiEx is MomSysException){ MomSysException sysEx = apiEx as MomSysException;Console.WriteLine(“系统异常:” + sysEx.Meage);MeageBox.Show(sysEx.Meage);} else if(apiEx is MomBizException){ MomBizException bizEx = apiEx as MomBizException;Console.WriteLine(“API异常:” + bizEx.Meage);MeageBox.Show(bizEx.Meage);} result = false;} //结束本次调用,释放API资源 broker.Release();}
注意项
2、说明 表单实体功能开发(表单实体工具栏按钮功能开发)表单实体的功能开发主要是针对表单中的某个实体的数据相应的功能操作。ReceiptPluginBase接口中的方法
/// /// 观察者视图工具条按钮单击事件的接口
///
被单击的按钮参数 ///
所属业务对象 ///
所属表单对象 /// Public virtual void ClickToolBarButton(ToolBarActionEventArgs para, 31 of
UAP开发指导文档
BusineProxy busineObject, VoucherProxy voucherObject);这个方法是表单实体功能按钮执行的入口,方法的参数para代表触发当前方法的工具栏上的一个按钮,busineObject代表当前表单实体的模型对象,voucherObject代表当前表单的模型对象。根据UAP中实体功能设计里不同的ButtonKey来区别不同的功能按钮。从UAP给出的接口的参数中可以看出,对当前表单实体的功能操作,不仅能访问当前的表单实体模型对象,还能访问当前的表单模型对象。在表单开发过程中可以访问两个模型对象中的数据。
示例
[IsImplementAttribute(true)] Public override void ClickToolBarButton(ToolBarActionEventArgs para, BusineProxy busineObject, VoucherProxy voucherObject){ switch(para.Key){ //复制选中行
case “SenDevCopyLine”: CopyCurrentLineToNewLine(busineObject, voucherObject);break;//查看存货量
case “SenDevViewCount”: ViewCount(busineObject, voucherObject);break;//查看当前订单对应报价单
case “SenDevViewBaoJiaDan”: ViewBaoJiaDan(busineObject, voucherObject);break;//订单追溯汇总查询
case “SenDevVoucherZhuiSuHuiZongChaXun”: VoucherZhuiSuHuiZongChaXun(busineObject, voucherObject);break;default: break;} } 这个方法是表单实体功能按钮执行的入口,IsImplementAttribute属性需要手工添加到方法上面。方法的参数para代表触发当前方法的工具栏上的一个按钮,busineObject代表当前表单实体的模型对象,voucherObject代表当前表单的模型对象。根据UAP中实体功能设计里不同的ButtonKey来区别不同的功能按钮。
of
UAP开发指导文档
注意项
(二)列表开发
说明
列表开发访问列表模型对象的接口为UFIDA.U8.UAP.UI.Runtime.List.UI.BaseUIEventHandler,该接口是一个已经包括部分功能代码的.Net类。该类被定义在UFIDA.U8.UAP.UI.Runtime.List.dll中,所以在列表开发前,你需要为新建的表单开发项目添加UFIDA.U8.UAP.UI.Runtime.List.dll的引用。你需要做的就是重写该类中的一个方法: /// /// 批审按钮处理方法
/// ///
事件触发者 ///
事件对应的参数信息 public override void ProceEvent(UFIDA.U8.UAP.UI.Runtime.List.UIEventTypeEnum eventType, object sender, object args){ } 列表的分成开发时,就是通过上面方法的参数sender来区分在各个不同的功能,然后开发着需要针对各个不同的功能实现其具体的业务逻辑,并将业务逻辑执行后对表单相关数据的修改持久化。
U872在列表二次开发时新增接口如下,这些接口主要作用是为生单开发而添加。每个方法都有自己的注释(该方法何时被调用,作用是什么)
/// /// 过滤窗口弹出时的处理,可以动态设置缺省过滤条件
/// ///
列表服务 ///
过滤组件 public virtual void ReceiptListFiltering(UFGeneralListService listService, FilterSrvCla filterSrv){ } /// /// 根据条件过滤源单据列表数据,可以重写缺省的过滤算法
/// ///
过滤参数 public virtual void ReceiptListFilter(FilterPluginArgs filterArgs){ if(filterArgs!= null){ 33 of
UAP开发指导文档
filterArgs.CurrentPageData = null;filterArgs.RowCountData = null;} }
/// /// 过滤操作执行后的事件
/// ///
列表服务 ///
查询后的数据(如果是分页的,只包含一页的数据)(该DataSet中只应该包含一个DataTable) ///
查询到的数据总行数(该DataSet中只包含一个DataTable,并且DataTable中只有一行一列) public virtual void ReceiptListFiltered(UFGeneralListService listService, DataSet dataSet, DataSet dataRowCountDataSet){ }
/// /// 源单据列表过滤结果填充之前的处理
/// ///
列表服务 ///
查询后的数据(如果是分页的,只包含一页的数据)(该DataSet中只应该包含一个DataTable) public virtual void ReceiptListFilling(UFGeneralListService listService, DataSet dataSet){ }
/// /// 源单据列表过滤结果填充之后的处理
/// ///
列表服务 ///
查询后的数据(如果是分页的,只包含一页的数据)(该DataSet中只应该包含一个DataTable) public virtual void ReceiptListFilled(UFGeneralListService listService, DataSet dataSet){ }
/// /// 源单据被选择事件,可以重写缺省的选择算法
/// ///
列表服务 34 of
UAP开发指导文档
///
触发对象 ///
事件 public virtual void ReceiptChecking(UFGeneralListService listService, object sender, CellEventArgs e){ }
/// /// 源单据被选择事件,可以重写缺省的选择算法
/// ///
列表服务 ///
触发对象 ///
事件 /// public virtual DataSet ReceiptCheck(UFGeneralListService listService,object sender,string voucherId){ return null;}
/// /// 源单据被选择事件,可以重写缺省的选择算法
/// ///
列表服务 ///
触发对象 ///
事件 public virtual void ReceiptChecked(UFGeneralListService listService,object sender, CellEventArgs e){ }
U872已经默认的生单插件就是继承了该接口类,重写了上述的U872新增接口中的三个方法:ReceiptListFilter(负责查询生单的源单据列表的数据)、ReceiptCheck(当单据列表上的一条单据被选择后,负责查询该单据的数据)、ReceiptChecked(负责为生单源单据列表上刚刚选择或取消选择的记录添加或取消CheckBox)。如果在实际的业务开发中需要做二次开发,只需要继承U872的默认的生单插件的实现类
UFIDA.U8.UAP.VoucherTransform.List.BasePlugin.BasePluginUIEvent,重写基类中的方法即可。
示例一 列表门户按钮二次开发
双击查看代码
of
UAP开发指导文档
using System;using System.Collections.Generic;using System.Text;using UFIDA.U8.UAP.UI.Runtime.List;using UFIDA.U8.UAP.UI.Runtime.Model;using System.Data;using UFIDA.U8.UAP.UI.Runtime.List.Metas;using System.Collections;using System.Data.SqlClient;using System.Diagnostics;using UFIDA.U8.Portal.Framework.Commands;using UFIDA.U8.Portal.Proxy.Acceory;namespace ufida.u8.uap.plugin.SalesVoucher { public cla SalesOrderList : UFIDA.U8.UAP.UI.Runtime.List.UI.BaseUIEventHandler { /// /// 实现该方法 /// ///
UI事件类型 ///
事件触发者 ///
事件对应的参数信息 public override void ProceEvent(UFIDA.U8.UAP.UI.Runtime.List.UIEventTypeEnum eventType, object sender, object args){ //检验事件类型是否为自定义按钮事件 if(eventType == UIEventTypeEnum.CUSTOMBUTTONCLICK){ //取出按钮元数据信息 ToolbarItemMeta item = args as ToolbarItemMeta;//批审 if(item.Id == “SenDevBatchAudit”){ this.ProceSenDevBatchAuditBtnEvent(sender, args);return;} } else if(eventType == UIEventTypeEnum.DBCLICK){ } base.ProceEvent(eventType, sender, args);} /// /// 批审按钮处理方法 /// ///
事件触发者 ///
事件对应的参数信息
of
UAP开发指导文档
示例二 生单二次开发列表部分
public cla
BasePluginUIEvent:UFIDA.U8.UAP.UI.Runtime.List.UI.BaseUIEventHandler { /// /// 根据条件过滤源单据列表数据,可以重写缺省的过滤算法
/// ///
列表服务 ///
查询后的数据(如果是分页的,只包含一页的数据)(该DataSet中只应该包含一个DataTable) ///
查询到的数据总行数(该DataSet中只包含一个DataTable,并且DataTable中只有一行一列) public override void ReceiptListFilter(FilterPluginArgs filterArgs){ string scriptSql = “”;string selectCountSql = “”;filterArgs.CurrentPageData = new DataSet();filterArgs.RowCountData = new DataSet();System.Diagnostics.Debug.WriteLine(“开始解析转换规则获取.........” + DateTime.Now.ToLongTimeString());UFIDA.U8.UAP.Common.LoginInfo tempLogin = new UFIDA.U8.UAP.Common.LoginInfo(this.ListService.VbLogin);DataServiceUtil.ProceQueryReponse(filterArgs.BizDAEScript, filterArgs.QueryBOID, tempLogin.AppServer, tempLogin.UFMetaSqlConStr, this.ListService.MakerVoucherRuleID, ref scriptSql, ref selectCountSql);
using(SqlConnection conn = new SqlConnection(tempLogin.UFDataSqlConStr)){ conn.Open();if(filterArgs.NeedPaginate){ SqlDataAdapter adapter = new SqlDataAdapter(scriptSql, conn);adapter.Fill(filterArgs.CurrentPageData,(filterArgs.CurrentPageIndex-1)* filterArgs.PageSize, filterArgs.PageSize, “temp”);} else { SqlDataAdapter adapter = new SqlDataAdapter(scriptSql, conn);adapter.Fill(filterArgs.CurrentPageData);}
SqlDataAdapter adapter1 = new SqlDataAdapter(selectCountSql, 37 of
UAP开发指导文档
conn);adapter1.Fill(filterArgs.RowCountData);} }
/// /// 源单据被选择事件,可以重写缺省的选择算法
/// ///
列表服务 ///
触发对象 ///
事件 /// public override DataSet ReceiptCheck(UFGeneralListService listService, object sender, string voucherId){ DataSet result = null;if(sender is MakeVoucher){ MakeVoucher tempObj = sender as MakeVoucher;result = tempObj.VoucherLogic.VoucherSrv.GetVoucherTransformData(voucherId, tempObj.MakeVoucherRuleId);}
}
/// /// 源单据被选择事件,可以重写缺省的选择算法
/// ///
列表服务 ///
触发对象 ///
事件 public override void ReceiptChecked(UFGeneralListService listService, object sender, CellEventArgs e){ this.ListService.ListPanel.SelectSameReceiptList(e, sender);} }
return result;38 of
UAP开发指导文档
注意项
(三)生单二次开发
生单二次开发共涉及到三个方面的二次开发:
生单接口二次开发; 列表接口二次开发; 单据接口二次开发;
其中列表接口和单据接口的二次开发参照行为对象二次开发章节的“表单二次开发”、“列表二次开发”。本节主要讲述生单的二次开发接口。
生单二次开发访问生单模型对象的接口为UFIDA.U8.UAP.UI.Runtime.Controller.IMakeReceipt,该接口是生单二次开发的基础接口。被定义在UFIDA.U8.UAP.UI.Runtime.Controller.dll中,所以在生单二次开发前,你需要为新建的表单开发项目添加UFIDA.U8.UAP.UI.Runtime.Controller.dll的引用。然后根据你的业务需要实现接口IMakeReceipt接口中的方法: /// /// 生单二次开发接口
/// public interface IMakeReceipt { /// /// 单据转化前调用接口
/// ///
生单窗体对象 ///
源单据数据 /// 单据转化是否继续执行 bool DataConverting(MakeVoucher makeReceipt, DataSet sourceDataSet);
/// /// 单据转化接口
/// ///
生单窗体对象 ///
源单据数据 /// 转化后的数据 DataSet DataConvert(MakeVoucher makeReceipt,DataSet sourceDataSet);
/// /// 单据转化后接口
/// ///
生单窗体对象 ///
转化后的数据 /// 单据转化是否继续执行 bool DataConverted(MakeVoucher makeReceipt, DataSet convertedDataSet);39 of
UAP开发指导文档
/// /// 生单窗体工具栏按钮二次开发
/// ///
按钮对象 /// 按钮二次开发接口实现类 IMakeVoucherButtonEventHandler GetButtonEventHandler(VoucherButtonArgs ButtonArgs);} 该接口中的DataConverting、DataConvert、DataConverted方法分别为生单转换前方法、具体的生单转换方法、生单转换后方法。其中生单转换算法最好在DataConvert方法中实现;GetButtonEventHandler方法为生单弹出窗体上按钮的二次开发接口,该方法类似于单据按钮的二次开发接口。该接口的返回值为IMakeVoucherButtonEventHandler类型,返回对象会被UAP运行时调用来执行该对象中的方法。IMakeVoucherButtonEventHandler接口定义了三个方法,按照运行时被调用执行的先后顺序分别为:
string Excuting(VoucherProxy ReceiptObject)、string Excute(VoucherProxy ReceiptObject, string PreExcuteResult)、string Excuted(VoucherProxy ReceiptObject, string PreExcuteResult)。注:
(1)三个方法的返回值为xml字符串,其格式为
“”,该返回值用来标示当前方法是否成功执行,记录在result属性里,errinfo属性用来记录任何可能的信息。Excuting方法的返回值可以作为Excute方法的第二个参数PreExcuteResult传入Excute,你可以在Excute方法体重分析传入的信息决定程序是否继续执行,或作出其他处理等,同样,Excute方法的返回值也可作为Excuted方法的参数传入,并作必要检查。另外,你可以在保证上面规定的xml结构的前提下,在节点内扩展该xml结构,以适应你的应用逻辑的需要。
(2)三个方法共有的参数就是当前表单功能按钮可以操作的表单模型。可以从该对象中取到当前可以操作的任何数据。
(四)联查报表
说明
联查报表是指在UAP表单中,通过表单功能或表单实体功能查询与表单或表单实体中的某些数据相关的U8报表。这种查询操作是针对特定的表单或表单实体,所以可以不必输入过滤条件,而是使用默认过滤条件,所以此处的联查报表有别于使用过滤条件的报表查询。
示例
联查报表示例----在UAP表单中打开U8报表
此处以销售订单中查看某个存货的现存量来描述。在销售订单的表单单据体中描述了一组(多行)存货数据信息。首先从当前表单实体模型中获得当前实体的主键值,进而获得当前主键值对应得存货信息,将存货信息封装到过滤条件中传入报表即可。(1)获得存货编码
BusineRow currentRow =someEntity.Rows[someEntity.CurrentPKValue];40 of
UAP开发指导文档
DataRow someRow = currentRow.RowData;string invCode = someRow[invcodeColumnName].ToString();(2)封装过滤条件 封装过滤条件涉及到一个过滤窗口是否显示的问题。如果过滤窗口显示,我们可以通过过滤窗口为过滤查询赋值;如果要求过滤窗口不显示,并且需要设置查询条件,此时只能是先通过代码封装查询过滤条件,然后再传入打开报表的方法。
//封装过滤条件
FilterSrv filter = new FilterSrvCla();bool hiddenFlag = true;object errInfo = new object();object temp2 =(object)filterColumnName;filter.OpenFilter((object)login, “SA[__]销售现存量查询”, “”, “”, ref errInfo, ref hiddenFlag);if(filter.FilterList.get_Item(ref temp2).IsSingleItem == true){ filter.FilterList.get_Item(ref temp2).varValue = filterValue1;} else { filter.FilterList.get_Item(ref temp2).varValue = filterValue1;filter.FilterList.get_Item(ref temp2).varValue2 = filterValue2;} //将过滤条件传入打开报表的方法
clsReportOpen clsReport = new clsReportOpenCla();bool hiddenFlag = true;object tmp =(object)filter;clsReport.OpenReport(reportName,(object)login, ref hiddenFlag,ref tmp);clsReport = null;注意项
(五)联查UAP列表
说明
联查UAP列表是指从UAP表单中打开UAP样式的U8表单列表。在现在的UAP中,打开UAP列表必须使用UAP列表的一些基础服务,在联查过程中,可以使用过滤设置设置列表查询的过滤条件,也可不使用过滤设置而使用默认的过滤条件。
示例
该部分示例与下一部分“UAP列表联查U8单据”一起展示
of
UAP开发指导文档
(六)UAP列表联查U8单据
说明
此处UAP列表是指UAP列表样式的U8表单列表,通过该列表联查U8单据必须与上面所讲的“联查UAP列表”结合使用。
从UAP表单中穿透到(打开)UAP列表样式的U8表单列表,并且从打开的UAP列表样式的U8表单列表中穿透到(打开)U8表单。
要获得U8表单列表需要实例化UFIDA.U8.UAP.UI.Runtime.List.UFGeneralListServiceUFIDA.U8.UAP.UI.Runtime.List.UFGeneralListService
类,而要实例化类,需要实例化
类,实例化UFIDA.U8.UAP.UI.Runtime.List.Metas.UFGeneralListMetaUFGeneralListMeta时一般需要的参数为数据源、过滤条件、栏目、用户自定义事件等。
数据源:
类:UFIDA.U8.UAP.UI.Runtime.List.Metas.DataAcceMeta 实例化该类时需要两个参数
new DataAcceMeta(“BizDAE”, erQuerySetting),第一个参数目前可支持两种类型分别为:“BizDAE”,“SqlQuery”;第二个参数为对应第一个参数的用xml描述的数据源详细信息。如果第一个参数为“BizDAE”,则xml结构为:
boid=“829345d6-79ce-48e5-9fa2-f78b5031d167” functionName=“QuerySA_QuoHeadData” type=“ER”/>;如果第一个参数为“SqlQuery”,则xml结构为: select部分 from部分 where部分 order部分 group部分 having部分 过滤条件:
类:UFIDA.U8.UAP.UI.Runtime.List.Metas.FilterMeta 实例化该类new FilterMeta(“SA[__]16”, filterSet)需要两个参数,第一个参数为本次查询需要的过滤条件编号ID,第二个为不显示过滤窗口时传入默认的过滤条件,其为xml结构的字符串,默认过滤条件的组织样式如下格式要求:
1、过滤列的名称必须在该处列表过滤条件所有可选的字段中。
2、操作符operator1为正常的Sql表到式中的where条件操作符。like等操作时需要自己添加必要的“%”等
3、区间条件时需要最终的格式为=“ val1=”区间条件时值“ operator2=”。当然也可以将一个区间条件项分为两个条件项 42 of
UAP开发指导文档
=“ val1=”区间条件时值“
operator2=” 栏目:
类:UFIDA.U8.UAP.UI.Runtime.List.Metas.ColumnMeta 实例化该类new ColumnMeta(“SaleVoucher”)需要一个参数,该参数为在UAP的栏目设计器中对应栏目的编号ID。用户自定义事件: 该参数为当表单开发人员对查询后的列表有自定义按钮事件或其他操作时使用,该参数为实现基类UFIDA.U8.UAP.UI.Runtime.List.UI.BaseUIEventHandler的子类的完整的命名路径。
至此使用上述几个参数可以实例化UFGeneralListMeta类的一个对象,然后再使用该对象实例化UFGeneralListService类的对象,就可以得到UAP列表。如果想从该列表中某一行数据穿透到该条数据对应的表单中,需要在实例化UFGeneralListMeta类的对象时做一个额外的工作。就是为UFGeneralListMeta类的对象的ExtendInfo属性赋值,该属性值为xml格式的字符串类型。其格式为:。
of
UAP开发指导文档
示例
UFGeneralListMeta listMeta = new UFGeneralListMeta();//组织数据源,此处使用数据引擎查询数据。UFGeneralListMetaUtil.SetBizDAEERQueryInfo(listMeta, “829345d6-79ce-48e5-9fa2-f78b5031d167”, “QuerySA_QuoHeadData”);#region 设置数据引擎过滤条件 Busine b = voucherObject.Businees[“SaleVouche_0001_E002”] as Busine;string curentRow = b.CurrentPKValue;BusineRows rows = b.Rows;//此处不再使用过滤,只能给其传输默认过滤条件。默认过滤条件的组织样式如下格式。//
1、过滤列的名称必须在该处列表过滤条件所有可选的字段中。//
2、操作符operator1为正常的Sql表到式中的where条件操作符。like等操作时需要自己添加必要的“%”等 //
3、区间条件时需要最终的格式为=“ val1=”区间条件时值“ operator2=” // 当然也可以将一个区间条件项分为两个条件项 // // // // =“ val1=”区间条件时值“ operator2=” // StringBuilder sb = new StringBuilder(“”);for(int i = 0;i “);break;} } sb.Append(”“);UFGeneralListMetaUtil.SetBizDAEFilterInfo(listMeta, ”SA[__]16“, sb.ToString());#endregion #region 设置列表的栏目信息 UFGeneralListMetaUtil.SetBizDAEColumnInfo(listMeta, ”SaleVoucher“);#endregion //设置列表的二次开发界面事件实现类 UFGeneralListMetaUtil.SetCustomeUIEventHandler(listMeta, ”ufida.u8.uap.plugin.SalesVoucher.SalesOrderList,ufida.u8.uap.plugin.SalesVoucher“);listMeta.DisplaySet = new DisplaySetMeta(true,200);//设置从列表中打开单据时需要的扩展信息 listMeta.ExtendInfo = this.GetExtendInfo(”SAM030101“, ”SA“, ”SA03000101“, ”销售报价单“, ”ID“, ”AutoID“, ”16“, ”16“,44 of
UAP开发指导文档
(七)用户自定义控件开发
说明
UAP表单开发支持在表单视图中添加用户自定义控件,并将该自定义控件与该表单中的某一个表单实体模型关联,根据用户的实际需求,对实体模型中数据做更加丰富的展示,或者通过对自定义控件上展示的数据的修改影响实体模型的数据。
ReceiptPluginBase类中的方法
/// /// 创建用户自定义控件接口,开发人员可以在这里创建用户自定义控件。运行时会把这个控件加载到布局视图中。(版本新增)
/// ///
所属业务对象 ///
所属表单对象 ///
布局视图中指定的自定义控件“控件ID” /// 用户自定义控件对象 Public virtual Control CreateControl(BusineProxy busineObject, VoucherProxy voucherObject, string ID);开发人员通过实现该方法返回自己定义的控件对象,UAP将控件对象加载到布局视图中。
示例
[IsImplementAttribute(true)] Public override System.Windows.Forms.Control
CreateControl(BusineProxy busineObject, VoucherProxy voucherObject, string ID){ Control resultControl = null;//此处的ID为UAP布局视图中自定义控件的属性“控件ID”
if(ID == ”09a86fa8-11d2-4e4c-8d1c-2cb2c0839fa3“){ SaleCountReportControl tempControl = new SaleCountReportControl();resultControl = tempControl;tempControl.Dock = DockStyle.Fill;} return resultControl;}
样例运行
样例项目中的“零售日报”表单为自定义控件表单例子,表体部分的数据被修改时自定义的图表信息会相应的做出修改。
of
UAP开发指导文档
(八)U8单据引用UAP档案
说明 示例
新建UAP档案
UAP档案分为“复杂档案”、“列表档案”、“树形编辑档案”、“树形导航档案”四种类型。“复杂档案”类型的档案设计方法与普通单据基本一致,唯一的区别就是设计“主表”实体时必须设计类型为“表单名称”的实体属性。其他三种类型档案新建方法分别如下:
1)新建列表档案:
选择档案类型及填写档案名称
of
UAP开发指导文档
列表档案类型的档案只有“主表”实体,不能再添加新实体。所以只需要为“主表”实体设计实体属性
表单编号类型(必须添加)
表单名称类型(必须添加)
of
UAP开发指导文档
根据需要可以再添加其他类型的实体属性。设计布局视图
可以再对该列表档案的“功能”、“栏目”、“过滤”等设计项或实体的属性等信息项做设定,设计完成之后可以发布该档案 2)新建树形编辑档案: 选择档案类型及填写档案名称
of
UAP开发指导文档
列表档案的实体设计同上述的列表档案,只有“主表”实体,“表单编号”和“表单名称”类型的实体属性必须设计。
布局视图的设计比较特别,需要在界面视图上添加“树形控件”
然后为“树形空间”绑定实体,在设计界面上的树形控件点击“右键”绑定实体“主表*********”。
of
UAP开发指导文档
然后在布局视图中添加“主表”实体控件。
可以再对该列表档案的“功能”、“栏目”、“过滤”等设计项或实体的属性等信息项做设定,设计完成之后可以发布该档案 3)新建树形导航档案: 选择档案类型及填写档案名称
of