Ein Feld einer internen Tabelle anpassen

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

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

Ein Feld einer internen Tabelle anpassen

Beitrag von Alexity (ForumUser / 15 / 8 / 0 ) »
Hallo,

ich sammle Beginn- und Enddatum von Abwesenheiten, um sie später auszugeben. Aber ich kriege den Modify nicht richtig hin.

Code: Alles auswählen.

ls_abw-evt_elternzeit_begin = ls_2001-begda.
MODIFY gt_abw INDEX lv_counter FROM ls_abw TRANSPORTING (ls_abw-evt_elternzeit_begin).
Hier kommt es zum Dump und er sagt in meinem Test, dass der Typ 20190428 nicht existiert, also der Wert, der im Beginndatum steht. Ohne die Klammern sagt er schon im Programm: Der angegebene Typ besitzt keine Struktur und daher auch keine Komponente mit Namen "LS_ABW-EVT_ELTERNZEIT_BEGIN".

Wie mache ich den Modify korrekt?

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


Re: Ein Feld einer internen Tabelle anpassen

Beitrag von jocoder (Specialist / 338 / 3 / 101 ) »

Code: Alles auswählen.

ls_abw-evt_elternzeit_begin = ls_2001-begda.
MODIFY gt_abw INDEX lv_counter FROM ls_abw TRANSPORTING ls_abw-evt_elternzeit_begin.
In runden Klammern versucht das System, das Feld auszuwählen, dass in ls_abw-evt_elternzeit_begin steht.

Re: Ein Feld einer internen Tabelle anpassen

Beitrag von Alexity (ForumUser / 15 / 8 / 0 ) »
jocoder hat geschrieben:
10.01.2020 09:37

Code: Alles auswählen.

ls_abw-evt_elternzeit_begin = ls_2001-begda.
MODIFY gt_abw INDEX lv_counter FROM ls_abw TRANSPORTING ls_abw-evt_elternzeit_begin.
In runden Klammern versucht das System, das Feld auszuwählen, dass in ls_abw-evt_elternzeit_begin steht.
Danke für deine Antwort, aber, wie oben geschrieben, komt die Fehlermeldung:
Der angegebene Typ besitzt keine Struktur und daher auch keine Komponente mit Namen "LS_ABW-EVT_ELTERNZEIT_BEGIN". Woran kann das liegen?

Re: Ein Feld einer internen Tabelle anpassen

Beitrag von qyurryus (Specialist / 107 / 81 / 45 ) »
Ist das Coding innerhalb eines Loops? Dann kann man statt work area entweder mit field-symbol oder reference into das Feld direkt manipulieren:

Code: Alles auswählen.

LOOP AT gt_abw ASSIGNING FIELD-SYMBOL(<abw>).
  ..
  <abw>-evt_elternzeit_begin = ls_2001-begda.
  ..
ENDLOOP.
Außerhalb eines Loops wäre eine Möglichkeit:

Code: Alles auswählen.

READ TABLE gt_abw INDEX lv_counter REFERENCE INTO DATA(abw).
IF SY-SUBRC = 0.
  abw->evt_elternzeit_begin = ls_abw-elternzeit_begin. "oder direkt = ls_2001-begda
ENDIF.

Re: Ein Feld einer internen Tabelle anpassen

Beitrag von jocoder (Specialist / 338 / 3 / 101 ) »
Danke für deine Antwort, aber, wie oben geschrieben, komt die Fehlermeldung:
Der angegebene Typ besitzt keine Struktur und daher auch keine Komponente mit Namen "LS_ABW-EVT_ELTERNZEIT_BEGIN". Woran kann das liegen?
ls_abw ist falsch typisiert. Dies muss eine Struktur sein und keine interne Tabelle oder ein skalarer Wert.
P.s.
Bei weiteren Fehlern ist hilfreich ein größeres Code-Snippet zu posten bzw. mehr über den Kontext, indem die MODIFY-Anweisung ausgeführt wird.

Re: Ein Feld einer internen Tabelle anpassen

Beitrag von Alexity (ForumUser / 15 / 8 / 0 ) »
Es klappt leider alles nicht..

Es kommt folgender Fehler:
"GT_ABW" hat einen generischen Typ, der nicht zur Deklaration verwendet werden kann.

Code: Alles auswählen.

TYPES: BEGIN OF ty_abw,
         evt_muttersch_begin  TYPE dats,
         evt_muttersch_end    TYPE dats,
         evt_elternzeit_begin TYPE dats,
         evt_elternzeit_end   TYPE dats,
       END OF ty_abw.

DATA: gt_abw TYPE TABLE OF ty_abw.
*......
 DATA: ls_abw     TYPE ty_abw.

    SELECT * FROM pa2001 INTO ls_2001 WHERE pernr = pernr-pernr AND
                                            begda >= pn-begda AND
                                            begda <= gv_check_date AND
                                            awart = '0510' AND
                                            sprps = abap_false
                                            ORDER BY begda.

      IF sy-subrc = 0.
        ls_abw-evt_elternzeit_begin = ls_2001-begda.

        READ TABLE gt_abw INDEX lv_counter REFERENCE INTO DATA(abw).
IF sy-subrc = 0.
          abw->evt_elternzeit_begin = ls_2001-begda.
        ENDIF.

Re: Ein Feld einer internen Tabelle anpassen

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
MODIFY gt_abw INDEX lv_counter FROM ls_abw TRANSPORTING (ls_abw-evt_elternzeit_begin).

