You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Progress 4GL循环中xml-node-type='hidden'异常及无多临时表解决方案咨询

Progress 4GL临时表生成XML地址标签的隐藏节点重置问题

场景与需求

通过临时表tt_address,基于供应商、采购方等多种限定符构建XML地址标签,每个地址包含street1、street2、street3,要求有值时显示对应XML标签,无值则隐藏。

现有代码

do i = 1 to num-entries(qualifiers):
create tt_address.
if ad_line1 <> ""
buffer tt_address:buffer-field("tt_address_street1"):xml-node-name = "STREET_1".
tt_address_street1   = trim(ad_line1).
else
buffer tt_address:buffer-field("tt_address_street1"):xml-node-type = "hidden".
if ad_line2 <> ""
buffer tt_address:buffer-field("tt_address_street2"):xml-node-name = "STREET_2".
tt_address_street2   = trim(ad_line2).
else
buffer tt_address:buffer-field("tt_address_street2"):xml-node-type = "hidden".
if ad_line3 <> ""
buffer tt_address:buffer-field("tt_address_street3"):xml-node-name = "STREET_3".
tt_address_street3   = trim(ad_line3).
else
buffer tt_address:buffer-field("tt_address_street3"):xml-node-type = "hidden".
end.

问题现象

  • 第一次循环:ad_line1非空、ad_line2和ad_line3为空,生成的XML仅包含<STREET_1>'ADDRESS1XXXXX'</STREET_1>,符合预期;
  • 第二次循环:ad_line1非空、ad_line2为空、ad_line3非空,生成的XML仍仅显示<STREET_1>'ADDRESS2XXXXX'</STREET_1>,ad_line3对应的标签未出现。

问题分析

临时表的字段XML属性(比如xml-node-type)是缓冲级别的全局设置,第一次迭代将tt_address_street2和tt_address_street3设为"hidden"后,后续迭代即使对应字段有值,该属性也会保持隐藏状态,不会自动重置。

解决方法

在每次创建临时表记录后,先将所有地址字段的xml-node-type重置为"element",再根据字段值判断是否设置为隐藏。同时修正原代码的分支结构缺失问题,修正后的代码如下:

do i = 1 to num-entries(qualifiers):
    create tt_address.
    
    // 先重置所有字段的XML节点类型为element,确保默认显示
    buffer tt_address:buffer-field("tt_address_street1"):xml-node-type = "element".
    buffer tt_address:buffer-field("tt_address_street2"):xml-node-type = "element".
    buffer tt_address:buffer-field("tt_address_street3"):xml-node-type = "element".

    // 处理street1
    if ad_line1 <> "" then do:
        buffer tt_address:buffer-field("tt_address_street1"):xml-node-name = "STREET_1".
        tt_address_street1 = trim(ad_line1).
    end.
    else do:
        buffer tt_address:buffer-field("tt_address_street1"):xml-node-type = "hidden".
    end.

    // 处理street2
    if ad_line2 <> "" then do:
        buffer tt_address:buffer-field("tt_address_street2"):xml-node-name = "STREET_2".
        tt_address_street2 = trim(ad_line2).
    end.
    else do:
        buffer tt_address:buffer-field("tt_address_street2"):xml-node-type = "hidden".
    end.

    // 处理street3
    if ad_line3 <> "" then do:
        buffer tt_address:buffer-field("tt_address_street3"):xml-node-name = "STREET_3".
        tt_address_street3 = trim(ad_line3).
    end.
    else do:
        buffer tt_address:buffer-field("tt_address_street3"):xml-node-type = "hidden".
    end.
end.

关键修正点

  1. 重置XML节点类型:每次创建临时表记录后,先把三个字段的xml-node-type设为"element",覆盖之前的隐藏设置;
  2. 修正分支结构:原代码的IF语句缺少THEN DO块,导致无论条件是否成立,字段赋值语句都会执行,逻辑错误。添加THEN DO和ELSE DO块确保逻辑分支正确;
  3. 简化节点名称设置:如果临时表字段的XML节点名称固定,可以直接在表定义时指定XML-NODE-NAME属性,无需在循环中重复设置:
DEFINE TEMP-TABLE tt_address
    FIELD tt_address_street1 AS CHARACTER XML-NODE-NAME "STREET_1"
    FIELD tt_address_street2 AS CHARACTER XML-NODE-NAME "STREET_2"
    FIELD tt_address_street3 AS CHARACTER XML-NODE-NAME "STREET_3".

内容的提问来源于stack exchange,提问作者Rajesh khanna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 04:32:09