Eventhandling ALV mit PAI

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
4 Beiträge • Seite 1 von 1
4 Beiträge Seite 1 von 1

Eventhandling ALV mit PAI

Beitrag von kapuzo (ForumUser / 2 / 0 / 0 ) »
Hi,
ich habe bereits viele Foreneinträge oder Tutorials gelesen, aber jetzt bin ich an einem Punkt angekommen, an dem es mir auch wohl etwas an Verständnis fehlt.
Im Rahmen einer Projektarbeit an meiner FH, sollen wir ein ABAP-Programm entwickeln, soweit auch kein Problem, wenn da nicht die ALV wären.
Eine Screen soll in etwa so aussehen.
Bild
Ein Textfeld, in das man den Gefahrenstoff einträgt und die Liste, in der man alle vorhanden Stoffe sieht.
Beim Löschen und Hinzufügen soll sich die Liste aktualisieren(das geht auch).
Bei einem Doppelklick in eine Zeile soll die Bezeichnung in das Textfeld geschrieben werden.
Der Event des ALV-Grids wird auch "abgefangen" und in einer Form bearbeitet nur leider wird nachdem diese Form durchlaufen wurde, der Prozess After Input nicht ausgelöst, wodurch der Screen nicht aktualisiert wird.

Lange Rede kurzer Sinn:
Wie kann ich das ALV-Event in den PAI umleiten oder wie kann ich aus dem Report heraus ein aktualisieren des Screens anfordern?

ABAP ist jetzt nicht mein Spezialgebiet, deshalb bitte, wenn es geht, ein Beispiel.

Und Hier dann noch der Quellcode, die unwichtigen Methoden habe ich für die Übersicht rausgelassen.

Code: Alles auswählen.

REPORT  z121_alv_test.

*----------------------------------------------------------------------*
*       CLASS lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_handler DEFINITION.
  PUBLIC SECTION .
    METHODS
handle_double_click
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column es_row_no.
  PRIVATE SECTION.
ENDCLASS.                    "lcl_event_handler DEFINITION
*----------------------------------------------------------------------*
*       CLASS lcl_event_handler IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_handler IMPLEMENTATION.
  METHOD handle_double_click .
    PERFORM handle_double_click USING e_row e_column es_row_no .
  ENDMETHOD .                   "handle_double_click
ENDCLASS.                    "lcl_event_handler IMPLEMENTATION

DATA : okcode TYPE sy-ucomm.

DATA : g_repid   LIKE   sy-repid.
DATA : grid TYPE REF TO cl_gui_alv_grid.
DATA : g_custom_container TYPE REF TO cl_gui_custom_container.
DATA : event_handler TYPE REF TO lcl_event_handler.

DATA : itab TYPE STANDARD TABLE OF z118_gefstoff WITH KEY id.
* wa_az soll die ausgewählte Zeile des Grids enthalten.
DATA : wa_az  TYPE z118_gefstoff.
DATA : bez(40) TYPE c.
DATA : manager TYPE REF TO z118_mngr_gefstoff.
DATA : pao TYPE REF TO z118_pao_gefstoff.

LOAD-OF-PROGRAM.
  CREATE OBJECT manager.
  CREATE OBJECT event_handler.

START-OF-SELECTION.
  CALL SCREEN '100'.

*&---------------------------------------------------------------------*
*&      Module  INITGRID_0100  OUTPUT
*&---------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
MODULE initgrid_0100 OUTPUT.
  CALL METHOD manager->get_tablecontent
    IMPORTING
      ret_itab = itab.

  IF g_custom_container IS INITIAL.
    CREATE OBJECT g_custom_container
      EXPORTING
        container_name = 'CCCONTAINER'.
    CREATE OBJECT grid
      EXPORTING
        i_parent = g_custom_container.
    CALL METHOD grid->set_table_for_first_display
      EXPORTING
        i_structure_name = 'Z118_GEFSTOFF'
      CHANGING
        it_outtab        = itab.
    SET HANDLER event_handler->handle_double_click FOR grid .
  ENDIF.
ENDMODULE.                 " INITGRID_0100  OUTPUT

*----------------------------------------------------------------------*
*  MODULE user_command_1100 INPUT
*----------------------------------------------------------------------*
* Anfangsbildschirm Commands
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  CASE okcode.
    WHEN 'SAV'.
      PERFORM save_data.
    WHEN 'DEL'.
      PERFORM del_data.
    WHEN 'END' OR 'BACK' OR 'EXIT'.
      LEAVE PROGRAM.
  ENDCASE.
ENDMODULE.                    "user_command_1100 INPUT

*----------------------------------------------------------------------*
*  MODULE refresh_contents INPUT
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
MODULE refresh_contents INPUT.
  bez = wa_az-bez.
  wa_az-bez = ''.
ENDMODULE.                    "refresh_contents INPUT

*&---------------------------------------------------------------------*
*&      Module  STATUS_1100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS '0100'.
  SET TITLEBAR '0100'.
ENDMODULE.                 " STATUS_1100  OUTPUT

*&---------------------------------------------------------------------*
*&      Form  save_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM save_data.
ENDFORM.                    "save_data

*&---------------------------------------------------------------------*
*&      Form  del_data
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM del_data.
ENDFORM.                    "del_data

*&---------------------------------------------------------------------*
*&      Form  handle_double_click
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM handle_double_click USING i_row TYPE lvc_s_row i_column TYPE lvc_s_col is_row_no TYPE lvc_s_roid.
  wa_az-bez = 'Nur so ein Test'.
ENDFORM .                    "handle_double_click
PBO und PAI

Code: Alles auswählen.

PROCESS BEFORE OUTPUT.
  MODULE initgrid_0100.
  MODULE status_0100.
