Ein Feld einer internen Tabelle anpassen Thema ist als GELÖST markiert

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 ) » 10.01.2020 09:28

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?


Re: Ein Feld einer internen Tabelle anpassen

Beitrag von jocoder (Specialist / 149 / 2 / 37 ) » 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.

Re: Ein Feld einer internen Tabelle anpassen

Beitrag von Alexity (ForumUser / 15 / 8 / 0 ) » 10.01.2020 09:55

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 (ForumUser / 43 / 32 / 10 ) » 10.01.2020 10:04

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 / 149 / 2 / 37 ) » 10.01.2020 10:40

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 ) » 10.01.2020 11:11

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 / 1270 / 139 / 291 ) » 10.01.2020 11:42

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 / 149 / 2 / 37 ) » 10.01.2020 11:49

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 (10.01.2020 12:28)


Re: Ein Feld einer internen Tabelle anpassen

Beitrag von Alexity (ForumUser / 15 / 8 / 0 ) » 10.01.2020 11:55

@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 / 149 / 2 / 37 ) » 10.01.2020 12:36

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 / 1270 / 139 / 291 ) » 10.01.2020 12:44

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 ) » 10.01.2020 12:58

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