2011-10-31 46 views
2

希望我能有人幫我解決我遇到的問題。我們正在使用與ERP系統交互的新產品,並使用OData通過REST服務公開業務對象。他們有一些樣品和我經歷過的所有事情,但我一直在試圖使用該產品的關鍵流程,即在一個請求中創建包含多個項目的銷售文檔。C#OData使用嵌套項目創建(POST)請求

我已經在服務器端接受請求的後端工作,因爲我可以使用Firefox中的REST客戶端手動創建POST請求,並且ERP系統接受請求並創建文檔沒有問題。

問題是,我想通過一個簡單的C#控制檯應用程序以編程方式創建請求,但無法正確創建請求。

這裏是什麼OData服務的$元的樣子:

<edmx:Edmx xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" xmlns:gp="http://www.sap.com/Protocols/SAPData/GenericPlayer" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:sap="http://www.sap.com/Protocols/SAPData" Version="1.0"> 
    <edmx:DataServices m:DataServiceVersion="2.0"> 
    <Schema xmlns="http://schemas.microsoft.com/ado/2008/09/edm" Namespace="SALES_ORDER"> 
     <EntityType Name="SalesOrderHeader" sap:content-version="1"> 
     <Key> 
      <PropertyRef Name="OrderId"/> 
     </Key> 
     <Property Name="OrderId" Type="Edm.String" Nullable="false" MaxLength="10" sap:label="Sales Document" sap:filterable="false"/> 
     <Property Name="DocumentType" Type="Edm.String" MaxLength="4" sap:label="Sales Doc. Type" sap:filterable="false"/> 
     <Property Name="DocumentDate" Type="Edm.DateTime" Precision="10" sap:label="Document Date" sap:filterable="false"/> 
     <Property Name="CustomerId" Type="Edm.String" MaxLength="10" sap:label="Sold-to party" sap:filterable="true"/> 
     <Property Name="SalesOrg" Type="Edm.String" MaxLength="4" sap:label="Sales Org." sap:filterable="false"/> 
     <Property Name="DistChannel" Type="Edm.String" MaxLength="2" sap:label="Distr. Channel" sap:filterable="false"/> 
     <Property Name="Division" Type="Edm.String" MaxLength="2" sap:label="Division" sap:filterable="false"/> 
     <Property Name="OrderValue" Type="Edm.Decimal" Precision="21" Scale="2" sap:label="Net value" sap:filterable="false"/> 
     <Property Name="Currency" Type="Edm.String" MaxLength="5" sap:label="Doc. Currency" sap:filterable="false" sap:semantics="currency-code"/> 
     <NavigationProperty Name="SalesOrderItems" Relationship="SALES_ORDER.SalesOrderHeader_SalesOrderItems" FromRole="FromRole_SalesOrderHeader_SalesOrderItem" ToRole="ToRole_SalesOrderItem_SalesOrderHeader"/> 
     </EntityType> 
     <EntityType Name="SalesOrderItem" sap:content-version="1"> 
     <Key> 
      <PropertyRef Name="OrderId"/> 
      <PropertyRef Name="Item"/> 
     </Key> 
     <Property Name="OrderId" Type="Edm.String" Nullable="false" MaxLength="10" sap:label="Sales Document" sap:filterable="false"/> 
     <Property Name="Item" Type="Edm.String" Nullable="false" MaxLength="6" sap:label="Item" sap:filterable="false"/> 
     <Property Name="Material" Type="Edm.String" MaxLength="18" sap:label="Material" sap:filterable="false"/> 
     <Property Name="Description" Type="Edm.String" MaxLength="40" sap:label="Description" sap:filterable="false"/> 
     <Property Name="Plant" Type="Edm.String" MaxLength="4" sap:label="Plant" sap:filterable="false"/> 
     <Property Name="Quantity" Type="Edm.Decimal" Precision="19" Scale="3" sap:label="Order quantity" sap:filterable="false"/> 
     <Property Name="UOM" Type="Edm.String" MaxLength="3" sap:label="Sales unit" sap:filterable="false" sap:semantics="unit-of-measure"/> 
     <Property Name="Value" Type="Edm.Decimal" Precision="21" Scale="2" sap:label="Net value" sap:filterable="false"/> 
     <NavigationProperty Name="SalesOrderHeader" Relationship="SALES_ORDER.SalesOrderItem_SalesOrderHeader" FromRole="FromRole_SalesOrderItem_SalesOrderHeader" ToRole="ToRole_SalesOrderHeader_SalesOrderItem"/> 
     </EntityType> 
     <Association Name="SalesOrderHeader_SalesOrderItems" sap:content-version="1"> 
     <End Type="SALES_ORDER.SalesOrderHeader" Multiplicity="1" Role="FromRole_SalesOrderHeader_SalesOrderItem"/> 
     <End Type="SALES_ORDER.SalesOrderItem" Multiplicity="*" Role="ToRole_SalesOrderItem_SalesOrderHeader"/> 
     </Association> 
     <Association Name="SalesOrderItem_SalesOrderHeader" sap:content-version="1"> 
     <End Type="SALES_ORDER.SalesOrderItem" Multiplicity="1" Role="FromRole_SalesOrderItem_SalesOrderHeader"/> 
     <End Type="SALES_ORDER.SalesOrderHeader" Multiplicity="1" Role="ToRole_SalesOrderHeader_SalesOrderItem"/> 
     </Association> 
     <EntityContainer Name="SALES_ORDER" m:IsDefaultEntityContainer="true"> 
     <EntitySet Name="SalesOrderHeaders" EntityType="SALES_ORDER.SalesOrderHeader" sap:content-version="1"/> 
     <EntitySet Name="SalesOrderItems" EntityType="SALES_ORDER.SalesOrderItem" sap:content-version="1"/> 
     <AssociationSet Name="AssocSet_SalesOrderHeader_SalesOrderItems" Association="SALES_ORDER.SalesOrderHeader_SalesOrderItems" sap:content-version="1"> 
      <End EntitySet="SalesOrderHeaders" Role="FromRole_SalesOrderHeader_SalesOrderItem"/> 
      <End EntitySet="SalesOrderItems" Role="ToRole_SalesOrderItem_SalesOrderHeader"/> 
     </AssociationSet> 
     <AssociationSet Name="AssocSet_SalesOrderItem_SalesOrderHeader" Association="SALES_ORDER.SalesOrderItem_SalesOrderHeader" sap:content-version="1"> 
      <End EntitySet="SalesOrderItems" Role="FromRole_SalesOrderItem_SalesOrderHeader"/> 
      <End EntitySet="SalesOrderHeaders" Role="ToRole_SalesOrderHeader_SalesOrderItem"/> 
     </AssociationSet> 
     </EntityContainer> 
    </Schema> 
    </edmx:DataServices> 
