执行缓冲区复制时,检查记录是否已存在

时间:2018-05-03 14:52:49

标签: openedge progress-4gl progress-db

我有一段代码执行Buffer-Copy方法,但是在执行记录的缓冲区副本之前是否有任何方法可以检查? 我不想在我的数据字典中查看“唯一键”。

这是我现在的代码:

    CREATE QUERY hQuery.
    hQuery:SET-BUFFERS(hBuffer).
    hQuery:QUERY-PREPARE("FOR EACH " + hBuffer:NAME + " NO-LOCK ").  
    hQuery:QUERY-OPEN().


    hQuery:GET-FIRST().
    DO WHILE NOT hQuery:QUERY-OFF-END:
        DO TRANSACTION ON ERROR UNDO:

            hDBBuffer:BUFFER-CREATE().
            hDBBuffer:BUFFER-COPY(hBuffer) NO-ERROR.   

2 个答案:

答案 0 :(得分:2)

目前还不清楚你想要完成什么,以及为什么你不想在我的数据字典中检查唯一键""甚至你的意思。

你的示例代码非常粗略和不完整,也许其他人可以弄清楚你想要做什么以及为什么,但我不知道它背后的目的。句柄和动态查询的使用尤其令人费解。似乎没有理由这样或任何需要这样做。

尽管如此,如果我编写一个例程来复制一个缓冲区,就不能在字典中查找唯一索引,并且想要主动避免潜在的冲突,我可能会这样写:

define temp-table oLine like orderLine.

for each orderline no-lock:
  find oLine of orderLine no-error.
  if not available( oLine ) then create oLine.
  buffer-copy orderLine to oline.
end.

(使用静态编码使示例保持简单。)

(我不会真正使用 OF - 这是我个人的禁止列表,我认为从文档和维护的角度来看这很糟糕。)

答案 1 :(得分:1)

我相信,正如Tom在他的回复中提到的那样,使用来自hBuffer的BUFFER-FIELD和BUFFER-VALUE进行另一个针对hDBBuffer的动态查询是最合适的,并在使用QUERY后检查NUM-RESULTS -打开。然后删除查询以用于内存目的。 但是,是的,您将寻找元数据唯一键来实现这一目标。我知道你不想这样做,但它确实是最好的方式,不能给它足够的压力。

现在,如果您真的想检查是否存在所有记录数据,请查看BUFFER-COMPARE方法。您可以创建第二个动态查询,然后使用buffer-compare循环所有记录,以将您正在查看的整个记录​​与您正在评估是创建的记录匹配,或列出您希望包含或排除的记录。但是,这种方法的性能较差,请记住这一点。