List-Ereignisse aus ALV

Hin und wieder stolpert man einfach über kleinere oder größere Fallen im SAP-System. So auch dann, wenn man aus dem REUSE-ALV-Grid abspringt um eine Listausgabe zu machen und meint, man könne von dort die guten alten Verzweigungslisten nutzen (AT LINE-SELETION). Weit gefehlt, denn…

Aber fangen wir noch mal von vorne an: Folgendes kleine Programm gibt mithilfe des REUSE-ALV-Grid-Bausteins eine ALV-Grid-Liste aus. Per Doppelklick kann man Details zu einem Eintrag anzeigen lassen. Diese Details werden als einfache Liste ausgegeben. Zugegeben, modern ist das nicht, aber die Listausgabe hat auch ihre Vorteile: Sie ist flexibel und lässt sich ohne Feldkatalog darstellen.

Coding Eins

REPORT.
TYPE-POOLS slis.

DATA gt_data       TYPE STANDARD TABLE OF t005t.
DATA gs_data       TYPE                   t005t.
DATA gv_fieldname  TYPE c LENGTH 40.
DATA gv_fieldvalue TYPE c LENGTH 40.

SELECT-OPTIONS: s_land1 FOR gs_data-land1.

*** Duble click in list ***
AT LINE-SELECTION.

*** field values
  GET CURSOR FIELD  gv_fieldname VALUE  gv_fieldvalue.

  CASE sy-lsind.
    WHEN 1.
      WRITE: / 'Mehr Informationen zu Land', gs_data-landx HOTSPOT ON.

  ENDCASE.

*** Start of program ***
START-OF-SELECTION.

  PERFORM selection.
  PERFORM display.

*&---------------------------------------------------------------------*
*&      Form  selection
*&---------------------------------------------------------------------*
FORM selection.
  SELECT * FROM t005t INTO TABLE gt_data
   WHERE land1 IN s_land1
     AND spras = sy-langu.
ENDFORM.                    "selection

*&---------------------------------------------------------------------*
*&      Form  display
*&---------------------------------------------------------------------*
FORM display.

*** Data
  DATA lt_fcat         TYPE lvc_t_fcat.
  FIELD-SYMBOLS <fcat> TYPE lvc_s_fcat.

*** get fieldcatalog
  CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
    EXPORTING
      i_buffer_active        = space
      i_structure_name       = 'T005T'
      i_client_never_display = 'X'
      i_bypassing_buffer     = 'X'
    CHANGING
      ct_fieldcat            = lt_fcat
    EXCEPTIONS
      inconsistent_interface = 1
      program_error          = 2
      OTHERS                 = 3.

*** set hotspot and colours
  LOOP AT lt_fcat ASSIGNING <fcat>.
    IF <fcat>-fieldname = 'LAND1'.
      <fcat>-hotspot = 'X'.
      <fcat>-emphasize = 'C400'.
    ENDIF.
  ENDLOOP.

*** display
  CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
    EXPORTING
      i_bypassing_buffer      = 'X'
      i_buffer_active         = space
      i_callback_program      = sy-cprog
      i_callback_user_command = 'CALLBACK_ALV_USERCOMMAND'
      it_fieldcat_lvc         = lt_fcat
    TABLES
      t_outtab                = gt_data
    EXCEPTIONS
      program_error           = 1
      OTHERS                  = 2.
ENDFORM.                    "anzeige

*&---------------------------------------------------------------------*
*&      Form  callback_alv_usercommand
*&---------------------------------------------------------------------*
FORM callback_alv_usercommand
    USING r_ucomm     LIKE sy-ucomm
          rs_selfield TYPE slis_selfield.

  CASE r_ucomm.
    WHEN '&IC1'.
      READ TABLE gt_data INTO gs_data INDEX rs_selfield-tabindex.
      IF sy-subrc = 0.
        LEAVE TO LIST-PROCESSING.
        SET PF-STATUS space.
        WRITE: / 'Land', gs_data-landx HOTSPOT ON.
      ENDIF.
  ENDCASE.

ENDFORM.                    "callback_alv_usercommand

Warum funktioniert der Doppelklick in der Liste nicht?

Wenn Sie das Programm ausführen, werden Sie merken, dass der Doppelklick aus dem ALV wunderbar funktioniert. Auch die Listausgabe funktioniert einwandfrei. Doch obwohl wir die Zeile mit “HOTSPOT ON” ausgeben, was normalerweise das Ereignis “AT LINE-SELECTION” aktiviert, klappt dies nicht mehr.

Die Lösung

Wenn Sie über das Menü “System – Status” schauen, dann werden Sie feststellen, dass Sie sich entweder “in gar keinem Programm mehr befinden” oder in der Funktionsgruppe des Reuse-Bausteins SAPLSLVC_FULLSCREEN.

Sie springen zwar in die Routine CALLBACK_ALV_USERCOMMAND, allerdings hat sich das Hauptprogramm durch den Aufruf des Funktionsbausteins geändert.

Dies ist auch der Grund, warum AT LINE-SELECTION nicht funktioniert, denn hier haben Sie das Coding ja nicht hinterlegt, sondern in Ihrem Programm.

Was also tun: Die Lösung ist: Sie müssen dafür sorgen, dass sie bei der Listausgabe in Ihrem Programm bleiben bzw. in Ihre Programm zurück kehren.

Das tun Sie, indem Sie die Liste nicht im CALLBACK_ALV_USERCOMMAND ausgebene, sondern mithilfe von CALL SCREEN in ein Dynpro Ihres Programms springen:

Coding Zwei

Ersetzen Sie die Callbackroutine:

*&---------------------------------------------------------------------*
*&      Form  callback_alv_usercommand
*&---------------------------------------------------------------------*
FORM callback_alv_usercommand
    USING r_ucomm     LIKE sy-ucomm
          rs_selfield TYPE slis_selfield.

  CASE r_ucomm.
    WHEN '&IC1'.
      READ TABLE gt_data INTO gs_data INDEX rs_selfield-tabindex.
      IF sy-subrc = 0.
        CALL SCREEN 100.                                                
      ENDIF.
  ENDCASE.

ENDFORM.                    "callback_alv_usercommand

Dafür müssen Sie aber natürlich das Dynpro 100 anlegen. tun Sie das und implementieren Sie die folgenden beiden in der Ablauflogik verwendeten Module:

Ablauflogik

PROCESS BEFORE OUTPUT.
  MODULE status_0100.
*
PROCESS AFTER INPUT.
  MODULE user_command_0100.

PBO + PAI

*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.

  SUPPRESS DIALOG.

ENDMODULE.                 " STATUS_0100  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

  CASE sy-ucomm.
    WHEN 'BACK' OR '%EX' OR 'RW'.
      SET SCREEN 0. LEAVE SCREEN.
    WHEN OTHERS.
      LEAVE TO LIST-PROCESSING.
      SET PF-STATUS space.
      WRITE: / 'Land', gs_data-landx HOTSPOT ON.
  ENDCASE.

ENDMODULE.                 " USER_COMMAND_0100  INPUT

Erklärung

Durch SUPPRESS DIALOG wird das PBO übersprungen und es wird sofort in das PAI verzweigt. Hier erfolgt ein LEAVE TO LIST-PROCESSING um eine Liste ausgeben zu können.

Der “SET-PF-STATUS space” muss sein, um den Standard-List-Status zu verwenden. Ansonsten wäre noch der Status des ALV-Grid aktiv.

Nun befinden wir uns wieder in unserem Programm und AT LINE-SELECTION wird durchlaufen.

Enno Wulff