</edmx:Edmx> 

現在,如果我手動創建一個請求(以下從軟件的供應商提供的說明),服務器接受請求,並在ERP系統中創建文檔。這是請求的樣子:

<?xml version="1.0" encoding="UTF-8"?> 
<atom:entry 
xmlns:atom="http://www.w3.org/2005/Atom" 
xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" 
xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"> 
    <atom:content type="application/xml"> 
    <m:properties> 
     <d:DocumentType>ZCSH</d:DocumentType> 
     <d:CustomerId>0001008657</d:CustomerId> 
     <d:SalesOrg>1100</d:SalesOrg> 
     <d:DistChannel>10</d:DistChannel> 
     <d:Division>40</d:Division> 
    </m:properties> 
    </atom:content> 
    <atom:link 
    href="SalesOrderHeaders(0000004970)/SalesOrderItems" 
    rel="http://schemas.microsoft.com/ado/2007/08/dataservices/related/SalesOrderItems" 
    type="application/atom+xml;type=feed" 
    title="SALES_ORDER.SalesOrderHeader_SalesOrderItems"> 
    <m:inline> 
     <atom:feed> 
     <atom:entry> 
      <atom:content type="application/xml"> 
      <m:properties> 
       <d:Item>000010</d:Item> 
       <d:Material>70000559</d:Material> 
       <d:Plant>570B</d:Plant> 
       <d:Quantity m:Type="Edm.Decimal">1.000</d:Quantity> 
      </m:properties> 
      </atom:content> 
     </atom:entry> 
     <atom:entry> 
      <atom:content type="application/xml"> 
      <m:properties> 
       <d:Item>000020</d:Item> 
       <d:Material>70000559</d:Material> 
       <d:Plant>570B</d:Plant> 
       <d:Quantity m:Type="Edm.Decimal">5</d:Quantity> 
      </m:properties> 
      </atom:content> 
     </atom:entry> 
     </atom:feed> 
    </m:inline> 
    </atom:link> 
</atom:entry> 

但是,在C#中使用下面的代碼,我無法讓項目成爲請求的一部分。他們只是不顯示。下面是C#:

