谷允金_如何根据档案编码查询档案最新版本ID
NC供应链文档
如何根据档案编码查询档案最新版本ID
谷允金 2012-05-29 关键词:档案,编码
1. 使用场景
一般情况下,在单据中输入或选择档案编码,会自动加载出档案相关属性。但是,如果编码是从外部导入的,需要根据档案的最新版本id(多版本的档案存在版本id,以下简称vid)加载相关属性。这时,我们就需要根据档案的编码查询出该编码对应的vid。本文就是讲述如何根据档案的编码查询档案对应的id。 2. 根据档案编码查询id
档案可以分为基础档案和自定义档案。区别就是前者是已经定义好的,后者具有不确定性。我们分别对两种情况进行分析。
2.1. 基础档案的查询思路
如何根据档案编码查询档案id呢,
uap中IAccessorQueryService类里有这样一个方法:
public Map loadBDDataByFieldValues(IBean bean, String pk_org, String pk_group, String attrName, Object[] attrValues) throws BusinessException;
根据档案的元数据,组织,集团,指定字段(编码对应的字段),编码值数组,就可以查到对应档案的数据,返回值是一个Map类型,key是档案的主键,value是档案数据。
首先需要注意一下,如果档案是多版本的,这里只支持最新版本的档案查询。因为多版本档案在数据库同一个档案会对应多个vid。所以,元数据要用最新版本的,而不是多版本的。
以物料为例,讲一下如何根据物料编码获取物料vid。组织、集团的值如何获取就不讲了,元数据可以根据物料的元数据ID来获取。IBDMetaDataIDConst中定义了物料基本信息元数据的ID,如下:
public static final String MATERIAL = "eae040f4-3c88-413d-abc9-b15774463d46";
然后可以根据ID获取元数据:
第 1 页 共 3 页
NC供应链文档
IBean bean = MDBaseQueryFacade.getInstance().getBeanByID(beanId);
物料编码在数据库中对应的列名为“code”,即:attrName=“code”。根据相应的编码,用上面讲的loadBDDataByFieldValues方法,就可以查到对应物料的相关数据,然后用getPK()方法就可以获取id了。需要注意的是,物料最新版本对应的数据库中的表的主键是oid,所以getPK()方法获取的是oid,还需要根据oid查询最新vid。
2.2. 自定义档案的查询思路
上面讲的是基础档案的获取方式,还有一种档案类型,是不确定的,如档案类型的自由辅助属性。也就是说不一定是哪种档案,有可能是客户,也有可能是项目,还有可能是其他档案类型。那么如何获取元数据和编码对应的字段呢, 这就要用到当前的BillItem:
BillItem item = this.util.getBodyItem(key);
String beanId = item.getMetaDataProperty().getRefBusinessEntity().getID();
获取到元数据ID之后,就可以根据上面讲过的内容,获取元数据。
还有一个难点,就是在档案编码对应的字段不确定的情况下,如何根据档案编码获取对应的vid,即便是直接查数据库,也要知道档案编码对应数据库的列名才能查询。
好在我们档案类型元数据实现了IDBObject接口,可以利用元数据的业务接口的映射关系来获取:
Map name_attr_map =
((IBusinessEntity) bean).getBizInterfaceMapInfo(IBDObject.class
.getName());
String codeAttrName = name_attr_map.get("code");
codeAttrName就是我们要获取的编码对应的字段。有了codeAttrName,再获取档案的vid,方法跟上面的一样,就不再重复了。
2.3. 实际使用的查询方法
上面介绍的是查询的思路,其实,实际使用的时候要简单的多。因为UAP帮我们提供了接口IGeneralAccessor,里面有个方法:
public IBDData[] getDocByCodes(String pk_org, String[] docCodes);
其中,pk_org是组织id,docCodes是编码数组。我们只要获取对应的访问器,把这两个参数传进去,就OK了。
以供应链为例,在SCMPUB项目中的
第 2 页 共 3 页
NC供应链文档
nc.itf.scmpub.reference.uap.bd.accesor包里有很多已经写好的访问器,比如MaterialAccessor是物料的访问器,ProjectAccessor是项目访问器。考虑到有自定义档案类型的存在,我又封装了一个档案类型通用访问器BdAccessor。需要多传一个参数beanId,即该档案的元数据Id:
public static Map getDocMapByCodes(String[] docCodes,
String beanId, String pk_org) {
IBDData[] bddata =
BdAccessor.getAccessor(beanId).getDocByCodes(pk_org,
docCodes);
Map map = new HashMap();
if (bddata != null) {
for (IBDData data : bddata) {
if (data != null) {
map.put(data.getCode(), data);
}
}
}
return map;
} 3. 总结
其实,基础档案的查询属于自定义档案查询一种,所以都可以用通用档案的查询方法来查。对于档案类型,只要是元数据实现了IDBObject接口,就可以用上面的方法通过档案编码查询到档案的id。只不过在查询多版本的档案时,注意元数据id的选取。
第 3 页 共 3 页