ABL Progress OpenEdge:使用分隔符更新 csv 文件中的记录

问题描述 投票:0回答:1

我正在努力完成能够刷新数据库环境的第一步。

首先,我将环境 1 中的表导出到名为 Test1 的 csv 文件。

OUTPUT TO VALUE("X:\Test\Test1.csv").

FOR EACH Test1 NO-LOCK:
    EXPORT DELIMITER ',' Test1.      
END.

OUTPUT CLOSE

然后我将此文件导入到环境 2,其中不知道 test1 中的所有记录是否都存在于环境 2 中。也不知道顺序是否相同(这是以下功能受限的地方)



INPUT FROM "X:\Test\Test1.csv".

FOR EACH Test12:
    IMPORT DELIMITER ',' Test1.
END.

因此,我需要能够查看环境 2 中的现有记录是否存在于从环境 1 导出的文件 Test1 中,并通过调整环境 2 中的这些记录来应用更改/更新。

不幸的是,我无法更具体地提供姓名和日期,因为这是机密

我尝试使用显示的脚本在 notepadd++ 中编辑导出文件 Test1,删除一条仍然运行良好的记录。然而,当我还通过删除记录删除了留下的空白规则时,所有内容都向上移动了一行,它提到entryID(第一列)已经存在。这意味着它存在于文件的另一行中(这是我删除记录之前的下面的行。)。

development-environment production-environment openedge progress-4gl
1个回答
0
投票

我认为你的根本问题是你不应该在导入块中使用 FOR EACH 。

您可能想要做的是使用 REPEAT 块来导入数据。

类似:

REPEAT:
  CREATE tableName.
  IMPORT DELIMITER "," tableName.
END.

可能进入临时表记录,并将导入的记录与现有表进行比较,如果存在差异则决定是否更新现有记录。

DEFINE TEMP-TABLE tt_tableName LIKE tableName.
CREATE tt_tableName.

REPEAT:
  IMPORT DELIMITER "," tt_tableName.
  FIND tableName EXCLUSIVE-LOCK WHERE tableName.id = tt_tableName.id NO-ERROR.  /* The "id" field is just something that I made up - use whatever the real table has for a UNIQUE key in the WHERE clause */
  IF AVAILABLE( tableName ) THEN
    DO:
      /* do whatever is appropriate to merge the data */
    END.
END.

注意:此方法不会检测“test”中缺少的记录以及应从“test12”中删除的记录,除非您的“适当的”合并逻辑可能在字段中使用“魔术”值来指示应删除记录.

如果您只是将现有的“test12”数据替换为“test”,那么您应该首先删除“test12”数据。对于小桌子,你可以合理地做到这一点:

FOR EACH tableName exclusive-lock:
  DELETE tableName.
END.

对于大桌子来说可能会变得非常痛苦。对于那些您最好将大表放入专用存储区域并使用“proutil -C truncate area”。

(上面的代码都是伪代码,没有经过测试,只是概述一下大概的做法。)

© www.soinside.com 2019 - 2024. All rights reserved.