テーブル
本製品 は、OData サービスドキュメントで定義されたすべてのエンティティセットとシングルトンのテーブルを公開します。これらのテーブルのエンティティは、標準のSQL INSERT、UPDATE、DELETE ステートメントを使用して、挿入、更新、削除することができます。
SQL でのDeep Insert の実行
本製品 では、ナビゲーションプロパティを指定することで、ベースエンティティの作成と関連エンティティへのリンクを同時に行うOData Deep Insert をサポートしています。エンティティのナビゲーションプロパティ を指定するには、ナビゲーションプロパティ用にテンポラリテーブルを作成し、ベーステーブルへの挿入でテンポラリテーブルを参照します。テンポラリテーブルは、ベーステーブルの適切なナビゲーションプロパティカラムで参照します。各ナビゲーションプロパティカラムには、"Linked" という単語が接頭辞として付きます。
テンポラリテーブルを定義し、同じ接続内でベースエンティティに挿入する必要があることに注意してください。 あるいは、テンポラリテーブルの代わりにJSON/XML 集計を指定することもできます。
例:SAP Gateway のDeep Insert
例えば、GWSAMPLE_BASIC サービスを考えてみましょう。GWSAMPLE_BASIC には、SalesOrder テーブルがあります。SalesOrder を作成する際は、新しいSalesOrderLineItem と既存のBusinessPartner を指定する必要があります。これを行うには、以下のナビゲーションプロパティを指定します。
テンポラリテーブルの作成
各ナビゲーションプロパティに対応するテンポラリテーブルに関連エンティティを挿入します。既存のエンティティの主キーを指定することも、新しいエンティティを挿入することもできます。
- SalesOrderLineItems:以下のステートメントは、2つのSalesOrderLineItems をSalesOrder に追加します。
INSERT INTO SalesOrderLineItems#TEMP (ProductID, Quantity) VALUES ('P001', 15) INSERT INTO SalesOrderLineItems#TEMP (ProductID, Quantity) VALUES ('P002', 10)
- BusinessPartners:以下のステートメントは、既存のBusinessPartner を指定します。
INSERT INTO BusinessPartners#TEMP (BusinessPartnerID) VALUES ('BP001')
Note: BusinessPartner は、SalesOrder のCustomerID プロパティで直接指定することもできます。この例では、適切な外部キーが常に利用できるとは限らないため、このカラムを使用していません。
CData ADO.NET Provider for SAP Gateway は、BusinessPartner がすでに存在するとみなし、主キーのみが指定されているため、既存のリファレンスにのみリンクします。SalesOrderLines の例のように、主キー以外のキーが定義されている場合、CData ADO.NET Provider for SAP Gateway は新しいエントリを作成しようと試み、Deep Insert をトリガーします。
エンティティの挿入
ベースエンティティのINSERT ステートメントで、LinkedToLineItems およびLinkedToBusinessPartner カラムのテンポラリテーブルを参照します。
INSERT INTO SalesOrders (Note, LinkedToLineItems, LinkedToBusinessPartner)
VALUES ('New sales order', 'SalesOrderLineItems#TEMP', 'BusinessPartners#TEMP')
サンプルコード
以下は新しいExternalUser を作成するための完全なコードです。ODataConnection odconn = new ODataConnection(connectionStr);
odconn.Open();
ODataCommand odcmd = new ODataCommand("INSERT INTO SalesOrderLineItems#TEMP (ProductID, Quantity) VALUES ('P001', 15)", odconn);
odcmd.ExecuteNonQuery();
odcmd.CommandText = "INSERT INTO SalesOrderLineItems#TEMP (ProductID, Quantity) VALUES ('P002', 10)";
odcmd.ExecuteNonQuery();
odcmd.CommandText = "INSERT INTO BusinessPartners#TEMP (BusinessPartnerID) VALUES ('BP001')";
odcmd.ExecuteNonQuery();
odcmd.CommandText = "INSERT INTO SalesOrders (Note, LinkedToLineItems, LinkedToBusinessPartner) VALUES ('New sales order', 'SalesOrderLineItems#TEMP', 'BusinessPartners#TEMP')";
odcmd.ExecuteNonQuery();
odconn.Close();
集計の使用
以下は、複数のOrder Line Items をJSON 集計として指定する例です。INSERT INTO SalesOrderSet (Note, CustomerID, LinkedToLineItems) VALUES ('New sales order', '0100000001', '
[
{
"ProductID": "HT-1001",
"Quantity": 2,
"Note": "Test aggregate 1",
"DeliveryDate": "2024-12-20 13:20:10"
},
{
"ProductID": "HT-1001",
"Quantity": 4,
"Note": "Test aggregate 2",
"DeliveryDate": "2024-12-20 13:20:10"
}
]
')