ALV Felder vorbelegen & Dynamisch füllen

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

Getting started ... Alles für einen gelungenen Start.
8 Beiträge • Seite 1 von 1
8 Beiträge Seite 1 von 1

ALV Felder vorbelegen & Dynamisch füllen

Beitrag von RIG (Specialist / 110 / 30 / 1 ) »
Hallo Alle zusammen,

ich habe eine Problem mit einem eingabefähigen ALV,
beim hinzufügen einer Zeile sollen 2 Felder (WERKS, PRGRP) vorbelegt werden, funktioniert soweit.
Wenn dann der WErt für NRMIT geändert wird und die nachfolgende Suche eine Bezeichnung findet soll diese mit eingetragen werden.

Die Logik ist genau dieselbe, alles wird durchlaufen, das Modify auf <tab> funktioniert und <tab> hat die richtigen WErte. Angezeigt wird leider nur die Vorbelegung von WERKS und PRGRP.

Gibt man dann bei MatNr irgendein Wert ein, wird natürlich wieder der Eventreceiver durchlaufen ... aber diesmal wird auch die Matnr aktualisiert, die Bezeichnung jedoch nicht.

Code: Alles auswählen.


*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver DEFINITION.

  PUBLIC SECTION.

    METHODS:  handle_data_changed
                FOR EVENT data_changed
                OF cl_gui_alv_grid
                IMPORTING er_data_changed
                          e_ucomm.

ENDCLASS.                    "lcl_event_receiver DEFINITION



*----------------------------------------------------------------------*
*       CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_event_receiver IMPLEMENTATION.

  METHOD handle_data_changed.

    DATA: dl_ins_row TYPE lvc_s_moce,   " Insert Row
          ls_deleted_row TYPE lvc_s_moce,
          ls_mat_gr_vert TYPE zip_st_mat_gr_vert.

    FIELD-SYMBOLS: <tab> TYPE table,
                   <ls_mat_gr_vert> TYPE zip_st_mat_gr_vert.         " Output table

*..............
* modified rows
*..............

    "Loop at the modified rows table and assign default values
    ASSIGN er_data_changed->mp_mod_rows->* TO <tab>. "<ls_mat_gr_vert>."
    LOOP AT <tab> ASSIGNING <ls_mat_gr_vert>.

      <ls_mat_gr_vert>-prgrp = gv_prgrp.
      <ls_mat_gr_vert>-werks = '01'.    "CUSTOMIZING ergänzen

      IF <ls_mat_gr_vert>-nrmit is not INITIAL.
        SELECT Single nrmit from pgmi into <ls_mat_gr_vert>-matnr where prgrp eq <ls_mat_gr_vert>-nrmit.
      ENDIF.
      IF <ls_mat_gr_vert>-matnr IS NOT INITIAL.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = <ls_mat_gr_vert>-matnr
          IMPORTING
            output = <ls_mat_gr_vert>-matnr.

        SELECT SINGLE maktx INTO <ls_mat_gr_vert>-bezeichnung
                            FROM makt
                            WHERE matnr EQ <ls_mat_gr_vert>-matnr
                            AND spras EQ 'DE'.  "CUSTOMIZING ergänzen

      ENDIF.
      MODIFY <tab> FROM <ls_mat_gr_vert> INDEX sy-tabix.
    ENDLOOP.

  ENDMETHOD.                    "handle_data_changed

Für Eure Ratschläge bin ich wie immer sehr dankbar.
Viele Grüße

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


Re: ALV Felder vorbelegen & Dynamisch füllen

Beitrag von a-dead-trousers (Top Expert / 4450 / 227 / 1196 ) »
hi!

Weiß nicht ob es helfen wird aber hast du schon mal probiert auch die Datentabelle in deinem Programm zu aktualisieren?
(Die, die bei SET_TABLE_FOR_FIRST_DISPLAY angegeben wurde)
Das ALV nimmt die Daten teilweise auch daraus bzw. speichert Änderungen da rein. (Weil CHANGING-Parameter)

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: ALV Felder vorbelegen & Dynamisch füllen

