READXML > Dataset / temp-table - how are relationships created?

sgooch

New Member
I have an XML file, that I bring into a dataset that has 4 temp-tables. I CAN see the data in the temp-tables, BUT where I am confused (LOST) is the fact that I don't see the below process creating the relationships between the temp-tables. I would expect the "parentid" fields to be populated with a RECID, and thus create my relationships. So if all my "parentid" fields are "?" (null) I don't have any good join from ga_export to ga_journal or ga_journal to ga_deposit or ga_deposit to ga_bank.

NOTE: this is a 10.1C04 version of Progress. From what I can read (and experience is showing me), trying FIELD parentid AS RECID SERIALIZE-HIDDEN does not work in this version. Any reference to "SERIALIZE", anywhere throws errors.

Also note that I cannot control the XML format or content. It is just my job to read it and get it into these related temp-tables and go from there.

Below is the code (only the highlights, I hope this is enough):

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
~~~
.

define temp-table ga_deposit
field parentid as recid
field ga_deposit_id as int
~~~
.

define temp-table ga_bank
field parentid as recid
field ga_name as character
~~~
.

DEFINE DATASET dsGAExport FOR ga_export, ga_journal, ga_receipt, ga_deposit, ga_bank
DATA-RELATION drexju FOR ga_export, ga_journal 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 Example:


<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ga_export>
<ga_journal>
<ga_journal_id>29</ga_journal_id>
<ga_deposit>
<ga_deposit_id>6</ga_deposit_id>
<ga_bank>
<ga_name>Bobs Bank</ga_name>
</ga_bank>
</ga_deposit>
<ga_exportTimestamp>20170426163505</ga_exportTimestamp>
</ga_journal>
</ga_export>
 

Stefan

Well-Known Member
I think you need parent-id-relation, the following works with 12.2.6:

Code:
def var lcxml as longchar no-undo.

lcxml    =    '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>'
        +    '<ga_export>'
        +    '<ga_journal>'
        +    '<ga_journal_id>29</ga_journal_id>'
        +    '<ga_deposit>'
        +    '<ga_deposit_id>6</ga_deposit_id>'
        +    '<ga_bank>'
        +    '<ga_name>Bobs Bank</ga_name>'
        +    '</ga_bank>'
        +    '</ga_deposit>'
        +    '<ga_exportTimestamp>20170426163505</ga_exportTimestamp>'
        +    '</ga_journal>'
        +    '</ga_export>'
        .

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
    .

define temp-table ga_deposit
    field parentid as recid
    field ga_deposit_id as int
    .

define temp-table ga_bank
    field parentid as recid
    field ga_name as character
    .

DEFINE DATASET dsGAExport
    FOR 
        ga_export,
        ga_journal,
        ga_deposit,
        ga_bank
    parent-id-relation drexju
        for ga_export, ga_journal 
        parent-id-field parentid
    parent-id-relation drjude
        for ga_journal, ga_deposit
        parent-id-field parentid
    parent-id-relation drdeba
        for ga_deposit, ga_bank
        parent-id-field parentid
    .

if DATASET dsGAExport:READ-XML(
        'longchar',
          lcxml, 
          ?, 
          ?,
        ?
    )
then do:

    display 'ga_export'.
    for each ga_export:
        display recid( ga_export ).
    end.

    display 'ga_journal'.
    for each ga_journal:
        display
             ga_journal.parentid
            recid( ga_journal )
            ga_journal.ga_journal_id
            .
    end.

    display 'ga_deposit'.
    for each ga_deposit:
        display
            ga_deposit.parentid
            recid( ga_deposit )
            ga_deposit.ga_deposit_id
            .
    end.

    display 'ga_bank'.
    for each ga_bank:
        display
            ga_bank.parentid
            recid( ga_bank )
            ga_bank.ga_name format "x(20)"
            .
    end.

end.
else
    message 'oops'.

You can test this in ABL Dojo.
 

sgooch

New Member
Thanks so much for the reply, but I get back this error: "** Unable to understand after -- "ga_deposit, ga_bank". (247)"
This is in the DEFINE DATASET section.
 
Top