当我需要检查记录是否存在并在不存在的情况下创建它时,我想实现一个针对频繁情况的解决方案。
PROCE CreateIfNotFound:
DEF INPUT PARAM bBuf AS HANDLE NO-UNDO.
DEF INPUT PARAM chPred AS CHAR NO-UNDO.
DEF INPUT PARAM iLockMode AS INT NO-UNDO:
DEF VAR hQry AS HANDLE NO-UNDO.
CREATE QUERY hQry.
hQry:SET-BUFFERS(bBuf).
hQry:QUERY-PREPARE("FOR EACH " + bBuf:NAME + " WHERE " + chPred).
hQry:QUERY-OPEN.
IF NOT hQry:GET-FIRST(LockMode) THEN DO:
bBuf:BUFFER-CREATE.
???
END.
END PROCE.
chPred
应为:
field1 = value1 AND field2 = value2 AND [...]
其中field1、field2和[…]是唯一索引字段。在不进行chPred
解析的情况下,我应该如何初始化具有给定值的已创建记录的给定字段?此外,分隔符也没有多大帮助,因为值可能包含AND
、=
,通常还有我可以选择的任何分隔符。如果是_!^@_MY_DELIM!@^__
,当然不太可能,但我真的不喜欢这个解决方案。
要用于初始化的值在chPred中是否正确?
为什么要让它变得更复杂?
在我看来,如果你知道chPred由相等匹配组成(总是使用"="),并且总是使用and条件,那么这个字符串正是你想要使用的,解析起来非常容易:
define variable x as character no-undo format "x(30)".
define variable s as character no-undo format "x(30)".
define variable a as character no-undo.
define variable b as character no-undo.
define variable i as integer no-undo.
x = "field1 = 3 and field2 = 5".
do while true:
i = index( x, " and " ).
if i < 0 then
x = s.
else
assign
s = substring( x, 1, i - 1 )
x = substring( x, i + 4 )
.
assign
a = entry( 1, s, "=" )
b = entry( 2, s, "=" )
.
display
s
x
a
b
.
pause.
if i <= 0 then leave.
end.
如果chPred字符串不包含相等匹配和and,那么显然必须通过其他参数化方案传递值。
一个简单的例子:
为表定义缓冲区btable。
找到第一个btable在哪里什么都没有锁没有错误。
如果不可用btable,那么做:
create btable.
assign btable.fields and so on.
结束。