ALV-Grid - Hinzufügen und Ändern von Daten Thema ist als GELÖST markiert

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

ALV-Grid - Hinzufügen und Ändern von Daten

Beitrag von STDIN (ForumUser / 28 / 15 / 0 ) » 20.05.2020 12:49
Hallo zusammen,

ich benutze die Klasse cl_gui_alv_grid um eine Tabelle anzuzeigen.
Bei der Editierfunktion stoße ich jetzt allerdings auf ein paar Probleme.

- Ich habe zwei Spalten, in denen ich einen Text oder sonstiges schreiben kann. Wenn ich diese Spalten allerdings ändere passen nur 10 Zeichen rein und werden nach Drücken der Enter-Taste in Großbuchstaben umgewandelt. Allerdings sollte die eine Spalte z.B. 255 Zeichen lang sein und auch in Kleinbuchstaben angezeigt werden (ist auch so in der Domäne angegeben). Ich habe auch irgendwo gelesen, dass das ALV-Grid nur 128 Zeichen in der Spalte zulässt und ich ja somit mit 255 Zeichen darüber bin. Allerdings ist die andere Spalte nur 20 Zeichen lang und da passiert schließlich das gleiche Szenario.

- Zusätzlich habe ich eine Spalte, in der ich eine Dezimalzahl eingeben möchte. Wenn ich diese z.B. auf 0,5 setzen möchte gibt es den Fehler, dass keine Dezimalstellen vorgesehen sind (in der Domäne mit 2 Nachkommastellen angegeben). Wenn ich dann nur eine 5 in die Spalte schreibe, wandelt es mir die Zahl komischerweise in 0,05 um.

- Eine dritte Frage wäre noch, ob es einen Parameter oder ähnliches gibt, welcher mir sagt, welchen Toolbar-Button ich gedrückt habe. Ich würde gerne unterscheiden, ob ich eine neue Zeile anhänge oder ob ich nur eine Zeile ändere. Daraufhin wäre noch die Frage, ob ich erst eine ganze Zeile bearbeiten kann, sodass ich nicht nach jeder geänderten Zelle in die Methode handle_change_data hineinspringe sondern im Anschluss darauf.


Ich hoffe ihr habt vielleicht ein paar Tipps/Hilfen für mich und bedanke mich schon einmal. :)


Re: ALV-Grid - Hinzufügen und Ändern von Daten

Beitrag von a-dead-trousers (Top Expert / 3456 / 106 / 892 ) » 20.05.2020 17:48
hi.

Ad 1)
Ja, intern werden die Daten ans ALV-Control mit einer eigenen Struktur übertragen. Als Datentyp wird LVC_VALUE verwendet welcher mit 128 Zeichen definiert ist. In diese 128 Zeichen fallen auch allfällige Konvertierungen und sonstige Aufbereitungsoptionen hinein, denn das Control bekommt vom Appl.Server nur die fix-fertig aufbereiteten Daten zur Verfügung gestellt.
Wegen der Groß-/Kleinschreibungsproblematik: Kann es sein, dass du beim Datentyp den du im Feldkatalog angegeben hast, diese Einstellungen erst etwas später geändert hast? Das ALV puffert den Feldkatalog daher kann es vorkommen, dass eine Änderung am Datentyp nicht sofort gezogen wird.

Eines dieser Programme sollte Abhilfe schaffen:
BALVBUFDEL
BCALV_BUFFER_DELETE
BCALV_BUFFER_DEL_SHARED

ad 2)
Könnte eventuell auch mit dem Puffer zusammenhängen. Ansonsten scheint sich das Feld als "Prozentzahl" oder "Währungsfeld" zu verhalten. Schau dir nochmal deine Felddefinition an. Für z.B. zwei Vorkomma- und zwei Nachkommastellen benötigst du Länge 4 und Dezimal 2.

ad 3)
Die ausgelösten Funktionscodes werden über Events probagiert. Da aber leider nicht alle. So glaube ich, dass z.B. gerade das Hinzufügen keinen Eventhandler auslöst. Das müsstest du wahrscheinlich über das DATA_CHANGED abbilden. Ansonsten sind alle Funktionscodes auch als Konstanten im Public-Bereich der Klasse definiert. Einfach die Evenst fürs Funktionscode-Handling registrieren und durchprobieren.

