【问题标题】:Copy some table records into the same table make some problems将一些表记录复制到同一张表中会产生一些问题
【发布时间】:2021-05-05 07:41:35
【问题描述】:
DEFINE BUFFER bfSource FOR tableA.
DEFINE BUFFER bfTarget FOR tableA.

DO FOR bfTarget TRANSACTION:
    FOR EACH bfSource  WHERE  bfSource.user_id = 0 NO-LOCK:
        CREATE bfTarget.
        BUFFER-COPY bfSource  EXCEPT id TO bfTarget.
        ASSIGN 
            bfTarget.user_id = 1.
    END.
END.

当我使用此查询时,最后一次迭代可能会随机产生一些问题。 AVM 尝试查找下一条记录,但它们没有,有时 AVM 会找到新创建的记录(在 user_id 为 0 之前)。我有一些想法来防止这种情况,可怕的发现,错误,但我不知道什么是最好的做法。我也尝试过更改事务范围的位置,但没有任何效果。

【问题讨论】:

  • 发布您遇到的错误有助于找出问题所在。一般来说,对于显示模式(字段和索引)的表(db 或 temp-)的问题也很有帮助。
  • 这只是一个例子,我没有收到任何错误,即使只有 id 字段并且没有缓冲区复制也可能会出现问题。在最后一次迭代中,我复制了先前创建的记录,因为 avm 在 id 0 之前找到它。

标签: openedge progress-4gl transactionscope 4gl


【解决方案1】:

目前我的解决方案是:

DEFINE BUFFER bfSource FOR tableA.
DEFINE BUFFER bfTarget FOR tableA.

REPEAT PRESELECT EACH bfSource WHERE bfSource.user_id = 0 NO-LOCK:
    FIND NEXT bfSource.
    DO FOR bfTarget TRANSACTION:
        CREATE bfTarget.
        BUFFER-COPY bfSource  EXCEPT id TO bfTarget.
        ASSIGN 
            bfTarget.user_id = 1.
    END.
END.

【讨论】:

  • 您可以让ASSIGN 成为BUFFER-COPY 语句的一部分(bfTarget 之后的. 使其成为单独的语句。
猜你喜欢
  • 2021-12-16
  • 2019-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-23
  • 1970-01-01
  • 2017-06-12
相关资源
最近更新 更多