如何在Xmlport导入CSV时跳过空值字段避免覆盖数据?
解决Xmlport导入CSV时跳过空值字段不覆盖原有记录的问题
这个需求在Dynamics NAV/BC的Xmlport导入场景里非常常见,默认情况下Xmlport会把CSV里的空值直接写入目标表,覆盖原有数据,咱们可以通过在数据源的触发事件里添加条件判断来解决这个问题,具体步骤如下:
实现思路
在Xmlport处理目标表的OnBeforeModifyRecord触发器(因为你是更新已有记录,主键匹配)中,对每个可能为空的字段做判断:只有当CSV导入的字段值非空时,才将其赋值给表的对应字段,否则保留表中原来的数值。
具体操作步骤
- 打开你的Xmlport设计界面,找到对应的数据表数据源(就是你要更新的那张表)。
- 双击该数据源,打开其触发器列表,找到
OnBeforeModifyRecord触发器并打开编辑界面。 - 在触发器中添加针对每个字段的判断逻辑,示例代码如下(结合你的CSV结构):
trigger OnBeforeModifyRecord(): Boolean begin // 处理StartDate:仅当CSV中的StartDate不为空时更新表字段 if Xmlport."StartDate" <> 0D then Rec."StartDate" := Xmlport."StartDate"; // 处理EndDate:仅当CSV中的EndDate不为空时更新表字段 if Xmlport."EndDate" <> 0D then Rec."EndDate" := Xmlport."EndDate"; // 如果FCode也可能出现空值需要跳过,可添加如下逻辑 // if Xmlport."FCode" <> '' then // Rec."FCode" := Xmlport."FCode"; exit(true); // 返回true允许修改记录 end;
代码说明
Xmlport."字段名":代表从CSV中读取到的当前行字段值Rec."字段名":代表目标表中已存在的记录字段值- 日期型字段的空值判断用
<> 0D(0D是NAV/BC中的空日期),文本型字段用<> ''(空字符串)
额外注意事项
- 如果你的Xmlport是插入新记录(而非更新),则需要在
OnBeforeInsertRecord触发器中做类似判断,避免空值写入新记录的字段(如果需要保留默认值的话)。 - 确保字段的
Validate属性如果开启,不会因为空值触发错误——不过咱们的逻辑里已经跳过了空值赋值,所以不会有问题。
这样设置后,导入CSV时就只会更新那些有实际值的字段,空值字段会完全保留表中原有的数据啦!
内容的提问来源于stack exchange,提问作者Nguyễn Hữu Bảo Kiến
相关产品推荐
相关产品推荐

