【问题标题】:How to implement "create if not found" function?如何实现“找不到就创建”功能?
【发布时间】:2013-08-30 22:41:53
【问题描述】:

当我需要检查记录是否存在时,我想针对频繁出现的情况实施解决方案,如果不存在则创建它。

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

【问题讨论】:

    标签: progress-4gl openedge


    【解决方案1】:

    您要用于初始化的值在 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,那么您显然将不得不通过其他一些参数化方案传递值。

    【讨论】:

    • 是的,它可能包含=AND。我曾考虑将 CHR(2)CHR(3) 作为分隔符,但我仍然不能称其为优雅的解决方案。
    • 如果您坚持使用超级优雅的内置“如果未找到则创建”关键字,您将等待很长时间。您需要的数据在 chPred 中并且很容易解析。不需要额外的分隔符。我建议你使用它。
    【解决方案2】:

    一个简单的:

    为表定义缓冲区btable。

    找到第一个btable,无论什么无锁无错误。

    如果 btable 不可用,则执行:

     create btable.
    
     assign btable.fields and so on.
    

    结束。

    【讨论】:

    • 不,问题是当过程只有一个字符串 "field1 = value 1 AND field2 = value2 ..." 时如何动态执行此操作
    猜你喜欢
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多