【问题标题】:How to add html tables in progress 4gl?如何在 4gl 中添加 html 表格?
【发布时间】:2019-06-29 21:08:48
【问题描述】:

我在 Progress4gl 中创建了一个临时表,我需要使用 html 语法从临时表中通过电子邮件发送数据。这意味着我需要将临时表中的所有字段链接到 html 表和电子邮件。

临时表中的字段是:

Part_ID、CustomerPartID、客户

请帮帮我。

【问题讨论】:

    标签: openedge progress-4gl


    【解决方案1】:

    你可以只输出 HTML。像这样的:

    define temp-table tt_test
      field f1 as integer
      field f2 as character
      field f3 as date
    .
    
    create tt_test.
    assign
      f1 = 1
      f2 = "abc"
      f3 = today
    .
    create tt_test.
    assign
      f1 = 2
      f2 = "xyz"
      f3 = today + 30
    .
    
    output to value( "mytable.html" ).
    
    put unformatted "<table>" skip.
    
    for each tt_test:
    
      put unformatted substitute( "  <tr><td>&1</td><td>&2</td><td>&3</td></tr>", f1, f2, f3 ) skip.
    
    end.
    
    put unformatted "</table>" skip.
    
    output close.
    

    【讨论】:

    • 非常感谢汤姆。我终于能够从中创建一个 html 文件。然而,我通过添加样式做了一些小的改动。现在我需要将此 html 文件添加到电子邮件正文中。有什么办法可以做到吗?
    • 将字符数据放入 HTML 时,必须进行转义。不这样做会破坏桌子。
    • 在对您提到的 sendEmail.p 的另一个答案的评论中。 SFAIK 不是标准 Progress 提供的程序,我不熟悉它的操作。我假设它接受电子邮件正文的参数,并且您将通过该参数传递格式化表格。 OTOH,如果“sendEmail.p”是一个有抱负的评论,并且您希望有人可以提供这样的程序,我的建议是您提出一个新问题,重点是如何编写一个使用 Progress 4gl 发送电子邮件的程序。了解您所在的平台以及您使用的电子邮件提供商将很有帮助。
    • 另外,虽然我的回答是“又快又脏”,而且代码很容易理解,但 Stefan 的回答实际上更加完整和健壮。
    【解决方案2】:

    要创建一个 html 表,您可以(ab)使用数据集与序列化名称相结合的强大功能:

    /* Write some awesome ABL code here, or load an existing snippet! */ 
    
    define temp-table ttparts serialize-name "tr"
       field part_id        as char serialize-name "td"
       field customerPartID as char serialize-name "td"
       field customer       as char serialize-name "td"
       .
    
    define dataset ds serialize-name "table" for ttparts .
    
    define buffer bupart for ttparts.
    
    create bupart.
    assign
       bupart.part_id = "one"
       bupart.customer = "A"
       .
    
    create bupart.
    assign
       bupart.part_id = "two"
       bupart.customer = "B"
       .
    
    def var lcc as longchar no-undo.
    dataset ds:write-xml( "longchar", lcc, true ).
    
    message string( lcc ).
    

    https://abldojo.services.progress.com:443/#/?shareId=5d1618c14b1a0f40c34b8bc8

    接受任何临时表句柄并返回包含 HTML 表的 longchar 的更新版本:

    function createHtmlTable returns longchar (
      i_ht as handle
    ):
    
       def var lcc as longchar.
       def var hds as handle.
       def var hb  as handle.
       def var ic  as int.
    
       create dataset hds.
       hds:serialize-name = "table". // not needed if stripped below
    
       create buffer hb for table i_ht.
       hb:serialize-name = "tr".
       hds:add-buffer( hb ).
    
       do ic = 1 to hb:num-fields:
          hb:buffer-field( ic ):serialize-name = "td".
       end.
    
       hds:write-xml( "longchar", lcc, true ).
    
       // remove xml declaration
       lcc = substring( lcc, index( lcc, "<", 2 ) ).   
       entry( 1, lcc, ">" ) = "<table". // see comment above
    
       return lcc.
    
       finally:
          delete object hds.
       end finally.
    
    end function.
    
    define temp-table ttparts
       field part_id as char
       field customerPartID as char
       field customer as char
       .
    
    define buffer bupart for ttparts.
    
    create bupart.
    assign
       bupart.part_id = "one"
       bupart.customer = "A"
       .
    
    create bupart.
    assign
       bupart.part_id = "two"
       bupart.customer = "B"
       .
    
    message string( createHtmlTable( temp-table ttparts:handle ) ).
    

    https://abldojo.services.progress.com/#/?shareId=5d1760d84b1a0f40c34b8bcd

    【讨论】:

    • 那是……嗯,我无语了。这很聪明。但我很确定我将不得不解雇任何真正试图将其投入生产的程序员。
    • 一旦你克服了最初的震惊,一旦你认为临时表是一张表,一条记录是一行,一个字段是一个单元格,那就没问题了,所以(序列化-)命名它们像这样。我很乐意将其投入生产(显然要减去格式化 xml 输出的 true ;-))。
    • 我不得不承认这很诱人。但是技巧编码是维护的噩梦和等待发生的错误。 "w3.org/2001/XMLSchema-instance">" 东西也毁了它。
    • 使用序列化名称没有什么“技巧编码”,它是一种单向映射 - 如果您不想要 xml 声明,它可以很容易地删除(我愿意)。作为奖励,通过使用经过验证的现有方法 - 而不是自己拼凑 - 我不需要考虑转义我的数据。你说什么?您没有名为
    • 的客户部分吗?啊,那好吧,你会没事的;-)
    • 同意。 abldojo.services.progress.com:443/#/… 将获取任何临时表(句柄)并将其作为 html 表吐出。
    【解决方案3】:

    没有内置的方法可以做到这一点。我能想到的一种方法是将临时表转换为 json,然后将 json 转换为 HTML。我相信有几个实用程序可以将 json 转换为 html 表。您可以使用 WRITE-JSON 方法将临时表转换为 ABL 中的 json。

    Progress 文档中的一个示例:

    DEFINE VARIABLE cTargetType AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cFile       AS CHARACTER NO-UNDO.
    DEFINE VARIABLE lFormatted  AS LOGICAL   NO-UNDO.
    DEFINE VARIABLE lRetOK      AS LOGICAL   NO-UNDO.
    
    DEFINE TEMP-TABLE ttCust NO-UNDO LIKE Customer.
    
    /* Code to populate the temp-table */  
    ASSIGN  
      cTargetType = "file" 
      cFile       = "ttCust.json" 
      lFormatted  = TRUE. 
    lRetOK = TEMP-TABLE ttCust:WRITE-JSON(cTargetType, cFile, lFormatted).
    

    【讨论】:

    • 感谢 Austin,有没有办法在我创建的 .p 文件中创建表并调用 sendEmail.p 程序。这样用户将收到表格 html 格式的电子邮件。
    猜你喜欢
    • 2012-02-11
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    相关资源
    最近更新 更多