文字項目の処理

関数と正規表現を使用した文字列の処理

Objectives

After completing this lesson, you will be able to:
  • ABAP の組込文字列関数について説明します。
  • ABAP の組込文字列関数を使用します。
  • ABAP での正規表現の使用について説明します。

組み込み文字列関数

&& 演算子による文字列連結および文字列テンプレートを使用した書式設定に加えて、ABAP にはさまざまな組込文字列関数が用意されています。結果のタイプに基づいて、文字列関数の 3 つのカテゴリを区別します。

注記

組み込み文字列関数の入力が複数のパラメータで構成されている場合、メイン入力パラメータの名前は常に val です。

文字列関数のパラメータ

一部の組込文字列関数では、入力は 1 つの文字型データオブジェクトのみで構成されます。これらの関数では、入力パラメータは使用されません。入力は括弧内で直接指定されます。説明関数 NUMOFCHAR( ) は、これらのタイプの関数の良い例です。

複数の入力がある関数では、名前の付いたパラメータが使用され、入力がこれらのパラメータに割り当てられます。多くのパラメータは、さまざまな組み込み文字列関数の共通点です。最も重要なパラメータは以下のとおりです。

VAL

関数で処理されるテキスト文字列をパラメータ val に渡します。また、戻り値が文字列型に変換可能な関数メソッド呼び出し、テーブル式、コンストラクタ式を指定することもできます。基本データ型のみを処理できます。固定長の文字型データオブジェクトが指定されている場合、末尾の空白は無視されます。非文字型の戻り値は、文字列データ型に変換されます。

SUB

パラメータ sub は、文字を検索または挿入する文字列を渡すために使用されます。基本データ型の引数のみを指定できます。固定長の文字型データオブジェクトが指定されている場合、末尾の空白は無視されます。

CASE

文字列関数での検索と比較では、デフォルトで大文字と小文字が区別されますが、パラメータの大文字と小文字を使用して、必要に応じてこれを上書きすることができます。パラメータ case には、定数 abap_true ('X') または abap_false (' ') の値を含む型 abap_bool (C LENGTH 1) の入力が必要です。case に abap_true の値が含まれている場合、検索では大文字と小文字が区別され、abap_false の値が含まれている場合は区別されません。

OCC

検索が実行される文字列関数では、パラメータ occ によって一致の発生が指定されます。occ がプラスの場合、発生は左側からカウントされます。occ がマイナスの場合、発生は右側からカウントされます。値 1、2、.... は、1 回目、2 回目、... の発生を示します。値 -1、-2、.... は、最後の、最後から 2 番目の発生を示します。occ のデフォルト値は 1 です。

注記

置換機能の置換の場合を除き、値 0 では例外 CX_SY_STRG_PAR_VAL が発生します。replace を使用すると、値 0 ですべての出現箇所が置き換えられます。
OFF および LEN

パラメータ off はオフセットを渡し、パラメータ len は長さを渡すために使用されます。off と len の両方を渡すことができる関数では、文字列が処理されるサブエリアが決定されます。

通常、off のデフォルト値は 0 で、len のデフォルト値は offset の後の文字列全体の長さに設定されます。

注記

値の組合せが不適切であると、例外 CX_SY_RANGE_OUT_OF_BOUNDS が発生する可能性があります。

これらのパラメータの影響については、いくつかの例を見てみましょう。

試してみる: 文字列関数の共通パラメータ

  1. インタフェース IF_OO_ADT_CLASSRUN を実装する新しいグローバルクラスを登録します。
  2. 以下のコードスニペットをメソッド if_oo_adt_classrun~main( ) の実装部分にコピーします。
    Code Snippet
    12345678910111213141516171819
    DATA text TYPE string VALUE ` Let's talk about ABAP `. DATA result TYPE i. out->write( text ). result = find( val = text sub = 'A' ). * * result = find( val = text sub = 'A' case = abap_false ). * * result = find( val = text sub = 'A' case = abap_false occ = -1 ). * result = find( val = text sub = 'A' case = abap_false occ = -2 ). * result = find( val = text sub = 'A' case = abap_false occ = 2 ). * * result = find( val = text sub = 'A' case = abap_false occ = 2 off = 10 ). * result = find( val = text sub = 'A' case = abap_false occ = 2 off = 10 len = 4 ). out->write( |RESULT = { result } | ).
  3. CTRL + F3 を選択してクラスを有効化し、F9 を選択してコンソールアプリとして実行します。
  4. コンソール出力を分析します。
  5. 関数 FIND( ) のさまざまな呼出の前にあるコメントを削除し、プログラムを再度有効化します。
  6. プログラムをデバッグし、各割当後にデータオブジェクト結果のコンテンツを分析します。さまざまな結果を理解できますか。
  7. さまざまなパラメータを操作して、その意味を理解します。

