Code: Alles auswählen.
LOOP AT Tabelle ASSIGNING <Tabelle> WHERE Spalte-Wert IS INITIAL.
Spalte-Wert = (Spalte-Wert_VORGÄNGER + Spalte-Wert_NACHFOLGER) / 2.
ENDLOOP.
Code: Alles auswählen.
itab_help = itab.
LOOP AT itab ASSIGNING <g_itab> WHERE WERT = '0.00'.
COUNTER = sy-tabix.
LOOP AT itab_help ASSIGNING <g_itab_help>.
IF sy-tabix = COUNTER - 1.
PREVIOUS = <g_itab_help>-WERT. "Vorgänger
EXIT.
ENDIF.
ENDLOOP.
LOOP AT itab_help ASSIGNING <g_itab_help>.
IF sy-tabix = COUNTER + 1.
FOLLOWING = <g_itab_help>-WERT. "Nachfolger
EXIT.
ENDIF.
ENDLOOP.
IF PREVIOUS <> '0.00' AND FOLLOWING <> '0.00'.
<g_itab>-WERT = ( PREVIOUS + FOLLOWING ) / 2.
<g_itab>-WERT_GESCHAETZT = 'X'.
ELSEIF PREVIOUS = '0.00' AND FOLLOWING <> '0.00'.
<g_itab>-WERT = FOLLOWING.
<g_itab>-WERT_GESCHAETZT = 'X'.
ELSEIF PREVIOUS <> '0.00' AND FOLLOWING = '0.00'.
<g_itab>-WERT = PREVIOUS.
<g_itab>-WERT_GESCHAETZT = 'X'.
ELSEIF PREVIOUS = '0.00' AND FOLLOWING = '0.00'.
<g_itab>-WERT = ''.
<g_itab>-WERT_GESCHAETZT = 'E'. "ERROR, ist aber ok
ENDIF.
MODIFY itab_help FROM <g_itab> INDEX sy-tabix TRANSPORTING WERT.
CLEAR PREVIOUS.
CLEAR FOLLOWING.
UNASSIGN <g_itab_help>.
ENDLOOP.
UNASSIGN <g_itab>.
Anstatt dem LOOP für den Vorgänger/Nachfolger solltest du diese mittels READ TABLE über den errechneten INDEX lesen.Bjuti hat geschrieben:es an der ein oder anderen Stelle eleganter umgesetzt werden kann.
Code: Alles auswählen.
LOOP AT itab ASSIGNING <g_itab> WHERE WERT = '0.00'.
COUNTER = sy-tabix.
LOOP AT itab_help ASSIGNING <g_itab_help>.
IF sy-tabix = COUNTER - 1.
PREVIOUS = <g_itab_help>-WERT. "Vorgänger
EXIT.
ENDIF.
ENDLOOP.
LOOP AT itab_help ASSIGNING <g_itab_help>.
IF sy-tabix = COUNTER + 1.
FOLLOWING = <g_itab_help>-WERT. "Nachfolger
EXIT.
ENDIF.
ENDLOOP.
Code: Alles auswählen.
LOOP AT itab ASSIGNING <g_itab> WHERE WERT = '0.00'.
counter = sy-tabix - 1.
READ TABLE itab ASSIGNING <g_itab_help_prev> INDEX counter.
counter = sy-tabix + 2.
READ TABLE itab ASSIGNING <g_itab_help_next> INDEX counter.
Code: Alles auswählen.
IF PREVIOUS <> '0.00' AND FOLLOWING <> '0.00'.
<g_itab>-WERT = ( <g_itab_help_prev>-wert + <g_itab_help_next>-wert ) / 2.
Code: Alles auswählen.
LOOP AT itab ASSIGNING <g_itab> WHERE WERT = '0.00'.
counter2 = sy-tabix.
IF sy-tabix = 1. "erster Eintrag der internen Tabelle
counter1 = sy-tabix.
ELSE.
counter1 = sy-tabix - 1.
ENDIF.
READ TABLE itab ASSIGNING <g_itab_prev> INDEX counter1. "Vorgänger
IF counter2 = 7. "letzter Eintrag der internen Tabelle
counter1 = counter2.
ELSE.
counter1 = counter2 + 1.
ENDIF.
READ TABLE itab ASSIGNING <g_itab_next> INDEX counter1. "Nachfolger
IF <g_itab_prev>-WERT <> '0.00' AND <g_itab_next>-WERT <> '0.00'.
<g_itab>-WERT = ( <g_itab_prev>-WERT + <g_itab_next>-WERT ) / 2.
<g_itab>-WERT_GESCHAETZT = 'X'.
ELSEIF <g_itab_prev>-WERT = '0.00' AND <g_itab_next>-WERT <> '0.00'.
<g_itab>-WERT = <g_itab_next>-WERT.
<g_itab>-WERT_GESCHAETZT = 'X'.
ELSEIF <g_itab_prev>-WERT <> '0.00' AND <g_itab_next>-WERT = '0.00'.
<g_itab>-WERT = <g_itab_prev>-WERT.
<g_itab>-WERT_GESCHAETZT = 'X'.
ELSEIF <g_itab_prev>-WERT = '0.00' AND <g_itab_next>-WERT = '0.00'.
<g_itab>-WERT = ''.
<g_itab>-WERT_GESCHAETZT = 'X'.
ENDIF.
UNASSIGN <g_itab_prev>.
UNASSIGN <g_itab_next>.
ENDLOOP.
UNASSIGN <g_itab>.
Folgende Benutzer bedankten sich beim Autor a-dead-trousers für den Beitrag:
Bjuti