ServiceReference4.SALES_ORDER ser = new ServiceReference4.SALES_ORDER(uri); 
     NetworkCredential c = nc; 

     ser.WritingEntity += new EventHandler<System.Data.Services.Client.ReadingWritingEntityEventArgs>(ser_WritingEntity); 
     ser.SendingRequest += new EventHandler<System.Data.Services.Client.SendingRequestEventArgs>(ser_SendingRequest); 
     ser.Credentials = c; 

     ServiceReference4.SalesOrderHeader soHeader = new ServiceReference4.SalesOrderHeader(); 
     ServiceReference4.SalesOrderItem soItem = new ServiceReference4.SalesOrderItem(); 

     soHeader = ServiceReference4.SalesOrderHeader.CreateSalesOrderHeader(""); 
     soHeader.DocumentType = "ZCSH"; 
     soHeader.DistChannel = "10"; 
     soHeader.Division = "40"; 
     soHeader.SalesOrg = "1100";    

     soItem = ServiceReference4.SalesOrderItem.CreateSalesOrderItem("", "10".PadLeft(6, '0')); 
     soItem.Material = "70000559".PadLeft(18, '0'); 
     soItem.Plant = "570B"; 
     soItem.Quantity = 1; 

     soItem.SalesOrderHeader = soHeader; 
     soHeader.SalesOrderItems.Add(soItem); 

     ser.AddToSalesOrderHeaders(soHeader); 

     try 
     {     
      System.Data.Services.Client.DataServiceResponse resp = ser.SaveChanges(); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message + Environment.NewLine + ex.InnerException); 
     } 

但是,這是生成請求:

<entry xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns="http://www.w3.org/2005/Atom"> 
    <category scheme="http://schemas.microsoft.com/ado/2007/08/dataservices/scheme" term="SALES_ORDER.SalesOrderHeader" /> 
    <title /> 
    <author> 
    <name /> 
    </author> 
    <updated>2011-10-31T20:27:42.5387007Z</updated> 
    <id>http://.../sap/opu/sdata/sap/SALES_ORDER/SalesOrderHeaders('')</id> 
    <content type="application/xml"> 
    <m:properties> 
     <d:Currency m:null="true" /> 
     <d:CustomerId m:null="true" /> 
     <d:DistChannel>10</d:DistChannel> 
     <d:Division>40</d:Division> 
     <d:DocumentDate m:type="Edm.DateTime" m:null="true" /> 
     <d:DocumentType>ZCSH</d:DocumentType> 
     <d:OrderId m:null="false" /> 
     <d:OrderValue m:type="Edm.Decimal" m:null="true" /> 
     <d:SalesOrg>1100</d:SalesOrg> 
    </m:properties> 
    </content> 
</entry> 

我希望這是有道理的......任何的幫助深表感謝。

感謝

+0

另外我對OData的網站上發現這一點: http://www.odata.org/developers/protocols/operations#CreatingnewEntries 如果你向下滾動的段落開頭「當客戶需要創建多個相關的條目,它可以作爲獨立的操作,或者如果條目之間的鏈接允許它在結構上 - 它們可以使用條目樹「 執行單個POST」這正是我想要的,並且顯示的POST請求只是我需要完成什麼,我只是不知道該怎麼做! – uwhuskies

回答

0

那麼,根據MS論壇上的討論,這種類型的深度插入請求現在不受WCF DS客戶端支持。

非常無趣。

0

你需要明確地告訴有這些對象之間的鏈接的數據服務上下文(SER)。看看AddLinkSetLink方法。這些頁面上的例子非常接近你想要做的事情。

底線,我想你需要添加:

ser.AddLink(soHeader, "SalesOrderItems", soItem); 
ser.SetLink(soItem, "SalesOrderHeader", soHeader); 

希望這有助於。

+0

三角形,感謝您的回覆。我用這個把我的頭靠在牆上。我嘗試了你的建議,但結果是一樣的,請求仍然看起來一樣。 – uwhuskies

+0

我只注意到你沒有將SalesOrderItem添加到數據服務上下文中。你可以嘗試添加ser.AddToSalesOrderItems(soItems);並看看是否有幫助? –

+0

剛剛嘗試過,結果相同......這裏是我現在擁有的:'ser.AddToSalesOrderHeaders(soHeader); ser.AddToSalesOrderItems(soItem); ser.AddLink(soHeader,「SalesOrderItems」,soItem);' – uwhuskies