ABAP RAP

Numbering

(C) Brandeis Consulting📁

Scope

In diesem Foliensatz geht es ausschließlich um die Standard Features des Managed Szenarios. Die folgenden Aspekte sollen gelernt werden:

  • Nummernvergabe
(C) Brandeis Consulting📁

Programmierte Nummernvergabe

Frühe Nummernvergabe

  • Im Kopf der Verhaltensdefinition: early numbering
  • Implementierung der Methode FOR_NUMBERING der Handlerklasse
(C) Brandeis Consulting📁

Späte Nummervergabe - Ab 2021

Anforderung: Anhand des ausgewählten Projektes soll ein Schlüssel erzeugt werden. Dieser besteht aus

  • dem Schlüssel des Projektes
  • einem Bindestrich und
  • einer innerhalb dieses Projektes fortlaufenden Nummer

Beispiel

Der Benutzer wählt das Projekt BW4 aus. Die höchste bislang vergebene Aufgabennummer für dieses Projekt ist BW4-815. Die nächste Nummer ist also die BW4-816.

Was zu tun ist

  • Behavior Definition anpassen
  • Implementierung der Methode ADJUST_NUMBERS
(C) Brandeis Consulting📁

Späte Nummernvergabe - Behavior Definition

Vorgehen:

  • late numbering einstellen
  • Feld Projekt ist Pflichtfeld für die Anlage
  • Feld TaskKey ist gegen Eingab gesperrt
managed implementation in class zbp_i_tasks unique;
strict ( 2 );

define behavior for zi_tasks 
late numbering                           //<===
persistent table zbc_tasks
lock master
authorization master ( instance )
{
  create;
  update;
  delete;
  association _Comments { create; }
  field ( readonly ) TaskKey;            //<===
  field ( mandatory : create ) Project;  //<===
  field ( mandatory ) Summary;
  mapping for zbc_tasks
(C) Brandeis Consulting📁

Späte Nummernvergabe - Implementierung

  • Im Changing-Parameter MAPPED stehen die %PID der Instanzen, die einen neuen Schlüssel bekommen sollen.
  • Da die Methode auch beim Update-Speichern ohne Neuanlage durchlaufen wird, ist die Logik im LOOP implementiert. Wenn MAPPED-ZI_TASKS leer ist, dann passiert auch nichts.
  • Der neue Schlüssel wird mit der %PID an die Tabelle MAPPED-ZI_TASKS angehängt.
  • Die WHERE-Bedingung im LOOP stellt sicher, dass es keine Endlosschleife gibt.
  METHOD adjust_numbers.
    LOOP AT mapped-zi_tasks INTO DATA(ls_task)
      where %key-taskkey is initial.

      READ ENTITY IN LOCAL MODE zi_tasks
        ALL FIELDS
        WITH VALUE #( ( %pid = ls_task-%pid ) )
        RESULT DATA(result).

      DATA(project) = result[ 1 ]-project.

      SELECT  SINGLE MAX(
                   CAST( right( task_key,
                                length( task_key ) 
                                - instr( task_key, '-' ) )
                            AS INT4 ) ) AS max_key
        FROM zbc_tasks
        WHERE project = @project
        INTO @DATA(max_key).

      DATA(nextKey) = |{ project }-{ max_key + 1 }|.

      APPEND VALUE #( %key-taskkey = nextKey
                      %pid = ls_task-%pid ) 
                TO mapped-zi_tasks.
    ENDLOOP.
  ENDMETHOD.
(C) Brandeis Consulting📁