Anderen Pflegedialog aufrufen
Durch Zeitpunkte können Sie in die Verarbeitung der Programmlogik eingreifen. Leider gibt es nur für einige Funktionen die entsprechenden Zeitpunkte. In diesem Artikel zeigen wir Ihnen, wie Sie durch eine einfache Manipulation des Dynpros aus der View-Pflege den Aufruf eines anderen Pflegedialogs einbinden können.
Anwendung
Einen Pflegedialog zu einer anderen Tabelle aufzurufen, kann recht nützlich sein. Zum Beispiel könnten Sie in einer Tabelle Daten mit verschieden “Typen” hinterlegen. Je “Typ” könnte es dann nötig sein, zusätzlich eine andere Tabelle zu pflegen.
|
Beispiel
Nehmen wir an, Sie haben eine Tabelle mit dem Feld “Materialnummer”. Eine Materialnummer ist einer Materialart zugeordnet. In der Tabelle sollen Materialien hinterlegt werden, zu denen bei der Produktion spezielle Prüfungen notwendig sind. Die Art der Prüfungen sind in einer separaten Customizingtabelle hinterlegt. Da sich die Prüfungen und Auspägungen aber je Materialart unterscheiden, muss zu Fertigerzeugnissen eine andere Tabelle gepflegt werden als für Rohstoffe.
Über einen View können Sie die Materialtabelle – nennen wir sie ZMATPRUEF – mit dem Materialstamm (Tabelle MARA) verbinden. Als zusätzliches Viewfeld wird die Materialart aufgenommen.
Um die Materialart in den View aufnehmen zu können, müssen Sie in ZMATPRUEF den Fremdschlüssel für Feld MATNR auf die Tabelle MARA definiert haben.
Sie können dann im Pflegeview über den Button [_Beziehungen_] die Tabelle MARA auswählen und das Feld MTART in die Feldliste aufnehmen.
Im angelegten View – er könnte ZMATPRUEF_V heissen – definieren Sie in den Feldeigenschaften, dass das Feld “Materialart” nur gelesen werden darf (Feld “P” [Pflegemerkmal] auf “R” setzen”).
Aufgrund dieses Feldes entscheiden wir hinterher, welche Pflegetabelle wir aufrufen.
Vorgehen
Drucktaste in den TableControl einfügen
So gehen Sie vor, um einen Button in ein Dynpro hinzuzufügen um mit diesem einen anderen Pflegedialog aufzurufen:
Nachdem Sie den Pflegedialog für den View ZMATPRUEF_V angelegt haben, ändern Sie das generierte Dynpro: Menü Umfeld – Modifikation – Pflegebild.
Im Dynproeditor ziehen Sie einfach ein Feld vom Typ “Drucktaste” rechts neben die Felder im TableControl.
|
Die Attribute zur Drucktaste könnten so aussehen:
|
Wichtig hierbei ist der Funktionscode, der mit Prozentzeichen enden muss. Die Prozentzeichen werden beim Drücken in die aktuelle Zeile umgewandelt. Wird der Druckknopf in der dritten Zeile gedrückt, so hat der Funktionscode den Wert ZZCALL003.
Aufruf des Pflegedialogs
Es gibt leider keinen Zeitpunkt mit dem man auf das Drücken des Knopfes reagieren könnte. Deswegen implementieren wir ein neues MODUL in die Ablauflogik des Dynpros.
Es gäbe zwei Möglichkeiten, an welcher Stelle man auf den Tastendruck reagieren könnte:
- innerhalb des LOOP über die Tabellenzeilen
- am Ende der Verarbeitung des PAI
Innerhalb des LOOP im TableControl muss man abfragen, ob die aktuell durchlaufene Zeile die ist, in der die Drucktaste betätigt wurde.
Bei Variante (2) muss man die Zeilennummer im Funktionscode auswerten und den entsprechenden Tabelleneintrag nachlesen.
Hier habe ich mich für die erste Variante entschieden.
Fügen Sie in der Ablauflogik direkt nach “LOOP AT EXTRACT” die folgende Zeile ein:
MODULE ZZ_USERCOMMAND.
Mit Doppelklick legen Sie das Modul an. Das Programm schlägt automatisch vor, dass das Modul in ein neues Include in der Funktionsgruppe des Pflegeviews angelegt wird.
So könnte das Coding des Moduls aussehen:
*&———————————————————————*
*& Module ZZ_USERCOMMAND INPUT
*&———————————————————————*
MODULE zz_usercommand INPUT.
IF sy-ucomm(6) = ‘ZZCALL’.
PERFORM zz_call_view_dialog USING sy-ucomm+6(3).
ENDIF.
ENDMODULE. ” ZZ_USERCOMMAND INPUT
Die Routine ZZ_CALL_VIEW_DIALOG enthält das eigentliche Coding für den Aufruf des Pflegedialogs:
*&———————————————————————*
*& Form ZZ_CALL_VIEW_DIALOG
*&———————————————————————*
FORM zz_call_view_dialog USING value(fi_row).
*** Datendeklarationen
DATA lv_tabname TYPE tabname.
DATA ls_sellist TYPE vimsellist.
DATA lt_sellist TYPE STANDARD TABLE OF vimsellist.
DATA lv_row TYPE i.
*** Die übergebene Nummer aus der Drucktaste ist der aktuellen
*** sichtbaren Zeile im TableControl. Um die richtige Position
*** herauszubekommen, muss die erste im TableControl angezeigte
*** Zeile addiert werden:
lv_row = fi_row + tctrl_zmatpruef_v-top_line – 1.
*** Hier prüfen wir, ob die aktuell im LOOP durchlaufene Zeile
*** auch die Zeile ist, in der der Druckknopf betätigt wurde
CHECK lv_row = tctrl_zmatpruef_v-current_line.
*** Übernahme der unstrukturierten Daten EXTRACT in die View-Struktur
zmatpruef_v = extract.
*** Hier entscheiden wir uns, welche Tabelle zur Materialart gehört:
CASE zmatpruef_v-mtart.
WHEN ‘FERT’.
lv_tabname = ‘ZMATPRUEF_FERT’.
WHEN ‘ROH’.
lv_tabname = ‘ZMATPRUEF_ROH’.
WHEN ‘HALB’.
lv_tabname = ‘ZMATPRUEF_HALB’.
WHEN OTHERS.
MESSAGE i000(vz) WITH ‘Kein Customizing nötig’.
EXIT.
ENDCASE.
*** In der ermittelten Customizingtabelle sollte als Schlüsselfeld die
*** Materialnummer vorhanden sein, da ja die Einstellungen zur
*** Materialnummer vorgenommen werden müssen.
*** Deswegen übergeben wir dem Pflegeview die Materialnummer
CLEAR lt_sellist.
ls_sellist-viewfield = ‘MATNR’.
ls_sellist-operator = ‘EQ’.
ls_sellist-value = zmatpruef_v-matnr.
APPEND ls_sellist TO lt_sellist.
*** Dies ist der Aufruf des Pflegedialoges zur ermittelten Tabelle
CALL FUNCTION ‘VIEW_MAINTENANCE_CALL’
EXPORTING
action = status-action
view_name = lv_tabname
TABLES
dba_sellist = lt_sellist
EXCEPTIONS
client_reference = 1
foreign_lock = 2
invalid_action = 3
no_clientindependent_auth = 4
no_database_function = 5
no_editor_function = 6
no_show_auth = 7
no_tvdir_entry = 8
no_upd_auth = 9
only_show_allowed = 10
system_failure = 11
unknown_field_in_dba_sellist = 12
view_not_found = 13
maintenance_prohibited = 14
OTHERS = 15.
IF sy-subrc = 0.
*** Falls der Pflegeview zur Tabelle ZMATPRUEF_V Teil eines
*** Viewclusters ist, müssen Sie die folgenden beiden Zeilen
*** aktivieren, um wieder auf dem Pflegeview zu landen
* CLEAR: vim_leave_screen, vim_act_dynp_view.
* SET SCREEN 0. LEAVE SCREEN.
ELSE.
*** Fehlermeldung, falls eine Pflege nicht möglich war
MESSAGE i000(vz) WITH ‘Pflege nicht möglich; SUBRC=’ sy-subrc.
ENDIF.
ENDFORM. ” ZZ_CALL_VIEW_DIALOG
Änderung der Feldeigenschaften
Als letztes bleibt uns noch die Änderung der Feldeigenschaften für den Druckknopf, denn im Anzeigemodus ist der Druckknopf nicht aktiv.
um den Druckknopf auch im Anzeigemodus zu aktivieren, müssen Sie im PBO innerhalb des LOOP AT EXTRACT ein Modul einfügen:
MODULE ZZ_SCREEN.
Coding in diesem Modul:
*&———————————————————————*
*& Module ZZ_SCREEN OUTPUT
*&———————————————————————*
MODULE zz_screen OUTPUT.
LOOP AT SCREEN.
IF screen-name = ‘ZZBUTTON_CALL’.
screen-input = ‘1’.
MODIFY SCREEN.
ENDIF.
ENDLOOP.
ENDMODULE. ” ZZ_SCREEN OUTPUT
Anmerkungen
Nachdem Sie nun alles aktiviert haben, können Sie die Funktionalität nutzen.
Beachten Sie bitte, dass bei einer Neugenerierung die folgenden Änderungen überschrieben werden und erneut angepasst werden müssen:
- Druckknopf im Dynpro
- Ablauflogik im Dynpro
Diese Änderungen sind jedoch minimal, da das Coding der Module erhalten bleibt.
- Interview mit Björn Schulz (Software-Heroes.com) - 3. September 2024
- Daten aus ALV ermitteln - 3. September 2024
- So lange es den SAPGUI noch gibt… - 27. Juni 2024