U811.1 客开培训资料之UAP
注意项
3) UAP已有功能的替代开发 说明
UAP系统中已经实现了一些公共功能,但这些功能并不一定适用于每种不同表单的具体情况,所以有些时候我们可能需要对UAP的已经实现的功能进行替代开发。替代开发分为两种:在实现业务基础上直接操作数据库、调用U8已经实现的该表单审核功能的API方法。
直接操作数据库:直接操作数据库的开发方法与下面的“新增功能开发”的开发方法大体一致,此处不再细述。 调用业务API:调用业务API方法避免了开发人员必须去了解当前功能的具体业务,降低了开发的复杂程度,有利于快速而准确的开发。但是在使用业务API之前,必须首先掌握在.Net中调用U8中API的方法,其次需要知道有那些API可以使用,各个API方法的参数和返回值代表的意义,以及根据API的参数和返回值确定你的表单开发过程的业务流程等。
Net中如何调用U8中的API
参照U8API资源管理器中为每个已有的API生成的调用代码示例
示例
Business b = ReceiptObject.Businesses[\] as Business; if (b.Cells[\].Value == \) return null;
DataSet ds = b.Rows[0].RowData.Table.DataSet; MSXML2.DOMDocument dom =
BusinessInterfaceUtil.ConvertDataSetToDOM(ds, b.TableName);
U8EnvContext envContext = new U8EnvContext(); envContext.U8Login = ReceiptObject.VBLoginObject;
envContext.SetApiContext(\, 12);
U8ApiAddress myApiAddress = new U8ApiAddress(\);
U8ApiBroker broker = new U8ApiBroker(myApiAddress, envContext); broker.AssignNormalValue(\, dom);
if (this.auditType == AuditType.Audit) {
//审核处理
broker.AssignNormalValue(\, true); }
else if (this.auditType == AuditType.AbandonAudit) {
U811.1 客开培训资料之UAP
//弃审处理
broker.AssignNormalValue(\, false); }
if (!broker.Invoke()) {
//错误处理
Exception apiEx = broker.GetException(); if (apiEx != null) {
if (apiEx is MomSysException) {
MomSysException sysEx = apiEx as MomSysException; Console.WriteLine(\系统异常:\ + sysEx.Message); MessageBox.Show(sysEx.Message); }
else if (apiEx is MomBizException) {
MomBizException bizEx = apiEx as MomBizException; Console.WriteLine(\异常:\ + bizEx.Message); MessageBox.Show(bizEx.Message); }
result = false; }
//结束本次调用,释放API资源 broker.Release(); }
注意项
2、
说明
表单实体功能开发(表单实体工具栏按钮功能开发)
表单实体的功能开发主要是针对表单中的某个实体的数据相应的功能操作。 ReceiptPluginBase接口中的方法
///
/// 观察者视图工具条按钮单击事件的接口
///
/// /// ///
Public virtual void ClickToolBarButton(ToolBarActionEventArgs para, BusinessProxy businessObject, VoucherProxy voucherObject); 这个方法是表
单实体功能按钮执行的入口,方法的参数para代表触发当前方法的工具栏上的一个按钮,
U811.1 客开培训资料之UAP
businessObject代表当前表单实体的模型对象,voucherObject代表当前表单的模型对
象。根据UAP中实体功能设计里不同的ButtonKey来区别不同的功能按钮。从UAP给出的接口的参数中可以看出,对当前表单实体的功能操作,不仅能访问当前的表单实体模型对象,还能访问当前的表单模型对象。在表单开发过程中可以访问两个模型对象中的数据。
示例
[IsImplementAttribute(true)]
Public override void ClickToolBarButton(ToolBarActionEventArgs para, BusinessProxy businessObject, VoucherProxy voucherObject) {
switch (para.Key) {
//复制选中行
case \:
CopyCurrentLineToNewLine(businessObject, voucherObject); break;
//查看存货量
case \:
ViewCount(businessObject, voucherObject); break;
//查看当前订单对应报价单
case \:
ViewBaoJiaDan(businessObject, voucherObject); break;
//订单追溯汇总查询
case \:
VoucherZhuiSuHuiZongChaXun(businessObject, voucherObject); break; default: break; } }
这个方法是表单实体功能按钮执行的入口,IsImplementAttribute属性需要手工添加到方法上
面。方法的参数para代表触发当前方法的工具栏上的一个按钮,businessObject代表当前表单实体的模型对象,voucherObject代表当前表单的模型对象。根据UAP中实体功能设计里不同的ButtonKey来区别不同的功能按钮。
注意项
(二) 列表开发
说明
列表开发访问列表模型对象的接口为UFIDA.U8.UAP.UI.Runtime.
U811.1 客开培训资料之UAP
List.UI.BaseUIEventHandler,该接口是一个已经包括部分功能代码的.Net类。该类
被定义在UFIDA.U8.UAP.UI.Runtime.List.dll中,所以在列表开发前,你需要为新建的表单开发项目添加UFIDA.U8.UAP.UI.Runtime.List.dll的引用。你需要做的就是重写该类中的一个方法:
///
/// ///
public override void ProcessEvent(
UFIDA.U8.UAP.UI.Runtime.List.UIEventTypeEnum eventType, object sender, object args) { }
列表的分成开发时,就是通过上面方法的参数sender来区分在各个不同的功能,然后开发着需要针对各个不同的功能实现其具体的业务逻辑,并将业务逻辑执行后对表单相关数据的修改持久化。
U872在列表二次开发时新增接口如下,这些接口主要作用是为生单开发而添加。每个方法都有自己的注释(该方法何时被调用,作用是什么)
///
/// 过滤窗口弹出时的处理,可以动态设置缺省过滤条件 ///
/// ///
public virtual void ReceiptListFiltering(UFGeneralListService listService, FilterSrvClass filterSrv) { }
///
/// 根据条件过滤源单据列表数据,可以重写缺省的过滤算法 ///
///
public virtual void ReceiptListFilter(FilterPluginArgs filterArgs) {
if (filterArgs != null) {
filterArgs.CurrentPageData = null; filterArgs.RowCountData = null; } }
///
/// 过滤操作执行后的事件
U811.1 客开培训资料之UAP ///
///
///
///
public virtual void ReceiptListFiltered(UFGeneralListService listService, DataSet dataSet, DataSet dataRowCountDataSet) { }
///
/// 源单据列表过滤结果填充之前的处理 ///
///
///
public virtual void ReceiptListFilling(UFGeneralListService listService, DataSet dataSet) { }
///
/// 源单据列表过滤结果填充之后的处理 ///
///
///
public virtual void ReceiptListFilled(UFGeneralListService listService, DataSet dataSet) { }
///
/// 源单据被选择事件,可以重写缺省的选择算法 ///
/// /// ///
public virtual void ReceiptChecking(UFGeneralListService listService, object sender, CellEventArgs e) { }