【问题标题】:How to matches two records using ENTRY in progress 4GL?如何使用正在进行的 ENTRY 4GL 匹配两条记录?
【发布时间】:2019-03-26 11:25:10
【问题描述】:

我编写了一个匹配两条记录的程序。如果它匹配,那么我需要一条消息“匹配”,但这里的问题是我不知道如何匹配。让我分享我的程序

DEFINE VARIABLE cPos AS INTEGER NO-UNDO.
DEFINE TEMP-TABLE tt_data NO-UNDO
      FIELD cPosition AS CHARACTER FORMAT "X(60)"
      FIELD cEndCode  AS CHARACTER
      FIELD cShotCode AS CHARACTER. 

CREATE tt_data.
ASSIGN
tt_data.cPosition ="S$$$^^^^^^^^^^$$$^^^MC^^^^^^^^^^^^R^^^^^^^^^^^^^^^^^^^^^^^^^"
tt_data.cEndCode =  10
tt_data.cShotCode = "S".

CASE tt_data.cEndCode:

WHEN 10 THEN DO:
cPos = 1.
END.

WHEN 20 THEN DO:
cPos = 2.
END.
.
.
.
WHEN 600 THEN DO:
cPos = 60
END.

END CASE.

FIND FIRST tt_date WHERE tt_data.cShotCode = SUBSTRING(tt_data.cPosition,cPos,1) NO-LOCK NO-ERROR. 

DISPLAY tt_data.cShotCode. /* Displayed Value is S */

如果您看到 tt_datacEndCode 值为 10,这意味着它指向 tt_data.cPosition(即 S)的 ENTRY 1。

当 20 时,对于 ENTRY 2,我希望达到 600(即 tt_datacEndCode = 60)。

这里的问题是我不能有高达 600 的 WHEN 语句。所以你能帮帮我吗?

【问题讨论】:

    标签: openedge progress-4gl


    【解决方案1】:

    对于您展示的示例,您可以删除 CASE 语句并简单地将其替换为:

    cPos = integer( tt_data.cEndCode / 10 ).
    

    (假设如图所示,cEndCode 始终是 10 的倍数,并且所需的 cPos 是该值的 1/10。)

    因此:

    DEFINE VARIABLE cPos AS INTEGER NO-UNDO.
    DEFINE TEMP-TABLE tt_data NO-UNDO
          FIELD cPosition AS CHARACTER FORMAT "X(60)"
          FIELD cEndCode  AS CHARACTER
          FIELD cShotCode AS CHARACTER. 
    
    CREATE tt_data.
    ASSIGN
    tt_data.cPosition ="S$$$^^^^^^^^^^$$$^^^MC^^^^^^^^^^^^R^^^^^^^^^^^^^^^^^^^^^^^^^"
    tt_data.cEndCode =  10
    tt_data.cShotCode = "S".
    
    cPos = integer( tt_data.cEndCode / 10 ).
    
    FIND FIRST tt_date WHERE tt_data.cShotCode = SUBSTRING(tt_data.cPosition,cPos,1) NO-LOCK NO-ERROR. 
    
    DISPLAY tt_data.cShotCode. /* Displayed Value is S */
    

    【讨论】:

    • 我同意,但建议将 FIND FIRST 替换为 FOR FIRST,同时在末尾删除 NO-ERROR。这将创建一个块并仅在成功找到记录时运行DISPLAY 语句,并在其周围保存错误处理逻辑。
    • 我不喜欢在每个 FIND 上毫无意义地抛出 FIRST,但出于某种原因决定保持沉默。 FOR FIRST 是另一罐蠕虫 - 虽然我确实喜欢它形成一个块并且仅在真实时运行的部分。
    • 会循环吗?因为 tt_data.cPosition 值并不总是相同。它可能会改变。因此,我们必须将 tt_data.cPosition 中的每条记录都包含到所有检查案例中,我的意思是 tt_data.EndCode = 600。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-22
    • 1970-01-01
    • 2018-03-16
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多