2

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

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

看起来,当在父映射中指定了多个(子)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。

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

4

1 回答 1

0

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

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

祝你好运,

于 2021-01-26T20:01:26.857 回答