SAP Jobsuche bei DV-Treff


Suchen
Akatash
  • Akatash
  • SAP Forum - Neuling Thema Starter
vor 7 Jahre
Hallo zusammen, evtl kann mir ja hier jemand helfen.

Also folgendes ich habe eine interne Tabelle mit der Struktur:

MONTH / VBELN /LABNK/ WMENG(kumuliert auf Monatsbasis)

und eine dynamische Tabelle die zur Laufzeit generiert wird je nachdem welchen Betrachtungszeitraum der Anwender eingibt im Selektionsbildschirm, nur um das zu verdeutlichen sagen wir mal 3 Monate Betrachtungszeitraum:

VBELN / LABNK/ 2016_11 / 2016_12 / 2017_1

Daten in der ITAB sehen so aus :

MONTH / VBELN /LABNK/ WMENG

2017_1 xxxxxx 0 100

2017_1 xxxxxx 1 50

2017_2 xxxxxx 0 200

2017_2 xxxxxx 1 100

Ich habe bisher folgenenden Code:


 FIELD-SYMBOLS: <vbeln> TYPE vbeln,
                 <labnk> TYPE labnk.
  CREATE DATA wa_dyn_table LIKE LINE OF <t_dyn_table>.
  ASSIGN wa_dyn_table->* TO <wa_dyn_table>.

  LOOP AT gt_res INTO wa_res.

    LOOP AT <t_dyn_table> ASSIGNING <wa_dyn_table> WHERE (('VBELN = wa_res-vbeln') AND ('LABNK = wa_res-LABNK')) * wird zwar hier richtig dargestellt, aber IN SAP krieg ich da eine Fehlermeldung.
*      LOOP AT <t_dyn_table> ASSIGNING <wa_dyn_table> WHERE ('LABNK = wa_res-LABNK').
*      EXIT.
*      ENDLOOP.

      EXIT.
    ENDLOOP.

    CLEAR <wa_dyn_table>.
    ASSIGN COMPONENT 'VBELN' OF STRUCTURE <wa_dyn_table> TO <vbeln>.
    IF sy-subrc = 0.
      <vbeln> = wa_res-vbeln.
    ENDIF.

    ASSIGN COMPONENT 'LABNK' OF STRUCTURE <wa_dyn_table> TO <labnk>.
    IF sy-subrc = 0.
      <labnk> = wa_res-labnk.
    ENDIF.


    spaltenname = ( wa_res-zmonth ).
    ASSIGN COMPONENT spaltenname OF STRUCTURE <wa_dyn_table> TO <w_field>.
    IF sy-subrc = 0.
      ADD wa_res-wmeng TO <w_field>.
    ENDIF.
    APPEND <wa_dyn_table> TO <t_dyn_table>.

  ENDLOOP.

Mein Problem ist jetzt nur, dass er mir die erste Lieferabrufnummer löscht und das Feld leer lässt und vor allem anstelle von 2 Zeilen siehe Beispieldaten oben 4 Zeilen macht, ich denke da stimmt irgendwas mit meinen Loops nicht oder der Zuweisung. Evtl hat da ja jemand einen Rat um das noch zu verdeutlichen die aktuelle Ausgabe sieht man in diesem Screenshot, hier macht er 30 Zeilen anstelle von 5, weil auch in der ITAB 30 Zeilen sind habe es schon über

AT NEW ZMONTH
versucht, aber führte auch nicht zum gewünschten Erfolg:

UserPostedImage

wreichelt
vor 7 Jahre
Hallo,

loop at itab.

clear zieltab.

zieltab-vbeln = itab-vbeln.

if itab-datum = datum1.

zieltab-datum1 = itab-wmeng.

else.

if itab-datum = datum2.

zieltab-datum2 = itab-wmeng.

else.

zieltab-datum3 = itab-wmeng.

endif.

endif.

collect zieltab.

endloop.

loop at itab.

at new...

endat.

write.

endloop.

Gruß Wolfgang

Akatash
  • Akatash
  • SAP Forum - Neuling Thema Starter
vor 7 Jahre
Danke für die Antwort, aber die bringt mich leider nicht wirklich weiter, da alles dynamisch generiert wurde und ich somit auf keine Komponenten direkt zugreifen kann läuft alles über Feldsymbole. Das Datum wird über spaltenname bereits richtig selektiert und auch die Menge wird richtig zugeordnet. Die dynamische Tabelle ist dann sogesehen die Tabelle, die ans ALV Grid übergeben wird.

Mein Hauptproblem ist einfach, dass ich anstelle von 5 Zeilen 30 Zeilen bekomme, weil ich irgendwo bei einem Loop was falsch mache, denn wenn in der internenen Tabelle ein neuer ZMONTH steht, dann sollte er wieder von vorne anfangen, es in die richtige Spalte hier 2017_2 zu der richtigen Abrufnummer eintragen. So das am Ende einfach die dynamische Tabelle komplett gefüllt ist und alle Werte nebeneinander stehen.

wreichelt
vor 7 Jahre
Hallo,

Du verwendest Append damit werden immer neue (zusätzliche) Einträge erzeugt.

