可能 DB.TOXML 错误? (AIX 上的 UniVerse 11.3.1)

Possible DB.TOXML bug? (UniVerse 11.3.1 on AIX)

根据我对与 DB.TOXML 相关的 XMAP 规范的理解,以下 XMAP 表示一个简单的 object 模型,其中包含两个具有相同 child table 的 [= =49=] table.

命令 DB.TOXML CUST_ACT.XML XMAP_CustomerActivity.XML 生成一个 XML 文件,其中包含 parent table 和 child [=53= 之一的记录和字段] 符合预期。 但是,另一个child table的每个记录的字段在记录节点内重复一次。如果我切换childTableMaps,在parentTABLECLASSMAP,问题切换到另一个childtable.

似乎在 parent 映射中指定了多个 (child) TableMap 时,来自 child 映射中的 table 的字段被引用第一个 (child) TableMap 条目在 table 的记录节点中重复 TableMap 次 。在具有更复杂的 object 模型的 real-world UniVerse 数据库环境中开发进程时注意到了此行为。

为了确认,我创建了简单的 CUSTOMER / CONTACT、CUSTOMER / ORDER 文件和一些测试记录以供演示。如果这是一个错误而不是我的 XMAP 配置错误,那么 XMAPCreate() API 函数或 XMAPAppendRec() API 函数可能无法正确支持此结构。

XMAP:
     ?xml version="1.0" encoding="UTF-8"?>
    <!-- DOCTYPE U2XMAP SYSTEM "U2XMAP.DTD" -->
    <U2XMAP version="1.0" Name="XMAP1" >
        <!-- Table/Class map XCLASS_CLASS -->
        <TABLECLASSMAP MapName="M1" StartNode="/Customers/Customer" TableName="CUSTOMERTBL">
            <ColumnMap Node="CustKey" Column="CKEY"/>
            <ColumnMap Node="Name" Column="CNAME" />
            <TableMap Node="Orders/Order" MapName="M2" />
            <TableMap Node="Contact/Methods" MapName="M3" />
        </TABLECLASSMAP>
        <TABLECLASSMAP MapName="M2" StartNode="Orders/Order" TableName="ORDERTBL">
            <ColumnMap Node="CustKey" Column="C.KEY" />
            <ColumnMap Node="OrderKey" Column="@ID" />
            <ColumnMap Node="OrderDate" Column="ORDERDATE" />
            <ColumnMap Node="ProductId" Column="PRODUCTID" />
        </TABLECLASSMAP>
        <TABLECLASSMAP MapName="M3" StartNode="Contact/Methods" TableName="CONTACTMETHTBL">
            <ColumnMap Node="CustKey" Column="C.KEY" />
            <ColumnMap Node="ContactKey" Column="@ID" />
            <ColumnMap Node="Type" Column="TYPE" />
            <ColumnMap Node="Address" Column="ADDRESS" />
        </TABLECLASSMAP>
        <RelatedTable>
            <MapParentKey TableName="CUSTOMERTBL" Column="CKEY" KeyGenerate="No" />
            <MapChildKey TableName="ORDERTBL" Column="CKEY" />
        </RelatedTable>
        <RelatedTable>
            <MapParentKey TableName="CUSTOMERTBL" Column="CKEY" KeyGenerate="No" />
            <MapChildKey TableName="CONTACTMETHTBL" Column="CKEY" />
        </RelatedTable>
    </U2XMAP>
