0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【RAP】Late Numbering

Last updated at Posted at 2022-01-19

はじめに

前回の記事に引き続き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. Late Numberingの実装

ステップ1, 2については前回の記事と同じなので割愛し、以下ではLate 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
image.png

keyにdraftuuidが追加されます。
image.png

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

2. Behavior Implementationの実装

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

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"の位置で呼ばれます。
image.png

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

  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をループする実装にしておけば問題ないと思います。

動作確認

新規データを登録します。
image.png
ドラフト状態ではキーは採番されません。
image.png
"Create"を押して保存すると、キーが採番されます。
image.png

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

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?