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.


Beispieltabelle mit Druckknopf

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 neue Drucktaste

Die Attribute zur Drucktaste könnten so aussehen:


Attribute der Drucktaste

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:

  1. innerhalb des LOOP über die Tabellenzeilen
  2. 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.

Enno Wulff

Leave a Comment