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

问题描述

根据我对与 DB.TOXML 相关的 XMAP 规范的理解,以下 XMAP 表示一个简单的对象模型,其中包含两个具有相同父表的子表。

命令 DB.TOXML CUST_ACT.XML XMAP_CustomerActivity.XML 按预期生成一个 XML 文件,其中包含来自父表和子表之一的记录和字段。 然而,另一个子表的每条记录的字段在记录节点内重复一次。如果我切换子表 TableMaps,在父表 TABLECLASSMAP 中,问题会切换到另一个子表。

看起来,当父映射中指定了多个(子)TableMap 时,第一个(子)TableMap 条目引用的子映射中的表中的字段会重复 TableMap 次记录该表的节点。这种行为是在真实世界的 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 对其进行了测试,我注意到了相同的行为。这可能是系统限制,但如果是这种情况,我预计映射调用会失败,因为它似乎非常特殊。

我会用火箭开一张票。我使用 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)添加到另一个文件中以将其包含在父字典中,因此不需要任何额外的表映射。

祝你好运