Eingabe-Dynpro für Tabelleneinträge

Anlegen eines Pflegedynpros

Es handelt sich hier um eine Einzelanzeige eines Datensatzes. Dieses Beispiel zeigt auch Felder die nicht in der Tabelle gespeichert sind, sondern nachträglich aus Funktionsbausteinen dazu gelesen werden. z.B. der Name der Kostenstelle wird mit einem BAPI nachgelesen, dazu kommen wir später noch.

image

Wir benötigen auch noch einen GUI-Status, damit die notwendigen Druckknöpfe angelegt werden. Diesen möchte ich einfach D902 nennen.

image

Die Ablauflogik beinhaltet nun die erforderlichen aufzurufenden Module.

PROCESS BEFORE OUTPUT.
MODULE STATUS_0902.
MODULE START_902.
MODULE HIDDEN_ITEM.
PROCESS AFTER INPUT.
MODULE USER_COMMAND_0902.

Zunächst wird also der GUI-Status gesetzt. In diesem Modul werden zu Beginn alle Felder  auf nicht Eingabebereit gesetzt. Die Variable CHG steuert im weiteren Verlauf, ob die Felder vom Anzeige- in den Eingabemodus geschaltet werden sollen. Diese Logik schaltet also zwischen Anzeige und Eingabe hin und her.

MODULE STATUS_0902 OUTPUT.
* SET PF-STATUS 'xxxxxxxx'.
SET TITLEBAR 'Investitionsplanung'.
SET PF-STATUS 'D902'.
LOOP AT SCREEN .
IF SCREEN-NAME 'ZMM_INVEST_PLAN-INTNR'.
IF CHG = 0.
SCREEN-INPUT = '0'.
ELSE.
SCREEN-INPUT = '1'.
ENDIF.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDMODULE.

Nächster Schritt, Daten einlesen und in die DYNPRO-Felder laden. Da dieses Dynpro aus einem ALV-Grid aufgerufen wird, ist die Selektionsbedingung im Ausgabebereich wa_aktuelle_zeile enthalten und wird an das DB-SELECT übergeben.

MODULE START_902 OUTPUT.
PERFORM START_902.
ENDMODULE.
FORM START_902 .
IF NOT WA_AKTUELLE_ZEILE-INTNR IS INITIAL.
SELECT SINGLE * FROM ZMM_INVEST_PLAN INTO I_INVEST_PLAN WHERE
INTNR = WA_AKTUELLE_ZEILE-INTNR.
MOVE-CORRESPONDING I_INVEST_PLAN TO ZMM_INVEST_PLAN.
ENDIF.

ENDFORM.

Nun muss noch nachgesehen werden, ob zusätzliche Daten per BAPI nachgelesen werden sollen. Damit werden weitere Felder im Dynpro versorgt.

MODULE HIDDEN_ITEM OUTPUT.
PERFORM HIDDEN_ITEM.
ENDMODULE.
FORM HIDDEN_ITEM.
* Kostenstellenbezeichnung
CLEAR: KSTXT.
CALL FUNCTION 'BAPI_COSTCENTER_GETDETAIL'
EXPORTING
CONTROLLINGAREA = '1000'
COSTCENTER = ZMM_INVEST_PLAN-KOSTL
DATE = SY-DATUM
IMPORTING
NAME = KOSTBZ
DESCRIPTION = KOSTBZ1
* PERSON_IN_CHARGE = KPERSON
* ADDRESS =
* COMMUNICATION =
* RETURN =
.
KSTXT = KOSTBZ.

* Kreditorenbezeichnung
CLEAR: HERST.
MOVE ZMM_INVEST_PLAN-LIFNR TO VEND.
CALL FUNCTION 'BAPI_CREDITOR_GETDETAIL'
EXPORTING
CREDITORID = VEND
COMPANYCODE = '1000'
IMPORTING
CREDITOR_GENERAL_DETAIL = I_VEND
* CREDITOR_COMPANY_DETAIL =
* RETURN =
* TABLES
* CREDITOR_BANK_DETAIL =
.
MOVE I_VEND-NAME TO HERST.

* Gesamtpreis ermitteln
ZMM_INVEST_PLAN-BRTWR = ZMM_INVEST_PLAN-MENGE * ZMM_INVEST_PLAN-NETPR.

* Einkäufergruppe Text
CLEAR EKTXT.
SELECT SINGLE EKNAM FROM T024 INTO EKTXT WHERE
EKGRP = ZMM_INVEST_PLAN-EKGRG.

