如果发现重复则跳过分配

时间:2019-07-24 11:24:42

标签: openedge progress-4gl

我有一个分配值并将其发送回的过程。我需要实施一项更改,以便在找到重复的iban代码时将跳过分配过程。就是在这个FOR EACH中。某种IF或其他事物。基本上,当它找到已经使用并分配的iban代码时,就不会第二次或第三次分配它。我是OpenEdge Progress的新手,所以我现在真的很难正确理解语法并自己编写代码。因此,如果有人可以解释我应该如何实现这一目标,请给出任何建议或技巧,我将非常感激。

FOR EACH viewpoint WHERE viewpoint.cif = cif.cif AND NOT viewpoint.close NO-LOCK:
    DEFINE VARIABLE cIban AS CHARACTER NO-UNDO.

    FIND FIRST paaa WHERE paaa.cif EQ cif.cif AND paaa.paaa = viewpoint.aaa AND NOT paaa.close NO-LOCK NO-ERROR.

    cIban = viewpoint.aaa.

    IF AVAILABLE paaa THEN DO:
        cIban = paaa.vaaa.

    CREATE tt_account_rights.
    ASSIGN
        tt_account_rights.iban = cIban.
END.

1 个答案:

答案 0 :(得分:3)

您尚未显示tt_account_rights的定义,但假设“ iban”是tt_account_rights中唯一索引的字段,则可能需要以下内容:

DEFINE VARIABLE cIban AS CHARACTER NO-UNDO.

FOR EACH viewpoint WHERE viewpoint.cif = cif.cif AND NOT viewpoint.close NO-LOCK:

    FIND FIRST paaa WHERE paaa.cif EQ cif.cif AND paaa.paaa = viewpoint.aaa AND NOT paaa.close NO-LOCK NO-ERROR.

    cIban = viewpoint.aaa.

    IF AVAILABLE paaa THEN DO:
        cIban = paaa.vaaa.

    find tt_account_rights where tt_account_rights.iban = cIban no-error.
    if not available tt_account_rights then
      do:
        CREATE tt_account_rights.
        ASSIGN
            tt_account_rights.iban = cIban.
      end.

END.

一些奖金观点:

1)尽可能将WHERE子句的元素表示为相等。这是查询效率的最重要贡献者。因此,与其说“ NOTspective.close”,不如将其编码为“ viewpoint.close = NO”。

2)不要在每次FIND之后自动抛出FIRST。您可能已经接触过某些“标准”代码。仍然是糟糕的编码。如果FIND是唯一的,则不会增加任何值(在这种情况下,它不会提高性能)。如果FIND不是唯一的,并且您按照上面的操作进行操作并从该记录中分配一个值,则实际上使该FIRST记录变得特殊。这违反了第三范式(现在,关于记录的事实与密钥,整个密钥无关,而与密钥无关)。如果第二条记录的iBan不同,该怎么办?如果不同的WHERE子句返回不同的“第一”记录怎么办?

在某些情况下,适合使用FIRST。关键是,它永远都是不正确的,并且在不考虑为什么要放置它以及该关键字的真正影响之前,不应该将其添加到每个FIND语句中。

3)显然将NO-LOCK(或EXCLUSIVE-LOCK或SHARE-LOCK)放在表名之后而不是语句的末尾。语法可以以任何一种方式起作用,但是从可读性的角度来看,最好在表旁使用锁定短语。