Beitrag von RIG (Specialist / 110 / 30 / 1 ) »
Danke für die schnelle Antwort,

die Idee erschien mir gestern auf den ersten Blick sehr gut, auch wenn es nicht "der richtige" Weg ist.
Als ich es heute umsetzen wollte bemekrte ich allerdings es hat doch noch einige tücken und würde eine sehr große Logik benötigen, da das betreffende Feld ein Schlüsselfeld ist was ich für den READ/Modify der Outtab benötige. Somit ist im EventHandler die Outtab ja noch nicht mit dem Schlüssel gefüllt. Ich müsste nun alle geänderten Zeilen zwischenspeichern und ein Kennzeichen setzen und im PBO prüfen ob das Kennzeichen gesetzt ist und dann die OUTTAB neu aufbauen/updaten.

Mit dem richtigen Weg meine ich das dies doch der Standard erledigt... die geänderten Daten der <tab> sollten doch alle der outtab zugeordnet werden?!?

Wenn niemand mehr eine Idee hat muss ich woll auf den Work-Arround umspringen, wäre ja nicht das erste mal das wir "andere" Wege gehen müssen um zum Ziel zu kommen.
ALV-Edit ist ja auch keine offiziell freigegebene Funktion soweit ich weiß. :)

Viele Grüße

Re: ALV Felder vorbelegen & Dynamisch füllen

Beitrag von RIG (Specialist / 110 / 30 / 1 ) »
Hallo nochmal,
wollte mir das gerade nochmal im Debugger anschauen... der PBO wird nachdem Event nicht durchlaufen....
auch das kann man sicher noch hinbekommen, aber ich habe das Gefühl ich komme immer weiter vom "richtigen" Wege ab.

Was meint Ihr?

Viele Grüße

Re: ALV Felder vorbelegen & Dynamisch füllen

Beitrag von Pyro (Specialist / 121 / 14 / 18 ) »
Moin,

verstehe ich die Fragestellung jetzt richtig, dass du ein ooalv hast, in dem du eine itab anzeigen lässt. Die Einträge dieser itab willst du ändern und wieder im alv anzeigen lassen?

Falls ja: Hast du schon einen cl_gui_alv_grid->refresh_table_Display oder wie das heißt probiert?

Re: ALV Felder vorbelegen & Dynamisch füllen

Beitrag von RIG (Specialist / 110 / 30 / 1 ) »
Pyro hat geschrieben:Moin,

verstehe ich die Fragestellung jetzt richtig, dass du ein ooalv hast, in dem du eine itab anzeigen lässt. Die Einträge dieser itab willst du ändern und wieder im alv anzeigen lassen?

Falls ja: Hast du schon einen cl_gui_alv_grid->refresh_table_Display oder wie das heißt probiert?

Das ooALV habe ich damit ich Daten verändern kann und Felder vorbelegen.
Wenn ich ein Refresh Table Display auslöse werden die geänderten Daten leider nicht übernommen.

Viele Grüße

Re: ALV Felder vorbelegen & Dynamisch füllen

Beitrag von RIG (Specialist / 110 / 30 / 1 ) »
Ich habe jetzt nochmal ein wenig probiert....

Mit dem folgenden Code geht es leider auch nicht:

Code: Alles auswählen.


