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.
关键修正点
- 重置XML节点类型:每次创建临时表记录后,先把三个字段的
xml-node-type设为"element",覆盖之前的隐藏设置; - 修正分支结构:原代码的
IF语句缺少THEN DO块,导致无论条件是否成立,字段赋值语句都会执行,逻辑错误。添加THEN DO和ELSE DO块确保逻辑分支正确; - 简化节点名称设置:如果临时表字段的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
相关产品推荐
相关产品推荐