説明関数

長さ関数

文字列に対する記述関数の重要なグループは、長さ関数 NUMOFCHAR( ) および STRLEN( ) です。ほとんどの場合、2 つの関数は同じ結果を返します。ただし、例外が 1 つあります。引数の型が string で、末尾に 1 つ以上の空白が含まれている場合、STRLEN( ) の結果にはこれらの後続ブランクが含まれますが、NUMOFCHAR( ) では無視されます。固定長の引数 (たとえば、引数が TYPE C または N) の場合、どちらの関数も末尾の空白を無視します。

検索機能のグループ

文字列の検索機能には、以下の 2 つのグループがあります。

関数 COUNT( ) および COUNT_...( ) で始まる関数は、検索引数の出現回数の合計を返します。関数 FIND( ) および FIND_( ) で始まる関数は、検索引数の特定のオカレンスの位置 (オフセット) を返します。

検索機能のパラメータサブ

関数 COUNT( ) および FIND( ) では、部分文字列 (オプションパラメータ sub) または正規表現 (オプションパラメータ pcre) のいずれかを検索することができます。正規表現については、このコースの後半で説明します。

_ANY_OF で終わる関数の場合、パラメータ sub の名称は少し誤解を招きます。ここで、パラメータ sub の値は部分文字列ではなく、文字の一覧です。これらの関数は、部分文字列 (つまり、文字の正確な組合せ) を検索するのではなく、個々の文字を評価し、各文字が提供された一覧に含まれる一致であるとみなします。_ANY_NOT_OF で終わる関数も同様に機能しますが、ここでは一覧のすべての文字とは異なる文字のみが一致と見なされます。

説明関数の例をいくつか見てください。

試してみる: テキスト機能

  1. インタフェース IF_OO_ADT_CLASSRUN を実装する新しいグローバルクラスを登録します。
  2. 以下のコードスニペットをメソッド if_oo_adt_classrun~main( ) の実装部分にコピーします。
    Code Snippet
    1234567891011121314151617181920212223242526
    DATA result TYPE i. DATA text TYPE string VALUE ` ABAP `. DATA substring TYPE string VALUE `AB`. DATA offset TYPE i VALUE 1. * Call different description functions ****************************************************************************** * result = strlen( text ). * result = numofchar( text ). result = count( val = text sub = substring off = offset ). * result = find( val = text sub = substring off = offset ). * result = count_any_of( val = text sub = substring off = offset ). * result = find_any_of( val = text sub = substring off = offset ). * result = count_any_not_of( val = text sub = substring off = offset ). * result = find_any_not_of( val = text sub = substring off = offset ). out->write( |Text = `{ text }`| ). out->write( |Substring = `{ substring }` | ). out->write( |Offset = { offset } | ). out->write( |Result = { result } | ).
  3. Ctrl + F3 キーを押してクラスを有効化し、F9 を選択してコンソールアプリとして実行します。
  4. コンソール出力を分析します。
  5. 変数結果のさまざまな値割当の前にあるコメントを削除し、プログラムを再度有効化します。
  6. ブレークポイントを設定し、各割当後にデータオブジェクト結果のコンテンツを分析します。さまざまな結果を理解できますか。
  7. textsubstring の開始値を使用して、関数に習熟します。

処理機能

処理機能の詳細については、以下のビデオを視聴してください。

ヒント

SEGMENT( ) の適切な使用ケースは、カンマ区切り形式 (csv) でのデータのインポートおよび処理です。

