ABAP では、異なるデータ型の変数間で値割当を実行することができます。これを行うと、ABAP によってソース項目の値がターゲット項目のデータ型に変換されます。変換が成功するかどうかは、ソース項目の値がターゲット項目のデータ型と互換性があるかどうかによって異なります。

ここでの最初の例では、文字列の値を整数フィールドに割り当てようとしています。文字列 12345 の値は有効な整数であるため、割当は成功します。2 番目の割当も成功します。
Objective
ABAP では、異なるデータ型の変数間で値割当を実行することができます。これを行うと、ABAP によってソース項目の値がターゲット項目のデータ型に変換されます。変換が成功するかどうかは、ソース項目の値がターゲット項目のデータ型と互換性があるかどうかによって異なります。

ここでの最初の例では、文字列の値を整数フィールドに割り当てようとしています。文字列 12345 の値は有効な整数であるため、割当は成功します。2 番目の割当も成功します。
1234567891011121314151617181920
DATA var_string TYPE string.
DATA var_int TYPE i.
DATA var_date TYPE d.
data var_pack type p length 3 decimals 2.
var_string = `12345`.
var_int = var_string.
out->write( 'Conversion successful' ).
var_string = `20230101`.
var_date = var_string.
out->write( |String value: { var_string }| ).
out->write( |Date Value: { var_date date = user }| ).値割当でのデータ型変換は、常に成功するわけではありません。ソース値がターゲット項目のデータ型と互換性がない場合があります。ここに表示される 2 つの割当の両方によって例外が発生し、捕捉されないと実行時エラーが発生します。

文字列値 ABCDE を整数項目に割り当てようとすると、文字列の内容を数値として表すことができないことが認識され、例外 CX_SY_CONVERSION_NO_NUMBER がトリガされます。2 番目の例では、長さ 3 と小数点以下桁数 2 のパック数値に値 1000 を割り当てようとしています。したがって、変数は 5 桁で、そのうち 2 桁は小数点以下桁数であるため、最大値は 999.99 です。そのため、この割当によって算術オーバーフローが発生し、システムが例外 CX_SY_CONVERSION_OVERFLOW で応答します。
一部の割り当ては、データの損失や精度の低下につながります。たとえば、文字項目の値をより短い項目に割り当てると、その値は切り詰められます。この例では、長さが 3 の文字項目に 5 文字を割り当てようとしました。この場合、4 番目と 5 番目の文字は失われます。

数値項目に値を割り当て、ターゲット項目の小数点以下桁数が不十分な場合は、算術丸めが使用されます。この 2 つの例では、1 つの四半期を 0.25 と正確に表すことができますが、8 分の 1 - 0.125 - は 0.13 に切り上げられます。
1234567891011121314151617181920
DATA long_char TYPE c LENGTH 10.
DATA short_char TYPE c LENGTH 5.
DATA result TYPE p LENGTH 3 DECIMALS 2.
long_char = 'ABCDEFGHIJ'.
short_char = long_char.
out->write( long_char ).
out->write( short_char ).
result = 1 / 8.
out->write( |1 / 8 is rounded to { result NUMBER = USER }| ).
2 つの異なるデータ型間の割当の結果が予期せぬ結果になる場合があります。たとえば、日付項目を整数項目に割り当てると、値は 0001/01/01 以降の日数になります。同様に、時間項目を整数に割り当てると、結果は午前 0 時からの秒数になります。

文字項目または文字列をデータ型 N の変数に割り当てると、数字以外の文字が破棄され、項目の残りの桁が右寄せで配置され、残りのスペースに先行ゼロが入力されます。
日付項目は、技術的な観点から見ると文字項目です。そのため、有効な日付に対応しない ABAP の日付項目に値を割り当てることができます (UI レイヤによって日付がチェックされるため、ユーザが UI を使用して日付を入力した場合は、これは行われないことに注意してください)。

算術式でインライン宣言を使用すると、式の右側から新しい変数の型が導出されます。数値リテラル 5 および 10 は整数であるため、変数 result1 および result2 も整数として登録されます。乗算の結果は正しいですが、除算の結果は 1 に切り上げられます。
123456789101112131415161718192021
DATA var_date TYPE d.
DATA var_int TYPE i.
DATA var_string TYPE string.
DATA var_n TYPE n LENGTH 4.
var_date = cl_abap_context_info=>get_system_date( ).
var_int = var_date.
out->write( |Date as date| ).
out->write( var_date ).
out->write( |Date assigned to integer| ).
out->write( var_int ).
var_string = `R2D2`.
var_n = var_string.
out->write( |String| ).
out->write( var_string ).
out->write( |String assigned to type N| ).
out->write( var_n ).データ型変換を明示的にまたは暗黙的に強制する方法については、このビデオを視聴してください。
1234567891011121314151617181920212223
* result has type C.
* and is displayed unformatted in the console
DATA(result1) = '20230101'.
out->write( result1 ).
* result2 is forced to have type D
* and is displayed with date formatting in the console
DATA(result2) = CONV d( '20230101' ).
out->write( result2 ).
* The method do_something( ) has an importing parameter of type string.
* Attempting to pass var results in a syntax error
* The CONV #( ) expression converts var into the expected type
* Note that CONV #( ) can lead to conversion exceptions
* lcl_class=>do_something( var ).切り詰めや丸めを防ぐ方法については、このビデオを視聴してください。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546
DATA var_date TYPE d.
DATA var_pack TYPE p LENGTH 3 DECIMALS 2.
DATA var_string TYPE string.
DATA var_char TYPE c LENGTH 3.
var_pack = 1 / 8.
out->write( |1/8 = { var_pack NUMBER = USER }| ).
TRY.
var_pack = EXACT #( 1 / 8 ).
CATCH cx_sy_conversion_error.
out->write( |1/8 has to be rounded. EXACT triggered an exception| ).
ENDTRY.
var_string = 'ABCDE'.
var_char = var_string.
out->write( var_char ).
TRY.
var_char = EXACT #( var_string ).
CATCH cx_sy_conversion_error.
out->write( 'String has to be truncated. EXACT triggered an exception' ).
ENDTRY.
var_date = 'ABCDEFGH'.
out->write( var_Date ).
TRY.
var_date = EXACT #( 'ABCDEFGH' ).
CATCH cx_sy_conversion_error.
out->write( |ABCDEFGH is not a valid date. EXACT triggered an exception| ).
ENDTRY.
var_date = '20221232'.
out->write( var_date ).
TRY.
var_date = EXACT #( '20221232' ).
CATCH cx_sy_conversion_error.
out->write( |2022-12-32 is not a valid date. EXACT triggered an exception| ).
ENDTRY.
ABAP クラスのコンソール出力を詳しく確認し、航空会社名が切り詰められていることを確認します。また、貨物フライトに対して表示される運送業者 ID および接続 ID に問題があることにも気付きました。問題のあるデータ型変換をこれらの問題の原因として特定し、それに応じてコードを修正します。