*
PROCESS AFTER INPUT.
  MODULE user_command_0100.
  MODULE refresh_contents.
Schonmal ein Danke im Vorraus.

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Re: Eventhandling ALV mit PAI

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
Beim registrieren der EventHandler kann man einstellen, dass diese einen PAI/PBO-Zyklus aufrufen.
Das geht mit der Methode SET_REGISTERED_EVENT und man muss in der übergebenen Struktur das Feld APPL_EVENT auf 'X' setzen.

Das Problem ist hier aber das ALV-Grid selbst: Das hat leider schon alle Events registriert und lässt keine Änderungen daran zu.

Du hast jetzt zwei Möglichkeiten:
1) Mit der Methode SET_NEW_OK_CODE der Klasse CL_GUI_CFW mit irgendeinem Dummywert einen Tastendruck simulieren. Hat den Nachteil das eben PBO durchlaufen wird und das könnte wiederum Auswirkungen auf andere Eingabefelder haben.
2) Mit dem Funktionsbaustein DYNP_VALUES_UPDATE die entsprechenden Felder im Dynpro direkt ändern. Hat den Nachteil, dass hiermit keine Feldumwandlung druchgeführt wird. Das heißt du musst bei Datumsfelder in die Übergabestruktur wirklich "01.01.2010" eintragen und nicht einfach den Inhalt eines Datumsfeldes (20100101) dasselbe gilt auch für Währungs/Mengefelder und Gleitkomma-Feldern. Auch musst du aufpassen, das bei Eingabefelder die im Dynpro als STRING definiert sind mit dieser Methode 255 Leerzeichen reingeschrieben werden.

lg ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Re: Eventhandling ALV mit PAI

Beitrag von kapuzo (ForumUser / 2 / 0 / 0 ) »
Danke für die schnelle und ausfürhliche Antwort.
Ich werde mich gleich mal dran machen und gucken ob ichs hinbekomme ;).

// EDIT
Also ich habe eine Lösung hinbekommen, zwar etwas anders als du es beschrieben hast, aber durch dich hatte ich immerhin nen konkreten Anhaltspunkt :).
Weil ich die EventID für den Doppelklick nicht rausbekommen habe, ich bin der Meinung es ist die 3, aber dann kam es zu einem Fehler (I_Event_Combination oder sowas), deshalb habe ich den Hammer ausgepackt und
beim Erzeugen des Grids angegeben, dass alle Events registriert werden sollen. Vorher hatte ich nicht ganz verstanden, wie das funktioniert, das 'X' als True-Ersatz bei einem Parameter I_APPL_EVENT, war mir nicht ganz einleuchtend ;).
Kommt davon wenn man sonst nur Java gewöhnt ist.
Außerdem muss man, wenn man das Problem mit dem Hammer erschlägt auch keinen New_OkCode setzen, nach den Events wird der PBO/PAI-Zyklus durchlaufen.

Lösung:

Code: Alles auswählen.

CREATE OBJECT grid
      EXPORTING
        i_parent      = g_custom_container
        i_appl_events = 'X'.

Re: Eventhandling ALV mit PAI

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
kapuzo hat geschrieben: Also ich habe eine Lösung hinbekommen, zwar etwas anders als du es beschrieben hast, aber durch dich hatte ich immerhin nen konkreten Anhaltspunkt :).
Weil ich die EventID für den Doppelklick nicht rausbekommen habe, ich bin der Meinung es ist die 3, aber dann kam es zu einem Fehler (I_Event_Combination oder sowas), deshalb habe ich den Hammer ausgepackt und
beim Erzeugen des Grids angegeben, dass alle Events registriert werden sollen. Vorher hatte ich nicht ganz verstanden, wie das funktioniert, das 'X' als True-Ersatz bei einem Parameter I_APPL_EVENT, war mir nicht ganz einleuchtend ;).
Kommt davon wenn man sonst nur Java gewöhnt ist.
Außerdem muss man, wenn man das Problem mit dem Hammer erschlägt auch keinen New_OkCode setzen, nach den Events wird der PBO/PAI-Zyklus durchlaufen.

Lösung:

Code: Alles auswählen.

CREATE OBJECT grid
      EXPORTING
        i_parent      = g_custom_container
        i_appl_events = 'X'.
Ja!
Stimmt!
Mist!
Klar!

Hab schon solange nicht mehr mit dem ALV gearbeitet, das ich ganz vergessen hatte, dass der Paramter dafür im Construktor versorgt werden muss :oops:
Weils ja nicht über SET_REGISTERED_EVENTS funktioniert.

Ich kam ursprünglich auch aus dem Java-Lager und hab am Anfang das Konzept X = True und <Leer> gleich false auch nicht gecheckt.
Es kommt aber noch schlimmer: Mal ist on = 1 und off = 0, oder 1 = True und 0 = false, oder X = on und <leer> = off, ...
Und an einigen Stellen kommt dann auch noch ein "undefined" dazu :?

gruß ADT
Theory is when you know something, but it doesn't work.
Practice is when something works, but you don't know why.
Programmers combine theory and practice: Nothing works and they don't know why.

ECC: 6.18
Basis: 7.50

Seite 1 von 1

Vergleichbare Themen

0
Antw.
2291
Views
Problem mit Eventhandling (inputField)
von wowjan » 17.10.2007 14:15 • Verfasst in Web-Dynpro, BSP + BHTML
11
Antw.
5797
Views
Tree Control - Eventhandling
von ralf.wenzel » 13.01.2015 17:50 • Verfasst in ABAP Objects®

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

Daten an Tabelle binden
Gestern von Bright4.5 1 / 511
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2146
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8742