ABL Progress OpenEdge:基于CSV更新数据库环境记录的技术问题
环境刷新:CSV导入匹配更新与空行问题解决
核心需求实现:环境2记录匹配更新
当前导入脚本未基于主键做匹配,无法实现“存在则更新”的逻辑,需通过临时表中转CSV数据,再与环境2的Test1表按主键(entryID)匹配处理。
1. 定义临时表存储CSV数据
创建与Test1结构一致的临时表,并按主键entryID建立唯一索引,避免重复数据:
DEFINE TEMP-TABLE ttTest1 LIKE Test1 INDEX idxEntryID IS PRIMARY UNIQUE entryID.
2. 读取CSV并过滤空行
读取CSV时跳过空行,避免空行导致的entryID异常:
INPUT FROM VALUE("X:\Test\Test1.csv"). REPEAT: CREATE ttTest1. IMPORT DELIMITER ',' ttTest1. // 检测空行(entryID为空),直接丢弃该记录 IF ttTest1.entryID = ? THEN DO: DELETE ttTest1. NEXT. END. END. INPUT CLOSE.
3. 匹配环境2记录执行更新
遍历环境2的Test1表,根据entryID查找临时表中的对应数据,存在则更新:
FOR EACH Test1 EXCLUSIVE-LOCK: FIND FIRST ttTest1 WHERE ttTest1.entryID = Test1.entryID NO-LOCK NO-ERROR. IF AVAILABLE ttTest1 THEN DO: // 全字段更新,若需指定字段可逐个赋值 ASSIGN Test1 = ttTest1. END. // 可选:若需插入CSV中存在但环境2没有的记录,取消以下注释 // ELSE DO: // CREATE Test1. // Test1 = ttTest1. // END. END. MESSAGE "数据更新完成" VIEW-AS ALERT-BOX INFORMATION.
空行问题根源与解决
删除记录后留下的空行,会导致IMPORT读取时错位,把后续行的entryID重复读取,触发主键重复报错。上述代码通过检测entryID = ?判断空行,直接丢弃异常记录,从根源避免该问题。
另外,导出CSV时可确保无空行(当前导出代码已满足,无需额外修改)。
内容的提问来源于stack exchange,提问作者Amber p
相关产品推荐
相关产品推荐