*..............
* modified rows
*..............

    "Loop at the modified rows table and assign default values
    ASSIGN er_data_changed->mp_mod_rows->* TO <tab>. "<ls_mat_gr_vert>."
    LOOP AT <tab> ASSIGNING <ls_mat_gr_vert>.

      <ls_mat_gr_vert>-prgrp = gv_prgrp.
      <ls_mat_gr_vert>-werks = '01'.    "CUSTOMIZING ergänzen

      IF <ls_mat_gr_vert>-nrmit is not INITIAL.
        SELECT Single nrmit from pgmi into <ls_mat_gr_vert>-matnr where prgrp eq <ls_mat_gr_vert>-nrmit.
      ENDIF.
      IF <ls_mat_gr_vert>-matnr IS NOT INITIAL.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = <ls_mat_gr_vert>-matnr
          IMPORTING
            output = <ls_mat_gr_vert>-matnr.

        SELECT SINGLE maktx INTO <ls_mat_gr_vert>-bezeichnung
                            FROM makt
                            WHERE matnr EQ <ls_mat_gr_vert>-matnr
                            AND spras EQ 'DE'.  "CUSTOMIZING ergänzen

        READ TABLE er_data_changed->mt_good_cells INTO ls_good WITH KEY fieldname = 'NRMIT'
                                                                        value     = <ls_mat_gr_vert>-nrmit.
        MOVE-CORRESPONDING ls_good to ls_good_new.
        ls_good_new-fieldname = 'MATNR'.
        ls_good_new-value = <ls_mat_gr_vert>-matnr.
        APPEND ls_good_new to er_data_changed->mt_good_cells.
        ls_good_new-fieldname = 'BEZEICHNUNG'.
        ls_good_new-value = <ls_mat_gr_vert>-bezeichnung.
        APPEND ls_good_new to er_data_changed->mt_good_cells.

      ENDIF.
      MODIFY <tab> FROM <ls_mat_gr_vert> INDEX sy-tabix.
      IF Sy-subrc eq 0.                                                                 "für geänderte Tabellenzeilen - Workarround :-(
        APPEND INITIAL LINE TO gt_mat_gr_vert_chg ASSIGNING <ls_mat_gr_vert_chg>.       "für geänderte Tabellenzeilen - Workarround :-(
        MOVE-CORRESPONDING <ls_mat_gr_vert> to <ls_mat_gr_vert_chg>.                    "für geänderte Tabellenzeilen - Workarround :-(
        gv_data_is_changed = 'X'.                                                       "für geänderte Tabellenzeilen - Workarround :-(
      ENDIF.                      
Im Debugger habe ich mir das jetzt noch einmal ganz genau angeschaut...
Die Werte werden nur übernommen beim allerersten durchlauf, dem einfügen einer Zeile
das Event wird zwar auch bei Änderung korrekt durchlaufen, aber die Daten auf dem ALV nicht angezeigt und auch in der outtab nicht mehr aktualisiert.

Viele Grüße

Re: ALV Felder vorbelegen & Dynamisch füllen

Beitrag von RIG (Specialist / 110 / 30 / 1 ) »
Jetzt habe ich es endlich geschafft,
vielen Dank für eure Hilfe. Hier die Lösung die zum Erfolg geführt hat:

Code: Alles auswählen.


*..............
* modified rows
*..............

    "Loop at the modified rows table and assign default values
    ASSIGN er_data_changed->mp_mod_rows->* TO <tab>. "<ls_mat_gr_vert>."
    LOOP AT <tab> ASSIGNING <ls_mat_gr_vert>.

      <ls_mat_gr_vert>-prgrp = gv_prgrp.
      <ls_mat_gr_vert>-werks = '01'.    "CUSTOMIZING ergänzen

      IF <ls_mat_gr_vert>-nrmit is not INITIAL.
        SELECT Single nrmit from pgmi into <ls_mat_gr_vert>-matnr where prgrp eq <ls_mat_gr_vert>-nrmit.
      ENDIF.
      IF <ls_mat_gr_vert>-matnr IS NOT INITIAL.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
          EXPORTING
            input  = <ls_mat_gr_vert>-matnr
          IMPORTING
            output = <ls_mat_gr_vert>-matnr.

        SELECT SINGLE maktx INTO <ls_mat_gr_vert>-bezeichnung
                            FROM makt
                            WHERE matnr EQ <ls_mat_gr_vert>-matnr
                            AND spras EQ 'DE'.  "CUSTOMIZING ergänzen

        READ TABLE er_data_changed->mt_good_cells INTO ls_good WITH KEY fieldname = 'NRMIT'
                                                                        value     = <ls_mat_gr_vert>-nrmit.
