当我需要检查记录是否存在时,我想为频繁的情况实施解决方案,如果不存在则创建它。
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!@^__
,当然不太可能,但我不太喜欢这个解决方案。
答案 0 :(得分:0)
您要用于初始化的值是在chPred中正确吗?
为什么要把它变得更复杂?
在我看来,如果你知道chPred由等式匹配(总是使用“=”)并且总是使用AND条件,那么该字符串正是你想要使用的,并且它将非常容易解析:< / p>
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,那么您显然必须通过其他一些参数化方案传递值。
答案 1 :(得分:0)
一个简单的:
为表定义缓冲区表。
查找第一个表,其中无锁无错误。
如果没有btable可用,那么:
create btable.
assign btable.fields and so on.
端。