

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# SDK for SAP ABAP の概念
<a name="concepts"></a>

このセクションでは、 の基本概念について説明します AWS SDK for SAP ABAP。

**Topics**
+ [API クラス](#api-classes)
+ [追加のオブジェクト](#additional-objects)
+ [構造クラス](#structure-classes)
+ [配列](#arrays)
+ [マップ](#maps)
+ [高レベルの関数](#higher-level-functions)

## API クラス
<a name="api-classes"></a>

各 には 3 文字の頭字語または AWS のサービス が割り当てられます`TLA`。サービスは `/AWS1/IF_<TLA>` 形式のインターフェイスで表されます。これをサービスインターフェイスと呼びます。API クラスは `/AWS1/API_<TLA>` パッケージにあります。サービスインターフェイスは AWS 、オペレーションごとに 1 つのメソッドで構成されます (これらのメソッドをオペレーションメソッドと呼びます）。 AWS SDK for SAP ABAP TLAs の完全なモジュールリストを確認するには、「 [AWS SDK for SAP ABAP - Module List](https://docs.aws.amazon.com/sdk-for-sap-abap/v1/api/latest/tla.html)」を参照してください。

各オペレーションメソッドには、いくつかの `IMPORTING` 引数と、最大 1 つの `RETURNING` 引数があります。多くの場合、これらの引数は複雑なコンストラクターと長い `GET…()` メソッドセットを持つオブジェクトです。多くの場合、オブジェクトには入れ子オブジェクト、再帰リファレンス、オブジェクトのテーブル、テーブルのテーブルなどが含まれます。これは、 AWS のサービス がディープ XML 構造と JSON 構造を渡すためです。これは、引数のフラットセットでは表現できません。

`RETURNING` 引数は、クラスに 1 つの属性のみが含まれている場合でも、常にクラスです。

## 追加のオブジェクト
<a name="additional-objects"></a>

各 API パッケージには、プライマリ API クラスに加えて、関連するさまざまなリポジトリとデータディクショナリオブジェクトが含まれています。
+ 各構造型オブジェクトのクラス。
+ テーブルに表示されるあらゆるプリミティブデータ型のクラス。例えば、サービスが文字列のテーブルを返す場合、ABAP API はそれをオブジェクトのテーブルとして表現します。各オブジェクトは文字列をカプセル化するラッパークラスです。これは、ABAP でネイティブに表現できない null 文字列を表現する際に、ラッパークラスが詳細を隠すことができるようにするためです。
+ サービスによって定義された特定のエラーの例外クラス。
+ 各プリミティブデータ型のデータ要素。各データ型には、自己文書化できるように独自のデータ要素があります。
+ XML や JSON ペイロードをシリアル化および逆シリアル化するための XSLT 変換など、内部処理用の追加オブジェクト。

## 構造クラス
<a name="structure-classes"></a>

サービスによって送受信されるほとんどの AWS データは、 AWS SDK によってクラスとして表されます。これらのクラスはデータの構造を表し、ストレージの内部の詳細を隠します。特に、*このフィールドには値がないことを* SDK が表現する方法がクラスによって隠されています。

 構造クラスの各フィールドには、3 つのメソッドがあります。

 **`GET_field( )`** 

`GET_field( )` メソッド 
+ フィールドの値が返されるか、または
+ フィールドに値がない場合は、オプションパラメータとして設定できるデフォルト値が返されます。

例えば、バケットの場所の制約を出力する次のコードを考えてみます。

```
DATA(lo_location) = go_s3->getbucketlocation( iv_bucket = CONV string( gv_bucket ) ).
WRITE: / 'Bucket Location: ', 
   lo_location->get_locationconstraint( ). 
```

バケットに場所の制約がまったくない場合 (`us-east-1` の場合のように)、`GET_LOCATIONCONSTRAINT( )` は空の文字列を返します。フィールドに値がまったくない場合は、この動作をオーバーライドして目的の値を指定できます。

```
DATA(lo_location) = go_s3->getbucketlocation( iv_bucket = CONV string( gv_bucket ) ).
WRITE: / 'Bucket Location: ', 
   lo_location->get_locationconstraint( iv_value_if_missing = 'assuming us-east-1' ). 
```

これで、`getbucketlocation()` の結果で場所が返されない場合、プログラムは `Bucket Location: assuming us-east-1` と記述するようになります。

要求された値が完全に欠落している場合、GET () メソッドに特定の結果を返すように要求できます。次のコード例を参照してください。

```
data(lo_location) = go_s3->GETBUCKETLOCATION(
   new /AWS1/CL_S3_GET_BUCKET_LOC_REQ( iv_bucket = gv_bucket )
).
write: / 'Location constraint: ', 
         lo_location->GET_LOCATIONCONSTRAINT( 'NopeNopeNope'  ).
```

この場合、場所の制約がなければ、`GET_LOCATIONCONSTRAINT( )` は `NopeNopeNope` を返します。

 **`HAS_field( )`** 

`HAS_field( )` メソッドはフィールドに値があるかどうかを調べる方法です。次の例を参照してください。

```
if NOT lo_location->HAS_LOCATIONCONSTRAINT( ).
   write: / 'There is no location constraint'.
endif.
```

あるフィールドに必ず値があることがわかっている場合、`HAS_field( )` メソッドはありません。

 **`ASK_field( )`** 

`ASK_field( )` メソッドはフィールドの値を返すか、値がない場合は例外を発生させます。これは、多数のフィールドを処理し、値のないフィールドがある場合にロジックを回避して別のアプローチを取る場合に便利な方法です。

```
TRY.
    WRITE: / 'Location constraint: ', lo_location->ask_locationconstraint( ).
CATCH /aws1/cx_rt_value_missing.
    WRITE: / 'Never mind, there is no location  constraint'.
ENDTRY.
```

`/AWS1/CX_RT_VALUE_MISSING` は静的な例外であり、これをキャッチしないことを選択すると警告が表示されることに注意してください。

 **ベストプラクティス** 

一般に、`GET_field( )` メソッドは NULL 文字列を空の文字列として扱い、3 つのオプションの中で最も ABAP に似ているため、使用できます。ただし、この方法では、フィールドの値が空白の状況とフィールドに値がない状況を簡単に区別することはできません。ビジネスロジックが欠損データと空白データの区別に依存している場合は、`HAS` または `ASK` メソッドを使用してこれらのケースに対処できます。

## 配列
<a name="arrays"></a>

配列は ABAP 標準オブジェクトテーブルとして表されます。

JSON 配列には、`[‘cat’, ‘dog’, null, ‘horse’]` の配列のような NULL 値を含めることができます。これはスパース配列と呼ばれます。ABAP ではオブジェクトリファレンスの内部テーブルとして表され、`null` 値はテーブル内では真の ABAP `null` 値として表されます。スパーステーブル内を繰り返し処理する場合、`null` オブジェクトにアクセスして `CX_SY_REF_IS_INITIAL` 例外が発生しないように、`null` 値をチェックする必要があります。実際には、スパース配列は AWS サービスではまれです。

オブジェクトの配列を初期化するには、ABAP 7.40 の新しいコンストラクトを使用すると便利です。複数のセキュリティグループが割り当てられた Amazon EC2 インスタンスの起動を考えてみます。

```
ao_ec2->runinstances(
    iv_imageid                   = lo_latest_ami->get_imageid( )
    iv_instancetype              = 't2.micro'
    iv_maxcount                  = 1
    iv_mincount                  = 1
    it_securitygroupids          = VALUE /aws1/cl_ec2secgrpidstrlist_w=>tt_securitygroupidstringlist(
                                    ( NEW /aws1/cl_ec2secgrpidstrlist_w( 'sg-12345678' ) )
                                    ( NEW /aws1/cl_ec2secgrpidstrlist_w( 'sg-55555555' ) )
                                    ( NEW /aws1/cl_ec2secgrpidstrlist_w( 'sg-99999999' ) )                                                                        
                                )
    iv_subnetid                  = ao_snet->get_subnetid( )
    it_tagspecifications         = make_tag_spec( 'instance' )
)
```

## マップ
<a name="maps"></a>

JSON マップは ABAP では `Hashed Tables` として表され、各テーブル行には 2 つのコンポーネントのみが含まれます。
+  `KEY` — テーブルの `UNIQUE KEY` である文字列。
+  `VALUE` — 値を含むオブジェクト。

マップは、 AWS SDK がクラスではなく真の構造を使用する数少ないケースの 1 つです。これは、ABAP ハッシュテーブルがキーフィールドとしてオブジェクト参照を持つことができず、 AWS マップキーは常に null 以外の文字列であるために必要です。

## 高レベルの関数
<a name="higher-level-functions"></a>

前のセクションで[API クラス](#api-classes)説明した は、 AWS サービス APIsし、これらの APIsとして表します。場合によっては、SDK には、特定のオペレーションを簡素化するために API クラス上に構築される高レベルの関数も含まれています。プログラマーの利便性のために上位レベルの関数が含まれており、下位レベルの API クラスを置き換えるものではありません。

SDK にモジュールの上位レベルの関数が含まれている場合、それらは同じトランスポートに含まれ、 というファクトリクラスを介してアクセスできます`/AWS1/CL_TLA_L2_FACTORY`。ファクトリクラスには、 API [ドキュメント](https://docs.aws.amazon.com/sdk-for-sap-abap/v1/api/latest/index.html)で残りの API とともに文書化された、モジュールのさまざまな上位レベルのクライアントを作成するメソッドが含まれています。