Benutzereingaben abfangen

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

Die Objektorientierung mit ABAP®: Vererbung, Dynamische Programmierung, GUI Controls (u.a. ALV im OO).
29 Beiträge • Vorherige Seite 2 von 2 (current)
29 Beiträge Vorherige Seite 2 von 2 (current)

Beitrag von popeiko (ForumUser / 47 / 0 / 1 ) »
Das hatte ich mir fast gedacht. Aber du hast doch geschrieben, dass du die veränderten Zellen über

Code: Alles auswählen.

l_cells = er_data_changed->mt_mod_cells.
liest.

Dafür muss der Import-Parameter doch schon definiert gewesen sein?

Viele Grüße Heiko.

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


Beitrag von marc1 ( / / 0 / 3 ) »
Ja müsste eigentlich schon definiert sein.
Hat er aber nicht erkannt.

Hab ihn dann einfach so

Code: Alles auswählen.

DATA: er_data_changed TYPE REF TO cl_alv_changed_data_protocol.
definiert.

Andere Frage:
Er bricht mein Programm immer ab. Was hab ich denn falsch programmiert?

Code: Alles auswählen.

CALL METHOD er_data_changed->add_protocol_entry
    EXPORTING
      i_msgid     = 'y_tr_table_tool'
      i_msgty     = 'E'
      i_msgno     = '123'
*      i_msgv1     = '010'
*      i_msgv2     =
*      i_msgv3     =
*      i_msgv4     =
      i_fieldname = <fs1>
      i_row_id    = '1'.
Gruß

Beitrag von popeiko (ForumUser / 47 / 0 / 1 ) »
Hast du deine Handler-Methode richtig definiert?

Code: Alles auswählen.

    METHODS mgmt_data_changed
      FOR EVENT data_changed OF cl_gui_alv_grid
      IMPORTING
        er_data_changed
        e_onf4
        e_onf4_before
        e_onf4_after.
Der Fehler bei dir war, dass du einfach eine Objektvariable definiert hast, ohne das sich tatsächlich ein Objekt dahinter befand. Wenn Du dann versuchst eine Methode aufzurufen, gibt's einen Dump.

er_data_changed wird deiner Methode als Parameter mitgegeben (falls du das so definiert hast).
Dahinter steht dann auch ein Objekt und von diesem musst du dann die Methode aufrufen.

Gruß Heiko.

Beitrag von marc1 ( / / 0 / 3 ) »
So nun hab ich sie wie du geschrieben hast definiert.

Jetzt muss ich sie aber auch noch implementieren!

Gibt es zu dieser Methode vielleicht irgendein Beispielprogramm? Versteh nämlich nicht ganz wie sich die Methode verhält.

Gruß

Beitrag von marc1 ( / / 0 / 3 ) »
Also so sieht mein Code jetzt aus:

Code: Alles auswählen.

CLASS lcl_event_receiver DEFINITION.

  PUBLIC SECTION.
    METHODS:

    z_handle_data_changed
    FOR EVENT data_changed OF cl_gui_alv_grid
    IMPORTING er_data_changed.

    METHODS:

     mgmt_data_changed
     FOR EVENT data_changed OF cl_gui_alv_grid
     IMPORTING
            er_data_changed
            e_onf4
            e_onf4_before
            e_onf4_after.

ENDCLASS.

CLASS lcl_event_receiver IMPLEMENTATION.

  METHOD z_handle_data_changed.

    l_cells = er_data_changed->mt_mod_cells .

    LOOP AT l_cells INTO wa_cells.
      PERFORM pruefe.
    ENDLOOP.



  ENDMETHOD.

  METHOD mgmt_data_changed.

    PERFORM vergleich.

    CALL METHOD er_data_changed->add_protocol_entry
      EXPORTING
        i_msgid     = '(y_tr_table_tool)'
        i_msgty     = 'E'
        i_msgno     = '123'
        i_fieldname = <fs1>
        i_row_id    = <fs2>.

  ENDMETHOD.


ENDCLASS.