RESULT:
    <?xml version="1.0" encoding="utf-8" standalone="yes" ?>
    <Customers>
      <Customer>
        <CustKey>1</CustKey>
        <Name>MOUSE, MICKEY</Name>
        <Orders>
          <Order>
            <CustKey>1</CustKey>
            <OrderKey>10</OrderKey>
            <OrderDate>01-04-2022</OrderDate>
            <ProductId>555R3232</ProductId>
            <CustKey>1</CustKey>
            <OrderKey>10</OrderKey>
            <OrderDate>01-04-2022</OrderDate>
            <ProductId>555R3232</ProductId>
          </Order>
          <Order>
            <CustKey>1</CustKey>
            <OrderKey>1</OrderKey>
            <OrderDate>12-27-2021</OrderDate>
            <ProductId>5323423</ProductId>
            <CustKey>1</CustKey>
            <OrderKey>1</OrderKey>
            <OrderDate>12-27-2021</OrderDate>
            <ProductId>5323423</ProductId>
          </Order>
          <Order>
            <CustKey>1</CustKey>
            <OrderKey>2</OrderKey>
            <OrderDate>12-28-2021</OrderDate>
            <ProductId>9299399</ProductId>
            <CustKey>1</CustKey>
            <OrderKey>2</OrderKey>
            <OrderDate>12-28-2021</OrderDate>
            <ProductId>9299399</ProductId>
          </Order>
          <Order>
            <CustKey>1</CustKey>
            <OrderKey>3</OrderKey>
            <OrderDate>12-29-2021</OrderDate>
            <ProductId>23492349</ProductId>
            <CustKey>1</CustKey>
            <OrderKey>3</OrderKey>
            <OrderDate>12-29-2021</OrderDate>
            <ProductId>23492349</ProductId>
          </Order>
        </Orders>
        <Contact>
          <Methods>
            <CustKey>1</CustKey>
            <ContactKey>1</ContactKey>
            <Type>HOMEPH</Type>
            <Address>444-555-6666</Address>
          </Methods>
          <Methods>
            <CustKey>1</CustKey>
            <ContactKey>2</ContactKey>
            <Type>HOMEST</Type>
            <Address>580 LIBERTY CIR</Address>
          </Methods>
        </Contact>
      </Customer>
      <Customer>
        <CustKey>2</CustKey>
        <Name>FROG, KERMIT</Name>
        <Orders>
          <Order>
            <CustKey>2</CustKey>
            <OrderKey>4</OrderKey>
            <OrderDate>12-29-2021</OrderDate>
            <ProductId>99338822</ProductId>
            <CustKey>2</CustKey>
            <OrderKey>4</OrderKey>
            <OrderDate>12-29-2021</OrderDate>
            <ProductId>99338822</ProductId>
          </Order>
          <Order>
            <CustKey>2</CustKey>
            <OrderKey>5</OrderKey>
            <OrderDate>12-28-2021</OrderDate>
            <ProductId>23874771</ProductId>
            <CustKey>2</CustKey>
            <OrderKey>5</OrderKey>
            <OrderDate>12-28-2021</OrderDate>
            <ProductId>23874771</ProductId>
          </Order>
        </Orders>
        <Contact>
          <Methods>
            <CustKey>2</CustKey>
            <ContactKey>3</ContactKey>
            <Type>HOMEPH</Type>
            <Address>777-888-9999</Address>
          </Methods>
          <Methods>
            <CustKey>2</CustKey>
            <ContactKey>4</ContactKey>
            <Type>WORKPH</Type>
            <Address>909-090-0909</Address>
          </Methods>
        </Contact>
      </Customer>
      <Customer>
        <CustKey>3</CustKey>
        <Name>BIRD, BIG</Name>
        <Orders>
          <Order>
            <CustKey>3</CustKey>
            <OrderKey>6</OrderKey>
            <OrderDate>12-30-2021</OrderDate>
            <ProductId>83776632</ProductId>
            <CustKey>3</CustKey>
            <OrderKey>6</OrderKey>
            <OrderDate>12-30-2021</OrderDate>
            <ProductId>83776632</ProductId>
          </Order>
          <Order>
            <CustKey>3</CustKey>
            <OrderKey>7</OrderKey>
            <OrderDate>12-30-2021</OrderDate>
            <ProductId>R29898W9</ProductId>
            <CustKey>3</CustKey>
            <OrderKey>7</OrderKey>
            <OrderDate>12-30-2021</OrderDate>
            <ProductId>R29898W9</ProductId>
          </Order>
          <Order>
            <CustKey>3</CustKey>
            <OrderKey>8</OrderKey>
            <OrderDate>12-31-2021</OrderDate>
            <ProductId>23884888</ProductId>
            <CustKey>3</CustKey>
            <OrderKey>8</OrderKey>
            <OrderDate>12-31-2021</OrderDate>
            <ProductId>23884888</ProductId>
          </Order>
          <Order>
            <CustKey>3</CustKey>
            <OrderKey>9</OrderKey>
            <OrderDate>12-29-2021</OrderDate>
            <ProductId>29993999</ProductId>
            <CustKey>3</CustKey>
            <OrderKey>9</OrderKey>
            <OrderDate>12-29-2021</OrderDate>
            <ProductId>29993999</ProductId>
          </Order>
        </Orders>
        <Contact>
          <Methods>
            <CustKey>3</CustKey>
            <ContactKey>5</ContactKey>
            <Type>HOMEPH</Type>
            <Address>405-040-5040</Address>
          </Methods>
        </Contact>
      </Customer>
    </Customers>

