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 • Seite 1 von 2 (current) Nächste
29 Beiträge Seite 1 von 2 (current) Nächste

Benutzereingaben abfangen

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

Wenn man in einem editierbaren ALV grid eine Zeitangabe so verändert, dass sie z.B. nicht mehr als Zeitangabe gilt, genneriert das Programm automatisch eine Fehlermeldung, und rahmt die Zelle rot ein.
Gibt es eine Funktion, mit der man diese Fehlermeldung selber kreieren kann? z.B. dass ein Feld nur 5 Zeichen lang sein soll und die Zeile rot einrahmt.

Danke schon mal für eure Hilfe und Mühe.

Gruß,
Marc.

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


Beitrag von TakerOne (Specialist / 102 / 0 / 3 ) »
Hallo,

Ich meine, wenn du ein Domänenfeld in der Länge 5 verwendest, greift die Prüfung automatisch. Es werden auch ggf. automatisch typspezifische Prüfungen durchgeführt.
Ich bin eigentlich ein sehr netter Mensch.
Wenn ich Freunde hätte, könnten diese es bestätigen. :-)

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

Das mit der 5 war nur ein Beispiel. Eigentlich möchte ich über eine IF Anweisuing mehrere Felder miteinander vergleichen und falls etwas falsch ist, soll eine Fehlermeldung kommen und sagen was falsch ist, und die falsche Zelle soll rot umrandet sein.
(Wie die automatisch Fehlermeldung nur selbstgeneriert!)

Gibt es dazu irgendeine Funktion oder Methode?

Gruß

Beitrag von popeiko (ForumUser / 47 / 0 / 1 ) »
Du must dem OO-ALV sagen, dass er ein Event bei Enter oder bei jeder Änderung auslösen soll:

Code: Alles auswählen.

CALL METHOD gx_grid->register_edit_event      
  EXPORTING                                   
    i_event_id = cl_gui_alv_grid=>mc_evt_enter
  EXCEPTIONS                                  
    OTHERS     = 0.                           
Danach löst der ALV-Grid bei einer Änderung das Event data_changed aus.
Du brauchst also eine eigene Methode als Handler, der dieses Event abfängt. Dieser Handler erhält bei Aufruf eine Referenz auf das Changed Data Protocol (CL_ALV_CHANGED_DATA_PROTOCOL).
Hierin stehen die Daten die sich zuletzt verändert haben.
Wenn du über die Methode ADD_PROTOCOL_ENTRY eine Nachricht hinzufügst, wird diese Nachricht im Popup ausgegeben und die entsprechende (falsche) Zelle wird je nach schwere des Fehlers (selbst definierbar) rot, grün oder gelb umrandet.

Gruß Heiko.

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

Zum registrieren, was sich verändert hat, benutzte ich dies:

Code: Alles auswählen.

CLASS lcl_event_receiver IMPLEMENTATION.

  METHOD z_handle_data_changed.

    l_cells = er_data_changed->mt_mod_cells .
l_cells zeigt dann an, was verändert wurde, und wo.
Ich kann aber die Methode die du oben geschrieben hast, keine Doku finden. In welcher Klasse steht die denn?

Gruß

Beitrag von popeiko (ForumUser / 47 / 0 / 1 ) »
Von welchem Release reden wir denn?
Die Klasse heißt CL_ALV_CHANGED_DATA_PROTOCOL.

Beitrag von marc1 ( / / 0 / 3 ) »
coole Klasse!

Weiß aber nicht genau, wie ich die in mein Programm einbinden soll.
Hab die geänderten Werte dynamisch in Feldsymbolen angegeben.
Wie kann ich die jetzt in die Methode miteinbinden?

Gruß

Beitrag von popeiko (ForumUser / 47 / 0 / 1 ) »
Ich weiß nicht genau, was du machen willst :roll:. Etwas mehr Info bitte.

Beitrag von marc1 ( / / 0 / 3 ) »
Also:

Ich benutzt die oben genannte selbstdefinierte Klasse.
Sie reagiert auf Eingaben im Grid, sobald man etwas in ein Feld geschrieben hat, und gibt die Änderungen in l_cells an, mit sy_tabix, fieldname und Änderung.
Nun habe ich die diese Werte so in eine interne Tabelle zusammengefasst, dass ich die geänderten Werte für meine Struktur benutzen kann.
Also hab ich nun die alte und die neue Zeile.
Diese möchte ich nun vergleichen.
Falls etwas nicht stimmt soll ein POPUP kommen, dass aussieht, wie bei der falschen Eingabe einer Uhrzeit.
Zusätzlich soll das fehlerhafte Feld rot markiert sein und ebenso die Schrift.
Mein Programm soll vergleichen, ob in Zelle 1 und in Zelle 2 etwas steht. Sollte dies der Fall sein, soll sofort die Fehlermeldung kommen.

So hoff das sind genug Infos :lol:

Gruß

Beitrag von popeiko (ForumUser / 47 / 0 / 1 ) »
Du musst einfach die Methode add_protocol_entry für jeden Fehler, den du feststellst aufrufen. Über den Parameter i_msgty kannst du beeinflussen, ob die jeweiligen Zellen rot (i_msgty = 'E'), grün(i_msgty = 'S'), oder gelb (i_msgty = 'W') umrandet werden sollen.
Die Parameter sind solche, die du sonst der MESSAGE-Anweisung geben würdest.

Sobald du Einträge erfasst hast, müsste das Protokoll erscheinen (nach Aufruf deines Eventhandlers). Wenn nicht, musst du vorher wohl deinem ALV-Grid sagen, dass es das Protokoll anzeigen soll, wenn Fehler aufgetreten sind.

Code: Alles auswählen.

CALL METHOD gx_grid->ACTIVATE_DISPLAY_PROTOCOL
  EXPORTING
    i_display = 'X'.
Hoffe es klapp so.

Gruß, Heiko.

Beitrag von marc1 ( / / 0 / 3 ) »
Also ich hab das jetzt mal so eingebaut:

Code: Alles auswählen.

CALL METHOD g_1->ACTIVATE_DISPLAY_PROTOCOL
  EXPORTING
    i_dialog = 'X'
    i_msgty = 'E'.
i_display erkennt er nicht.

Aber passiert garnichts, da er i_msgty = 'E' nicht erkennt.

Beitrag von popeiko (ForumUser / 47 / 0 / 1 ) »
Jetzt hast du etwas verwechselt.
Dem ALV-Grid musst du sagen, dass er dass Protokoll überhaupt aktivieren soll.
ACTIVATE_DISPLAY_PROTOCOL ist also eine Methodes des Grids.

Im Handler musst du der PROTOKOLL-Klasse Protokoll-Einträge hinzufügen:

Code: Alles auswählen.

CALL METHOD er_data_changed->add_protocol_entry
  EXPORTING
    i_msgid     = "Nachrichtenklasse"
    i_msgty     = "Nachrichtentyp (E= Error, W=Warning...)
    i_msgno     = "Nachrichtennummer"
    i_msgv1     = "Nachrichtenvariablen..."
    I_MSGV2     =
    I_MSGV3     =
    I_MSGV4     =
    i_fieldname = "Feldname des Grids"
    I_ROW_ID    = "Zeile des Grids".
Hoffe es hilft. Mit Nachrichtenklassen kennst du dich aus?
Gruß Heiko.

Beitrag von Gast ( / / 0 / 3 ) »
Also eigentlich kenn ich mich mit denen nicht aus :oops:

Hab das aber jetzt soweit mal versucht.

Aber die methode

Code: Alles auswählen.

CALL METHOD er_data_changed->add_protocol_entry 
erkennt er nicht.
Wie muss ich die denn in meinem Handler definieren?

Beitrag von popeiko (ForumUser / 47 / 0 / 1 ) »
Guck dir in deinem System doch mal die Klasse CL_ALV_CHANGED_DATA_PROTOCOL an (SE24). Die Methode müsste schon da sein.
Mit welchem Release arbeitest du?

Beitrag von marc1 ( / / 0 / 3 ) »
Hi.
Arbeite mit Release 6.0.

Musste noch er_data_change definieren. :?

Vergleichbare Themen

8
Antw.
2271
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.