Fortsetzung Eingabe-Dynpro mit Sperrverwaltung

Zu diesem Dokument gehören auch:

Eingabe-Dynpro für Tabelleneinträge

Dynprofelder als Druck ausgeben

Drucken aus Dynpro, Aufruf des Formulares

Hier folgt nun die Erweiterung des Eingabedynpros mit einer Sperrverwaltung.

Im vorherigen Artikel hatte ich bereits erwähnt, dass bei Erstellung des Tabellenpflegedynpros durch den Tabellenpflege-Generator ein Manko besteht. Befindet sich ein User im Eingabe-/Änderungsmodus, dann wird die ganze Tabelle für Änderungen gesperrt. Das braucht und soll aber so nicht sein. Wir wollen nun eine Sperrverwaltung einbauen, die nur den jeweiligen Datensatz sperrt, der gerade im Änderungs-Zugriff steht.

 Wir brauchen ein Sperrobjekt:

Mit der Transaktion se11 erstellen wir ein Sperrobjekt. In den SAP-Konventionen ist festgelegt, dass der Name mit “E” beginnen soll.

image

Da ich das Sperrobjekt bereits angelegt habe, werde ich hier nur die Änderungssicht zeigen können.

Für welche Tabelle soll das Sperrobjekt angelegt werden? Hier wird die Tabelle eingetragen und der Sperrmodus ausgewählt.

image

 Auf der Registerkarte “Sperrparameter” erscheinen die Schlüsselfelder der Tabelle. Da wir ja auf Datensatzebene sperren, müssen alle Schlüsselfelder ausgewählt werden, sonst würde die ganze Tabelle für Eingaben gesperrt werden.

image

Durch das aktivieren des Sperrobjektes werden im Hintergrund zwei Funktionbausteine angelegt.

ENQUEUE_EINVEST und DEQUEUE_EINVEST.

Diese Funktionsbausteine müssen nun so in das Programm eingebaut werden, dass sie zur richtigen Zeit das Richtige tun. D.h. Es soll ein Sperreintrag gesetzt werden sobald in den Änderungsmodus umgeschaltet wird und umgekehrt. Auch beim Verlassen der Transaktion muss sichergestellt sein, dass der Sperreintrag wieder entfernt wird.

Im folgenden greife ich noch mal das Programm aus dem vorhergehenden Artikel auf und baue nun den Aufruf der Funktionsbausteine dort ein.

Zunächst erstellen wir mal ein Unterprogramm in dem die FuB aufgerufen werden sollen.

Die Variable CHG = 1 besagt, dass der Änderungsmodus aktiviert wurde. In diesem Fall soll ein Sperrvermerk in die Sperrtabelle vorgenommen werden. Andernfalls muss der Sperrvermerk wieder entfernt werden.

FORM SPERRE .
* Egal welche Benutzeraktion hier stattfindet, es muss in jedem Fall
* am Ende der Sperreintrag entfernt werden
* Sperre auf Datensatzebene setzen
IF CHG = 1.
CALL FUNCTION 'ENQUEUE_EINVEST'
EXPORTING
MODE_ZMM_INVEST_PLAN = 'X'
MNDT = SY-MANDT
INTNR = ZMM_INVEST_PLAN-INTNR
* X_INTNR = ' '
* _SCOPE = '2'
* _WAIT = ' '
* _COLLECT = ' '
EXCEPTIONS
FOREIGN_LOCK = 1
SYSTEM_FAILURE = 2
OTHERS = 3.
IF SY-SUBRC 0.
CASE SY-SUBRC.
WHEN 1.
CHG = 0.
CONCATENATE 'Datensatz gesperrt durch: ' SY-MSGV1 INTO I_MSG SEPARATED BY ' '.
MESSAGE E888(SABAPDOCU) WITH I_MSG.
WHEN 2 OR 3.
CHG = 0.
MESSAGE E888(SABAPDOCU) .
ENDCASE.
ENDIF.
ELSE.
CALL FUNCTION 'DEQUEUE_EINVEST'
EXPORTING
MODE_ZMM_INVEST_PLAN = 'X'
MNDT = SY-MANDT
INTNR = ZMM_INVEST_PLAN-INTNR
* X_INTNR = ' '
* _SCOPE = '3'
* _SYNCHRON = ' '
* _COLLECT = ' '
.
ENDIF.
ENDFORM.

Den Aufruf habe ich in das PAI-Module USER_COMMAND_0902 INPUT eingebaut.

MODULE USER_COMMAND_0902 INPUT.
WA_AKTUELLE_ZEILE-INTNR = ''.
CASE SY-UCOMM.
WHEN 'SAVE'.
PERFORM P_SAVE.
CHG = 0. "Kenneichen damit
PERFORM SPERRE. "der Sperreintrag aufgehoben wird.
SET SCREEN 0.
LEAVE SCREEN.
WHEN 'CANCEL'. "Abbruch
CHG = 0.
PERFORM SPERRE.
SET SCREEN 0.
LEAVE SCREEN.
WHEN 'NEW'.
CHG = 0.
PERFORM SPERRE.
CHG = 1. "nach aufheben der Sperre wieder in den Ändern/Eingabemodus
PERFORM P_NEW.
WHEN 'COPY'.
CHG = 0.
PERFORM SPERRE.
CHG = 1.
PERFORM P_COPY.
WHEN 'DELETE'.
PERFORM P_DELETE.
* PERFORM SPERRE.
WHEN 'CHANGE'.
PERFORM P_CHANGE.
PERFORM SPERRE.
ENDCASE.


ENDMODULE.

Die Sperreinträge sollten nun über die Transaktion SM12 beobachtet werden. Es muss sichergestellt sein, dass die Sperreinträge auch wieder entfernt werden wenn das Programm die Sperre für den Datensatz nicht mehr benötigt. 

Schreibe einen Kommentar