有什么想法吗?提前致谢。 AIX 上的 UniVerse 11.3.1。

我也发布了这个问题 here 但没有得到太多曝光。 (在这里您可以更好地看到以红色突出显示的重复条目)。

看起来这对我来说可能是一个错误。我在 Linux 下用 11.3.2 测试了它,我注意到了相同的行为。这可能是系统限制,但如果是这种情况,我预计映射调用会失败,因为它似乎非常特殊。

我会用 Rocket 开票。我使用 UniVerse 附带的 HS.SALES 演示数据进行复制。我将在此处提供,供您在报告中使用。如果支持人员已经在处理相同的数据,那么确认错误或告诉您我们共同做错了什么会容易得多。

<?xml version="1.0" encoding="UTF-8"?>
<!-- DOCTYPE U2XMAP SYSTEM "U2XMAP.DTD" -->
<U2XMAP version="1.0" Name="XMAP1" >
    <!-- Table/Class map XCLASS_CLASS -->
    <TABLECLASSMAP MapName="M1" StartNode="/Customers/Customer" TableName="CUSTOMER">
        <ColumnMap Node="CustID" Column="@ID"/>
        <ColumnMap Node="FirstName" Column="FNAME"/>
        <ColumnMap Node="LastName" Column="LNAME" />
        <ColumnMap Node="State" Column="STATE" />
        <ColumnMap Node="ProductID" Column="PRODID" />
        <TableMap Node="States/State" MapName="M2" />
        <TableMap Node="Products/Product" MapName="M3" />
    </TABLECLASSMAP>
    <TABLECLASSMAP MapName="M2" StartNode="States/State" TableName="STATES">
        <ColumnMap Node="StateName" Column="NAME" />
    </TABLECLASSMAP>
    <TABLECLASSMAP MapName="M3" StartNode="Products/Product" TableName="PRODUCTS">
        <ColumnMap Node="Price" Column="LIST" />
        <ColumnMap Node="Description" Column="DESCRIPTION" />
    </TABLECLASSMAP>
    <RelatedTable>
        <MapParentKey TableName="CUSTOMER" Column="PRODID" KeyGenerate="No" />
        <MapChildKey TableName="PRODUCTS" Column="PRODID" />
    </RelatedTable>
    <RelatedTable>
        <MapParentKey TableName="CUSTOMER" Column="STATE" KeyGenerate="No" />
        <MapChildKey TableName="STATES" Column="CODE" />
    </RelatedTable>
</U2XMAP>

与此同时,如果您被阻止并且映射不是过于复杂,您可以将 I-Descriptors 和 TRANS(或 XLATE)添加到另一个文件以将其包含在父字典中,因此不需要任何额外的 table 映射。

祝你好运,