Prüfe mal das mit Collect.

Gruß Wolfgang

Akatash
  • Akatash
  • SAP Forum - Neuling Thema Starter
vor 7 Jahre
Das ist schon richtig was Du sagst, aber muss ja ne Möglichkeit geben, dass ich ihm sage ok wenn LABNK wieder von vorne angeht soll er zurückspringen in der dynamischen Tabelle und von oben die Spalten wieder befüllen... also in dem Fall nur die Mengen in die Datumsspalten hinzufügen.

Mit dem COLLECT das bringt mich nicht weiter, weil er mir dann Summen bildet bzw aggregiert und die Daten sind ja schon alle aggegriert.

Akatash
  • Akatash
  • SAP Forum - Neuling Thema Starter
vor 7 Jahre
So bin schon mal ein Stück weiter gekommen und mir ist klar das durch den APPEND ich immer unten alles angefügt bekomme, deswegen lautet nun meine Frage, wie bekomm ich es hin, das als Resultat nur 5 Zeilen rauskommen ? Ich denke das müsste ich wieder über einen Loop lösen und und irgendeiner Bedingung, aber sitze heute schon die ganze Zeit dran und komm irgendwie auf keinen grünen Zweig. Wäre nett wenn mir da jemand weiterhelfen könnte, weil ich denke ich bin ziemlich nah an der Lösung....

FIELD-SYMBOLS: <vbeln> TYPE vbeln,
                 <labnk> TYPE labnk.
*                 <wa_res> like LINE OF gt_res.
  CREATE DATA wa_dyn_table LIKE LINE OF <t_dyn_table>.
  ASSIGN wa_dyn_table->* TO <wa_dyn_table>.


  SORT gt_res BY zmonth labnk.

  LOOP AT gt_res INTO wa_res.

      IF <wa_dyn_table> IS NOT ASSIGNED.

        APPEND INITIAL LINE TO <t_dyn_table> ASSIGNING <wa_dyn_table>.
      ENDIF.

    CLEAR <wa_dyn_table>.
    IF <vbeln> IS NOT ASSIGNED.
      ASSIGN COMPONENT 'VBELN' OF STRUCTURE <wa_dyn_table> TO <vbeln>.
    ELSE.
        <vbeln> = wa_res-vbeln.
    ENDIF.
    IF sy-subrc = 0.
      <vbeln> = wa_res-vbeln.
    ENDIF.

    ASSIGN COMPONENT 'LABNK' OF STRUCTURE <wa_dyn_table> TO <labnk>.
    IF sy-subrc = 0.
      <labnk> = wa_res-labnk.
    ENDIF.

    spaltenname = ( wa_res-zmonth ).
    ASSIGN COMPONENT spaltenname OF STRUCTURE <wa_dyn_table> TO <w_field>.
    IF sy-subrc = 0.
      ADD wa_res-wmeng TO <w_field>.
    ENDIF.
    APPEND <wa_dyn_table> TO <t_dyn_table>.

  ENDLOOP.

Ergebnis sieht so aus nun, was auch richtig wäre, wenn es nicht zeilenmäßig versetzt wäre

UserPostedImage

wreichelt
vor 7 Jahre
Hallo,

ich würde Dir trotzdem mal raten das mit dem Collect (statt Append) mal zu versuchen. Beim Collect werden nur die numerischen Felder addiert.

Die Daten werden anhand der Schlüsselfelder VBELN und Abruf zusammengefasst.

Gruß Wolfgang

Akatash
  • Akatash
  • SAP Forum - Neuling Thema Starter
vor 7 Jahre
Danke für Deine Mühen, aber wie gesagt das mit Collect funktioniert nicht, da das alles schon kumulierte Werte sind, aber ich hab nun endlich die Lösung, falls es wen interessiert.

DATA: ls_group LIKE LINE OF gt_res.
SORT gt_res BY VBELN LABNK.
CLEAR ls_group.
LOOP AT gt_res ASSIGNING <ls_res>.
  IF ls_group-VBELN NE <ls_res>-vbeln OR ls_group-labnk NE <ls_res>-LABNK.
    APPEND INITIAL LINE TO <t_dyn_table> ASSIGNING <wa_dyn_table>.
    
    ASSIGN COMPONENT 'VBELN' OF STRUCTURE <wa_dyn_table> TO <vbeln>.
    <vbeln> = <ls_res>-vbeln.
     
    ASSIGN COMPONENT 'LABNK' OF STRUCTURE <wa_dyn_table> TO <labnk>.
    <labnk> = <ls_res>-labnk.
* Felder für die Gruppenbildung merken
    ls_group-VBELN = <ls_res>-vbeln.
    ls_group-labnk = <ls_res>-LABNK.
  ENDIF. 

  spaltenname = ( <ls_res>-zmonth ).
  ASSIGN COMPONENT spaltenname OF STRUCTURE <wa_dyn_table> TO <w_field>.
  IF sy-subrc = 0.
    ADD <ls_res>-wmeng TO <w_field>.
  ENDIF.  
ENDLOOP.