单据联查实现步骤:

1.元数据设置

元数据主实体实现IFlowBizItf业务接口,此接口针对联查扩展了两个字段:来源单据类型和来源单据id,将这两个属性对应到元数据的子实体对应字段上

2.单据类型注册

可能是由于老脚本的原因,还有很多的单据类型配置中的“来源数据查询类”使用了5系列提供的供应链查询类,在V6.1中都需要删除,保持为空的状态,使用默认的查询类

3.按钮配置

在界面上添加联查按钮Action:nc.ui.pubapp.uif2app.actions.LinkQueryAction,需要设置model和单据类型,配置如下:

<bean id="actiont18" class="nc.ui.pubapp.uif2app.actions.LinkQueryAction">
<property name="model" ref="ManageAppModel"/>
<property name="billType" value="30"/>
<!--openMode为1是表示为单据追溯,打开的单据有提交、审批之类的按钮-->
<property name="openMode" value="1"/>
</bean>

关于openMode的问题,若不设置,则默认为单据联查,联查打开的单据没有提交、审批之类的按钮。

可以在界面配置文件中联查按钮中配置openMode为1,表示该按钮为单据追溯,打开的单据有审批按钮。

也可以在按钮的类中赋值 this.setOpenMode(1);

4.打开界面监听

为了从联查界面能直接打开单据,需要被打开单据配置打开节点监听器,典型的配置如下所示,

<!-- 打开节点监听 -->
<bean id="InitDataListener"
class="nc.ui.pubapp.uif2app.model.DefaultFuncNodeInitDataListener">
<property name="model" ref="ManageAppModel"/>
<!-- VO的类名 -->
<property name="voClassName" value="nc.vo.so.m32.entity.SaleInvoiceVO"/>
<!-- 打开节点节点后要显示的界面 -->
<property name="autoShowUpComponent" ref="billFormEditor"/>
</bean>

5.多来源单据处理

系统提供了一个多来源单据的查找器,nc.impl.pubapp.linkquery.MutiSrcTypeDataFinder,这个类需要传入返回多个记录上下游关键字段信息IBillFlow的工厂IMutiBillFlowFactory,通过此工厂返回的多组信息进行多次查找,业务组可根据各自的记录多源头单据的情况实现工厂并创建自己的BillFlow。

目前系统默认提供了两种IMutiBillFlowFactory的实现:

  • nc.impl.pubapp.linkquery.SingleTagSuportBillFlowFactory 此工厂创建的IBillFlow是基于单属性的上游单据记录方式,适用于采用一个字段记录固定类型的上游单据id的情况,使用时只需要在对应id字段的元数据标签上配置如下标签:SRCTYPE:单据类型,某个字段是来源于销售订单,则标签配置为:SRCTYPE:30
  • nc.impl.pubapp.linkquery.SrcGroupTagSuportBillFlowFactory 此工厂创建的IBillFlow是基于成对字段的上游单据记录方式,适用于对于每张上游单据都是用两个字段来记录的情况,一个字段记录上游的单据类型,一个字段记录上游的单据id,使用时对于每一组的来源单据type和id,在元数据标签上分别配上“SRCGROUP_TYPE:X”和“SRCGROUP_ID:X”, 其中X可以自己任意指定,只要保证对于每一组一致即可; 比如:单据有两组上游单据字段,分别是srctype1、srctypeid1和srctype1、srctypeid2, 那么在元数据标签上可以这样配置:
字段名 A srctypeid1 srctype2 SRCGROUP_TYPE:B srctypeid2 SRCGROUP_ID:B 标签
srctype1 SRCGROUP_TYPE:A
srctype1 SRCGROUP_ID:A
srctype2 SRCGROUP_TYPE:B
srctype2 SRCGROUP_ID:B

注册方法.

业务组实现自己的MutiSrcTypeDataFinder类,传入的工厂根据自己的情况进行选择,可能的代码如下:

public class TagMutiSrcTypeDataFinder extends MutiSrcTypeDataFinder {  public TagMutiSrcTypeDataFinder() {   super();   // 声明一个组合工厂   CompositeBillFlowFactory factory = new CompositeBillFlowFactory();   // 默认的支持元数据接口的工厂   factory.addFactory(new SingleTagSuportBillFlowFactory());   // 单字段的工厂   factory.addFactory(new SrcGroupTagSuportBillFlowFactory());   // 设置工厂类   this.setBillFlowFactory(factory);  } }

实现完上面的代码后,在单据类型的“来源数据查询类”中配置上此类即可。

单据联查自由报表的方法

ReportDrillItem[] drillItems = new ReportDrillItem[1];
drillItems[0] = new ReportDrillItem();
drillItems[0].setConditionType(ReportDrillItem.TYPE_FRQUERYITEM);
//注意!!!!此处需要严格按照元数据选择字段里面的字段名称,区分大小写!!!
// drillItems[0].setConditionName("vbillcode");
drillItems[0].setConditionName("PK_CHECKSTANDARD"); //ctrl+shift+x
drillItems[0].setValue(pk_checkstand);
ReportDrillInfo drillRule = new ReportDrillInfo();
drillRule.setDrillItem(drillItems);
FreeReportDrillParam drillParam = new FreeReportDrillParam();
drillParam.setDrillRule(drillRule);
FuncletInitData initData = new FuncletInitData();
initData.setInitData(drillParam);
FreeReportFuncletUtil.openReportNode("50090189", initData);