迭代使用READ-XML填充的数据集,而没有类似父 - 子关系的列?

时间:2016-07-24 16:22:14

标签: progress-4gl openedge

我目前在Openedge 10.1c上。我正在使用READ-XML来填充数据集。我无法更改源XML,并且想知道如果没有在我的连接中使用的父子关系唯一键,您将如何迭代数据集。

当我到达我的办公桌时,我会包含示例XML和显示循环。

与此同时,它就是这样......

<data>
  <fulfillments>
    <field1>field1</field1>
    <field2>field2</field2>
    <field3>field3</field3>
    <customer>
      <name>test</name>
    </customer>
  </fulfillments>
  <fulfillments>
    <field1>field11</field1>
    <field2>field22</field2>
    <field3>field33</field3>
    <customer>
      <name>test2</name>
    </customer>
  </fulfillments>
</data>

在我使用read XML之后,我获得了所有数据但是尝试迭代它我不知道如何在每个履行中显示客户。相反,它只会显示每个履行的所有客户。

示例代码读取并显示数据集......

PROCEDURE _read_xml:
    DEFINE INPUT-OUTPUT PARAMETER DATASET-HANDLE idshndl.
    DEFINE INPUT        PARAMETER ifileloc  AS CHARACTER NO-UNDO.
    DEFINE OUTPUT       PARAMETER oreturn   AS LOGICAL   NO-UNDO.

    DEFINE VARIABLE cSourceType             AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cReadMode               AS CHARACTER NO-UNDO.
    DEFINE VARIABLE lOverrideDefaultMapping AS LOGICAL   NO-UNDO.
    DEFINE VARIABLE cFile                   AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cEncoding               AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cSchemaLocation         AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cFieldTypeMapping       AS CHARACTER NO-UNDO.
    DEFINE VARIABLE cVerifySchemaMode       AS CHARACTER NO-UNDO.

    IF SEARCH(ifileloc) <> ? THEN
    DO:
        ASSIGN
            cSourceType = "file"
            cFile = ifileloc
            cReadMode = "empty"
            cSchemaLocation = ?
            lOverrideDefaultMapping = ?
            cFieldTypeMapping = ?
            cVerifySchemaMode = ?.

        oreturn = idshndl:READ-XML(cSourceType,
                                   cFile,
                                   cReadMode,
                                   cSchemaLocation,
                                   lOverrideDefaultMapping,
                                   cFieldTypeMapping,
                                   cVerifySchemaMode).
    END.
    ELSE
    DO:
        oreturn = FALSE.
    END.

END PROCEDURE.

PROCEDURE _fulfillment_display_data:
    DISPLAY "DATA".
    FOR EACH tt_biz_fulfillments NO-LOCK,
        EACH tt_biz_ship_to:
            DISPLAY "FULFILLMENTS".
            DISPLAY tt_biz_fulfillments WITH SIDE-LABELS.        
            DISPLAY tt_biz_ship_to WITH SIDE-LABELS. 
    END.
END PROCEDURE.

示例XML ...

    <?xml version="1.0" encoding="UTF-8"?>