FORM pruefe.

  ASSIGN COMPONENT 'FIELDNAME' OF STRUCTURE wa_cells TO <fs1>.
  ASSIGN COMPONENT 'ROW_ID' OF STRUCTURE wa_cells TO <fs2>.
  ASSIGN COMPONENT 'VALUE' OF STRUCTURE wa_cells TO <fs3>.

  READ TABLE t_1 INDEX <fs2> INTO wa_pr1.

  auf_1 = wa_pr1.

  ASSIGN COMPONENT <fs1> OF STRUCTURE auf_1 TO <fs4>.

  <fs4> = <fs3>.

ENDFORM.

FORM vergleich.

  IF auf_1-py_abn = 'X' AND auf_1-py_citi = 'X'.
    
  ELSEIF auf_1-py_abn = 'X' AND auf_1-py_nord = 'X'.
    
  ELSEIF auf_1-py_abn = 'X' AND auf_1-py_not = 'X'.
    
  ELSEIF auf_1-py_citi = 'X' AND auf_1-py_nord = 'X'.
    
  ELSEIF auf_1-py_citi = 'X' AND auf_1-py_not = 'X'.
    
  ELSEIF auf_1-py_nord = 'X' AND auf_1-py_not = 'X'.
    
  ENDIF.

ENDFORM.

Wie soll ich jetzt die IF-Abfrage in die Funktion einbauen? Mir fehlt noch, was er machen soll, wenn das IF eintritt.

Gruß

Beitrag von Gast ( / / 0 / 3 ) »
Du brauchst nur eine Handlermethode, nicht zwei! Bei einer Handlermethode musst du dir angucken, welche Parameter von der Ereignis auslösenden Klasse exportiert werden: (SE24->"cl_gui_alv_grid"->ereignisse->"data_changed"->Parameter).
Ergebnis:

Code: Alles auswählen.

ER_DATA_CHANGED	Type	REF TO CL_ALV_CHANGED_DATA_PROTOCOL		Datenänderungsobjekt
E_ONF4	Type	CHAR01		Im F4 Ereignis gerufen
E_ONF4_BEFORE	Type	CHAR01		Im F4 Ereignis vor der F4 Verarbeitung gerufen
E_ONF4_AFTER	Type	CHAR01		Im F4 Ereignis nach der F4 Verarbeitung gerufen
Bei der Definition deiner Handlermethode musst du genau diese Parameter als Import-Parameter definieren (also bei z_handle_data_changed). mgmt_data_changed brauchst du dann nicht!

Dann definierst du eine Nachrichtenklasse (SE91, entspricht i_msgid). In dieser Nachrichtenklasse kannst du Meldungen (mit einer eindeutigen Meldungsnummer innerhalb der Nachrichtenklasse, entspricht i_msgno) definieren. In jede Meldung kannst du maximal 4 Variablen einbauen (mit &-Zeichen, z. B. "Es ist der Fehler & aufgetreten", entspricht i_msgv1 - i_msgv4). Schließlich besagt i_msgty, wie schwer der Fehler ist.
Guck mal unter der F1-Hilfe für die ABAP-MESSAGE-Anweisung.

Innerhalb von PRÜFE würdest du dann in den If-Anweisungen jedes Mal ein entsprechendes ADD_PROTOCOL_ENTRY aufrufen. Fertig.

Dabei kannst du aber nicht einfach irgendeine Nachrichtenklasse definieren. Sie muss auch in der SE91 definiert sein.

Gruß Heiko.

Beitrag von Gast ( / / 0 / 3 ) »
Anonymous hat geschrieben:Du brauchst nur eine Handlermethode, nicht zwei! Bei einer Handlermethode musst du dir angucken, welche Parameter von der Ereignis auslösenden Klasse exportiert werden: (SE24->"cl_gui_alv_grid"->ereignisse->"data_changed"->Parameter).
Ergebnis:

Code: Alles auswählen.

