【RAP】Late Numbering


はじめに

前回の記事に引き続きRAP(ABAP RESTful Application Programming Model)でのキーの採番(Numbering)についてみていきます。今回のテーマはLate Numberingです。Late NumberingはDBへの保存の直前に採番を行う方法で、キーに抜けが発生しないのが利点です。

シリーズの先頭はこちら☞ 【RAP】ADTのRAP Generatorを使ってみる

Late Numberingを実装

以下のステップで実装を行います。

  1. UUIDでないキーを持つテーブルを登録
  2. RAP GeneratorでBOを生成
  3. Early Numberingの実装

ステップ1, 2については前回の記事と同じなので割愛し、以下ではEarly Numberingの実装の部分を説明します。

Late Numberingの実装

1. Behavior Definitionの設定

Behavior Definitionの先頭にlate numberingの指定を追加します。また、キー項目であるPersonIDをreadonlyに設定します。

define behavior for ZI_PERSON_LNUM_M alias Person
persistent table zperson_lnum_m
draft table zperson_lnum_m_d
etag master LocalLastChangedAt
lock master total etag LastChangedAt
authorization master( global )
late numbering //追加

{
  field ( readonly )
   CreatedAt,
   CreatedBy,
   LastChangedAt,
   LocalLastChangedAt,
   LastChangedBy,
   PersonID; //追加

late numberingにした場合、ドラフトテーブルに"draftuuid"の項目が必要になります。このため、Quick Fix (Ctrl + 1)でドラフトテーブルを再生成します。
参考:Unmanaged Internal Late Numbering

keyにdraftuuidが追加されます。

再生成するとなぜか"client"の項目が"mandt"に変わってしまうため、"client"に戻して有効化します。

2. Behavior Implementationの実装

late numberingのところにカーソルを当て、Quick Fixでメソッドを生成します。

Behavior ImplementationクラスのLocal Typesにadjust numbersというメソッドが追加されました。

CLASS lsc_zi_person_lnum_m DEFINITION INHERITING FROM cl_abap_behavior_saver.

  PROTECTED SECTION.

    METHODS adjust_numbers REDEFINITION.

ENDCLASS.

CLASS lsc_zi_person_lnum_m IMPLEMENTATION.

  METHOD adjust_numbers.
  ENDMETHOD.

ENDCLASS.

adjust_numbersはSave Sequenceの中で、saveの直前に呼ばれるメソッドです。ここまで来るとエラーは起こりえない、"point of no return"の位置で呼ばれます。

adjust_numbersでやることはEarly Numberingのときと同じく、changingパラメータのmappedに仮のキー(%pky)と実際のキーとのマッピングを返します。mappedには以下のように%pidが設定された状態で入ってくるので、キーを設定して返せばよいです。

  METHOD adjust_numbers.

    "Get max person id from db
    SELECT MAX( person_id ) FROM zperson_lnum_m INTO @DATA(new_id).

    LOOP AT mapped-person ASSIGNING FIELD-SYMBOL(<person>).
      new_id += 1.
      <person>-PersonID = new_id.
    ENDLOOP.

  ENDMETHOD.

なお、adjust_numbersメソッドは登録時だけでなく、更新や削除のときも呼ばれましたが登録以外ではmappedが空でした。よって上記のようにmapped-personをループする実装にしておけば問題ないと思います。

動作確認

新規データを登録します。

ドラフト状態ではキーは採番されません。

"Create"を押して保存すると、キーが採番されます。

Late Numberingが使える環境

Late Numberingは比較的新しい機能で、オンプレのS/4HANAでは以下のバージョンから使えるようになっています。