Вложение нескольких таблиц / запросов при экспорте в XML

Есть ли способ использовать Application.ExportXML способ не только объединить несколько запросов, но и вложить запросы друг в друга?

Например, скажем, у меня есть три таблицы. Я уже могу использовать Application.ExportXML способ объединить три вместе. Основные запросы, которые я не хочу повторять, не повторяются, а тот, который содержит всю информацию о клиенте, повторяется. Хорошо.

Но это получается так (по разным параноидальным причинам я использую поддельные данные):

<DogCare>
  <Facility>Twin Peaks</Facility>
  <Year>1992</Year>
  <Month>1</Month>
</DogCare>
<DogTeam>
  <Team>DogWalker</Team>
  <DogsWalked>24</DogsWalked>
  <TreatsGiven>900</TreatsGiven>
</DogTeam>
<PetWalkTime>
  <Name>Palmer</Name>
  <Age>7</Age>
  <FavoriteSnack>Cheese</FavoriteSnack>
  <FavThingtoDo>Chew Shoes</FavThingtoDo>
  <Day>1</Day>
  <DidBusiness>Yes</DidBusiness>
  <Barked>Constantly</Barked>
  <PulledonLeash>Whole Time</PulledonLeash>
  <DeservesTreat>Gave it Anyway</DeservesTreat>
</PetWalkTime>
<PetWalkTime>
  <Name>Laura</Name>
  <Age>5</Age>
  <FavoriteSnack>Pie</FavoriteSnack>
  <FavThingtoDo>Fetch</FavThingtoDo>
  <Day>1</Day>
  <DidBusiness>Yes</DidBusiness>
  <Barked>No</Barked>
  <PulledonLeash>No</PulledonLeash>
  <DeservesTreat>Gave Several</DeservesTreat>
</PetWalkTime>

Сейчас. "DogCare","DogTeam" и "PetWalkTime" являются отдельными запросами. Тем не менее, они все связаны и принадлежат друг другу так:

<DogCare>
  <Facility>Twin Peaks</Facility>
  <Year>1992</Year>
  <Month>2</Month>
  <DogTeam>
    <Team>DogWalker</Team>
    <DogsWalked>24</DogsWalked>
    <TreatsGiven>900</TreatsGiven>
    <PetWalkTime>
        <Name>Palmer</Name>
        <FavoriteSnack>Cheese</FavoriteSnack>
        <FavThingtoDo>Chew Shoes</FavThingtoDo>
        <Day>1</Day>
        <DidBusiness>Yes</DidBusiness>
        <Barked>Constantly</Barked>
        <PulledonLeash>Whole Time</PulledonLeash>
        <DeservesTreat>Gave it Anyway</DeservesTreat>
    </PetWalkTime>
    <PetWalkTime>
         <Name>Laura</Name>
         <FavoriteSnack>Pie</FavoriteSnack>
         <FavThingtoDo>Fetch</FavThingtoDo>
         <Day>1</Day>
         <DidBusiness>Yes</DidBusiness>
         <Barked>No</Barked>
         <PulledonLeash>No</PulledonLeash>
         <DeservesTreat>Gave Several</DeservesTreat>
    </PetWalkTime>
  </DogTeam>
</DogCare>

Есть ли способ сделать этот последний возможным на экспорт?

1 ответ

Решение

Да, Application.ExportXML может экспортировать правильный вложенный XML при условии, что

  1. вы экспортируете таблицы (не запросы) и
  2. вы установили отношения в доступе (иначе ограничения внешнего ключа) между таблицами

Relationships.png

Если какое-либо из этих условий не выполняется, даже если вы используете метод, описанный в статье MSDN, вы все равно получите "последовательный" XML:

<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2014-11-21T13:43:50">
    <DogCare>
        <ID>1</ID>
        <Facility>Twin Peaks</Facility>
    </DogCare>
    <DogTeam>
        <TeamID>1</TeamID>
        <ParentID>1</ParentID>
        <Team>DogWalker</Team>
    </DogTeam>
    <PetWalkTime>
        <WalkID>1</WalkID>
        <TeamID>1</TeamID>
        <Name>Palmer</Name>
        <Age>7</Age>
    </PetWalkTime>
    <PetWalkTime>
        <WalkID>2</WalkID>
        <TeamID>1</TeamID>
        <Name>Laura</Name>
        <Age>5</Age>
    </PetWalkTime>
</dataroot>

Однако, если оба условия соблюдены, мы можем получить "вложенный" XML, как этот

<?xml version="1.0" encoding="UTF-8"?>
<dataroot xmlns:od="urn:schemas-microsoft-com:officedata" generated="2014-11-21T13:52:50">
    <DogCare>
        <ID>1</ID>
        <Facility>Twin Peaks</Facility>
        <DogTeam>
            <TeamID>1</TeamID>
            <ParentID>1</ParentID>
            <Team>DogWalker</Team>
            <PetWalkTime>
                <WalkID>1</WalkID>
                <TeamID>1</TeamID>
                <Name>Palmer</Name>
                <Age>7</Age>
            </PetWalkTime>
            <PetWalkTime>
                <WalkID>2</WalkID>
                <TeamID>1</TeamID>
                <Name>Laura</Name>
                <Age>5</Age>
            </PetWalkTime>
        </DogTeam>
    </DogCare>
</dataroot>

используя такой код

Option Compare Database
Option Explicit

Sub XmlExportTest()
    Dim objTeam As AdditionalData, objWalk As AdditionalData
    Set objTeam = Application.CreateAdditionalData
    Set objWalk = objTeam.Add("DogTeam")
    objWalk.Add "PetWalkTime"
    Application.ExportXML _
            ObjectType:=acExportTable, _
            DataSource:="DogCare", _
            DataTarget:="C:\Users\Gord\Desktop\DogData.xml", _
            AdditionalData:=objTeam
End Sub
Другие вопросы по тегам