ER_DATA_CHANGED	Type	REF TO CL_ALV_CHANGED_DATA_PROTOCOL		Datenänderungsobjekt
E_ONF4	        Type	CHAR01		Im F4 Ereignis gerufen
E_ONF4_BEFORE	Type	CHAR01		Im F4 Ereignis vor der F4 Verarbeitung gerufen
E_ONF4_AFTER	Type	CHAR01		Im F4 Ereignis nach der F4 Verarbeitung gerufen
Bei der Definition deiner Handlermethode musst du genau diese Parameter als Import-Parameter definieren (also bei z_handle_data_changed). mgmt_data_changed brauchst du dann nicht!

Dann definierst du eine Nachrichtenklasse (SE91, entspricht i_msgid). In dieser Nachrichtenklasse kannst du Meldungen (mit einer eindeutigen Meldungsnummer innerhalb der Nachrichtenklasse, entspricht i_msgno) definieren. In jede Meldung kannst du maximal 4 Variablen einbauen (mit &-Zeichen, z. B. "Es ist der Fehler & aufgetreten", entspricht i_msgv1 - i_msgv4). Schließlich besagt i_msgty, wie schwer der Fehler ist.
Guck mal unter der F1-Hilfe für die ABAP-MESSAGE-Anweisung.

Innerhalb von PRÜFE würdest du dann in den If-Anweisungen jedes Mal ein entsprechendes ADD_PROTOCOL_ENTRY aufrufen. Fertig.

Dabei kannst du aber nicht einfach irgendeine Nachrichtenklasse definieren. Sie muss auch in der SE91 definiert sein.

Gruß Heiko.

Eingabeprüfungen im ALV

Beitrag von Gast ( / / 0 / 3 ) »
Hallo,

schau Dir mal den Report BCALV_EDIT_04 an. Der hat mir sehr gut weitergeholfen. Irgendwo gib es da eine Methode "perform_semantic_checks".

mfg. Uwe

Beitrag von marc1 ( / / 0 / 3 ) »
Ok bin jetzt schon weiter.
Hab es jetzt mal soweit angepasst!

Code: Alles auswählen.

CLASS lcl_event_receiver DEFINITION.

  PUBLIC SECTION.
    
    METHODS:
        z_handle_data_changed
            FOR EVENT data_changed OF cl_gui_alv_grid
              IMPORTING
                 er_data_changed.

  PRIVATE SECTION.

    METHODS:
       perform_semantic_checks
          IMPORTING
             pr_data_changed TYPE REF TO cl_alv_changed_data_protocol.

ENDCLASS.

CLASS lcl_event_receiver IMPLEMENTATION.

  METHOD z_handle_data_changed.

    l_cells = er_data_changed->mt_mod_cells .

    LOOP AT l_cells INTO wa_cells.
      PERFORM pruefe.
    ENDLOOP.

    CALL METHOD perform_semantic_checks( er_data_changed ).

  ENDMETHOD.

  METHOD perform_semantic_checks.

    PERFORM vergleich.

  ENDMETHOD.

ENDCLASS.

FORM vergleich.

  IF auf_1-py_abn = 'X' AND auf_1-py_citi = 'X'.
  perform screen1.
  ELSEIF auf_1-py_abn = 'X' AND auf_1-py_nord = 'X'.
  perform screen1.
  ELSEIF auf_1-py_abn = 'X' AND auf_1-py_not = 'X'.
   perform screen1.
  ELSEIF auf_1-py_citi = 'X' AND auf_1-py_nord = 'X'.
    perform screen1.
  ELSEIF auf_1-py_citi = 'X' AND auf_1-py_not = 'X'.
   perform screen1.
  ELSEIF auf_1-py_nord = 'X' AND auf_1-py_not = 'X'.
   perform screen1.
  ENDIF.

ENDFORM.

FORM screen1.

call method pr_data_changed->add_protocol_entry
                            exporting
                 i_msgid = 'y_tr_tabletool'
                 i_msgno = '111'
                 i_msgty = 'E'
                 i_fieldname = <fs1>
                 i_row_id = <fs2>.

            error_in_data = 'X'.

ENDFORM.
Bricht mir aber das Programm jedesmal ab, weil eine 0 interprtiert wurde!

Gruß

