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配置存在错误:
- 关联字段配置错误:父子表关联应该是父表的唯一标识字段关联子表的parentid,而非双方都用parentid,父表本身的parentid没有值,自然无法填充子表字段。
- 缺少必要参数:没有开启嵌套读取和自动重填外键的配置。
修改方案如下:
第一步:修正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
相关产品推荐
相关产品推荐

