Ereignis DATA_CHANGED nach F4 Hilfe ALV GRID

Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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

Ereignis DATA_CHANGED nach F4 Hilfe ALV GRID

Beitrag von PeterPaletti (Specialist / 348 / 32 / 97 ) »
Hallo,
ich habe für ein Feld eine F4-Hilfe registriert.

Code: Alles auswählen.

METHOD register_f4_fields.
  DATA: lt_f4        TYPE lvc_t_f4,
        ls_f4        TYPE lvc_s_f4.

  FIELD-SYMBOLS: <fcat>   TYPE lvc_s_fcat.
  LOOP AT it_fcat ASSIGNING <fcat>
          WHERE f4availabl = 'X'.

    ls_f4-fieldname     = <fcat>-fieldname.
    ls_f4-register      = 'X'.
*    ls_f4-getbefore     = 'X'.
    ls_f4-chngeafter    = 'X'.
    ls_f4-internal      = 'X'.
    INSERT ls_f4 INTO TABLE lt_f4.
  ENDLOOP.

  CALL METHOD ir_alv->register_f4_for_fields( lt_f4 ).
ENDMETHOD.
Mit der Methode ON_ONf4 wird die F4-Hilfe publiziert.

Code: Alles auswählen.

  DATA ls_shlp TYPE shlp_descr.
  DATA ld_rc   TYPE sy-subrc.
  DATA lt_value TYPE TABLE OF ddshretval.
  DATA ls_value TYPE ddshretval.
*  DATA ls_pnodid TYPE pnodid.
*  DATA lr_pn TYPE REF TO /bdfplm/if_dcc_pn.

  FIELD-SYMBOLS <fs_alv> TYPE zmcc_pn_rel_alv.
  FIELD-SYMBOLS <fs_interface> TYPE ddshiface.
  CHECK e_fieldname = 'PNAME'.

  er_event_data->m_event_handled = 'X'.

  CASE sender.
    WHEN gr_relv_alv.
      READ TABLE gi_relv_alv INDEX es_row_no-row_id ASSIGNING <fs_alv>.
    WHEN gr_reln_alv.
      READ TABLE gi_reln_alv INDEX es_row_no-row_id ASSIGNING <fs_alv>.
  ENDCASE.

  CALL FUNCTION 'F4IF_GET_SHLP_DESCR'
    EXPORTING
      shlpname = 'PVS_PNODE00'
      shlptype = 'SH'
    IMPORTING
      shlp     = ls_shlp.

  READ TABLE ls_shlp-interface ASSIGNING <fs_interface>
  WITH KEY shlpfield = 'PNAME'.
  <fs_interface>-valfield = 'X'.

  CALL FUNCTION 'F4IF_START_VALUE_REQUEST'
    EXPORTING
      shlp          = ls_shlp
    IMPORTING
      rc            = ld_rc
    TABLES
      return_values = lt_value.

  CHECK ld_rc = 0.
  IF lt_value IS INITIAL.
*             Daten sind nicht geändert. Einfach raus.
    EXIT.
  ENDIF.

  READ TABLE lt_value INTO ls_value WITH KEY fieldname = 'PNAME'.
  <fs_alv>-pname = ls_value-fieldval.

*  ls_pnodid-pname = <fs_alv>-pname.
*  lr_pn = gr_pn_cntl->get_obj_pn( ls_pnodid ).
*  IF o_appl_message->check_error( ) IS INITIAL
* ENDIF.
  CALL METHOD refresh_display
    EXPORTING
      ir_alv = sender.
ENDMETHOD.
Mit der Methode ON_DATA_CHANGED will ich auf die Eingabe reagieren.

Code: Alles auswählen.

