Вложенный XML-экспорт родительских / дочерних данных из Access

#xml #vba #ms-access #ms-access-2007

#xml #vba #ms-access #ms-access-2007

Вопрос:

 Public Sub Click()

    Dim objOtherTbls As AdditionalData

        Set objOtherTbls = Application.CreateAdditionalData
        objOtherTbls.Add "vessels"
        objOtherTbls.Add "Export"

        Application.ExportXML ObjectType:=acExportTable, _
                    DataSource:="orderSummary", _
                    DataTarget:="pls.xml", _
                    AdditionalData:=objOtherTbls


End Sub
  

введите описание изображения здесь

Как мне сделать XML вложенным, а повторяющиеся поля повторяются только один раз?

 I would like something like:

 <vessels>
    <vessels ID>
        <product Id>
         <quantity>
        <product Id>
         <quantity> 
        <product Id>
         <quantity>
  

Как мне объединить таблицы и сделать их похожими на упомянутые выше, чтобы каждое имя судна было указано только один раз, и все элементы этого судна перечислены ниже и добавлены с вкладками?

Ответ №1:

Access использует «Отношения» для идентификации родительской / дочерней иерархии при экспорте в XML. В вашей базе данных, по-видимому, отсутствует связь между [сосудами] и [Экспорт], поэтому вы получаете «плоский» XML-экспорт двух таблиц, как показано в вопросе.

Если вы добавите связь в базу данных…

Отношения.png

… затем вы получите «вложенный» XML-экспорт, который вы ищете:

 <vessels>
  <vessel_id>2</vessel_id>
  <vessel_name>B</vessel_name>
</vessels>
<vessels>
  <vessel_id>3</vessel_id>
  <vessel_name>C</vessel_name>
  <Export>
     <product_id>10</product_id>
     <Quantity>10</Quantity>
     <vessel_id>3</vessel_id>
  </Export>
  <Export>
     <product_id>100</product_id>
     <Quantity>20</Quantity>
     <vessel_id>3</vessel_id>
  </Export>
  <Export>
     <product_id>1000</product_id>
     <Quantity>1</Quantity>
     <vessel_id>3</vessel_id>
  </Export>
  <Export>
     <product_id>10000</product_id>
     <Quantity>10</Quantity>
     <vessel_id>3</vessel_id>
  </Export>
  <Export>
     <product_id>10001</product_id>
     <Quantity>20</Quantity>
     <vessel_id>3</vessel_id>
  </Export>
  <Export>
     <product_id>10002</product_id>
     <Quantity>10</Quantity>
     <vessel_id>3</vessel_id>
  </Export>
</vessels>
  

Ответ №2:

Вот краткий набросок (для SQL DDL требуется режим запроса ANSI-92, но его можно воспроизвести с помощью инструментов Access GUI):

 CREATE TABLE vessels
( vessel_id INT NOT NULL UNIQUE, 
  vessel_name CHAR(1) WITH COMPRESSION NOT NULL UNIQUE );

CREATE TABLE Export
( product_id INT NOT NULL UNIQUE, 
  Quantity INT NOT NULL, CHECK ( Quantity >= 0 ),
  vessel_id INT NOT NULL 
     REFERENCES vessels ( vessel_id ) );

INSERT INTO vessels VALUES ( 1, 'A' );
INSERT INTO vessels VALUES ( 2, 'B' );
INSERT INTO vessels VALUES ( 3, 'C' );
INSERT INTO vessels VALUES ( 4, 'D' );
INSERT INTO vessels VALUES ( 5, 'E' );

INSERT INTO Export VALUES ( 10, 10, 3 );
INSERT INTO Export VALUES ( 100, 20, 3 );
INSERT INTO Export VALUES ( 1000, 1, 3 );
INSERT INTO Export VALUES ( 10000, 10, 3 );
INSERT INTO Export VALUES ( 10001, 20, 3 );
INSERT INTO Export VALUES ( 10002, 10, 3 );