2011-10-31 10 views
2

希望している人が私に持っている問題を手伝ってもらうことができます。私たちは、ERPシステムと相互作用し、ODataを使用してRESTサービスを介してビジネスオブジェクトを公開する新しい製品を使用しています。彼らはいくつかのサンプルと私が終わったことを持っていますが、私たちは製品を使ってみようとしている重要なプロセスに取り組んでいます。ネストされたアイテムを使用したC#OData Create(POST)リクエスト

FirefoxでRESTクライアントで手動でPOSTリクエストを作成でき、ERPシステムが要求を受け入れてドキュメントを問題なく作成できるため、要求を受け入れるサーバー側でバックエンドを処理しています。

問題は、単純なC#コンソールアプリケーションでプログラムでリクエストを作成しようとしていますが、リクエストを正しく作成することができません。私は手動で要求を作成した場合(ソフトウェアのベンダーからの指示に従って)、サーバーが要求を受け入れ、今、

<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> 

:ここ

はのODataサービスの$メタデータがどのように見えるかです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#で次のコードを使用すると、リクエストの一部になるアイテムを取得できません。彼らはちょうど表示されません。

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); 
     } 

しかし、これは、生成された要求である:ここではC#がある

<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> 

私は、これは理にかなって...任意のヘルプははるかに高く評価されている願っています。あなたが明示的にこれらのオブジェクト間のリンクがあることがデータサービスコンテキスト(SER)を指示する必要があり

おかげ

+0

独立した操作または複数の関連するエントリを作成する - エントリ間のリンクが構造的に可能な場合 - エントリツリーで単一のPOSTを実行できる " これはまさに私が望むものであり、私が達成する必要があるもの、私はちょうどそれを行う方法を理解することはできません! – uwhuskies

答えて

0

まあ、MSフォーラム上の人によると、このタイプの深い挿入要求は現在WCF DSクライアントではサポートされていません。

メガバマー。あなたは、クライアントがする必要がある場合」で始まる段落までスクロールダウンしている場合 http://www.odata.org/developers/protocols/operations#CreatingnewEntries :また、このODATAサイト上のIを見つけた

0

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

関連する問題