*        MOVE-CORRESPONDING ls_good to ls_good_new.
*        ls_good_new-fieldname = 'MATNR'.
*        ls_good_new-value = <ls_mat_gr_vert>-matnr.
*        APPEND ls_good_new to er_data_changed->mt_good_cells.
*        ls_good_new-fieldname = 'BEZEICHNUNG'.
*        ls_good_new-value = <ls_mat_gr_vert>-bezeichnung.
*        APPEND ls_good_new to er_data_changed->mt_good_cells.

       er_data_changed->modify_cell(
         EXPORTING
           i_row_id    = ls_good-row_id            " Zeilen-ID
           i_tabix     = ls_good-tabix             " Zeilen-Index
           i_fieldname = 'MATNR'                   " Feldname
           i_value     = <ls_mat_gr_vert>-matnr    " Wert
       ).

       er_data_changed->modify_cell(
         EXPORTING
           i_row_id    = ls_good-row_id               " Zeilen-ID
           i_tabix     = ls_good-tabix                " Zeilen-Index
           i_fieldname = 'BEZEICHNUNG'                " Feldname
           i_value     = <ls_mat_gr_vert>-bezeichnung " Wert
       ).

      ENDIF.
      MODIFY <tab> FROM <ls_mat_gr_vert> INDEX sy-tabix.
      IF Sy-subrc eq 0.                                                                 "für geänderte Tabellenzeilen - Workarround :-(
        APPEND INITIAL LINE TO gt_mat_gr_vert_chg ASSIGNING <ls_mat_gr_vert_chg>.       "für geänderte Tabellenzeilen - Workarround :-(
        MOVE-CORRESPONDING <ls_mat_gr_vert> to <ls_mat_gr_vert_chg>.                    "für geänderte Tabellenzeilen - Workarround :-(
        gv_data_is_changed = 'X'.                                                       "für geänderte Tabellenzeilen - Workarround :-(
      ENDIF.                                                                            "für geänderte Tabellenzeilen - Workarround :-(

*      READ TABLE gt_mat_gr_vert with key werks = '01'
*                                         prgrp = <ls_mat_gr_vert>-prgrp
*                                         nrmit = <ls_mat_gr_vert>-nrmit
*                                         TRANSPORTING NO FIELDS.
*      IF Sy-subrc eq 0.
*        MODIFY gt_mat_gr_vert from <ls_mat_gr_vert> INDEX sy-tabix.
*      ENDIF.
    ENDLOOP.

Seite 1 von 1

Vergleichbare Themen

3
Antw.
6071
Views
Felder vorbelegen
von bohne » 24.10.2006 12:20 • Verfasst in ABAP® für Anfänger
4
Antw.
14187
Views
SAP Felder vorbelegen
von isensatus » 24.08.2018 15:00 • Verfasst in ABAP® für Anfänger
0
Antw.
1883
Views
1
Antw.
1468
Views
F4IF_FIELD_VALUE_REQUEST Felder vorbelegen
von Reto Crameri » 20.09.2024 16:18 • Verfasst in ABAP® für Anfänger
1
Antw.
1900
Views
BP Felder Vorbelegen in Kunde Vertrieb
von KaiserD » 08.11.2023 09:21 • Verfasst in ABAP® Core

Ü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

Aktuelle Forenbeiträge

Web Feature Services (WFS) im SAP
vor 17 Stunden von msfox 1 / 68
FOR mit CORRESPONDING
vor 19 Stunden von rob_abc 4 / 191

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.

Aktuelle Forenbeiträge

Web Feature Services (WFS) im SAP
vor 17 Stunden von msfox 1 / 68
FOR mit CORRESPONDING
vor 19 Stunden von rob_abc 4 / 191

Unbeantwortete Forenbeiträge

Web Feature Services (WFS) im SAP
vor 17 Stunden von msfox 1 / 68
Erweiterung in ME51N/ME52N:
vor 3 Wochen von ABAPlerv 1 / 2089
Erweiterung in ME51N/ME52N:
vor 3 Wochen von ABAPlerv 1 / 1917