lg ADT

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

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.07
Basis: 7.40

Re: ALV-Grid - Hinzufügen und Ändern von Daten

Beitrag von STDIN (ForumUser / 28 / 15 / 0 ) » 27.05.2020 14:41
Vielen Dank ADT.

Die ersten beiden Punkte konnte ich somit lösen.
Für Punkt 3 habe ich meine Methode mit dem Event data_changed erstmal ohne Abfrage auf fehlerhafte Daten überarbeitet und es funktioniert. Wenn ich allerdings Abfragen auf Fehler in mein Coding hinzufüge und es zunächst mit einem fehlerhaften Eintrag teste kommt meine Fehlermeldung, dass dieser Wert falsch ist und ich diesen eben berichtigen soll. Soweit funktioniert es. Wenn ich dann den Wert berichtige prüft mein Programm wieder alles auf Richtigkeit in der Methode handle_data_changed und am Ende der Methode habe ich alle Daten in meiner internen Tabelle stehen. Aber dann kommt der Laufzeitfehler MESSAGE_TYPE_X (direkt nach endmethod von handle_data_changed).
Leider komme ich durch Recherche im Internet nicht wirklich weiter und meine Arbeitskollegin ist auch ratlos. Als Anlehnung für mein Coding habe ich die Beispielprogramme in SAP für das ALV-Grid genutzt.

Hier ist ein Ausschnitt des Codings:

Code: Alles auswählen.

IF lv_bt_error EQ space AND lv_et_error EQ space AND
  lv_bt_min_error EQ space AND lv_et_min_error EQ space.
        CALL METHOD get_presence
          EXPORTING
            pv_bt             = lv_btime
            pv_et             = lv_etime
          IMPORTING
            ev_presence       = lv_pre
            ev_presence_error = lv_presence_error.

        IF lv_presence_error EQ space.
          gs_out-anwesend = lv_pre.

          CALL METHOD check_pause
            EXPORTING
              pv_pause       = gs_out-pause
              pv_presence    = lv_pre
            IMPORTING
              ev_pause_error = lv_pause_error.

          IF lv_pause_error EQ space.
            gs_out-a_time = gs_out-anwesend -
    gs_out-pause.
          ELSE.
            CLEAR gs_out-pause.
            exit.
          ENDIF.

Die Methode check_pause zB sieht wie folgt aus:

Code: Alles auswählen.

 IF pv_presence LT pv_pause.
*      MESSAGE e023(zactvt).
      CALL FUNCTION 'POPUP_TO_INFORM'
        EXPORTING
          titel = 'Error'
          txt1  = 'anwesend kleiner als pause'
          txt2  = ' '.

      ev_pause_error = 'X'.
    ENDIF.
*        EXIT.
*      ELSE.
    IF pv_pause > 0.
      lv_pause = ( pv_pause * 100 ) MOD 25.
      IF lv_pause NE 0.
        CALL FUNCTION 'POPUP_TO_INFORM'
          EXPORTING
            titel = 'Error'
            txt1  = 'kein viertelstundentakt'
            txt2  = ' '.

        ev_pause_error = 'X'.
*            EXIT.
*          MESSAGE e024(zactvt).
      ELSE.
        lv_pause = pv_pause.
      ENDIF.
    ELSE.
      lv_pause = pv_pause.
    ENDIF.

Vielleicht hatte hier ja schon jemand dieses Problem und weiß woran es liegt.

Re: ALV-Grid - Hinzufügen und Ändern von Daten

Beitrag von a-dead-trousers (Top Expert / 3456 / 106 / 892 ) » 28.05.2020 07:40
Ich kann mich dunkel erinnern, dass dieser Abbruch zustande kommt, wenn man in den Eventhandlern für DATA_CHANGED ein REFRESH oder CHECK_CHANGED_DATA aufruft. Das würde nämlich zu einer Endlosschleife führen. Eventuell schaust du dir die Abbruchstelle an der das MESSAGE TYPE X ausgelöst wird genauer an. Normalerweise ist da meistens auch ein Kommentar dabei warum jetzt abgebrochen werden soll. Wenn es im FLUSH (Control-Steuerung) passiert, musst du die "Autom. Queue synchrone Vararbeitung" ausschalten (Menü>System>Hilfsmittel) um zur genauen Fehlerstelle bzw. Aufrufstack zu kommen.