<data>
   <fulfillments>
      <shipping_method>AIM - Direct</shipping_method>
      <picker_id />
      <sales_order_id>234722</sales_order_id>
      <packaging_id>1</packaging_id>
      <scheduled_delivery_date>07/01/2016</scheduled_delivery_date>
      <net_weight>225</net_weight>
      <shipper_name>TEST</shipper_name>
      <external_note>Test Note</external_note>
      <packaging_type>box</packaging_type>
      <bill_to>sender</bill_to>
      <shipping_cost />
      <fulfillment_id>12345</fulfillment_id>
      <ship_to>
         <city>Pittsburgh</city>
         <name>Bizowie</name>
         <zip>15219</zip>
         <is_residential>0</is_residential>
         <company />
         <address>429 Fourth Avenue Suite 1206</address>
         <phone_extension />
         <contact_id>8</contact_id>
         <phone />
         <state>PA</state>
         <country />
         <email />
      </ship_to>
      <location_id>1</location_id>
      <parent_fulfillment_id />
      <location_name>201 - PA</location_name>
      <manifest_number />
      <picker_name />
      <scheduled_pick_date />
      <pick_timestamp />
      <delivery_timestamp />
      <packaging_weight>0.150000</packaging_weight>
      <insured_value />
      <bill_to_zip />
      <internal_note>test note internal</internal_note>
      <bill_to_account />
      <status>shipped</status>
      <dock_number />
      <route_id>1</route_id>
      <delivery_latitude />
      <shipper_id>1</shipper_id>
      <scheduled_ship_date>06/29/2016</scheduled_ship_date>
      <acceptance_timestamp />
      <shipping_carrier />
      <packaging_height>4.0000</packaging_height>
      <packaging_length>4.0000</packaging_length>
      <gross_weight>225.15</gross_weight>
      <packaging_width>4.0000</packaging_width>
      <delivery_longitude />
      <delivery_signer_location />
      <packing_layer />
      <truck_number />
      <route_name />
      <flag_message />
      <delivery_signer_name />
      <tracking_number />
      <packing_row />
      <ship_timestamp>06/09/2016 07:15:15 AM</ship_timestamp>
   </fulfillments>
   <fulfillments>
      <shipping_method>TEST</shipping_method>
      <picker_id />
      <sales_order_id>234722</sales_order_id>
      <packaging_id>1</packaging_id>
      <scheduled_delivery_date>08/05/2016</scheduled_delivery_date>
      <net_weight>440</net_weight>
      <shipper_name>BLAH</shipper_name>
      <external_note>TESTING</external_note>
      <packaging_type>box</packaging_type>
      <bill_to>sender</bill_to>
      <shipping_cost />
      <fulfillment_id>12346</fulfillment_id>
      <ship_to>
         <city>Wyoming</city>
         <name />
         <zip>18644</zip>
         <is_residential />
         <company>Walmart</company>
         <address>10 Moosic St</address>
         <phone_extension />
         <contact_id>1226058</contact_id>
         <phone />
         <state>PA</state>
         <country />
         <email />
      </ship_to>
      <location_id>1</location_id>
      <parent_fulfillment_id />
      <location_name>201 - PA</location_name>
      <manifest_number />
      <picker_name />
      <scheduled_pick_date />
      <pick_timestamp />
      <delivery_timestamp />
      <packaging_weight>0.150000</packaging_weight>
      <insured_value />
      <bill_to_zip />
      <internal_note>TESTING NOTE</internal_note>
      <bill_to_account />
      <status>shipped</status>
      <dock_number />
      <route_id>1</route_id>
      <delivery_latitude />
      <shipper_id>1</shipper_id>
      <scheduled_ship_date>07/18/2016</scheduled_ship_date>
      <acceptance_timestamp />
      <shipping_carrier />
      <packaging_height>4.0000</packaging_height>
      <packaging_length>4.0000</packaging_length>
      <gross_weight>440.15</gross_weight>
      <packaging_width>4.0000</packaging_width>
      <delivery_longitude />
      <delivery_signer_location />
      <packing_layer />
      <truck_number />
      <route_name />
      <flag_message />
      <delivery_signer_name />
      <tracking_number />
      <packing_row />
      <ship_timestamp>06/09/2016 07:15:15 AM</ship_timestamp>
   </fulfillments>
</data>

1 个答案:

答案 0 :(得分:3)

我不能100%确定这是否适用于10.c。它当然适用于11.6。

如果在定义数据集时使用PARENT-ID-RELATION,则在READ-XML

时,父缓冲区的记录ID将添加到所有子项中