METHOD on_data_changed.
  DATA ls_good TYPE lvc_s_modi.
  DATA ld_retco TYPE sy-subrc.
  CASE sender.
    WHEN gr_relv_alv.
      LOOP AT er_data_changed->mt_good_cells INTO ls_good.
        CASE ls_good-fieldname.
          WHEN 'PNAME'.
            CALL METHOD check_if_pnode_exists
              EXPORTING
                ir_data_changed = er_data_changed
                is_good         = ls_good
              IMPORTING
                ed_retco        = ld_retco.
            IF ld_retco NE 0.
              EXIT.
            ENDIF.

            CALL METHOD check_if_otype_is_n
              EXPORTING
                ir_data_changed = er_data_changed
                is_good         = ls_good
              IMPORTING
                ed_retco        = ld_retco.
            IF ld_retco NE 0.
              EXIT.
            ENDIF.

            CALL METHOD check_if_pnode_is_in_list
              EXPORTING
                ir_data_changed = er_data_changed
                is_good         = ls_good
                it_alv          = gi_relv_alv
              IMPORTING
                ed_retco        = ld_retco.
            IF ld_retco NE 0.
              EXIT.
            ENDIF.

            CALL METHOD check_circle
              EXPORTING
                ir_data_changed = er_data_changed
                is_good         = ls_good
                id_type         = 'RELV'
              IMPORTING
                ed_retco        = ld_retco.
            IF ld_retco NE 0.
              EXIT.
            ENDIF.

            CALL METHOD lock_pnode
              EXPORTING
                ir_data_changed = er_data_changed
                is_good         = ls_good
              IMPORTING
                ed_retco        = ld_retco.
            IF ld_retco NE 0.
              EXIT.
            ENDIF.

            CALL METHOD modify_cells
              EXPORTING
                ir_data_changed = er_data_changed
                is_good         = ls_good
                id_type         = 'RELV'.

        ENDCASE.
      ENDLOOP.
      IF ld_retco NE 0.
        RETURN.
      ENDIF.
    WHEN gr_reln_alv.
      LOOP AT er_data_changed->mt_good_cells INTO ls_good.
        CASE ls_good-fieldname.
          WHEN 'PNAME'.
            CALL METHOD check_if_pnode_exists
              EXPORTING
                ir_data_changed = er_data_changed
                is_good         = ls_good
              IMPORTING
                ed_retco        = ld_retco.
            IF ld_retco NE 0.
              EXIT.
            ENDIF.

            CALL METHOD check_if_otype_is_n
              EXPORTING
                ir_data_changed = er_data_changed
                is_good         = ls_good
              IMPORTING
                ed_retco        = ld_retco.
            IF ld_retco NE 0.
              EXIT.
            ENDIF.

            CALL METHOD check_if_pnode_is_in_list
              EXPORTING
                ir_data_changed = er_data_changed
                is_good         = ls_good
                it_alv          = gi_reln_alv
              IMPORTING
                ed_retco        = ld_retco.
            IF ld_retco NE 0.
              EXIT.
            ENDIF.

            CALL METHOD check_circle
              EXPORTING
                ir_data_changed = er_data_changed
                is_good         = ls_good
                id_type         = 'RELN'
              IMPORTING
                ed_retco        = ld_retco.
            IF ld_retco NE 0.
              EXIT.
            ENDIF.

            CALL METHOD lock_pnode
              EXPORTING
                ir_data_changed = er_data_changed
                is_good         = ls_good
              IMPORTING
                ed_retco        = ld_retco.
            IF ld_retco NE 0.
              EXIT.
            ENDIF.

            CALL METHOD modify_cells
              EXPORTING
                ir_data_changed = er_data_changed
                is_good         = ls_good
                id_type         = 'RELN'.

        ENDCASE.
      ENDLOOP.
      IF ld_retco NE 0.
        RETURN.
      ENDIF.
  ENDCASE.
  CALL METHOD cl_ppeuieng_cntl=>set_update_flag.
ENDMETHOD.
Mein Problem ist, dass das Änderungsprotokoll ER_DATA keinen Eintrag in der Tabelle MT_GOOD_CELLS aufweist.
Hat jemand eine Idee,wie ich auf die Änderungen reagieren kann, wenn der Anwender die F4-Hilfe aufruft?

Grüße
Peter

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


Re: Ereignis DATA_CHANGED nach F4 Hilfe ALV GRID

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
In ON_ONF4 kannst du ja schon auf die Eingaben reagieren.
(Was du ja eh schon teilweise machst, weil du die Suchhilfe aufrufst)
ON_DATA_CHANGED wird eigentlich nur durchlaufen, wenn die Eingabe NICHT über F4 gehandhabt wird.

Evtl. musst du die geänderten Daten NICHT in deine Tabelle sondern in ER_EVENT_DATA->M_DATA schreiben um das zu erreichen was du willst.
(Kann nicht versprechen, dass das funktioniert, hab ich noch nie so gemacht, würde aber von meiner Erfahrung her da mal ansetzen)

lg ADT

Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
PeterPaletti

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: Ereignis DATA_CHANGED nach F4 Hilfe ALV GRID

