单据体新增导入、更新导入和新增并更新导入功能介绍
1. 业务场景
在录入HR人员信息、物料等数据的场景中,这些数据大部分是单据体的数据,并不需要同时导入单头的数据,因此需要单独导入单据体数据的功能。
2. 适用版本
单据体新增导入:金蝶云苍穹 V5.0.011及以上版本。
单据体更新导入、更新并新增导入:金蝶云苍穹 V7.0.01及以上版本。
3. 操作流程
3.1. 新增数据
1) 配置单据体导入操作
在单据工具栏中配置“单据体导入”操作按钮。
2) 配置单据体导入模板
模板可以通过两个入口进行配置:
V6.0.0.0前:
a.【配置工具】->【导入导出模板】->【单据体导入模板】
V6.0.0.0后
a.【公共设置】->【导入导出模板】->【单据体导入模板】
b.【单据页面】->【单据体导入按钮】->【单据体导入起始页】->【模板下载】->【下载单据体导入模板】
上述两个入口均可进入单据体导入模板的编辑界面。
模板编辑界面中,可以在“单据体选择”多选下拉列表中,选择需要生成模板的单据体。配置好需要导入的字段,其中基础资料字段需要配置导入属性(可选编码/名称)。
3) 录入数据
下载的模板中,单据体展示在Excel的工作表中,单据体与工作表一一对应,工作表名称为单据体名称。如下图所示:
4) 导入数据
上传导入文件,文件校验通过后(校验不通过时,文件无法上传成功),点击“导入数据”。导入完成后,可查看每个单据体的导入结果,如下图所示:
导入结果:
导入结果界面按单据体分别展示导入成功数据及失败数据。
如全部数据导入成功,下方显示【关闭】按钮;
如存在错误数据,下方显示【导出错误数据】超链接(如在上传文件界面,勾选"是否导出所有错误数据",则展示导出全量错误数据),错误信息统一录在Excel工作表的第一列,如果单据体不存在错误信息,则对应的工作表不会输出至错误文件。
点击【继续导入】,重新进入单据体导入界面。
按照错误提示修改数据后,可使用错误文件再次导入。
3.2. 更新数据
1) 在单据体导入模板中,将需要更新单据体的“匹配id”的“是否导入”属性打开,按单据体导入模板导出数据(该功能介绍详见:),对需要更新的数据进行修改。例如原已订货数量为3,需要将数据更新为5。
2) 再点击“单据体导入”操作,打开单据体导入界面,选择“导入方式为更新数据”,默认根据单据体的“匹配id”更新数据,上传更新后的文件,然后点击“导入数据”。
3) 默认根据匹配id更新数据,导入成功后即可看到字段值更新,例如下方的“已订货数量”更新为5。
3.3. 更新已有数据并添加新的数据
1) 在单据体导入模板中,将需要更新单据体的“匹配id”的“是否导入”属性打开,按单据体导入模板导出数据(该功能介绍详见:),对需要更新的数据进行修改。例如原已订货数量为3,需要将数据更新为5,并新增一条数据。
2) 再点击“单据体导入”操作,打开单据体导入界面,选择“导入方式为更新数据”,默认根据单据体的“匹配id”更新数据,上传更新后的文件,然后点击“导入数据”。
3) 默认根据匹配id更新数据,匹配上的就更新,没匹配上的就新增,导入成功后即可看到更新和新增的数据,例如下方的“已订货数量”更新为5,并增加一条数据。
4 插件干预
单据体引入支持两种方式进行插件干预:
模板下载:
在模板编辑界面中,通过“插件”编辑框,注册插件。该插件用于下载模板时,将模板中“基础资料”类型的列,设置单元格格式为下拉选项,并给下拉项赋值。
例:将标识为“basedatafield1”的字段,下拉值列表设置为"0002", "0003", "0004","0005","0006","0007"
import java.util.Arrays; public class TestImportEntryBaseDataPlugin implements ImportEntryTemplateListener{ //将标识为“basedatafield1”的字段 //下拉值列表设置为"0002", "0003", "0004","0005","0006","0007" @Override public void beforeSetBaseData(BeforeDownloadImportEntryTemplateEvent evt) { evt.getBaseDataDropDownValues().put("basedatafield1", Arrays.asList("客户","0002","0003","0004","0005","0006","0007")); } }
效果如下:
修改数据:
编写表单插件,继承表单插件基类AbstractFormPlugin,实现beforeImportEntry方法,在设计器界面注册表单插件。
例:校验单据体数据,并填入自定义错误信息,移除错误数据不予引入。
public class TestBeforeImportEntryPlugin extends AbstractFormPlugin { @Override public void beforeImportEntry(BeforeImportEntryEventArgs e) { //key为单据体标识 Set<Map.Entry<String, List<ImportEntryData>>> entries = source.entrySet(); for (Map.Entry<String, List<ImportEntryData>> entry : entries) { entryName = entry.getKey(); List<ImportEntryData> entryEntityImportDataList = entry.getValue(); if (CollectionUtils.isEmpty(entryEntityImportDataList) ) { return; } // 校验并返回Map<行号, 业务自定义错误信息> // validateEntry为自定义的校验方法 Map<Integer, String> indexVsMsgMap = validateEntry(entryEntityImportDataList); //校验并记录错误 Set<Integer> indexSet = indexVsMsgMap.keySet(); Map<String, List<Object>> logMap = event.getEntryDataMap(); ImportLogger importLogger = (ImportLogger)logMap.get(entryName).get(0); Set<Map.Entry<Integer, String>> indexVsMsgEntries = indexVsMsgMap.entrySet(); //干预导入结果里成功、失败条数 for (Map.Entry<Integer, String> indexVsMsgEntry : indexVsMsgEntries) { // 封装错误信息 Integer index = indexVsMsgEntry.getKey(); importLogger.log(index, indexVsMsgEntry.getValue()); importLogger.fail(); importLogger.setTotal(importLogger.getTotal() + 1); } //干预导出错误结果,移除后excel无该条数据 Iterator<ImportEntryData> iterator = entryEntityImportDataList.iterator(); while (iterator.hasNext()) { ImportEntryData entryData = iterator.next(); Integer rowNum = (Integer)entryData.getData().get("rowNum"); if (indexSet.contains(rowNum)) { iterator.remove(); } } } }
当基础资料查不到或者查到多个结果时,设置正确的id:
@Override public void queryImportBasedata(QueryImportBasedataEventArgs e) { Map<BasedataItem, List<Object>> searchResult = e.getSearchResult(); for (Entry<BasedataItem, List<Object>> entry : searchResult.entrySet()) { List<Object> basedata = entry.getValue(); if (basedata.isEmpty()) { // 查不到基础资料数据 basedata.add(业务自己查一个id放着); } else { // 查到多个基础资料数据 // 业务场景,应根据需求剔除不合法的基础资料数据(最终保留一个) Iterator it = basedata.iterator(); it.next(); while (it.hasNext()) { it.remove(); } } } }
单据体新增导入、更新导入和新增并更新导入功能介绍
本文2024-09-23 00:35:57发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-140498.html