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.
これらのテンプレートは、実際のプロジェクトで必要に応じてカスタマイズして使用できます。基本的な機能を備えながら、拡張性も考慮した設計となっています。