Progress 4gl 如何实施";如果找不到,则创建";功能?
当我需要检查记录是否存在并创建它(如果不存在)时,我想为频繁出现的情况实现一个解决方案Progress 4gl 如何实施";如果找不到,则创建";功能?,progress-4gl,openedge,Progress 4gl,Openedge,当我需要检查记录是否存在并创建它(如果不存在)时,我想为频繁出现的情况实现一个解决方案 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.
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 [...]
其中字段1、字段2和[…]是唯一的索引字段。在不进行chPred
解析的情况下,如何使用给定值初始化已创建记录的给定字段?
此外,分隔符也帮不了什么忙,因为值可能包含
和,=
以及通常我可以选择的任何分隔符。如果是,则不太可能^@_我的朋友@^__代码>,但我真的不喜欢这个解决方案。要用于初始化的值在chPred中是否正确
为什么要把它弄得更复杂
在我看来,如果您知道chPred由相等匹配(总是使用“=”)组成,并且总是使用和条件,那么该字符串正是您想要使用的,并且解析起来非常简单:
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.
将变量x定义为字符无撤销格式“x(30)”。
将变量s定义为字符无撤消格式“x(30)”。
将变量定义为不撤消的字符。
将变量b定义为无撤消字符。
将变量i定义为不撤消的整数。
x=“field1=3和field2=5”。
正确时执行以下操作:
i=指数(x,“和”)。
如果我<0,那么
x=s。
其他的
分配
s=子串(x,1,i-1)
x=子串(x,i+4)
.
分配
a=条目(1,s,“=”)
b=条目(2,s,“=”)
.
显示
s
x
A.
B
.
暂停。
如果我一个简单的问题:
为表定义缓冲区btable
找到第一个btable,无论在哪里都没有锁,没有错误
如果不可用,请执行以下操作:
create btable.
assign btable.fields and so on.
结束。是,它可能由=
和和组成。我曾考虑将CHR(2)
和CHR(3)
作为分隔符,但我仍然不能称之为优雅的解决方案。如果您坚持使用一个超优雅的内置“未找到时创建”关键字,您将要等待很长时间。您需要的数据位于chPred中,并且易于解析。不需要额外的分隔符。我建议您使用它。不,问题是当过程只有一个字符串“field1=value 1和field2=value 2…”时,如何动态执行此操作