如果发现重复则跳过分配
Skip assigning if found duplicates
我有一个分配值并将其发回的程序。我需要实施一项更改,以便在发现重复的 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.
您没有显示 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 子句的元素表示为相等匹配。这是查询效率的最重要贡献者。因此,与其说 "NOT viewpoint.close",不如将其编码为 "viewpoint.close = NO"。
2) 不要在每次 FIND 后自动抛出 FIRST。您可能接触过一些代码,其中 "standard"。它是 none 不太糟糕的编码。如果 FIND 是唯一的,则它不会增加任何价值(在这种情况下它不会提高性能)。如果 FIND 不是唯一的,并且您按照上面的方式操作并从该记录中分配一个值,那么您实际上是在使该 FIRST 记录变得特殊。这违反了第三范式(现在有一个与密钥无关的记录的事实,整个密钥,只有密钥)。如果第二条记录有不同的 iBan 怎么办?如果不同的 WHERE 子句 return 不同的“第一条”记录怎么办?
有些情况下 FIRST 是合适的。关键是它并不总是正确的,不应该将它添加到每个 FIND 语句中,而不考虑为什么要将它放在那里以及该关键字的真正影响是什么。
3) 将 NO-LOCK(或 EXCLUSIVE-LOCK 或 SHARE-LOCK)紧跟在 table 名称之后而不是在语句末尾放置会更清楚。语法以任何一种方式工作,但从可读性的角度来看,最好将锁定短语放在 table 旁边。
我有一个分配值并将其发回的程序。我需要实施一项更改,以便在发现重复的 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.
您没有显示 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 子句的元素表示为相等匹配。这是查询效率的最重要贡献者。因此,与其说 "NOT viewpoint.close",不如将其编码为 "viewpoint.close = NO"。
2) 不要在每次 FIND 后自动抛出 FIRST。您可能接触过一些代码,其中 "standard"。它是 none 不太糟糕的编码。如果 FIND 是唯一的,则它不会增加任何价值(在这种情况下它不会提高性能)。如果 FIND 不是唯一的,并且您按照上面的方式操作并从该记录中分配一个值,那么您实际上是在使该 FIRST 记录变得特殊。这违反了第三范式(现在有一个与密钥无关的记录的事实,整个密钥,只有密钥)。如果第二条记录有不同的 iBan 怎么办?如果不同的 WHERE 子句 return 不同的“第一条”记录怎么办?
有些情况下 FIRST 是合适的。关键是它并不总是正确的,不应该将它添加到每个 FIND 语句中,而不考虑为什么要将它放在那里以及该关键字的真正影响是什么。
3) 将 NO-LOCK(或 EXCLUSIVE-LOCK 或 SHARE-LOCK)紧跟在 table 名称之后而不是在语句末尾放置会更清楚。语法以任何一种方式工作,但从可读性的角度来看,最好将锁定短语放在 table 旁边。