如何实现"创建如果没找到"功能?

时间:2013-08-23 13:13:28

标签: 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.
  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!@^__,当然不太可能,但我不太喜欢这个解决方案。

2 个答案:

答案 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.

端。