Beitrag von marc1 ( / / 0 / 3 ) »
Hab das ganze jetzt gemacht wie im Beispielprogramm.
Bricht das Programm aber ab, wenn ich das Popup verlassen möchte. Außerdem stimmt die Nachricht auch nicht.
Kann mir da vielleicht jemand helfen?

Code: Alles auswählen.

CREATE OBJECT pr_data_changed.

CALL METHOD pr_data_changed->add_protocol_entry
  EXPORTING
    i_msgid     = 'y_tr_tabletool1'
    i_msgty     = 'E'
    i_msgno     = '000'
    I_MSGV1     = text-111
    i_fieldname = wa_cells-fieldname
    I_ROW_ID    = wa_cells-row_id.
    
  CALL METHOD pr_data_changed->display_protocol.
Gruß Marc

Beitrag von Gast ( / / 0 / 3 ) »
Mal ins blaue hinein geraten:
Muss das Literal welches als i_msgid übergeben wird nicht groß geschrieben werden?
Also so:

Code: Alles auswählen.

CALL METHOD pr_data_changed->add_protocol_entry
  EXPORTING
    i_msgid     = 'Y_TR_TABLETOOL1'
    i_msgty     = 'E'
    i_msgno     = '000'
    I_MSGV1     = text-111
    i_fieldname = wa_cells-fieldname
    I_ROW_ID    = wa_cells-row_id.
SAP ist da doch etwas empfindlich.
Gruß Hendrik

Beitrag von marc1 ( / / 0 / 3 ) »
Hi.

Danke für deine Hilfe. Bin auch schon darauf gekommen. :?

Hab grad aber das Problem, dass er bei der Message keinen Spaltennamen mitangibt und auch nicht die betroffene Zelle rot einrahmt.
Verlassen der Message klappt inzwischen auch.
Würd nur gern wisssen, wie ich die betroffene Zelle rot markieren könnte! :?:

Gruß Marc

Beitrag von Mr. ABAP (ForumUser / 97 / 0 / 0 ) »
Hallo,

schön, dass es noch jemand gibt, der ähnliche Probleme hat. Jedoch funktioniert alles schon, was hier diskutiert wurde, nur meine F4-Auswahl nicht. Werden bestimmte Werte ausgewählt füge ich mich ADD_PROTOCOL_ENTRY einen Fehlereintrag dem Protokoll hinzu. Meine Vorgehensweise ist folgende: Ein Wert wird aus der F4-Eingabe ausgewählt, der nicht ausgewählt werden darf, ich füge einen Protokolleintrag hinzu und das Fehlerprotokoll erscheint nicht, erst nachdem ich am Ende explizit die Methode DISPLAY_PROTOCOL schmeiss... wobei die fehlerhafte Zelle nicht rot markiert wird.

was mache ich falsch????

Gruss und Danke
Red1825

Beitrag von Mr. ABAP (ForumUser / 97 / 0 / 0 ) »
Hallo,

ich arbeite mit dem Protokoll in einem normalen ALV (ohne Eingabemöglichkeit) und bekomme es nicht hin das Feld Spaltenbezeichnung zu befüllen. Was mach ich falsch? Nur mit Wertzuweisung funktionierts wahrscheinlich nicht oder und wenn ich den Spaltennamen in ein Hilfsfeld schieb, gehts auch ned wirklich. Hat jemand viell. ne Ahnung?

Vergleichbare Themen

8
Antw.
2264
Views
auf Benutzereingaben reagieren
von Dörk » 22.11.2005 15:15 • Verfasst in ABAP® Core
17
Antw.
5338
Views
Abfangen von /h
von zzcpak » 29.06.2005 16:09 • Verfasst in Basis
3
Antw.
391
Views
http_communication_failure abfangen?
von danbrown_1999 » 11.02.2023 17:22 • Verfasst in ABAP® für Anfänger
12
Antw.
15600
Views
Ausnahmen abfangen
von dawns » 19.05.2008 10:21 • Verfasst in ABAP Objects®
2
Antw.
2152
Views
Abfangen von Fehler
von debianfan » 06.11.2017 13:33 • Verfasst in ABAP® für Anfänger

Ü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.