Progress 12使用WRITE-XML生成XML时如何调整Othr节点至PstlAdr后
问题背景
在Progress 12环境中通过临时表搭配WRITE-XML语句生成XML文件,目标输出的XML结构如下:
<CdtrAgt> <FinInstrnId> <ClrSysMmbId> <MmbId>xxx</MmbId> </ClrSysMmbId> <Nm>yyy</Nm> <PstlAdr> <Ctry>US</Ctry> </PstlAdr> <Othr> <Id>zzz</Id> </Othr> </FinInstrnId> </CdtrAgt>
目前已经通过PARENT-ID-RELATION配置实现了<Nm>节点排在<PstlAdr>节点之前的效果,但无法将<Othr>节点移动到<PstlAdr>节点之后。
已生效的节点排序配置片段:
PARENT-ID-RELATION FinCR1 FOR FinInstnId-CR, ClrSysMmbId-CR PARENT-ID-FIELD FinInstn-Id PARENT-FIELDS-AFTER (Nm) PARENT-ID-RELATION FinCR2 FOR FinInstnId-CR, PstlAdr-CR PARENT-ID-FIELD FinInstn-Id2
问题根因
当前代码中Othr-CI表和FinInstnId-CR表使用的是普通DATA-RELATION嵌套关联,不是PARENT-ID-RELATION。Progress ABL数据集输出XML的节点顺序遵循固定规则:
- 先输出父表自身标记为XML节点的字段,按表定义顺序排列
- 再按
PARENT-ID-RELATION的定义顺序,输出对应子节点,可通过PARENT-FIELDS-AFTER指定子节点插在哪个父字段之后 - 最后输出普通
DATA-RELATION ... NESTED关联的子节点,按关联定义顺序排列
因此普通关联的<Othr>节点无法插入到两个PARENT-ID关联的子节点之间,位置不符合预期。
解决方案
- 删除原有
FinInstnId-CR和Othr-CI之间的普通DATA-RELATION Cred-10关联 - 新增第三条
PARENT-ID-RELATION关联FinInstnId-CR和Othr-CI,直接放在FinCR2关联之后即可,无需额外指定PARENT-FIELDS-AFTER,<Othr>节点会自动排在<PstlAdr>节点之后 - 写入数据时给
Othr-CI表的FinInstn-Id3字段赋值为对应FinInstnId-CR记录的RECID,和另外两个PARENT-ID关联的赋值逻辑保持一致,保证父子关联正常匹配
修正后的数据集定义代码片段
DEFINE DATASET Document NAMESPACE-URI "urn:iso:std:iso:20022:tech:xsd:pain.001.001.03" FOR CstmrCdtTrfInitn, CdtTrfTxInf, PmtInf, PmtTpInf, CdtrAgt, FinInstnId-CR, ClrSysMmbId-CR, PstlAdr-CR, Othr-CI DATA-RELATION Pymt-1 FOR CstmrCdtTrfInitn, PmtInf RELATION-FIELDS(MsgId, MsgId) NESTED DATA-RELATION Cred-1 FOR PmtInf, CdtTrfTxInf RELATION-FIELDS(MsgId, MsgId, PmtInfId, PmtInfId) NESTED DATA-RELATION Cred-5 FOR CdtTrfTxInf, CdtrAgt RELATION-FIELDS(MsgId, MsgId, PmtInfId, PmtInfId, SeqNum, SeqNum) NESTED DATA-RELATION Cred-6 FOR CdtrAgt, FinInstnId-CR RELATION-FIELDS(MsgId, MsgId, PmtInfId, PmtInfId, SeqNum, SeqNum) NESTED /* FinInstnId下所有子节点统一用PARENT-ID-RELATION管理,按定义顺序控制输出位置 */ PARENT-ID-RELATION FinCR1 FOR FinInstnId-CR, ClrSysMmbId-CR PARENT-ID-FIELD FinInstn-Id PARENT-FIELDS-AFTER (Nm) PARENT-ID-RELATION FinCR2 FOR FinInstnId-CR, PstlAdr-CR PARENT-ID-FIELD FinInstn-Id2 PARENT-ID-RELATION FinCR3 FOR FinInstnId-CR, Othr-CI PARENT-ID-FIELD FinInstn-Id3.
内容的提问来源于stack exchange,提问作者JSS
相关产品推荐
相关产品推荐

