ABAPでINSERT文を使用する基礎知識
INSERT文の基本構文と動作の仕組み
ABAPのINSERT文は、データベースや内部テーブルにレコードを追加するための基本的なSQL操作です。使用対象(データベース/内部テーブル)とレコード数(単一/複数)によって4つの主要パターンに分類されます。
1. データベースへの単一レコード挿入
* 基本構文 INSERT INTO DBテーブル名 VALUES 構造名. * 実装例 INSERT INTO zt_employee VALUES @ls_employee.
2. データベースへの複数レコード挿入
* 基本構文 INSERT DBテーブル名 FROM TABLE 内部テーブル [ACCEPTING DUPLICATE KEYS]. * ACCEPTING DUPLICATE KEYS: 重複キーのレコードが存在した場合の動作を指定 * - 指定なし:重複エラーでショートダンプ * - 指定あり:重複キーエラーを許容し、エラーが発生しても処理を続行する * 実装例 * 重複チェックあり(デフォルト) INSERT zt_employee FROM TABLE @lt_employees. * 重複チェックなし INSERT zt_employee FROM TABLE @lt_employees ACCEPTING DUPLICATE KEYS.
3. 内部テーブルへの単一レコード挿入
* 基本構文 INSERT 構造体 INTO TABLE 内部テーブル名. INSERT 構造体 INTO 内部テーブル名 [INDEX 挿入位置]. * INDEX: レコードを挿入する位置を指定(標準テーブルのみ使用可) * - 指定なし:テーブルタイプに応じた位置(標準テーブルは末尾、ソートテーブルはソート順) * - 指定あり:指定した位置に挿入(既存レコードは後方シフト) * 実装例 * 通常の挿入 INSERT ls_employee INTO TABLE lt_employees. * 特定の位置に挿入 INSERT ls_employee INTO lt_employees INDEX lv_index.
4. 内部テーブルへの複数レコード挿入
* 基本構文 INSERT LINES OF コピー元内部テーブル INTO TABLE コピー先内部テーブル. INSERT LINES OF コピー元内部テーブル FROM 開始位置 TO 終了位置 INTO TABLE コピー先内部テーブル. * 実装例 * 全レコードの挿入 INSERT LINES OF lt_source INTO TABLE lt_target. * 特定範囲の挿入 INSERT LINES OF lt_source FROM lv_from TO lv_to INTO TABLE lt_target.
シングルレコードのINSERT処理実装手順
INSERT INTO文による1件のレコード追加方法
シングルレコードのINSERT処理は、ABAPで最も基本的なデータ登録処理です。ここでは、効率的で安全な実装方法について解説します。
基本的な実装パターン
* 1. 構造体の宣言とデータ設定 DATA: ls_employee TYPE zt_employee. * データ設定 ls_employee-id = '1001'. ls_employee-name = 'John Smith'. ls_employee-department = 'IT'. ls_employee-entry_date = sy-datum. "システム日付 ls_employee-status = 'A'. "Active * 2. INSERT実行とエラーハンドリング INSERT INTO zt_employee VALUES @ls_employee. IF sy-subrc = 0. COMMIT WORK AND WAIT. "同期的なコミット MESSAGE 'Record inserted successfully.' TYPE 'S'. ELSE. ROLLBACK WORK. MESSAGE 'Insert failed.' TYPE 'E'. ENDIF.
効率的な実装のためのベストプラクティス
- 事前バリデーション
* データ検証用のメソッド例
METHOD validate_employee_data.
DATA: lv_error TYPE boolean.
" 必須項目チェック
IF is_employee-id IS INITIAL OR
is_employee-name IS INITIAL.
lv_error = abap_true.
ENDIF.
" ID形式チェック(例:4桁の数字)
IF NOT matches( val = is_employee-id
regex = '^\d{4}$' ).
lv_error = abap_true.
ENDIF.
" エラーがある場合は例外を発生
IF lv_error = abap_true.
RAISE EXCEPTION TYPE cx_invalid_data.
ENDIF.
ENDMETHOD.
- トランザクション制御の最適化
* トランザクション制御を含むINSERT処理の例
METHOD insert_employee.
DATA: ls_employee TYPE zt_employee.
" トランザクション開始
GET TIME STAMP FIELD DATA(lv_start_time).
TRY.
" データ検証
validate_employee_data( is_employee ).
" INSERT実行
INSERT INTO zt_employee VALUES @is_employee.
" 正常終了時のコミット
COMMIT WORK AND WAIT.
" 処理時間の記録(オプション)
GET TIME STAMP FIELD DATA(lv_end_time).
log_processing_time(
iv_start_time = lv_start_time
iv_end_time = lv_end_time ).
CATCH cx_invalid_data INTO DATA(lx_error).
" エラー処理
ROLLBACK WORK.
log_error( lx_error ).
ENDTRY.
ENDMETHOD.
パフォーマンス最適化のポイント
- バッファ利用の最適化
- テーブルバッファを効果的に活用
- 不要なバッファ更新を防ぐ
- コミットのタイミング
- 適切なタイミングでコミット
- 必要に応じて非同期コミットを使用
コード品質を高めるためのチェックリスト
| チェック項目 | 説明 | 重要度 |
|---|---|---|
| データ検証 | 全ての必須項目と形式チェック | 高 |
| エラーハンドリング | 例外処理の実装 | 高 |
| トランザクション制御 | 適切なCOMMIT/ROLLBACK | 高 |
| パフォーマンス考慮 | バッファ利用の最適化 | 中 |
| ログ記録 | エラーログと処理時間の記録 | 中 |
| コメント | 処理の目的と仕様の記載 | 中 |
実装時の注意点
- データの整合性確保
- 主キー重複チェック
- 外部キー制約の考慮
- トランザクションの適切な管理
- エラーハンドリング
- 具体的なエラーメッセージの提供
- ログ記録による追跡可能性の確保
- リカバリー処理の実装
- 保守性への配慮
- コードの構造化
- 適切なコメント付与
- 命名規則の遵守
このように、シングルレコードのINSERT処理でも、品質の高い実装のために考慮すべき点は多岐にわたります。基本的な実装パターンを理解した上で、これらのベストプラクティスを適用することで、より堅牢なプログラムを作成することができます。
マルチレコードのINSERT処理最適化テクニック
INSERT文による複数レコードの一括登録方法
大量データを効率的に処理するための一括INSERT処理について、最適な実装方法と注意点を解説します。
基本的な一括INSERT実装
* 1. 内部テーブルの準備
DATA: lt_employees TYPE TABLE OF zt_employee,
ls_employee TYPE zt_employee.
* 2. 複数レコードの一括INSERT
METHOD insert_employees_bulk.
TRY.
INSERT zt_employee FROM TABLE @it_employees
ACCEPTING DUPLICATE KEYS.
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
rv_success = abap_true.
ELSE.
ROLLBACK WORK.
rv_success = abap_false.
ENDIF.
CATCH cx_root INTO DATA(lx_error).
ROLLBACK WORK.
log_error( lx_error ).
rv_success = abap_false.
ENDTRY.
ENDMETHOD.
パフォーマンス最適化テクニック
- バッチサイズの最適化
* 最適なバッチサイズでの分割処理
METHOD insert_with_optimal_batch.
CONSTANTS: lc_batch_size TYPE i VALUE 1000.
DATA: lt_batch TYPE TABLE OF zt_employee.
WHILE lines( it_employees ) > 0.
" バッチサイズ分のデータを取得
lt_batch = VALUE #(
FOR i = 1 WHILE i <= lc_batch_size
AND i <= lines( it_employees )
( it_employees[ i ] ) ).
" バッチ処理実行
INSERT zt_employee FROM TABLE @lt_batch.
" 成功した場合、処理済みデータを削除
IF sy-subrc = 0.
DELETE it_employees TO lc_batch_size.
COMMIT WORK AND WAIT.
ELSE.
ROLLBACK WORK.
EXIT. " エラー発生時は処理中断
ENDIF.
ENDWHILE.
ENDMETHOD.
- パラレル処理の活用
* パラレル処理を利用した高速化
METHOD insert_parallel.
DATA: lt_packages TYPE TABLE OF rspc_t_func_pool.
" データを複数パッケージに分割
lt_packages = split_data_into_packages(
it_data = it_employees
iv_package_size = 1000 ).
" パラレル処理の実行
CALL FUNCTION 'ZSPC_PARALLEL_INSERT'
STARTING NEW TASK 'PARALLEL_INSERT'
DESTINATION IN GROUP 'parallel_generators'
PERFORMING handle_package ON END OF TASK
TABLES
it_packages = lt_packages.
WAIT UNTIL gv_all_packages_processed = abap_true.
ENDMETHOD.
処理効率を高めるためのベストプラクティス
| テクニック | 効果 | 実装の複雑さ | 推奨ケース |
|---|---|---|---|
| バッチ処理 | 高 | 低 | 定期的な大量データ登録 |
| パラレル処理 | 非常に高 | 高 | リアルタイム性が要求される場合 |
| 非同期処理 | 中 | 中 | バックグラウンド処理 |
パフォーマンスモニタリング
* パフォーマンス計測用のユーティリティクラス
CLASS lcl_performance_monitor DEFINITION.
PUBLIC SECTION.
METHODS:
start_monitoring,
end_monitoring,
get_statistics RETURNING VALUE(rs_stats) TYPE ty_stats.
PRIVATE SECTION.
DATA:
mv_start_time TYPE timestamp,
mv_end_time TYPE timestamp,
mv_records TYPE i.
ENDCLASS.
エラーハンドリングと回復戦略
- エラー検出と記録
* エラーハンドリングの実装例
METHOD handle_insert_errors.
DATA: lt_failed_records TYPE TABLE OF zt_employee.
" 失敗したレコードの収集
lt_failed_records = VALUE #( FOR rec IN it_employees
WHERE ( status = 'ERROR' ) ( rec ) ).
" エラーログの記録
log_failed_records( lt_failed_records ).
" リトライキューへの登録
enqueue_for_retry( lt_failed_records ).
ENDMETHOD.
- リカバリー処理
* リカバリー処理の実装
METHOD recover_failed_inserts.
DATA: lt_retry_records TYPE TABLE OF zt_employee.
" リトライキューからデータ取得
SELECT * FROM zt_retry_queue
INTO TABLE @lt_retry_records
WHERE status = 'PENDING'
ORDER BY priority.
" リトライ処理実行
LOOP AT lt_retry_records INTO DATA(ls_retry).
TRY.
insert_single_record( ls_retry ).
update_retry_status(
iv_record_id = ls_retry-id
iv_status = 'SUCCESS' ).
CATCH cx_root.
update_retry_status(
iv_record_id = ls_retry-id
iv_status = 'FAILED' ).
ENDTRY.
ENDLOOP.
ENDMETHOD.
これらの実装方法を適切に組み合わせることで、大量データの一括INSERT処理を効率的に実現できます。特に、パフォーマンスとエラーハンドリングのバランスを考慮した実装が重要です。
データ整合性を保証するINSERT処理の実装
重複チェックロジックの実装方法
データ整合性を維持するための重複チェックと、その実装パターンについて解説します。
1. 基本的な重複チェック実装
* 単一キーでの重複チェック
METHOD check_duplicate_employee.
DATA: lv_exists TYPE abap_bool.
SELECT SINGLE @abap_true
FROM zt_employee
WHERE id = @is_employee-id
INTO @lv_exists.
IF lv_exists = abap_true.
RAISE EXCEPTION TYPE zcx_duplicate_entry
EXPORTING
textid = zcx_duplicate_entry=>employee_id_exists
employeeid = is_employee-id.
ENDIF.
ENDMETHOD.
* 複合キーでの重複チェック
METHOD check_duplicate_contract.
SELECT SINGLE @abap_true
FROM zt_contracts
WHERE employee_id = @is_contract-employee_id
AND valid_from = @is_contract-valid_from
INTO @DATA(lv_exists).
IF lv_exists = abap_true.
RAISE EXCEPTION TYPE zcx_duplicate_entry.
ENDIF.
ENDMETHOD.
2. 高度な整合性チェック実装
CLASS lcl_data_integrity_checker DEFINITION.
PUBLIC SECTION.
METHODS:
* 包括的な整合性チェック
check_data_integrity
IMPORTING
is_data TYPE any
iv_check_type TYPE char1
RETURNING
VALUE(rv_valid) TYPE abap_bool
RAISING
zcx_data_integrity,
* 関連テーブルとの整合性チェック
check_referential_integrity
IMPORTING
is_data TYPE any
RAISING
zcx_referential_integrity.
PRIVATE SECTION.
METHODS:
check_mandatory_fields,
check_value_ranges,
check_business_rules.
ENDCLASS.
* 実装例
METHOD check_data_integrity.
" 必須項目チェック
check_mandatory_fields( is_data ).
" 値範囲チェック
check_value_ranges( is_data ).
" ビジネスルールチェック
check_business_rules( is_data ).
rv_valid = abap_true.
ENDMETHOD.
3. トランザクション制御を含めた実装
* トランザクション制御を含む登録処理
METHOD insert_with_integrity_check.
" トランザクション開始
GET TIME STAMP FIELD DATA(lv_start_time).
TRY.
" ロック設定
CALL FUNCTION 'ENQUEUE_EZ_EMPLOYEE'
EXPORTING
mode_zt_employee = 'E'
mandt = sy-mandt
id = is_employee-id
EXCEPTIONS
foreign_lock = 1
system_failure = 2
OTHERS = 3.
IF sy-subrc <> 0.
RAISE EXCEPTION TYPE zcx_lock_error.
ENDIF.
" 整合性チェック
mo_integrity_checker->check_data_integrity(
is_data = is_employee
iv_check_type = 'I' ).
" データ登録
INSERT zt_employee FROM @is_employee.
" コミット
COMMIT WORK AND WAIT.
" ロック解放
CALL FUNCTION 'DEQUEUE_EZ_EMPLOYEE'
EXPORTING
mode_zt_employee = 'E'
mandt = sy-mandt
id = is_employee-id.
CATCH zcx_data_integrity INTO DATA(lx_integrity)
OR zcx_lock_error INTO DATA(lx_lock).
" ロールバックとロック解放
ROLLBACK WORK.
CALL FUNCTION 'DEQUEUE_ALL'.
" エラーログ記録
log_error( lx_integrity ).
RAISE EXCEPTION TYPE zcx_insert_failed
EXPORTING
previous = lx_integrity.
ENDTRY.
ENDMETHOD.
データ整合性チェックリスト
| チェック項目 | 実装レベル | 重要度 | 説明 |
|---|---|---|---|
| 主キー重複 | データベース | 最高 | 一意性制約による保証 |
| 外部キー参照 | アプリケーション | 高 | 関連データの存在確認 |
| 必須項目 | アプリケーション | 高 | NOT NULL項目の入力確認 |
| 値範囲 | アプリケーション | 中 | 許容値の範囲チェック |
| ビジネスルール | アプリケーション | 中 | 業務ロジックに基づく整合性 |
実装時の注意点
- パフォーマンスへの配慮
- インデックスの効果的な活用
- 必要最小限のロック範囲
- 適切なコミットタイミング
- エラーハンドリング
- 具体的なエラーメッセージ
- トランザクションの適切な制御
- ロックの確実な解放
- 保守性への配慮
- チェックロジックの集約
- 再利用可能なコンポーネント化
- 適切なドキュメント化
これらの実装パターンを適切に組み合わせることで、データ整合性を確実に保証するINSERT処理を実現できます。
INSERT処理の実装における注意点とトラブルシューティング
よくあるエラーとその対処方法
INSERT処理で発生する一般的なエラーとその解決方法について、実践的な対処方法を解説します。
1. 主要なエラーパターンと対処法
| エラーコード | エラー内容 | 主な原因 | 対処方法 |
|---|---|---|---|
| DBSQL_DUPLICATE_KEY | 一意制約違反 | 主キーの重複 | 既存データの確認と一意性の保証 |
| DBSQL_NOT_NULL | NOT NULL制約違反 | 必須項目の未設定 | 必須項目の入力チェック |
| DBSQL_FOREIGN_KEY | 外部キー制約違反 | 参照整合性エラー | 関連データの存在確認 |
| DBSQL_MAX_LENGTH | 最大長超過 | フィールド長の超過 | データ長のバリデーション |
| DBSQL_CONVERSION_ERROR | 型変換エラー | データ型の不一致 | 適切なデータ型変換の実装 |
* エラーハンドリングの実装例
METHOD handle_insert_error.
CASE cx_root=>get_text( ).
WHEN 'DBSQL_DUPLICATE_KEY'.
" 重複キーエラーの処理
handle_duplicate_key_error(
is_data = is_record
io_error = io_error ).
WHEN 'DBSQL_NOT_NULL'.
" NULL値エラーの処理
handle_not_null_error(
is_data = is_record
io_error = io_error ).
WHEN OTHERS.
" その他のエラー処理
handle_general_error(
is_data = is_record
io_error = io_error ).
ENDCASE.
ENDMETHOD.
2. エラー予防のためのバリデーション実装
CLASS lcl_data_validator DEFINITION.
PUBLIC SECTION.
METHODS:
validate_before_insert
IMPORTING
is_data TYPE any
RETURNING
VALUE(rt_errors) TYPE ty_error_tab.
PRIVATE SECTION.
METHODS:
check_data_types,
check_field_lengths,
check_mandatory_fields,
check_value_ranges.
ENDCLASS.
METHOD validate_before_insert.
" データ型チェック
rt_errors = VALUE #( BASE rt_errors
( LINES OF check_data_types( is_data ) ) ).
" フィールド長チェック
rt_errors = VALUE #( BASE rt_errors
( LINES OF check_field_lengths( is_data ) ) ).
" 必須項目チェック
rt_errors = VALUE #( BASE rt_errors
( LINES OF check_mandatory_fields( is_data ) ) ).
" 値範囲チェック
rt_errors = VALUE #( BASE rt_errors
( LINES OF check_value_ranges( is_data ) ) ).
ENDMETHOD.
デバッグとパフォーマンスモニタリングの方法
1. SQL トレース活用法
* SQLトレース取得用のユーティリティクラス
CLASS lcl_sql_trace DEFINITION.
PUBLIC SECTION.
METHODS:
start_trace,
stop_trace,
analyze_trace
RETURNING
VALUE(rt_analysis) TYPE ty_trace_analysis.
ENDCLASS.
METHOD analyze_trace.
" トレース結果の解析
SELECT *
FROM d_sql_trace
WHERE trace_timestamp BETWEEN @mv_start_time AND @mv_end_time
INTO TABLE @DATA(lt_trace).
" 実行時間の分析
LOOP AT lt_trace INTO DATA(ls_trace).
ANALYZE ls_trace-execution_time.
ENDLOOP.
ENDMETHOD.
2. パフォーマンスモニタリング実装
* パフォーマンスモニタリングの実装例
METHOD monitor_insert_performance.
DATA: lv_start_time TYPE timestamp,
lv_end_time TYPE timestamp,
lv_duration TYPE decimal.
GET TIME STAMP FIELD lv_start_time.
" INSERT処理の実行
TRY.
execute_insert( ).
CATCH cx_root INTO DATA(lx_error).
handle_error( lx_error ).
ENDTRY.
GET TIME STAMP FIELD lv_end_time.
" 処理時間の計算と記録
lv_duration = calculate_duration(
iv_start_time = lv_start_time
iv_end_time = lv_end_time ).
log_performance_data(
iv_duration = lv_duration
is_metrics = get_performance_metrics( ) ).
ENDMETHOD.
3. トラブルシューティングのベストプラクティス
- 段階的なデバッグアプローチ
- データ検証
- SQL実行計画の確認
- ロック状況の確認
- トランザクション状態の確認
- ログ記録の重要性
* 包括的なログ記録の実装
METHOD log_insert_operation.
DATA: ls_log TYPE zst_insert_log.
" ログデータの設定
ls_log = VALUE #(
timestamp = sy-datum
user = sy-uname
operation = 'INSERT'
table_name = iv_table_name
record_count = iv_record_count
duration = iv_duration
status = iv_status
error_message = iv_error_message
).
" ログの保存
INSERT ztt_insert_log FROM @ls_log.
ENDMETHOD.
- パフォーマンス改善のチェックポイント
| 確認項目 | チェック内容 | 改善方法 |
|---|---|---|
| テーブルバッファ | バッファ利用状況 | バッファ設定の最適化 |
| インデックス | インデックスの使用状況 | 適切なインデックス設定 |
| ロック待ち | ロック競合の有無 | ロック戦略の見直し |
| コミット頻度 | コミットタイミング | 適切なコミット間隔設定 |
これらの実装と対策を適切に組み合わせることで、安定したINSERT処理の運用が可能になります。
実践的なコード例で学ぶINSERT処理の応用
業務システムでよく使用されるINSERTパターン
実際の業務システムで頻繁に使用されるINSERT処理のパターンと、その実装例を解説します。
1. マスタデータ登録処理
* マスタデータ登録クラス
CLASS zcl_master_data_manager DEFINITION.
PUBLIC SECTION.
METHODS:
* マスタデータ一括登録
import_master_data
IMPORTING
it_data TYPE ANY TABLE
RETURNING
VALUE(rt_result) TYPE ty_import_result
RAISING
zcx_master_data_error.
PRIVATE SECTION.
METHODS:
validate_master_data,
handle_duplicates,
update_reference_data.
ENDCLASS.
* 実装例
METHOD import_master_data.
" トランザクション制御
CALL FUNCTION 'ENQUEUE_E_TABLE'
EXPORTING
tabname = 'ZT_MASTER'.
TRY.
" データ検証
validate_master_data( it_data ).
" 重複チェックと処理
handle_duplicates( it_data ).
" 一括登録
INSERT zt_master FROM TABLE @it_data
ACCEPTING DUPLICATE KEYS.
" 参照データの更新
update_reference_data( it_data ).
" コミット
COMMIT WORK AND WAIT.
CATCH cx_root INTO DATA(lx_error).
ROLLBACK WORK.
rt_result-success = abap_false.
rt_result-message = lx_error->get_text( ).
ENDTRY.
" ロック解放
CALL FUNCTION 'DEQUEUE_E_TABLE'
EXPORTING
tabname = 'ZT_MASTER'.
ENDMETHOD.
2. トランザクションデータの登録処理
* トランザクションデータ登録クラス
CLASS zcl_transaction_manager DEFINITION.
PUBLIC SECTION.
METHODS:
create_transaction
IMPORTING
is_header TYPE zstt_trans_header
it_items TYPE ztt_trans_items
RETURNING
VALUE(rv_trans_id) TYPE ztrans_id
RAISING
zcx_transaction_error.
PRIVATE SECTION.
METHODS:
generate_transaction_id,
validate_transaction,
update_stock_quantity,
create_audit_log.
ENDCLASS.
METHOD create_transaction.
" トランザクションID生成
rv_trans_id = generate_transaction_id( ).
TRY.
" ヘッダデータ設定
DATA(ls_header) = is_header.
ls_header-trans_id = rv_trans_id.
ls_header-create_date = sy-datum.
ls_header-create_time = sy-uzeit.
ls_header-create_user = sy-uname.
" データ検証
validate_transaction(
is_header = ls_header
it_items = it_items ).
" ヘッダ登録
INSERT ztt_trans_header FROM @ls_header.
" 明細登録
LOOP AT it_items INTO DATA(ls_item).
ls_item-trans_id = rv_trans_id.
INSERT ztt_trans_items FROM @ls_item.
" 在庫数更新
update_stock_quantity(
iv_material = ls_item-material
iv_quantity = ls_item-quantity ).
ENDLOOP.
" 監査ログ作成
create_audit_log(
iv_trans_id = rv_trans_id
is_header = ls_header
it_items = it_items ).
COMMIT WORK AND WAIT.
CATCH cx_root INTO DATA(lx_error).
ROLLBACK WORK.
RAISE EXCEPTION TYPE zcx_transaction_error
EXPORTING
previous = lx_error.
ENDTRY.
ENDMETHOD.
実際のプロジェクトで使える実装テンプレート
1. 汎用データ登録テンプレート
* 汎用データ登録クラス
CLASS zcl_generic_data_manager DEFINITION.
PUBLIC SECTION.
METHODS:
constructor
IMPORTING
iv_table_name TYPE tabname,
insert_data
IMPORTING
it_data TYPE ANY TABLE
iv_commit_count TYPE i DEFAULT 1000
RETURNING
VALUE(rt_result) TYPE ty_insert_result.
PRIVATE SECTION.
DATA:
mv_table_name TYPE tabname,
mo_validator TYPE REF TO zcl_data_validator,
mo_logger TYPE REF TO zcl_operation_logger.
METHODS:
process_batch
IMPORTING
it_batch TYPE ANY TABLE
RETURNING
VALUE(rt_result) TYPE ty_batch_result.
ENDCLASS.
METHOD insert_data.
DATA: lt_batch TYPE TABLE OF ty_batch_result.
" バッチ処理
WHILE lines( it_data ) > 0.
DATA(lt_current_batch) = VALUE #(
FOR i = 1 UNTIL i > iv_commit_count
( CAST #( VALUE #( it_data[ i ] OPTIONAL ) ) ) ).
IF lt_current_batch IS NOT INITIAL.
" バッチ処理実行
APPEND process_batch( lt_current_batch ) TO lt_batch.
" 処理済みデータの削除
DELETE it_data TO iv_commit_count.
ENDIF.
ENDWHILE.
" 結果の集計
rt_result = summarize_results( lt_batch ).
ENDMETHOD.
2. エラーハンドリング付きINSERTテンプレート
* エラーハンドリング付き登録処理テンプレート
CLASS zcl_resilient_insert DEFINITION.
PUBLIC SECTION.
TYPES:
BEGIN OF ty_insert_config,
max_retries TYPE i,
retry_interval TYPE i,
batch_size TYPE i,
END OF ty_insert_config.
METHODS:
constructor
IMPORTING
is_config TYPE ty_insert_config,
insert_with_retry
IMPORTING
it_data TYPE ANY TABLE
RETURNING
VALUE(rt_result) TYPE ty_insert_result.
PRIVATE SECTION.
DATA:
ms_config TYPE ty_insert_config.
METHODS:
execute_with_retry
IMPORTING
it_batch TYPE ANY TABLE
RAISING
zcx_max_retry_exceeded.
ENDCLASS.
METHOD insert_with_retry.
DATA: lt_failed_records TYPE TABLE OF ty_failed_record.
" バッチ処理
WHILE lines( it_data ) > 0.
TRY.
" リトライ付き実行
execute_with_retry(
it_batch = extract_batch(
it_data = it_data
iv_batch_size = ms_config-batch_size ) ).
CATCH zcx_max_retry_exceeded INTO DATA(lx_retry).
" 失敗したレコードの記録
APPEND LINES OF get_failed_records( lx_retry )
TO lt_failed_records.
ENDTRY.
ENDWHILE.
" 結果の返却
rt_result = VALUE #(
success_count = lines( it_data ) - lines( lt_failed_records )
failed_records = lt_failed_records ).
ENDMETHOD.
これらのテンプレートは、実際のプロジェクトで必要に応じてカスタマイズして使用できます。基本的な機能を備えながら、拡張性も考慮した設計となっています。