いくつかの文字列処理関数の結果を示すために、いくつかの例を見てみましょう。

  • この例では、入力文字列に大文字と小文字が混在しています。関数 TO_UPPER( ) は、これらすべてを大文字に変換します。
  • 関数 TO_MIXED( ) は、文字列を大文字と小文字の混在に変換します。区切り記号文字列が検索されて削除され、区切り記号の後の最初の文字が大文字に変換されます。その他の文字はすべて小文字に変換されます。パラメータ sep は、アンダースコア記号 (_) をデフォルト値とするオプションであることに注意してください。
  • 関数 REVERSE( ) は、文字を逆の順序で返します。
  • SHIFT_LEFT( ) 関数の最初の例では、places = 2 が指定されています。そのため、最初の 2 文字 (##) が結果から削除されます。
  • SHIFT_LEFT( ) の 2 番目の例では、パラメータ circular = 2 が指定されています。そのため、最初の 2 文字は削除されず、末尾に移動されます。
  • SUBSTRING( ) 関数の例では、2 文字のオフセットで始まる長さ 4 の部分文字列が抽出されます。つまり、位置 3、4、5、および 6 の文字が返されます。
  • 関数 SUBSTRING_AFTER( ) は、部分文字列 "is" を検索し、この検索以降のすべての文字を返します。
  • 関数 SUBSTRING_FROM( ) でも同じですが、結果には部分文字列 "is" も含まれます。
  • SEGMENT( ) 関数の最初の例では、区切記号文字列 (1 つのアンダースコア) のすべての出現箇所が検索されます。2 つが見つかり、入力文字列が 3 つのセグメントに分割されます。次に、2 番目のセグメントが返されます。
  • 2 番目の例は同じですが、3 番目のセグメントを返します。区切記号文字列自体は結果の一部ではないことに注意してください。

試してみる: 処理機能

  1. インタフェース IF_OO_ADT_CLASSRUN を実装する新しいグローバルクラスを登録します。
  2. 以下のコードスニペットをメソッド if_oo_adt_classrun~main( ) の実装部分にコピーします。
    Code Snippet
    12345678910111213141516171819202122232425262728293031323334353637
    DATA text TYPE string VALUE ` SAP BTP, ABAP Environment `. * Change Case of characters ********************************************************************** out->write( |TO_UPPER = { to_upper( text ) } | ). out->write( |TO_LOWER = { to_lower( text ) } | ). out->write( |TO_MIXED = { to_mixed( text ) } | ). out->write( |FROM_MIXED = { from_mixed( text ) } | ). * Change order of characters ********************************************************************** out->write( |REVERSE = { reverse( text ) } | ). out->write( |SHIFT_LEFT (places)= { shift_left( val = text places = 3 ) } | ). out->write( |SHIFT_RIGHT (places)= { shift_right( val = text places = 3 ) } | ). out->write( |SHIFT_LEFT (circ) = { shift_left( val = text circular = 3 ) } | ). out->write( |SHIFT_RIGHT (circ) = { shift_right( val = text circular = 3 ) } | ). * Extract a Substring ********************************************************************** out->write( |SUBSTRING = { substring( val = text off = 4 len = 10 ) } | ). out->write( |SUBSTRING_FROM = { substring_from( val = text sub = 'ABAP' ) } | ). out->write( |SUBSTRING_AFTER = { substring_after( val = text sub = 'ABAP' ) } | ). out->write( |SUBSTRING_TO = { substring_to( val = text sub = 'ABAP' ) } | ). out->write( |SUBSTRING_BEFORE= { substring_before( val = text sub = 'ABAP' ) } | ). * Condense, REPEAT and Segment ********************************************************************** out->write( |CONDENSE = { condense( val = text ) } | ). out->write( |REPEAT = { repeat( val = text occ = 2 ) } | ). out->write( |SEGMENT1 = { segment( val = text sep = ',' index = 1 ) } | ). out->write( |SEGMENT2 = { segment( val = text sep = ',' index = 2 ) } | ).
  3. Ctrl + F3 キーを押してクラスを有効化し、F9 を選択してコンソールアプリとして実行します。
  4. コンソール出力を分析します。さまざまな機能の結果を理解できますか。
  5. 開始値を使用してさまざまな機能を試し、その結果を把握します。
  6. テキストサブストリング、およびさまざまなパラメータの値の開始値を試して、関数について理解します。

述部関数

述部関数 CONTAINS( ) は、指定された部分文字列が入力文字列に少なくとも 1 回出現する場合は true です。つまり、CONTAINS( ) が true の場合、関数 COUNT( ) は 0 より大きい結果を返します。

述部関数 CONTAINS_ANY_OF( ) と CONTAINS_ANY_NOT_OF( ) と、対応する記述関数 COUNT_ANY_OF( ) と COUNT_ANY_NOT_OF( ) の間には、同じ関係が存在します。

MATCHES( ) は、入力文字列全体を正規表現と比較するための専用の述部関数です。正規表現については、次のセクションで説明します。

ABAP の正規表現

正規表現 (略して Regex) は、一連の文字列を記述するリテラル文字と特殊文字のパターンです。正規表現は、多くの場合、テキスト検索、"検索と置換" 操作、または文字型項目の内容のチェックに使用されます。正規表現を使用する検索は、単純な文字列を検索するよりも強力です。正規表現は、多数の (潜在的に無限の) 文字列を表し、同時に検索するためです。

正規表現の構文は広く標準化されていますが、Perl や POSIX などの一般的な標準と、XPath や XSD 正規表現などの異なる構文のフレーバには違いがあります。

ABAP では、Perl Compatible Regular Expression (PCRE) が推奨される標準ですが、ABAP では他の標準およびフレーバもサポートされています。

注記

このコースの例では、PCRE 標準に従います。その他の標準および構文のフレーバについては、ABAP キーワード文書を参照してください。

正規表現の例

正規表現の例をいくつか見てみましょう。

  • 最も単純な正規表現はリテラルです。
  • 角括弧 ( [ ] ) のペアを使用して、特定の位置で許可される文字セットを指定できます。最初の例では、個別の 2 つの文字 B と S で構成される文字セットを指定します。したがって、2 つの文字 A の間には文字 B または S のいずれかを使用できます。
  • 次の例では、ハイフン記号 (-) を使用して、使用可能な文字の範囲を指定します。B-D は、B、D、およびその間のすべての文字を含む文字セットを字句順で定義します。もちろん、個々の値と複数の範囲を組み合わせることができます。[AL-NRX-Z] は、たとえば、文字 A、L、M、N、R、X、Y、Z で構成される文字セットを定義します。
  • 次の例では、開始角括弧の後に ^ 記号を使用して、対象リストではなく除外リストを定義します。[^LX] は文字 L と X を除外しますが、他のすべての文字は許可します。
  • 使用可能なすべての文字を含み、何も除外しない文字セットを指定するには、正規表現で単一のフルストップ記号 (.) を使用します。この例では、2 つの A の間には任意の文字を使用できますが、その文字は必須であり、そのような文字は 1 つのみ許可されます。
  • 柔軟性を高めるために、量化子を導入することができます。量化子は、中括弧 ( {} ) のペアです。左側の要素を繰り返す頻度を指定します。この例では、量化子の 3 は、2 つの A の間に正確に 3 文字の B が必要であることを意味します。
  • 数量化子では、1 つの固定値の代わりに、繰返の下限値と上限値を指定することができます。この例では、2 つの A の間に少なくとも 1 つの B が必要ですが、2 つの B も許可されます。
  • 上限値を除外する場合は、最小値のみを設定します。この例では、2 つの A の間には任意の数の文字 B を使用できますが、少なくとも 1 つの文字が必要です。
  • 通常の括弧 ( ) を使用して、複数のエレメントをグループ化します。適切なユースケースは、量化子の左側にあるグループです。単一の文字ではなく、量化子の数値に基づいてグループ全体が繰り返されます。この例では、文字 A と P の間にグループ BA が繰り返されています。
  • 最後に、ユニオン演算子 | を確認します。グループ外では、2 つのパターンが結合され、2 つのパターンの結果セットが結合されます。この例では、グループ内で UNION 演算子を使用します。終了リテラル AP の左側には、リテラル AB または単一文字 S のいずれかの 2 つのパターンを使用できます。

注記

これらの例はかなり単純であり、その目的はいくつかの基本コンセプトを説明することです。他の多くのコンセプトが存在し、これらすべてのコンセプトを組み合わせることで、非常に強力な式を構築することができます。全体像を把握するには、ABAP 文書から開始します。そこから、その他の情報ソースにナビゲートすることができます。

組込文字列関数と正規表現

多くの組み込み文字列関数は、特に検索の実行時にパラメータ pcre を提供します。多くの場合、Pcre はパラメータサブの代替です。一連の文字をパラメータ pcre に渡すと、関数は入力を Perl 互換正規表現 (PCRE) として解釈し、このパターンに一致するサブ文字列を検索します。関数にパラメータ sub と pcre の両方がある場合は、そのうちの 1 つのみを指定できます。

注記

正規表現のパラメータの詳細については、ABAP 文書を参照してください。そのうちの 1 つであるパラメータ regex が POSIX 正規表現に使用されました。これは無効であるため、使用しないでください。

FIND( ) や COUNT( ) などの関数では、部分文字列の検索を実行することが明らかです。ただし、他の機能でも検索が実行されます。例として、述部関数 CONTAINS( ) や処理関数 REPLACE( )、SUBSTRING_FROM( )、SUBSTRING_AFTER( ) などがあります。

また、正規表現のみを使用する組み込み文字列関数もあります。完全な文字列が正規表現と一致する場合、述部関数 MATCHES( ) は true です。MATCH( ) は FIND( ) と同様に機能します。文字列内で、正規表現に一致する部分文字列が検索されます。ただし、FIND( ) は検索のオフセットを返し、MATCH( ) は見つかった部分文字列を返します。

このビデオでは、パラメータ PCRE を使用したいくつかの例について説明します。

注記

matches( ) 関数は、文字型入力項目に複雑なチェックを実装する必要がある場合に、シャープで洗練されたツールです。

文字列処理関数の使用

この演習問題では、文字列処理機能を使用して、テキストシンボルを変数の内容で拡張してから、それらをコンソール出力に追加します。

テンプレート:

  • /LRN/CL_S4D401_TCS_TEXT_POOL (グローバルクラス)

ソリューション:

  • /LRN/CL_S4D401_TCS_STRING_PROC (グローバルクラス)

タスク 1: テンプレートのコピー (オプション)

テンプレートクラス /LRN/CL_S4D401_TCS_TEXT_POOL をコピーします。前の演習問題を完了した場合は、このタスクをスキップし、クラス ZCL_##_SOLUTION の編集を続行することができます。

ステップ

  1. クラス /LRN/CL_S4D401_TCS_TEXT_POOL を独自のパッケージのクラスにコピーします (推奨名: ZCL_##_SOLUTION、## はグループ番号)。

    1. Project Explorer で、クラス /LRN/CL_S4D401_TCS_TEXT_POOL を右クリックしてコンテキストメニューを開きます。

    2. コンテキストメニューから Duplicate.... を選択します。

    3. Package 項目にパッケージの名称を入力します。Name 項目に、ZCL_##_SOLUTION (## はグループ番号) と入力します。

    4. Next を選択します。

    5. 移送依頼を確認し、Finish を選択します。

  2. コピーを有効化します。

    1. Ctrl + F3 を押してクラスを有効化します。

タスク 2: 文字列処理関数の使用

グローバルクラスのマスタ言語を使用してログオンしていることを確認します。次に、ローカルクラス LCL_PASSENGER_FLIGHT のメソッド GET_DESCRIPTION の実装を調整します。文字列テンプレートのリテラルテキストをテキストプールの翻訳可能テキストに置き換えます。最初のテキストについては、プレースホルダを含む単一テキストシンボルを登録し、文字列処理機能を使用してプレースホルダを属性値に置き換えます。

ステップ

  1. ABAP クラスのマスタ言語を表示し、同じ言語でログオンしていることを確認します。

    1. グローバルクラス ZCL_##_SOLUTION のソースコードを開きます。

    2. エディタの下のタブから、Properties タブを選択します。

    3. マスタ言語プロパティを書き留めます。これは EN に設定する必要があります。

    4. Project Explorer で、ABAP Cloud プロジェクトの説明を分析します。システム ID、ログオンクライアント、およびユーザ ID の後に、ログオン言語が表示されます。

    5. ログオン言語が ABAP クラスのマスタ言語と一致しない場合は、適切なログオン言語で新しいプロジェクトを登録します。

  2. ローカルクラス LCL_PASSENGER_FLIGHT のメソッド GET_DESCRIPTION の実装にナビゲートします。

    1. たとえば、エディタで Local Types タブを開き、METHOD get_description を検索することができます。

    2. または、左側のアウトラインビューで ZCL_##_SOLUTIONLCL_PASSENGER_FLIGHT を展開し、GET_DESCRIPTION を選択することもできます。

  3. 最初の APPEND 命令をコメントアウトし、STRING 型のローカル変数の APPEND に置き換えます (推奨名: txt)。

    1. 最初の APPEND 命令に属するすべてのコード行を選択し、Ctrl + < を押します。

    2. コードを以下のように調整します。

      ABAP
      123456
      * APPEND |Flight { carrier_id } { connection_id } on { flight_date DATE = USER } | && * |from { connection_details-airport_from_id } to { connection_details-airport_to_id }| * TO r_result. DATA txt TYPE string. APPEND txt TO r_result.
  4. APPEND 文の前に、前の文字列テンプレートを反映したテキストリテラルをデータオブジェクトに入力します。文字列テンプレートに埋込式 (&carrid&、&connid&、&date&、&from&、&to& など) が含まれている適切なプレースホルダを使用してください。

    1. コードを以下のように調整します。

      ABAP
      123
      DATA text TYPE string. txt = 'Flight &carrid& &connid& on &date& from &from& to &to&'. APPEND text TO r_result.
  5. テキストリテラルを新しいテキストシンボルにリンクします (テキストシンボルの推奨 ID: 005)。

    1. コードを以下のように調整します。

      ABAP
      1
      txt = 'Flight &carrid& &connid& on &date& from &from& to &to&'(005).
  6. クイックフィックスを使用して、テキストプールに新規テキストを最大長 132 で登録します。

    1. (005) にカーソルを合わせ、Ctrl + 1 を押します。

    2. テキストプールでテキスト 005 登録を選択します

    3. スライダを使用して最大長132 に設定し、終了を選択します。

  7. ABAP コードに戻ります。APPEND 文の前に、適切な文字列処理関数を使用して、文字列変数 txt のプレースホルダ &carrid& をインスタンス属性 carrier_id の内容に置き換えます。

    1. コードを以下のように調整します。

      ABAP
      123
      txt = 'Flight &carrid& &connid& on &date& from &from& to &to&'(005). txt = replace( val = txt sub = '&carrid&' with = carrier_id ). APPEND txt TO r_result.
  8. 他のプレースホルダに対して、上記のステップを適宜繰り返します。フライト日付の書式設定は、ユーザの希望日付書式に従って忘れないようにしてください。

    1. コードを以下のように調整します。

      ABAP
      123456789
      txt = 'Flight &carrid& &connid& on &date& from &from& to &to&'(005). txt = replace( val = txt sub = '&carrid&' with = carrier_id ). txt = replace( val = txt sub = '&connid&' with = connection_id ). txt = replace( val = txt sub = '&date&' with = |{ flight_date DATE = USER }| ). txt = replace( val = txt sub = '&from&' with = connection_details-airport_from_id ). txt = replace( val = txt sub = '&to&' with = connection_details-airport_to_id ). APPEND txt TO r_result.
  9. オプション: GET_DESCRIPTION メソッドの残りのリテラルテキストをテキストシンボルに置き換えます。

    1. 前と同じ方法でこのステップを実行します。

    2. 最後に、コードは以下のようになります。

      ABAP
      12345678910111213141516171819202122232425
      METHOD get_description. * APPEND |Flight { carrier_id } { connection_id } on { flight_date DATE = USER } | && * |from { connection_details-airport_from_id } to { connection_details-airport_to_id }| * TO r_result. DATA txt TYPE string. txt = 'Flight &carrid& &connid& on &date& from &from& to &to&'(005). txt = replace( val = txt sub = '&carrid&' with = carrier_id ). txt = replace( val = txt sub = '&connid&' with = connection_id ). txt = replace( val = txt sub = '&date&' with = |{ flight_date DATE = USER }| ). txt = replace( val = txt sub = '&from&' with = connection_details-airport_from_id ). txt = replace( val = txt sub = '&to&' with = connection_details-airport_to_id ). APPEND txt TO r_result. APPEND |{ 'Planetype:'(006) } { planetype }| TO r_result. APPEND |{ 'Maximum Seats:'(007) } { seats_max }| TO r_result. APPEND |{ 'Occupied Seats:'(008) } { seats_occ }| TO r_result. APPEND |{ 'Free Seats:'(009) } { seats_free }| TO r_result. APPEND |{ 'Ticket Price:'(010) } { price CURRENCY = currency } { currency }| TO r_result. APPEND |{ 'Duration:'(011) } { connection_details-duration } { 'minutes'(012) }| TO r_result. ENDMETHOD.
  10. グローバルクラスをコンソールアプリとして有効化してテストします。

    注記

    差異に気付くべきではありません。テキストの翻訳が可能になったことが改善されました。ただし、これは、システム管理者が翻訳プロジェクトを実際に登録した場合にのみ効果があります。これは、このコースの範囲外です。
    1. Ctrl + F3 を押します。

    2. F9 を押します。