注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
SAP ERP コネクターを使用すると、Foundry を SAP のオンプレミス ERP Central Component (ECC) および S/4 HANA(オンプレミスおよび Cloud Private Edition ↗)に接続できます。SAP ERP コネクターにより、Foundry は次のようなさまざまな種類の SAP データを扱うことができます。
SAP ERP ソースを使用するには、対象の SAP アプリケーション層に Palantir Foundry Connector 2.0 for SAP Applications アドオンをインストールする必要があります。
| セクション | 内容 |
|---|---|
| セットアップ | ソースの作成と接続の種類の設定。 |
| 認証 | サポートされている認証方式。 |
| ネットワークと接続 | エグレスポリシーと証明書。 |
| バッチ同期 | SAP オブジェクトタイプ、インクリメンタル(差分)同期、同期パラメーター。 |
| メディアセット | SAP のドキュメント管理システムからのメディアファイルの取り込み。 |
| Webhook | BAPI による SAP へのデータの書き戻し。 |
| コードリポジトリでの使用 | 外部トランスフォームまたは関数からの SAP アドオン REST API の直接呼び出し。 |
| 機能 | ステータス |
|---|---|
| 探索 | 🟢 一般提供 |
| バッチ同期 | 🟢 一般提供 |
| インクリメンタル(差分連携) | 🟢 一般提供 |
| メディアセット | 🟡 ベータ版 |
| Webhook | 🟢 一般提供 |
| 一括ライトバック | 🟢 一般提供 |
| コードリポジトリでの使用 | 🟢 一般提供 |
Foundry でのコネクターのセットアップについて詳しくはこちら。
SAP ERP コネクターは、2種類の接続をサポートしています。
| 接続の種類 | 説明 |
|---|---|
| Direct | SAP システムに直接接続します。これがデフォルトです。 |
| リモート(ゲートウェイ経由) | ゲートウェイを介してリモートの SAP システムに接続します。ゲートウェイ経由で接続トグルを有効にし、リモートシステムを識別するためのコンテキスト値を指定します。 |
接続の種類によって、利用可能な SAP オブジェクトタイプが決まります。リモート接続について詳しくはこちら。リモート Agent の設定について詳しくはこちら。
SAP ERP コネクターは、次の認証方式をサポートしています。
| 認証方式 | 説明 |
|---|---|
| 基本認証 | コネクターのインストール時に作成したテクニカルユーザーのユーザー名とパスワードを入力します。 |
| 認証トークン | 認証に使用するトークンを指定します。 |
| カスタム認証ヘッダー | カスタム認証ヘッダーを指定します。 |
| 認証なし | 証明書を使用して Agent マシン上で認証が設定されている場合は、この選択肢を使用します。 |
Foundry が SAP システムにアクセスできるように、エグレスポリシーを適切に設定してください。オンプレミスの SAP 環境では、トラフィックを正しくルーティングするために、通常は Agent プロキシポリシーが必要です。
多くの SAP システムではカスタム署名証明書が使用されており、初めて接続を設定するときに SSL ハンドシェイク例外が発生することがあります。システムの正しいカスタム証明書を入手し、ソースに追加してください。
Foundry と SAP Data Accelerator の統合は、開発のベータ版段階にあり、お使いのエンロールメントでは利用できない場合があります。開発が活発に行われている間は、機能が変更される可能性があります。
SAP Data Accelerator(SAP Cloud Connector を介して公開されるシステム向けの SAP のマネージド接続サービス)を通じてこの SAP システムにアクセスするには、ソースのホストとポートを Cloud Connector の仮想ホストとポートに設定します。次に、Palantir が提供するクライアント証明書を割り当て、SAP Data Accelerator のコントロールプレーンとデータプレーンへのエグレスを許可し、コントロールプレーンの URL を指定して SAP Data Accelerator プロパティを追加します。この接続経路では、Foundry ワーカーを使用する必要があります。
利用可能なオブジェクトタイプは、ソースに設定されている接続タイプによって異なります。
| オブジェクトタイプ | 直接 | リモート(Gateway 経由) | 説明 |
|---|---|---|---|
| ERP テーブル | ✓ | ✓ | SAP ABAP データディクショナリ内の任意の ERP テーブルまたはビューからデータを抽出します。クラスターテーブル、プールテーブル、カスタム Z* テーブルも含まれます。 |
| CDS ビュー | ✓ | ABAP CDS (Core Data Services) ビューからデータを抽出します。WITH PARAMETERS で宣言されたビューも含まれます。下記の CDS ビューのパラメーターを参照してください。 | |
| HANA ビュー | ✓ | SAP アプリケーション層で有効化された HANA ビューからデータを抽出します。前提条件については、SAP から HANA ビューを取り込むを参照してください。 | |
| BW コンテンツエクストラクター | ✓ | ERP Business Content エクストラクターを実行します。ソースで Gateway 経由で接続が有効になっており、コンテキストの値が設定されている場合にのみ、オブジェクトタイプのドロップダウンに表示されます。デルタ抽出をサポートするエクストラクターには APPEND を使用します。エクストラクターを設定するを参照してください。 | |
| トランザクションコード | ✓ | ✓ | SAP トランザクションコードまたは ABAP レポートを実行し、表示された出力を取り込みます。下記のトランザクションコードのパラメーターを参照してください。 |
| 汎用モジュール | ✓ | ✓ | SAP 汎用モジュール(BAPI など)を呼び出し、構造化されたレスポンスを取り込みます。下記の汎用モジュールのパラメーターを参照してください。 |
インクリメンタル同期では、同じテーブルから APPEND 形式のトランザクションを実行できます。インクリメンタル同期を有効にするには、トランザクションタイプを APPEND に設定します。
利用可能なインクリメンタルモードは、オブジェクトタイプによって異なります。
| インクリメンタルモード | ERP テーブル | CDS ビュー | HANA ビュー | BW コンテンツエクストラクター |
|---|---|---|---|---|
| 複数フィールド | ✓ | ✓ | ✓ | |
| フィールドを連結 | ✓ | ✓ | ✓ | |
| 変更文書テーブル | ✓ | |||
| ツインテーブル | ✓ | |||
| SAP 組み込みデルタ | ✓ |
インクリメンタルフィールドの値は、単調増加することが望ましいです。システムは「以上」の比較を使用し、特定の日付の途中で同期が実行された場合にデータの取りこぼしを防ぎます。Foundry データセットには重複する値が含まれる場合があるため、変換パイプラインの最初のステップで削除する必要があります。
トランザクションコードと汎用モジュールのオブジェクトタイプは、インクリメンタル同期をサポートしていません。常にスナップショットとして実行されます。
テーブル型のインクリメンタル同期では、同期あたりの最大行数設定によって、1回の実行で返される行数の概算上限を設定できます。断続的な問題(ネットワーク障害など)によって長時間実行される同期が中断される場合は、この設定を使用して、大きなテーブルの初回同期を、より小規模で障害に強い一連の実行に分割します。
インクリメンタルモードとしてツインテーブルを使用する場合、インクリメンタルツインテーブル設定でツインテーブルの名前を指定し、インクリメンタルツインマッピング設定で主要テーブルとツインテーブルの結合条件を定義します。マッピングエントリーには次の形式を使用します。
{PRIMARY_TABLE_NAME}-{FIELD_NAME}={TWIN_TABLE_NAME}-{FIELD_NAME}
複数の結合条件はセミコロン(AND 演算子)で組み合わせます。
フルロードを強制的に実行し、インクリメンタル取り込みを再初期化するには、同期のインクリメンタル状態のリセットトグルを有効にします。これにより、SAP からデータの完全なスナップショットが取得され、データセット内のすべてのファイルが置き換えられます。同期が完了したら、以降の同期でインクリメンタルな追加が再開されるように、トグルを無効にします。
インクリメンタル状態のリセットは、ERP テーブル、CDS ビュー、HANA ビュー、BW コンテンツエクストラクターのオブジェクトタイプでサポートされています。
同期の設定時には、次のパラメーターを利用できます。
| パラメーター | 適用対象 | 説明 |
|---|---|---|
| フィルター | ERP テーブル、CDS ビュー、HANA ビュー、BW コンテンツエクストラクター | 条件ビルダーを使用して、SAP から抽出するデータを絞り込みます。 |
| 列の除外 | ERP テーブル、CDS ビュー、HANA ビュー、BW コンテンツエクストラクター | 抽出前に選択した列を除外します。パフォーマンスを向上させ、機密性の高いフィールドや不要なフィールドの取り込みを防ぎます。 |
| タイムスタンプ | すべて | /PALANTIR/TIMESTAMP(同期の実行日時)列と /PALANTIR/ROWNO(レコードの順序)列を追加します。下流で重複レコードを削除する際に役立ちます。 |
| 取得オプション | BW コンテンツエクストラクター | データの取得方法を制御します。 |
| スキーマの変更を許可 | すべて | 同期の実行ごとに出力スキーマの変更を許可するかどうかを制御します。 |
条件グループを追加し、各グループ内でフィールド、演算子、値の行を設定します。すべてのフィールド名は SAP データディクショナリと一致する必要があります。
YYYYMMDD 形式を使用します(たとえば、2021年1月1日は 20210101)。* をサポートします(たとえば、A*12* は A で始まり、12 を含む任意の文字列に一致します)。動的フィルター値では、特殊なキーワードと日付計算関数を使用して、より柔軟なフィルター式を作成できます。アドオンのバージョン SP26 以降で利用できます。フィルター値を指定できる場所であれば、どこでも使用できます。
固定キーワード
| キーワード | 説明 |
|---|---|
[CURRENTYEAR] | YYYY 形式の現在の年。 |
[TODAY] | YYYYMMDD 形式の今日の日付。 |
[LASTDAYOFMONTH] | YYYYMMDD 形式の今月の末日。 |
[LASTDAYOFLASTMONTH] | YYYYMMDD 形式の先月の末日。 |
[FIRSTDAYOFMONTH] | YYYYMMDD 形式の今月の初日。 |
[FIRSTDAYOFLASTMONTH] | YYYYMMDD 形式の先月の初日。 |
日付計算関数
| 関数 | 説明 |
|---|---|
[ADDDAY] | 選択した日付に日数を加算します。例:[ADDDAY(22102022,1)] → 23102022。 |
[ADDMONTH] | 選択した日付に月数を加算します。 |
[ADDYEAR] | 選択した日付に年数を加算します。 |
[GETMONTH] | 選択した日付の月を2桁の値(01~12)として返します。 |
[GETDAY] | 日付の日を2桁の値として返します。 |
[GETYEAR] | 選択した日付の年を返します。 |
関数は、固定キーワードと直接組み合わせて使用することも、ネストして使用することもできます。たとえば、[ADDDAY([TODAY], 1)] や [GETDAY([ADDDAY([FIRSTDAYOFMONTH], -1)])] です。
オブジェクトタイプがトランザクションコードの場合、オブジェクト名は SAP トランザクションコードまたは Advanced Business Application Programming (ABAP) レポートを指し、次の追加フィールドを利用できます。
| パラメーター | 説明 |
|---|---|
| プログラムの種類 | オブジェクト名がトランザクションコードと ABAP レポートのどちらを指すかを指定します。必須です。 |
| 選択バリアント | トランザクションまたはレポートを実行する前に適用する SAP 選択バリアントの名前です。 |
| 出力バリアント | 結果リストの構造を制御する SAP 出力バリアント(レイアウト)の名前です。 |
| スプール取り込みを使用 | 有効にすると、実行時のメモリーではなく SAP スプールシステムからレポートの出力を取得します。レポートの出力が 2 GB を超える場合は必須です。 |
| 小計行と概要行を非表示 | 有効にすると、取り込んだデータから集計された小計行と概要行を削除します。 |
WITH PARAMETERS 句で宣言された Core Data Services (CDS) ビューでは、同期時にパラメーターを指定する必要があります。オブジェクトタイプが CDS ビューの場合、任意のプロパティである CDS ビューのパラメーターに、parameter name と parameter value のペアの行を指定できます。パラメーター名は CDS ビューで宣言された名前と一致する必要があります。不明なパラメーターや必要なパラメーターの欠落があると、同期に失敗します。空の行は保存時に破棄されます。
オブジェクトタイプが汎用モジュールの場合、オブジェクト名は汎用モジュール(通常は Business Application Programming Interface (BAPI))を指します。次の追加フィールドを利用できます。
| パラメーター | 説明 |
|---|---|
| 関数の入力パラメーター | 汎用モジュールの IMPORTING パラメーターとして渡される parameter name と parameter value のペアの行です。ほとんどの BAPI で必須です。 |
| 関数呼び出し後にコミット | 有効にすると、関数呼び出しの後に COMMIT WORK 文を発行します。変更の永続化にコミットを必要とする標準 BAPI では必須です。デフォルトでは無効です。 |
次の設定は、各同期の詳細設定に表示されます。一部の設定はソースレベルでも設定できます。
| 設定 | 説明 |
|---|---|
| 最大ファイルサイズ | 各出力 Parquet ファイルの最大サイズです。デフォルトは1ファイルあたり50,000行です。 |
| Avro 用にフィールド名をクリーンアップ | Foundry ストリームで使用される Avro ↗ のスキーマルールに準拠するように、フィールド名をクリーンアップします。データセットをストリーミングパイプラインで使用する場合は必須です。 |
| 予期しない値を無視 | 有効にすると、パースに失敗した日付または数値は null として書き込まれ、同期の終了時にパース例外の概要がログに記録されます。 |
| 日付を文字列に変換 | 日付フィールドを文字列として取り込みます。SAP の日付フィールドに、特別な意味を持ち、下流で処理する必要があるパースできない値が含まれている場合に役立ちます。 |
| ページサイズ | SAP からデータを取得する際に、1ページあたりに返される行数です。デフォルトは50,000です。最小は5,000です。 |
| 並列ページングのスレッド数 | ページデータの生成に使用する SAP ワークプロセスの数です。 |
| プラグインワーカーのスレッド数 | ページデータの取得に使用する Data Connection Agent のスレッド数です。 |
| シリアル化エンジン | データ転送に使用するシリアル化方法です。 |
| 再試行とタイムアウト | 再試行回数、再試行までの待機時間、リクエストのタイムアウトです。 |
| リソースチェック | 抽出中のメモリーと CPU のチェックです。無効にすると、SAP システムに過剰な負荷がかかる可能性があります。 |
| デバッグ設定 | トレースログとデバッグログです。デバッグログは SAP でバックグラウンドプロセスを開始するため、注意して使用してください。 |
SAP ERP コネクターは、SAP の Document Management System(DMS)に保存されているメディアファイルやドキュメントを取り込むためのメディアセットをサポートしています。
新しいメディア取り込みを作成するには、次の手順に従います。
サブフォルダーまたはメディアファイルを選択すると、特定のドキュメントタイプ(CPD など)を選択して関連するすべてのドキュメントを取り込むことも、1件のドキュメントを選択してそのファイルのみを取り込むこともできます。