我在这里添加了一个简化版本。您可能想要更改数据类型。仅需要PARENT-FIELDS-BEFOREPARENT-FIELDS-AFTER来使输出数据集看起来相同(基本上如果将&#34; ship_to&#34;部分放在正确的位置)。只需读取xml并遍历记录就不需要它。

DEFINE TEMP-TABLE ttFulfillments NO-UNDO SERIALIZE-NAME "fulfillments"
    FIELD shipping_method          AS CHARACTER
    FIELD picker_id                AS CHARACTER
    FIELD sales_order_id           AS CHARACTER
    FIELD packaging_id             AS CHARACTER
    FIELD scheduled_delivery_date  AS CHARACTER
    FIELD net_weight               AS CHARACTER
    FIELD shipper_name             AS CHARACTER
    FIELD external_note            AS CHARACTER
    FIELD packaging_type           AS CHARACTER
    FIELD bill_to                  AS CHARACTER
    FIELD shipping_cost            AS CHARACTER
    FIELD fulfillment_id           AS CHARACTER
    FIELD location_id              AS CHARACTER
    FIELD parent_fulfillment_id    AS CHARACTER
    FIELD location_name            AS CHARACTER
    FIELD manifest_number          AS CHARACTER
    FIELD picker_name              AS CHARACTER
    FIELD scheduled_pick_date      AS CHARACTER
    FIELD pick_timestamp           AS CHARACTER
    FIELD delivery_timestamp       AS CHARACTER
    FIELD packaging_weight         AS CHARACTER
    FIELD insured_value            AS CHARACTER
    FIELD bill_to_zip              AS CHARACTER
    FIELD internal_note            AS CHARACTER
    FIELD bill_to_account          AS CHARACTER
    FIELD fullfill_status          AS CHARACTER SERIALIZE-NAME "status" 
    FIELD dock_number              AS CHARACTER
    FIELD route_id                 AS CHARACTER
    FIELD delivery_latitude        AS CHARACTER
    FIELD shipper_id               AS CHARACTER
    FIELD scheduled_ship_date      AS CHARACTER
    FIELD acceptance_timestamp     AS CHARACTER
    FIELD shipping_carrier         AS CHARACTER
    FIELD packaging_height         AS CHARACTER
    FIELD packaging_length         AS CHARACTER
    FIELD gross_weight             AS CHARACTER
    FIELD packaging_width          AS CHARACTER
    FIELD delivery_longitude       AS CHARACTER
    FIELD delivery_signer_location AS CHARACTER
    FIELD packing_layer            AS CHARACTER
    FIELD truck_number             AS CHARACTER
    FIELD route_name               AS CHARACTER
    FIELD flag_message             AS CHARACTER
    FIELD delivery_signer_name     AS CHARACTER
    FIELD tracking_number          AS CHARACTER
    FIELD packing_row              AS CHARACTER
    FIELD ship_timestamp           AS CHARACTER.

DEFINE TEMP-TABLE ttShipTo NO-UNDO SERIALIZE-NAME "ship_to"
    FIELD parent_recid    AS RECID SERIALIZE-HIDDEN
    FIELD city            AS CHARACTER
    FIELD shipto_name     AS CHARACTER SERIALIZE-NAME "name"
    FIELD zip             AS CHARACTER
    FIELD is_residential  AS CHARACTER
    FIELD company         AS CHARACTER
    FIELD address         AS CHARACTER
    FIELD phone_extension AS CHARACTER
    FIELD contact_id      AS CHARACTER
    FIELD phone           AS CHARACTER
    FIELD state           AS CHARACTER
    FIELD country         AS CHARACTER
    FIELD email           AS CHARACTER.

DEFINE DATASET dsData SERIALIZE-NAME "data"
    FOR ttFulfillments, ttShipTo
    PARENT-ID-RELATION pr1 FOR ttFulFillments, ttShipTo 
        PARENT-ID-FIELD parent_recid
        PARENT-FIELDS-BEFORE (shipping_method, picker_id, sales_order_id, packaging_id, scheduled_deliv, net_weight, shipper_name, external_note, packaging_type, bill_to, shipping_cost, fulfillment_id )
        PARENT-FIELDS-AFTER  (location_id,parent_fulfillment_id,location_name,manifest_number,picker_name,scheduled_pick_date,pick_timestamp, delivery_timestamp, packaging_weight, insured_value, bill_to_zip, internal_note, bill_to_account, fullfill_status, dock_number, route_id, delivery_latitude, shipper_id, scheduled_ship_date, acceptance_timestamp, shipping_carrier, packaging_height, packaging_length, gross_weight, packaging_width, delivery_longitude, delivery_signer_location, packing_layer, truck_number, route_name, flag_message, delivery_signer_name, tracking_number, packing_row, ship_timestamp).

DATASET dsData:READ-XML("file", "c:\temp\sample-data.xml", "empty", ?, ?, ?, ?).

/* Output dataset just to have a reference to compare to the input... */
DATASET dsData:WRITE-XML("file","c:\temp\output-data.xml").

/* Iterate on temp-tables */
FOR EACH ttFulfillments :
    DISPLAY ttFulfillments.

    FOR EACH ttShipTo WHERE ttShipTo.parent_recid = RECID(ttFulfillments):
        DISPLAY ttShipTo EXCEPT ttShipTo.parent_recid.
    END.

END.