Hast du deine Events als APPL_EVENT (Parameter im Constructor) registriert? Dann könnt ich mir vorstellen, dass das damit verbundene PAI/PBO ein implizites REFRESH durchführt. Lass den Parameter mal weg oder setz ihn auf SPACE.
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.07
Basis: 7.40

Re: ALV-Grid - Hinzufügen und Ändern von Daten

Beitrag von STDIN (ForumUser / 28 / 15 / 0 ) » 29.05.2020 08:07
Ich habe alles nochmal durchgesehen und geprüft, einen Refresh oder check_changed_data Aufruf habe ich nicht in meinem handle_data_changed. Ein Appl_Event habe ich auch nicht registriert und im Flush passiert es auch nicht...

Deswegen habe ich es noch einmal parallel zum Beispielprogramm BCALV_EDIT03 gedebuggt. Wenn ich den Wert korrigiere und erneut prüfe, dann komme ich in den Constructor der Klasse cl_alv_changed_data_protocol.
2020-05-29 07_56_20-Window.png
Wenn ich dann in die i_calling_alv schaue, sehe ich, dass die Tabelle MT_ROW_ID_CACHE nur 2 Zeilen hat (0 und 1). Im ersten Durchlauf erkennt er noch alle Zeilen, die im ALV-Grid aufgelistet sind. Da er aber nur diese zwei Zeilen erkennt, kommt es auch später zum Dump, da es keine übereinstimmenden Zeilen gibt (wenn ich z.B. die Zeile 8 ändere). Allerdings verstehe ich nicht, warum nur diese zwei Zeilen (bearbeitete Zeile und Zeile, in der die Gesamtsumme über eine Spalte steht)...

Re: ALV-Grid - Hinzufügen und Ändern von Daten

Beitrag von a-dead-trousers (Top Expert / 3456 / 106 / 892 ) » 29.05.2020 22:09
Weil im CHANGED_DATA_PROTOCOLL logischerweise nur die "geänderten" Zeilen vorkommen. ;)
Ausgehend von diesen Informationen befüllt das ALV nach dem Eventhandling die eigentliche Datentabelle die bei SET_TABLE_FOR_FIRST_DISPLAY mit CHANGING übergeben wurde.
Probier mal beim Debugging das "Systemdebugging" zu aktivieren. Dann kannst du auch in Standardcoding nach der Fehlerursache suchen.

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

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.07
Basis: 7.40

Re: ALV-Grid - Hinzufügen und Ändern von Daten

Beitrag von STDIN (ForumUser / 28 / 15 / 0 ) » 03.06.2020 07:56
a-dead-trousers hat geschrieben:
29.05.2020 22:09
Weil im CHANGED_DATA_PROTOCOLL logischerweise nur die "geänderten" Zeilen vorkommen. ;)

Vielen Dank a-dead-trousers, ich frage mich warum ich da nicht eher drauf gekommen bin... mit einem Aufruf von meiner Form select_data am Ende der Methode handle_changed_data funktioniert es jetzt wunderbar.

Seite 1 von 1

Über diesen Beitrag



Unterstütze die Community und teile den Beitrag für mehr Leser und besseren Inhalt:

Aktuelle Forenbeiträge

Tabellensortierung
vor 6 Stunden von DeathAndPain 3 / 76
SU01 - Dokumentation pflegen
vor 10 Stunden von Tron 2 / 51
VA02 Warnmeldung Fakturadatum
Gestern von Max_SAP 5 / 1882

Vergleichbare Themen

Icon der Liste im ALV-Grid hinzufügen
von hmaxi96 » 06.10.2016 11:11
Editierbarer ALV GRID - Neue Zeile hinzufügen
von ABAP_DEV » 03.01.2017 10:32
ALV-Grid: Wo sind die Daten?
von OliTe » 11.07.2005 11:36
ALV Grid anzeigen ohne Daten
von datatom » 29.10.2010 09:40