我有一个分配值并将其发送回的过程。我需要实施一项更改,以便在找到重复的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.
答案 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)放在表名之后而不是语句的末尾。语法可以以任何一种方式起作用,但是从可读性的角度来看,最好在表旁使用锁定短语。