Beitrag von PeterPaletti (Specialist / 348 / 32 / 97 ) »
Vielen Dank für deine Antwort.
Wasmich nur wundert ist: ich kann beim Registrieren des F4-Events den Parameter chngeafter setzen, der dafür sorgt, dass anch Änderung das Ereignis DATA_CHANGED ausgelöst wird und damit die Methode ON_DATA_CHANGED durchlaufen wird.
Das bringt aber nicht viel wenn das Datenprotokoll ER_DATA_CHANGED nicht versorgt ist. Ich kann dann gerade mal bestimmen, dass das Ereignis bei der F4-Hilfe ausgelöst wurde, aber ich kann nicht ermitteln, um welche Zeile es geht und um welches Feld. Das ist doch Mumpitz.

Ich werde das mal mit ER_EVENT_DATA ausprobieren.
Ansonsten bleibt mir nur der Weg, den Quellcode aus ON_DATA_CHANGED für ON_ONF4 nochmal umzuschreiben. :-(

Re: Ereignis DATA_CHANGED nach F4 Hilfe ALV GRID

Beitrag von PeterPaletti (Specialist / 348 / 32 / 97 ) »
Also: das Programm läuft immer noch nicht rund, das liegt aber noch an Fehlern in den selbst gebastelten Methoden check_if_pnode_is_in_list und lock_pnode.
Ist jetzt nicht so wichtig, warum und wieso.
Jedenfalls: Mit ER_EVENT_DATA->M_DATA funktioniert es prinzipiell.

Ich habe die folgenden Felder in meiner Methode ON_ONF4 deklariert.

Code: Alles auswählen.

  DATA: ls_f4 TYPE lvc_s_modi.
  FIELD-SYMBOLS: <lt_f4> TYPE lvc_t_modi.
Und den ER_EVENT_DATA gefüttert.

Code: Alles auswählen.

 ASSIGN er_event_data->m_data->* TO <lt_f4>.
  ls_f4-fieldname = e_fieldname.
  ls_f4-row_id    = es_row_no-row_id.
  ls_f4-value     = <fs_alv>-pname .
  APPEND ls_f4 TO <lt_f4>.
Das gesamte Coding der Methode ON_ONF4 sieht nun so aus:

Code: Alles auswählen.

METHOD on_onf4.
  DATA ls_shlp TYPE shlp_descr.
  DATA ld_rc   TYPE sy-subrc.
  DATA lt_value TYPE TABLE OF ddshretval.
  DATA ls_value TYPE ddshretval.
  DATA lr_alv   TYPE REF TO cl_gui_alv_grid.
  DATA: ls_f4 TYPE lvc_s_modi.
  FIELD-SYMBOLS: <lt_f4> TYPE lvc_t_modi.

  FIELD-SYMBOLS <fs_alv> TYPE zmcc_pn_rel_alv.
  FIELD-SYMBOLS <fs_interface> TYPE ddshiface.
  CHECK e_fieldname = 'PNAME'.

  er_event_data->m_event_handled = 'X'.
  lr_alv ?= sender.
  CASE sender.
    WHEN gr_relv_alv.
      READ TABLE gi_relv_alv INDEX es_row_no-row_id ASSIGNING <fs_alv>.
    WHEN gr_reln_alv.
      READ TABLE gi_reln_alv INDEX es_row_no-row_id ASSIGNING <fs_alv>.
  ENDCASE.

  CALL FUNCTION 'F4IF_GET_SHLP_DESCR'
    EXPORTING
      shlpname = 'PVS_PNODE00'
      shlptype = 'SH'
    IMPORTING
      shlp     = ls_shlp.

  READ TABLE ls_shlp-interface ASSIGNING <fs_interface>
  WITH KEY shlpfield = 'PNAME'.
  <fs_interface>-valfield = 'X'.

  CALL FUNCTION 'F4IF_START_VALUE_REQUEST'
    EXPORTING
      shlp          = ls_shlp
    IMPORTING
      rc            = ld_rc
    TABLES
      return_values = lt_value.

  CHECK ld_rc = 0.
  IF lt_value IS INITIAL.
*             Daten sind nicht geändert. Einfach raus.
    EXIT.
  ENDIF.

  READ TABLE lt_value INTO ls_value WITH KEY fieldname = 'PNAME'.
  <fs_alv>-pname = ls_value-fieldval.

  ASSIGN er_event_data->m_data->* TO <lt_f4>.
  ls_f4-fieldname = e_fieldname.
  ls_f4-row_id    = es_row_no-row_id.
  ls_f4-value     = <fs_alv>-pname .
  APPEND ls_f4 TO <lt_f4>.

  CALL METHOD refresh_display
    EXPORTING
      ir_alv = sender.


ENDMETHOD.
Durch das Registrieren mit dem Parameter chngeafter in der Methode REGISTER_F4_FIELDS wird das Ereignis DATA_CHANGED nach dem Ändern ausgelöst und die Methode ON_DATA_CHANGED durchlaufen.

Vielen lieben Dank a-dead-trousers. Das war der richtige Hinweis.

Gruß
Peter

Re: Ereignis DATA_CHANGED nach F4 Hilfe ALV GRID

Beitrag von a-dead-trousers (Top Expert / 4395 / 223 / 1182 ) »
Gern geschehen!
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: Ereignis DATA_CHANGED nach F4 Hilfe ALV GRID

Beitrag von PeterPaletti (Specialist / 348 / 32 / 97 ) »
So ich habe es noch mal überarbeitet.
Das Coding kommt völlig ohne den Passus aus, dass die Ausgabetabelle direkt geändert wird. Es reicht, die Daten an er_event_data->m_data zu übergeben.

Code: Alles auswählen.

METHOD on_onf4.
  DATA ls_shlp TYPE shlp_descr.
  DATA ld_rc   TYPE sy-subrc.
  DATA lt_value TYPE TABLE OF ddshretval.
  DATA ls_value TYPE ddshretval.
  DATA: ls_f4 TYPE lvc_s_modi.
  FIELD-SYMBOLS: <lt_f4> TYPE lvc_t_modi.

  FIELD-SYMBOLS <fs_interface> TYPE ddshiface.
  CHECK e_fieldname = 'PNAME'.

  er_event_data->m_event_handled = 'X'.

  CALL FUNCTION 'F4IF_GET_SHLP_DESCR'
    EXPORTING
      shlpname = 'PVS_PNODE00'
      shlptype = 'SH'
    IMPORTING
      shlp     = ls_shlp.

  READ TABLE ls_shlp-interface ASSIGNING <fs_interface>
  WITH KEY shlpfield = 'PNAME'.
  <fs_interface>-valfield = 'X'.

  CALL FUNCTION 'F4IF_START_VALUE_REQUEST'
    EXPORTING
      shlp          = ls_shlp
    IMPORTING
      rc            = ld_rc
    TABLES
      return_values = lt_value.

  CHECK ld_rc = 0.
  IF lt_value IS INITIAL.
*             Daten sind nicht geändert. Einfach raus.
    EXIT.
  ENDIF.

  READ TABLE lt_value INTO ls_value WITH KEY fieldname = 'PNAME'.

  ASSIGN er_event_data->m_data->* TO <lt_f4>.
  ls_f4-fieldname = e_fieldname.
  ls_f4-row_id    = es_row_no-row_id.
  ls_f4-value     = ls_value-fieldval.
  APPEND ls_f4 TO <lt_f4>.

ENDMETHOD.


Grüße
Peter

Seite 1 von 1

Vergleichbare Themen

0
Antw.
2291
Views
DATA-CHANGED-PROTOCOL vom ALV-Grid manipulieren
von Frog » 27.05.2008 21:31 • Verfasst in ABAP Objects®
4
Antw.
4086
Views
Ereignis auf ALV Grid
von Lainer » 26.10.2006 11:02 • Verfasst in ABAP Objects®
3
Antw.
2753
Views
Ereignis data_changed im editierbaren ALV Grid
von jondahl11 » 02.11.2006 12:40 • Verfasst in ABAP Objects®
1
Antw.
10159
Views
Getting the displayed data from an ALV Grid.
von Meurant » 22.11.2005 03:55 • Verfasst in Development Related
1
Antw.
4534
Views
ALV GRID (OO) F4-Hilfe auf Zellenebene
von Cysco » 06.03.2006 10:07 • Verfasst in ABAP Objects®

Über diesen Beitrag


Die Frage ist als "gelöst" markiert. Den entsprechend Beitrag findest du hier.

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
vor 21 Stunden von Bright4.5 1 / 467
aRFC im OO-Kontext
vor 4 Wochen von ralf.wenzel 1 / 2113
Hilfe bei SWEC/SWE2
letzen Monat von retsch 1 / 8709