メディアセット同期には、次のフィルターを適用できます。
| フィルター | 説明 |
|---|---|
| 同期済みファイルを除外 | パスがメディアセット内にすでに存在するファイルをスキップします。 |
| パスの一致 | 正規表現パターンに一致するファイルのみを同期します。デフォルトは .pdf です。 |
| ドキュメントのタイプ | SAP のドキュメントタイプで絞り込みます。 |
| ファイルサイズの上限 | 指定されたサイズ上限(バイト単位)以内のファイルのみを同期します。 |
SAP のメディアドキュメントタイプは、略語と、その用途を平易な英語で記述した説明で示されます。ドキュメントタイプで絞り込む際は、略語表記を使用してメディア取り込みの対象を絞り込めます。

SAP Webhook を使用すると、Foundry から汎用モジュール(通常は BAPI(Business Application Programming Interfaces))を呼び出して、SAP にデータをライトバックできます。Webhook のセットアップ方法の概要については、Webhook を参照してください。
SAP Webhook は、Foundry が管理するクラウドコンピューティングでの Foundry ワーカー接続をサポートしています。SAP Webhook では、Data Connection Agent 経由で実行する代わりに、このランタイムを使用することを推奨します。Foundry ワーカーで設定されている既存の SAP ソースは、移行を行わなくても自動的にクラウド実行のメリットを利用できます。Data Connection Agent で実行されている SAP ソースでは、クラウドで実行される Webhook を利用するために、Foundry ワーカーに切り替える必要があります。
BAPI を呼び出すには、sap-erp-run-function-webhook-task-v0 タスクタイプを選択します。
Webhook のタスク本文は、Handlebars ↗ 構文を使用して記述する JSON ドキュメントです。呼び出す SAP 汎用モジュールを指定し、その入力を指定して、返す出力を選択します。
| フィールド | 必須 | データ型 | 説明 |
|---|---|---|---|
function-name | はい | 文字列 | 呼び出す SAP 汎用モジュールまたは BAPI。たとえば BAPI_SALESORDER_CHANGE です。 |
inputs | いいえ | オブジェクト、またはオブジェクトの配列 | 関数の入力パラメーター。1件のレコードをライトバックするには1個のオブジェクトを指定し、1回の呼び出しで複数件のレコードをライトバックするにはオブジェクトの配列を指定します。関数が入力を必要としない場合は省略します。 |
output | いいえ | 文字列、または文字列の配列 | 返す出力変数。1個の変数名を指定するか、複数の変数を返すには名前の配列を指定します。 |
commit | いいえ | ブール値 | 変更をコミットするかどうか。コミットする場合は省略します(デフォルト)。コミットを抑制するには false に設定します。標準の BAPI では、変更を永続化するためにコミットが必要です。 |
parallel | いいえ | オブジェクト | 並列ライトバックを選択し、任意でその実行を調整します。複数件のレコードをライトバックするを参照してください。 |
api-version | いいえ | Integer | SAP アドオン API のバージョン。デフォルトは 1 です。バージョン2の機能を使用するには 2 に設定します。SAP アドオンの互換性を参照してください。 |
リモートの SAP システムの場合は、ソースの接続の種類を Remote (via Gateway) に設定し、ソースでコンテキストを指定します。
次の例では、BAPI_SALESORDER_CHANGE を呼び出して販売伝票の購入日を変更し、SAP の RETURN テーブルを返します。
Copied!1 2 3 4 5 6 7 8 9 10{ "function-name": "BAPI_SALESORDER_CHANGE", "inputs": { "SALESDOCUMENT": {{json sales-doc-id}}, "ORDER_HEADER_IN": { "PURCH_DATE": {{json purchase-date}} }, "ORDER_HEADER_INX": { "UPDATEFLAG": "U", "PURCH_DATE": "X" } }, "output": "RETURN", "api-version": 2 }
一括ライトバックと並列ライトバックは、OAuth 2.0 認証をサポートしていません。
1回の呼び出しで複数件のレコードをライトバックするには、inputs にオブジェクトの配列を渡し、output に必要な変数を列挙します。任意の parallel ブロックを使用して実行を調整します。次の例では、BAPI_PR_CREATE で2件の購買依頼を作成し、2個の出力変数を返します。
Copied!1 2 3 4 5 6 7 8 9 10 11{ "function-name": "BAPI_PR_CREATE", "commit": true, "parallel": { "max-jobs": 2, "max-calls-per-job": 4 }, "inputs": [ { "PRHEADER": { "PR_TYPE": "NB" }, "PRITEM": [ { "MATERIAL": "100-100", "PLANT": "1100", "QUANTITY": "1" } ] }, { "PRHEADER": { "PR_TYPE": "NB" }, "PRITEM": [ { "MATERIAL": "100-200", "PLANT": "1100", "QUANTITY": "2" } ] } ], "output": ["NUMBER", "PRHEADEREXP"], "api-version": 2 }
Webhook の実行は SAP 側で並列化できます。inputs が2個以上のオブジェクトを含む配列の場合、または空であっても parallel ブロックを明示的に指定した場合に、自動的に並列化されます。任意の parallel ブロックを使用して実行を調整します。
max-jobs — 同時に実行するジョブの最大数。max-calls-per-job — 各ジョブが処理するレコードの最大数。省略した設定には SAP アドオンで定義されている値が使用されます。デフォルトは3ジョブ、ジョブあたり4回の呼び出しです。
max-jobs をレコード数より大きい値に設定しても問題ありません。余分なジョブは使用されず、リソースが無駄になることもありません。
parallel ブロックを指定しない1件のレコードの場合、レスポンスは要求した出力変数の数によって異なります。
1件のレコードで出力変数が1個の場合、その変数の行のリストが返されます。
Copied!1 2 3[ { "NUMBER": "0010048439" } ]
1件のレコードで出力変数が複数ある場合、変数名をキーとするオブジェクトが返されます。たとえば output["NUMBER"] のように、名前を使用してアクセスします。
Copied!1 2 3 4{ "NUMBER": [ { "NUMBER": "0010048439" } ], "PRHEADEREXP": [ { "PREQ_NO": "0010048439", "PR_TYPE": "NB" } ] }
並列ライトバックでは、入力が1件のみの場合でも、入力レコードごとに1個の要素を含む配列が返されます。たとえば、次のようになります。
Copied!1 2 3 4 5 6 7[ { "OUTPUT": { "NUMBER": [ { "NUMBER": "0010048439" } ], "PRHEADEREXP": [ { "PREQ_NO": "0010048439" } ] }, "ROWNO": 1, "MSG": [ { "MSGTYP": "S", "MSGTXT": "Purchase requisition 0010048439 created" } ] } ]
OUTPUT はそのレコードの結果で、単一レコードのレスポンスと同じ形式です。ROWNO は、inputs 配列内の対応するエントリーの位置(1から開始)です。これにより、各結果を入力に対応付けられます。MSG は、そのレコードの SAP メッセージログです。各メッセージには、種類(MSGTYP: 成功は S、エラーは E、警告は W、情報は I、中止は A)とテキスト(MSGTXT)が含まれます。各レコードが個別にメッセージを報告するため、どのレコードの処理に成功し、どのレコードの処理に失敗したかを確認できます。成功を示さない HTTP レスポンスを受け取ると、Webhook はエラーを返します。成功を示す Webhook レスポンスであっても、SAP のビジネスエラーが含まれている可能性があります。利用可能な場合は SAP の RETURN 出力を要求して内容を確認し、レコードごとの MSG エントリーを確認して、要求した変更に成功したかどうかを判断してください。
複数の出力変数、一括ライトバック、および並列ライトバックを使用するには、api-version を 2 に設定します。バージョン 2 には SAP アドオン 2.29.0 以降が必要です。api-version を省略すると、Webhook はバージョン 1 を使用します。このバージョンでは、parallel ブロックを使用せず、1個の入力と1個の出力変数をサポートします。
バージョン 2 に切り替える際は、0 より大きい値の retries-per-request 設定を削除してください。
SAP Data Accelerator を介したユーザーに帰属するライトバックでは、sap-erp-oauth2-token-webhook-task と sap-erp-oauth2-refresh-webhook-task を使用してアウトバウンドアプリケーションを設定します。セットアップ手順については、SAP Data Accelerator を使用したユーザーに帰属する SAP ライトバックを参照してください。
SAP ERP ソースを Python の外部トランスフォームまたは関数にインポートすると、コードから SAP アドオンの REST API に直接アクセスできます。バッチ同期、メディアセット同期、Webhook では十分な制御ができない場合に使用します。たとえば、Workshop アクションから BAPI を同期的に呼び出す、大規模な入力データセットをループ処理して行ごとに BAPI を呼び出す、Foundry 側のデータに基づいて特定の DMS ドキュメントを取得する、1回のビルドで複数の SAP 呼び出しを連鎖させる、といった場合です。
以下の例では、次のエンドポイントを使用します。すべてソース URL(https://<host>:<port>/sap/palantir)からの相対パスです。
| エンドポイント | 用途 |
|---|---|
POST /v2/function/{functionName}/writeback | 単一の汎用モジュール(BAPI)を同期的に呼び出します。 |
POST /v2/function/{functionName}/parallel_writeback | 一括入力を使用して、サーバー側で並列化された汎用モジュールを同期的に呼び出します。 |
GET /v2/get_documents | DMS ドキュメントを一覧表示します。必要に応じて、ドキュメントの種類、ファイル形式、ファイル名、オブジェクトリンクで絞り込めます。 |
GET /v2/get_document | ID を指定して単一の DMS ドキュメントをダウンロードします。 |
これらの例を使用する前に、SAP ERP ソースをリポジトリにインポートしてください。
external_systems デコレーターを使用します。@function(sources=[...]) デコレーターでソースを宣言します。次の外部トランスフォームは、入力データセットの行ごとに BAPI_SALESORDER_CHANGE を1回呼び出して、各販売伝票の購入日を更新し、確認用に SAP の RETURN テーブルを出力データセットに記録します。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38from transforms.api import Input, Output, transform from transforms.external.systems import external_systems, Source, ResolvedSource @external_systems( sap_source=Source("<source_rid>"), ) @transform( sales_order_updates=Input("<input_dataset_rid>"), # 列: sales_doc_id, purchase_date (YYYYMMDD) writeback_results=Output("<output_dataset_rid>"), ) def update_purchase_dates(ctx, sap_source: ResolvedSource, sales_order_updates, writeback_results): base_url = sap_source.get_https_connection().url client = sap_source.get_https_connection().get_client() results = [] for row in sales_order_updates.dataframe().collect(): response = client.post( f"{base_url}/v2/function/BAPI_SALESORDER_CHANGE/writeback", json={ "commit": True, "input": { "SALESDOCUMENT": row.sales_doc_id, "ORDER_HEADER_IN": {"PURCH_DATE": row.purchase_date}, "ORDER_HEADER_INX": {"UPDATEFLAG": "U", "PURCH_DATE": "X"}, }, "output": ["RETURN"], }, ) response.raise_for_status() results.append({ "sales_doc_id": row.sales_doc_id, "purchase_date": row.purchase_date, "status_code": response.status_code, "sap_return": str(response.json()), }) writeback_results.write_dataframe(ctx.spark_session.createDataFrame(results))
変更を永続化するためにコミット文が必要な標準 BAPI では、"commit": true を設定します。関数を呼び出す前に、metadata エンドポイント(GET /v2/function/{functionName}/metadata)を使用して、期待される入力および出力の構造を確認します。
Workshop アクション、オントロジーアクションのバックエンド、または Foundry 関数のほかの呼び出し元から BAPI を同期的に呼び出すには、ライトバックを Python のソースを使用する関数として公開します。この関数は、データ型が定義された入力を受け取り、SAP の RETURN 構造を呼び出し元に返します。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35from functions.api import function from functions.sources import get_source @function(sources=["sap_source"]) def update_sales_order_purchase_date(sales_doc_id: str, purchase_date: str) -> str: """BAPI_SALESORDER_CHANGE を介して受注の購買日付を更新します。 Args: sales_doc_id: SAP 販売伝票番号。 purchase_date: YYYYMMDD 形式の新しい購買日付。 Returns: SAP RETURN テーブルの文字列表現です。呼び出し元に エラーや警告メッセージを伝えるのに役立ちます。 """ source = get_source("sap_source") base_url = source.get_https_connection().url client = source.get_https_connection().get_client() response = client.post( f"{base_url}/v2/function/BAPI_SALESORDER_CHANGE/writeback", json={ "commit": True, "input": { "SALESDOCUMENT": sales_doc_id, "ORDER_HEADER_IN": {"PURCH_DATE": purchase_date}, "ORDER_HEADER_INX": {"UPDATEFLAG": "U", "PURCH_DATE": "X"}, }, "output": ["RETURN"], }, timeout=30, ) response.raise_for_status() return str(response.json())
関数でソースを使用するには、ソースのコードインポートとエクスポートを有効にする必要があります。重大度が0以外の SAP RETURN メッセージは、呼び出し元が対応できるように、ユーザー向けエラーとして表示します。
外部トランスフォームから parallel_writeback エンドポイントを使用すると、1回のリクエストで多数の BAPI 呼び出しを送信できます。SAP システムは複数のバックグラウンドジョブを起動して呼び出しを分散するため、大規模なバッチでは、writeback を順次呼び出すよりも大幅に高速になります。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43from transforms.api import Input, Output, transform from transforms.external.systems import external_systems, Source, ResolvedSource @external_systems( sap_source=Source("<source_rid>"), ) @transform( sales_order_updates=Input("<input_dataset_rid>"), writeback_results=Output("<output_dataset_rid>"), ) def update_purchase_dates_parallel( ctx, sap_source: ResolvedSource, sales_order_updates, writeback_results ): base_url = sap_source.get_https_connection().url client = sap_source.get_https_connection().get_client() bulkinput = [ { "SALESDOCUMENT": row.sales_doc_id, "ORDER_HEADER_IN": {"PURCH_DATE": row.purchase_date}, "ORDER_HEADER_INX": {"UPDATEFLAG": "U", "PURCH_DATE": "X"}, } for row in sales_order_updates.dataframe().collect() ] response = client.post( f"{base_url}/v2/function/BAPI_SALESORDER_CHANGE/parallel_writeback", json={ "commit": True, "output": ["RETURN"], "bulkinput": bulkinput, "parallel": True, "paralleljobs": 5, "functioncallperjob": 10, }, ) response.raise_for_status() results = [ {"index": i, "result": str(r)} for i, r in enumerate(response.json()) ] writeback_results.write_dataframe(ctx.spark_session.createDataFrame(results))
ワークロードと SAP システムの利用可能な処理容量に基づいて、paralleljobs(SAP で起動するバックグラウンドジョブ数)と functioncallperjob(ジョブごとに処理する呼び出し数)を調整します。単一の一括リクエストを引き続き使用しながら逐次実行に切り替えるには、"parallel": false を設定します。
次の外部トランスフォームは、DMS の一覧取得とダウンロードのエンドポイントを組み合わせて、SAP のドキュメント管理システムからドキュメントを取得し、メディアセットに書き込みます。組み込みのメディアセット同期では十分な制御ができない場合、たとえば、ドキュメントの選択が Foundry 側のデータに依存する場合や、ダウンロード前に複数のフィルターを組み合わせる必要がある場合に、このパターンを使用します。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34import io from transforms.api import transform from transforms.external.systems import external_systems, Source, ResolvedSource from transforms.mediasets import MediaSetOutput @external_systems( sap_source=Source("<source_rid>"), ) @transform( documents=MediaSetOutput("<media_set_rid>"), ) def fetch_dms_documents(ctx, sap_source: ResolvedSource, documents): base_url = sap_source.get_https_connection().url client = sap_source.get_https_connection().get_client() # 文書の種類とファイル形式で絞り込んだ DMS 内の文書を一覧表示します。 list_response = client.get( f"{base_url}/v2/get_documents", params={"DOCUMENTTYPE": "CPT", "FILEFORMAT": "pdf"}, ) list_response.raise_for_status() for doc in list_response.json(): document_id = doc["DOCUMENT_ID"] document_name = doc["DOCUMENT_NAME"] download_response = client.get( f"{base_url}/v2/get_document", params={"DOCUMENT_ID": document_id}, ) download_response.raise_for_status() documents.put_media_item(io.BytesIO(download_response.content), document_name)
Foundry の入力データセットに基づいて取り込みを行うには、たとえば、EBELN(購買発注)の値のリストで参照されているドキュメントのみを取得する場合は、OBJECTLINK フィルターを指定して /v2/get_documents を呼び出すか、入力行の各 DOCUMENT_ID を直接 /v2/get_document に渡します。
次のガイドでは、SAP 側と Foundry 側の両方の設定を伴うワークフローについて説明します。
STXL テーブルの長文テキストを解凍して取り込みます。