* Der Status wird auf "erledigt" gesetzt wenn eine Auftragsnummer vorhanden ist
IF NOT ZMM_INVEST_PLAN-EBELN IS INITIAL AND
ZMM_INVEST_PLAN-FIN IS INITIAL.
ZMM_INVEST_PLAN-FIN = 'erledigt'.
ENDIF.
* Bei Eingabe eines Innenauftrages wird die bebuchbare Kostenstelle gezogen
IF NOT ZMM_INVEST_PLAN-IAUF IS INITIAL.
MOVE ZMM_INVEST_PLAN-IAUF TO I_ORDERID.
CALL FUNCTION 'BAPI_INTERNALORDER_GETDETAIL'
EXPORTING
ORDERID = I_ORDERID
* LANGUAGE = 'DE'
IMPORTING
MASTER_DATA = I_MASTER_DATA
* RETURN =
* TABLES
* SYSTEM_STATUS =
* USER_STATUS =
* ALLOWED_BUS_TRACT =
.
IF NOT I_MASTER_DATA IS INITIAL.
ZMM_INVEST_PLAN-KOSTL = I_MASTER_DATA-CCTR_POSTED.
ENDIF.
ENDIF.

* eClass zum Typ holen

ENDFORM.

Das waren die PBO-Module, jetzt soll aber auch auf die Druckknöpfe reagiert werden. Dazu existiert das PAI-Modul USER_COMMAND_0902. Je nachdem welche Knopf gedrückt wurde, wird hier in ein Unterprogramm verzweigt.

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.

Es werden nun nicht alle Unterprogramme erklärt, stattdessen werde ich den kompletten Quelltext in den Anhang verpacken.

Das anlegen eines neuen Datensatzes erfordert auch, dass eine neue Nummer aus dem Nummernkreisobjekt gezogen wird. Deswegen werde ich diesen Prozess näher erläutern.

In dieser FORM findet zunächst eine Berechtigungsprüfung statt, in der geprüft wird, ob der Benutzer einen Datensatz hinzufügen darf. Daraus erfolgt der Aufruf in die FORM Next_number.

FORM P_NEW .
AUTHORITY-CHECK OBJECT 'ZCHG'
ID 'ZACTVT' FIELD '01'.
IF SY-SUBRC 0.
MESSAGE TEXT-001 TYPE 'E'.
EXIT.
ELSE.
IF CHG = 1.
CLEAR ZMM_INVEST_PLAN.
PERFORM NEXT_NUMBER.
MOVE I_INTNR TO ZMM_INVEST_PLAN-INTNR. "nächste freie Nummer
* MOVE-CORRESPONDING ZMM_INVEST_PLAN TO I_INVEST_PLAN.
SICHERN = 'INS'.
ENDIF.
ENDIF.
*insert zmm_invest_plan from i_invest_plan.
ENDFORM.
FORM NEXT_NUMBER .
* lesen der nächst freien Nummer aus dem Nummernkreisobjekt
* die Nummer wird reserviert und es kann kein zweites Mal die
* gleiche Nummer geholt werden. Wenn ein neuer Datensatz nicht
* gespeichert wird, dann werden Lücken in der fortlufenden Nummerierung
* vorhanden sein.

*1. Exklusive Sperre setzen, damit kein anderer eine Nummer anfordert.

CALL FUNCTION 'NUMBER_RANGE_ENQUEUE'
EXPORTING
OBJECT = 'Z_INVEST'
EXCEPTIONS
FOREIGN_LOCK = 1
OBJECT_NOT_FOUND = 2
SYSTEM_FAILURE = 3
OTHERS = 4.
IF SY-SUBRC NE 0.
* message e086 with 'Lock error' sy-subrc.
ENDIF.

* 2. Nummer abholen

CALL FUNCTION 'NUMBER_GET_NEXT'
EXPORTING
NR_RANGE_NR = '01'
OBJECT = 'Z_INVEST'
IMPORTING
NUMBER = I_INTNR " Number generated by Range Generator Object
EXCEPTIONS
INTERVAL_NOT_FOUND = 1
NUMBER_RANGE_NOT_INTERN = 2
OBJECT_NOT_FOUND = 3
QUANTITY_IS_0 = 4
QUANTITY_IS_NOT_1 = 5
INTERVAL_OVERFLOW = 6
BUFFER_OVERFLOW = 7
OTHERS = 8.
IF SY-SUBRC 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

* 3. Sperre wieder aufheben

CALL FUNCTION 'NUMBER_RANGE_DEQUEUE'
EXPORTING
OBJECT = 'Z_INVEST'.
IF SY-SUBRC 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.

ZMM_INVEST_PLAN-INTNR = I_INTNR.
ENDFORM.

Schreibe einen Kommentar