RAP Prechecks im DRAFT Modus

RAP Prechecks im DRAFT Modus

Veröffentlicht am 3. Februar 2024 von

Sören Schlegel

| ABAP |

Ich habe bereits einen kleinen Beitrag zur Kombination von Prechecks geschrieben - aber wenn man Prechecks in DRAFT-aktivierten Szenarien verwendet, steht man vor einem anderen Problem: Updates enthalten nur geänderte Felder - wie geht man damit um?

Zuerst schauen wir uns die Definition an. Dies kann sowohl auf der Ebene der Verhaltensdefinition als auch auf der Ebene der Verhaltensprojektion geschehen - ich persönlich bevorzuge dies in der Regel auf der Ebene der Projektion, da es sinnvoll ist, die Prüfung erneut als Determination on Save abzubilden, so dass eine saubere Integrität des BO gewährleistet ist:

define behavior for ZC_MyEntity alias Header
{
  use create ( augment, precheck );
  use update ( augment, precheck );
  use delete;
  ...
}

Nachdem wir das Verhalten definiert haben, kommen wir zur Definition der Methode:

    METHODS precheck FOR PRECHECK
      IMPORTING entities_create FOR CREATE Header
                entities_update FOR UPDATE header.

Und ja: last but not least, die Implementierung:

    DATA(entities_check) = entities_create.

    LOOP AT entities_update INTO DATA(entity_update).

      READ ENTITIES OF ZC_MyEntity IN LOCAL MODE
           ENTITY Header
           ALL FIELDS WITH VALUE #( ( %tky = entity_update-%tky ) )
           RESULT DATA(header_read).

      IF lines( header_read ) = 0.
        CONTINUE.
      ENDIF.

      APPEND INITIAL LINE TO entities_check ASSIGNING FIELD-SYMBOL(<entity_check>).

      <entity_check> = CORRESPONDING #( header_read[ 1 ] ).
      <entity_check> = CORRESPONDING #( BASE ( <entity_check> ) entity_update USING CONTROL ).

    ENDLOOP.


    LOOP AT entities_check INTO DATA(entity_check).
* Here are our checks!
    ENDLOOP.

Was machen wir hier?

  • Zeile 1: Hier definieren wir eine Variable, die schließlich alle Einträge enthalten soll, die wir überprüfen wollen
  • Zeile 3: Wir machen eine Schleife über die ENTITIES_UPDATE, da wir für diese die anderen Inhalte lesen müssen
  • Zeile 5: Jetzt kommt ein READ ENTITIES - je nachdem, wo wir unsere Vorprüfung implementieren, auf dem ZI_* oder dem ZC_*
  • Zeile 7: Dies ist besonders für DRAFT-Neulinge wichtig! Wir verwenden nicht %KEY, sondern %TKY - wir wollen vielleicht den Inhalt des DRAFT lesen - und nicht das, was nur aktiviert ist.
  • Zeile 10: Wie immer sollten wir auch hier darauf achten, dass es schon etwas gibt und wir nicht in der ersten Änderung sind
  • Zeile 17: Jetzt kombinieren wir "alte Werte" und "neue Werte" - wir benutzen die CONTROL-Flags, die uns RAP zur Verfügung stellt, anstatt einen manuellen Vergleich durchzuführen
  • Zeile 22ff: Jetzt können wir uns mit unserer ganzen Magie austoben 🙂

Viel Spaß!

Sören Schlegel