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

OpenEdge 10.1c 读取XML到Dataset时parentid(RECID)为空问题

问题跟进:OpenEdge 10.1c读取XML到数据集时parentid字段为空

问题描述

本次为3月提交问题的跟进,使用10.1c旧版本将XML数据读取到包含多临时表、多表关联关系的Dataset中时,临时表内的parentid字段未被填充,值仅为?(空值),无法基于parentid正确建立父子表关联,其余字段数据读取均符合预期。

核心诉求

如何让parentid字段正确填充,保障多表关联关系正常生效。

相关代码

临时表与数据集定义

define temp-table ga_export NO-UNDO 
   FIELD parentid AS RECID 
. 

define temp-table ga_journal  
   field parentid as recid      
   field ga_journal_id as int
   field ga_journal_type_ind as character
   field ga_unapplied_cash_ind as logical
   field ga_named_user as character
   field ga_action as character
   field ga_amount as decimal
   field ga_amount_allowed as decimal
   field ga_amount_over as decimal
   field ga_currency as character
   field ga_operation as character
   field ga_custno as character
   field ga_invno as character
   field ga_batchnum as int
.

 define temp-table ga_receipt
   field parentid as recid
   field ga_receiptnum as int
   field ga_checknum as int
   field ga_amount as decimal
.
  
 define temp-table ga_posting
   field parentid as recid
   field ga_gl_code as character
   field ga_gl_name as character
   field ga_gl_category as character
   field ga_artarget_desc as character
   field ga_artarget_id as character
   field ga_fr_unit as character /* level="Division" */ 
   field ga_fr_unit2 as character /* level="Sales Area" */
.

define temp-table ga_deposit
   field parentid as recid
   field ga_deposit_id as int
   field ga_date as date
   field ga_amount as decimal
   field ga_currency as character
.
            
define temp-table ga_bank
   field parentid as recid
   field ga_name as character
   field ga_micr_routing as int
   field ga_micr_account as int
.

DEFINE DATASET dsGAExport FOR ga_export, ga_journal, ga_receipt, ga_posting, ga_deposit, ga_bank
   DATA-RELATION drexju FOR ga_export, ga_journal RELATION-FIELDS (parentid, parentid)
   DATA-RELATION drjure FOR ga_journal, ga_receipt RELATION-FIELDS (parentid, parentid)
   DATA-RELATION drjupoe FOR ga_journal, ga_posting RELATION-FIELDS (parentid, parentid)
   DATA-RELATION drjude FOR ga_journal, ga_deposit RELATION-FIELDS (parentid, parentid)
   DATA-RELATION drdeba FOR ga_deposit, ga_bank RELATION-FIELDS (parentid, parentid)
.


lRetOK = DATASET dsGAExport:READ-XML(cSourceType, outFileName, cReadMode, cSchemaLocation,
        lOverrideDefaultMapping, cFieldTypeMapping, cVerifySchemaMode).

XML示例

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ga_export>
    <ga_journal>
        <ga_journal_id>29</ga_journal_id>
        <ga_journal_type_ind>C</ga_journal_type_ind>
        <ga_unapplied_cash_ind>false</ga_unapplied_cash_ind>
        <ga_named_user>GET</ga_named_user>
        <ga_action>C</ga_action>
        <ga_amount>52071.83</ga_amount>
        <ga_amount_allowed>0.00</ga_amount_allowed>
        <ga_amount_over>0.00</ga_amount_over>
        <ga_currency>USD</ga_currency>
        <ga_operation>TR_POST</ga_operation>
        <ga_custno>1006</ga_custno>
        <ga_invno>12093</ga_invno>
        <ga_batchnum>1001</ga_batchnum>
        <ga_receipt>
            <ga_receiptnum>1001</ga_receiptnum>
            <ga_checknum>1001</ga_checknum>
            <ga_amount>52071.83</ga_amount>
        </ga_receipt>
        <ga_posting>
            <ga_gl_code>2000</ga_gl_code>
            <ga_gl_name>TAR</ga_gl_name>
            <ga_gl_category>TRADE_RECEIVABLE</ga_gl_category>
            <ga_artarget_desc>DEFAULT</ga_artarget_desc>
            <ga_artarget_id>DEFAULT</ga_artarget_id>
            <ga_fr_unit level="Division">DIV01</ga_fr_unit>
            <ga_fr_unit level="Sales Area">Template</ga_fr_unit>
        </ga_posting>
        <ga_deposit>
            <ga_deposit_id>6</ga_deposit_id>
            <ga_date>2017-04-26</ga_date>
            <ga_amount>57871.83</ga_amount>
            <ga_currency>USD</ga_currency>
            <ga_bank>
                <ga_name>Bobs Bank</ga_name>
                <ga_micr_routing>987654321</ga_micr_routing>
                <ga_micr_account>123456789</ga_micr_account>
            </ga_bank>
        </ga_deposit>
        <ga_exportTimestamp>20170426163505</ga_exportTimestamp>
    </ga_journal>
</ga_export>

解决方案

问题根源是10.1c版本的READ-XML默认不会自动匹配XML嵌套结构填充关联外键,同时DATA-RELATION配置存在错误:

  1. 关联字段配置错误:父子表关联应该是父表的唯一标识字段关联子表的parentid,而非双方都用parentid,父表本身的parentid没有值,自然无法填充子表字段。
  2. 缺少必要参数:没有开启嵌套读取和自动重填外键的配置。

修改方案如下:

第一步:修正DATA-RELATION配置

给所有DATA-RELATION加上NESTED和REPARENT参数,同时修正关联字段为父表的RECID关联子表的parentid:

DEFINE DATASET dsGAExport FOR ga_export, ga_journal, ga_receipt, ga_posting, ga_deposit, ga_bank
   DATA-RELATION drexju FOR ga_export, ga_journal RELATION-FIELDS (RECID, parentid) NESTED REPARENT
   DATA-RELATION drjure FOR ga_journal, ga_receipt RELATION-FIELDS (RECID, parentid) NESTED REPARENT
   DATA-RELATION drjupoe FOR ga_journal, ga_posting RELATION-FIELDS (RECID, parentid) NESTED REPARENT
   DATA-RELATION drjude FOR ga_journal, ga_deposit RELATION-FIELDS (RECID, parentid) NESTED REPARENT
   DATA-RELATION drdeba FOR ga_deposit, ga_bank RELATION-FIELDS (RECID, parentid) NESTED REPARENT
.

参数说明:

  • NESTED:指定READ-XML按照XML的嵌套层级匹配父子表关系
  • REPARENT:开启自动填充外键功能,读取子节点时自动将父节点的RECID写入子表的parentid字段

第二步:调整READ-XML的读取模式

确保cReadMode参数值为"EMPTY",避免现有数据干扰填充逻辑:

lRetOK = DATASET dsGAExport:READ-XML(cSourceType, outFileName, "EMPTY", cSchemaLocation,
        lOverrideDefaultMapping, cFieldTypeMapping, cVerifySchemaMode).

修改后重新读取XML即可自动填充所有子表的parentid字段,关联关系正常生效。


内容的提问来源于stack exchange,提问作者Steve Gooch

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:18:01