Abgesehen von der überflüssigen Klammer besteht der Fehler darin, dass Du überflüssigerweise ls_abw wiederholst. Lass das weg, dann funktioniert es. Der FROM-Teil besagt ja schon, aus welcher Struktur Du die Unterfelder meinst.

Re: Ein Feld einer internen Tabelle anpassen

Beitrag von jocoder (Specialist / 338 / 3 / 101 ) »
Es kommt folgender Fehler:
"GT_ABW" hat einen generischen Typ, der nicht zur Deklaration verwendet werden kann.
Übergibst du gt_abw als generisch typisierten Parameter wie in folgenden Codesnippet?

Code: Alles auswählen.

TYPES: BEGIN OF _structure,
  key(2),
  value TYPE i,
END OF _structure.  

START-OF-SELECTION.
  DATA: structure TYPE _structure.
  
  PERFORM generic_signature USING structure.

FORM generic_signature USING input.
  
  WRITE: input-key, input-value.
  
ENDFORM.    
Dann wird gt_abw durch einen generischen Parameter verschattet und das System kann gt_abw keinen Zeilentyp mehr zuordnen.

Folgende Benutzer bedankten sich beim Autor jocoder für den Beitrag:
Alexity


Re: Ein Feld einer internen Tabelle anpassen

Beitrag von Alexity (ForumUser / 15 / 8 / 0 ) »
@jocoder
Ja das mache ich genau so. (Wieder nicht genug Code reingehängt 🙄 ) Soll ich das dann einfach der Form/Perform-Anweisung raus nehmen?

Re: Ein Feld einer internen Tabelle anpassen

Beitrag von jocoder (Specialist / 338 / 3 / 101 ) »
Die Form-Anweisung kann drinnen bleiben.

Nur der Parameter sollte nicht mehr generisch typisiert werden und wenn du die ungarische Notation verwendest, dann richtig oder gar nicht.
Mit dieser Prozedur sollte es keine Probleme mehr geben:

Code: Alles auswählen.

FORM read_elternzeit_beginn CHANGING pt_abw LIKE gt_abw.
  DATA: ls_abw TYPE ty_abw.
  
  "...

    SELECT * FROM pa2001 INTO ls_2001 WHERE pernr = pernr-pernr AND
                                            begda >= pn-begda AND
                                            begda <= gv_check_date AND
                                            awart = '0510' AND
                                            sprps = abap_false
                                            ORDER BY begda.

  "???
  ENDSELECT.

     "???
      IF sy-subrc = 0.
	
        READ TABLE pt_abw INDEX lv_counter REFERENCE INTO DATA(abw).
        IF sy-subrc = 0.
          abw->evt_elternzeit_begin = ls_2001-begda.
        ENDIF.
   ENDIF.
ENDFORM.
Was mir zudem noch aufgefallen ist, dein SELECT kann mehrere Datensätze lesen. Deine SELECT-Bedingung ist also eine Schleife. Wenn in jedem Schleifendurchlauf das Merkmal evt_elternzeit_begin in die interne Tabelle pt_abw übertragen werden soll, ist die IF sy-subrc = 0-Bedingung überflüssig.
Wenn der Beginn der Elternzeit nur einmal übertragen werden soll, ist es besser SELECT * UP TO 1 ROWS FROM pa2001 mit einer entsprechenden ORDER BY-Bedingung zu wählen.
Dann wird direkt ersichtlich, dass nur das älteste bzw. das jüngste Datum übertragen wird.
Zuletzt geändert von jocoder am 10.01.2020 12:52, insgesamt 1-mal geändert.

Re: Ein Feld einer internen Tabelle anpassen

Beitrag von DeathAndPain (Top Expert / 1795 / 213 / 396 ) »
Ja, das Hauptproblem ist, dass wir nur Fragmente des Codes sehen und damit dann Rätsel raten müssen. Wieso kannst Du nicht einfach mal den gesamten Code posten, damit wir auch Zusammenhänge einsehen können, deren Relevanz Dir vielleicht noch gar nicht bewusst ist?

Re: Ein Feld einer internen Tabelle anpassen

Beitrag von Alexity (ForumUser / 15 / 8 / 0 ) »
Der Report, den ich anpasse, hat ohne Includes etc. schon 2000 Zeilen. Aber ja ich muss in Zukunft mehr Zusammenhänge zeigen, danke für den Tipp!

Seite 1 von 1

Vergleichbare Themen

8
Antw.
4811
Views
Feld einer internen Tabelle dynamisch löschen
von Hagbard » 16.08.2005 15:28 • Verfasst in ABAP® für Anfänger
1
Antw.
2205
Views
Einen neuen Feld in einen Internen Tabelle Hinzufügen
von 721227 » 17.07.2017 10:15 • Verfasst in ABAP® für Anfänger
3
Antw.
5245
Views
Inhalt einer internen Tabelle in eine transparente Tabelle?
von Gast » 19.10.2004 14:23 • Verfasst in ABAP® Core
13
Antw.
3273
Views
Tabelle AUFK Datenelement anpassen
von Marco.K » 30.10.2015 09:30 • 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

Aktuelle Forenbeiträge

Zugriff auf Daten via Webdav
vor 28 Minuten von msfox 2 / 33
Interne Tabelle
vor 17 Stunden von sap_enthusiast 3 / 163
Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 71

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

Zugriff auf Daten via Webdav
vor 28 Minuten von msfox 2 / 33
Interne Tabelle
vor 17 Stunden von sap_enthusiast 3 / 163
Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 71

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 71
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 111
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 141