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

Check if record already exists when doing a buffer-copy

我有一段代码执行Buffer-Copy方法,但是有什么方法可以在执行记录的缓冲区复制之前检查是否已经存在? 我不想在我的数据字典中检查 'unique keys'。

这是我此时的代码:

    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.   

不清楚您要完成什么以及您为什么不想检查唯一键 "in my data dictionary" 甚至您的意思。

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

None 更少,如果我正在编写一个复制缓冲区的例程,无法在字典中查找唯一索引,并且想主动避免潜在的冲突我可能会写这样的东西:

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 - 它在我个人的禁止列表中,我认为从文档和维护的角度来看它很糟糕。)

我相信,正如 Tom 在他的回复中提到的那样,使用 hBuffer 中的 BUFFER-FIELD 和 BUFFER-VALUE 对 hDBBuffer 进行另一个动态查询并在您之后检查 NUM-RESULTS 是最合适的使用查询打开。然后出于内存目的删除查询。 但是,是的,您会寻找元数据唯一键来实现这一点。我知道你不想这样做,但这确实是最好的方法,怎么强调都不为过。

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