by Heinrich5128 » Tue Apr 12, 2005 12:40 pm
Hallo Leute,
ich hatte das vor einer ganzen Weile mal ausprobiert.
Anbei verschiedene Lösungen zu dem Problem + Laufzeiten.
Am besten und einfachsten ist es mit sorted Tables zu arbeiten. Das Programm ist dann auch am lesbarsten. Über Read + loop form ... exit ..
bekommt man auch was noch schnelleres hin, aber so viel besser ist das dann auch nicht.
Gruß Volker
REPORT z_inttab.
* Dieser Report legt automatisch drei interne Tabellen an, die folgende
* Verknüpfungen aufweisen:
* Zu jedem Eintrag in g_tab_b1 gehören mehrere Einträge in g_tab_b2.
* Die Verknüpfung wird hierbei über den KEY1 hergestellt.
* Zu jedem Eintrag in g_tab_b2 gehören mehrere Einträge
* in g_tab_b3. Die Verknüpfung wird hier jedoch über das Feld FKEY
* gebildet.
* Die allgemeine Aufgabe ist es, alle Werte in der Tabelle g_tab_b3 zu
* zählen, die zu einem Eintrag in der Tabelle g_tab_b1 gehören, wo das
* Info Feld <= 9 ist.
* Dabei sind doppelte Referenzierungen auf einen FKEY Schlüssel oder
* einen key1 Schlüssel von verschiedenen Datensätzen aus nicht möglich.
* Und müssen auch nicht doppelt gezählt werden.
* Durch diese Einschränkung eröffnen sich auch weitere Lösungsansätze
* Das diese Tabellen dabei nach einer einfachen festen Regel gefüllt
* werden darf bei den Lösungen nicht berücksichtig werden.
* Über diese festen Regeln wird lediglich sichergestellt, daß
* für Laufzeitmessungen sämtliche Lösungen die gleichen Bedingungen
* vorliegen.
* Wird im Feld Version ein Wert angegeben, so wird nur diese eine
* Lösungsvariante vom Programm getestet.
TYPES: BEGIN OF t_tab1,
key1(5) TYPE c,
info TYPE i,
END OF t_tab1.
TYPES: BEGIN OF t_tab2,
key1(5) TYPE c,
key2(6) TYPE c,
wert TYPE i,
fkey TYPE i,
END OF t_tab2.
TYPES: BEGIN OF t_tab3,
fkey TYPE i,
key3 TYPE i,
wert TYPE i,
END OF t_tab3.
DATA: i1 TYPE i, i2 TYPE i, i3 TYPE i.
DATA: ti1 TYPE i,
ti2 TYPE i,
ti3 TYPE i,
wert TYPE i.
DATA: g_tab_b1 TYPE STANDARD TABLE OF t_tab1 WITH HEADER LINE.
DATA: g_tab_b2 TYPE STANDARD TABLE OF t_tab2 WITH HEADER LINE.
DATA: g_tab_b3 TYPE STANDARD TABLE OF t_tab3 WITH HEADER LINE.
DATA: g_tab_b1_c TYPE STANDARD TABLE OF t_tab1 WITH HEADER LINE.
DATA: g_tab_b2_c TYPE STANDARD TABLE OF t_tab2 WITH HEADER LINE.
DATA: g_tab_b3_c TYPE STANDARD TABLE OF t_tab3 WITH HEADER LINE.
PARAMETERS: version TYPE i.
START-OF-SELECTION.
PERFORM init1.
IF version = 0 OR version = 1.
CLEAR wert.
COMMIT WORK.
PERFORM init.
PERFORM loesung1 CHANGING wert.
PERFORM ausgabe USING '1' wert.
ENDIF.
IF version = 0 OR version <= 2.
CLEAR wert.
COMMIT WORK.
PERFORM init.
PERFORM loesung2 CHANGING wert.
PERFORM ausgabe USING '2' wert.
ENDIF.
IF version = 0 OR version <= 3.
CLEAR wert.
COMMIT WORK.
PERFORM init.
PERFORM loesung3 CHANGING wert.
PERFORM ausgabe USING '3' wert.
ENDIF.
IF version = 0 OR version <= 4.
CLEAR wert.
COMMIT WORK.
PERFORM init.
PERFORM loesung4 CHANGING wert.
PERFORM ausgabe USING '4' wert.
ENDIF.
IF version = 0 OR version <= 5.
CLEAR wert.
COMMIT WORK.
PERFORM init.
PERFORM loesung5 CHANGING wert.
PERFORM ausgabe USING '5' wert.
ENDIF.
IF version = 0 OR version <= 6.
CLEAR wert.
COMMIT WORK.
PERFORM init.
PERFORM loesung6 CHANGING wert.
PERFORM ausgabe USING '6' wert.
ENDIF.
IF version = 0 OR version <= 7.
CLEAR wert.
COMMIT WORK.
PERFORM init.
PERFORM loesung7 CHANGING wert.
PERFORM ausgabe USING '7' wert.
ENDIF.
IF version = 0 OR version <= 8.
CLEAR wert.
COMMIT WORK.
PERFORM init.
PERFORM loesung8 CHANGING wert.
PERFORM ausgabe USING '8' wert.
ENDIF.
IF version = 0 OR version <= 9.
CLEAR wert.
COMMIT WORK.
PERFORM init.
PERFORM loesung9 CHANGING wert.
PERFORM ausgabe USING '9' wert.
ENDIF.
IF version = 0 OR version <= 10.
CLEAR wert.
COMMIT WORK.
PERFORM init.
PERFORM loesung10 CHANGING wert.
PERFORM ausgabe USING '10' wert.
ENDIF.
IF version = 0 OR version <= 10.
CLEAR wert.
COMMIT WORK.
PERFORM init.
PERFORM loesung11 CHANGING wert.
PERFORM ausgabe USING '11' wert.
ENDIF.
*---------------------------------------------------------------------*
* FORM init1 *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM init1.
REFRESH: g_tab_b1,
g_tab_b2,
g_tab_b3.
i1 = 100.
i2 = 50.
i3 = 10.
CLEAR g_tab_b2-fkey.
WHILE i1 > 2.
i1 = i1 - 1.
i3 = i3 - 1.
IF i3 = 0. i3 = 10. ENDIF.
g_tab_b1-key1 = i1.
g_tab_b1-info = i3.
APPEND g_tab_b1.
WHILE i2 > 2.
i2 = i2 - 1.
g_tab_b2-key1 = i1.
g_tab_b2-key2 = i2.
g_tab_b2-wert = i1 + 1.
g_tab_b2-fkey = g_tab_b2-fkey + 1.
APPEND g_tab_b2.
g_tab_b3-fkey = g_tab_b2-fkey.
g_tab_b3-key3 = 1.
g_tab_b3-wert = i1 + 10.
APPEND g_tab_b3.
g_tab_b3-fkey = g_tab_b2-fkey.
g_tab_b3-key3 = 2.
g_tab_b3-wert = i1 + 15.
APPEND g_tab_b3.
g_tab_b3-fkey = g_tab_b2-fkey.
g_tab_b3-key3 = 3.
g_tab_b3-wert = i1 + 30.
APPEND g_tab_b3.
g_tab_b3-fkey = g_tab_b2-fkey.
g_tab_b3-key3 = 4.
g_tab_b3-wert = i1 + 30.
APPEND g_tab_b3.
g_tab_b3-fkey = g_tab_b2-fkey.
g_tab_b3-key3 = 5.
g_tab_b3-wert = i1 + 30.
APPEND g_tab_b3.
g_tab_b3-fkey = g_tab_b2-fkey.
g_tab_b3-key3 = 6.
g_tab_b3-wert = i1 + 30.
APPEND g_tab_b3.
IF i2 = 38 OR i2 = 836.
g_tab_b2-key1 = i2.
g_tab_b2-key2 = i2 + i1 + 1000.
g_tab_b2-fkey = g_tab_b2-fkey + 1.
APPEND g_tab_b2.
g_tab_b3-fkey = g_tab_b2-fkey.
g_tab_b3-wert = i1 + 10.
APPEND g_tab_b3.
ENDIF.
ENDWHILE.
i2 = 50.
ENDWHILE.
g_tab_b1_c[] = g_tab_b1[].
g_tab_b2_c[] = g_tab_b2[].
g_tab_b3_c[] = g_tab_b3[].
ENDFORM.
*---------------------------------------------------------------------*
* FORM init *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
FORM init.
REFRESH: g_tab_b1,
g_tab_b2,
g_tab_b3.
g_tab_b1[] = g_tab_b1_c[].
g_tab_b2[] = g_tab_b2_c[].
g_tab_b3[] = g_tab_b3_c[].
GET RUN TIME FIELD ti1.
ENDFORM.
*---------------------------------------------------------------------*
* FORM Ausgabe *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> Nr *
* --> Wert *
*---------------------------------------------------------------------*
FORM ausgabe USING nr TYPE i
wert TYPE i.
DATA: text(7) TYPE c.
DATA: text2(20) TYPE c.
WRITE nr TO text.
GET RUN TIME FIELD ti2.
ti3 = ti2 - ti1.
WRITE ti3 TO text2.
WRITE: / 'Lösung Nr.', text, ' Laufzeit:', text2, ' Wert:',wert.
ENDFORM.
*---------------------------------------------------------------------*
* FORM loesung1 *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> wert *
*---------------------------------------------------------------------*
FORM loesung1 CHANGING wert TYPE i.
LOOP AT g_tab_b1 WHERE info <= 9.
LOOP AT g_tab_b2 WHERE key1 = g_tab_b1-key1.
LOOP AT g_tab_b3 WHERE fkey = g_tab_b2-fkey.
wert = wert + g_tab_b3-wert.
ENDLOOP.
ENDLOOP.
ENDLOOP.
ENDFORM.
*---------------------------------------------------------------------*
* FORM loesung2 *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> wert *
*---------------------------------------------------------------------*
FORM loesung2 CHANGING wert TYPE i.
FIELD-SYMBOLS:
<l_str_b1> LIKE LINE OF g_tab_b1,
<l_str_b2> LIKE LINE OF g_tab_b2,
<l_str_b3> LIKE LINE OF g_tab_b3.
LOOP AT g_tab_b1 ASSIGNING <l_str_b1> WHERE info <= 9.
LOOP AT g_tab_b2 ASSIGNING <l_str_b2> WHERE key1 = <l_str_b1>-key1.
LOOP AT g_tab_b3 ASSIGNING <l_str_b3> WHERE fkey = <l_str_b2>-fkey.
wert = wert + <l_str_b3>-wert.
ENDLOOP.
ENDLOOP.
ENDLOOP.
ENDFORM.
*---------------------------------------------------------------------*
* FORM loesung3 *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> wert *
*---------------------------------------------------------------------*
FORM loesung3 CHANGING wert TYPE i.
FIELD-SYMBOLS:
<l_str_b1> LIKE LINE OF g_tab_b1,
<l_str_b2> LIKE LINE OF g_tab_b2,
<l_str_b3> LIKE LINE OF g_tab_b3.
SORT g_tab_b1 BY key1.
SORT g_tab_b2 BY fkey.
LOOP AT g_tab_b3 ASSIGNING <l_str_b3>.
READ TABLE g_tab_b2 ASSIGNING <l_str_b2>
WITH KEY fkey = <l_str_b3>-fkey
BINARY SEARCH.
IF sy-subrc = 0.
READ TABLE g_tab_b1 ASSIGNING <l_str_b1>
WITH KEY key1 = <l_str_b2>-key1
BINARY SEARCH.
IF sy-subrc = 0.
IF <l_str_b1>-info <= 9.
wert = wert + <l_str_b3>-wert.
ENDIF.
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.
*---------------------------------------------------------------------*
* FORM loesung4 *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> wert *
*---------------------------------------------------------------------*
FORM loesung4 CHANGING wert TYPE i.
FIELD-SYMBOLS:
<l_str_b1> LIKE LINE OF g_tab_b1,
<l_str_b2> LIKE LINE OF g_tab_b2,
<l_str_b3> LIKE LINE OF g_tab_b3.
DATA: l_tab_b1 TYPE HASHED TABLE OF t_tab1 WITH UNIQUE KEY key1.
DATA: l_tab_b2 TYPE HASHED TABLE OF t_tab2 WITH UNIQUE KEY key1 key2.
DATA: l_tab_b3 TYPE HASHED TABLE OF t_tab3 WITH UNIQUE KEY fkey key3.
INSERT LINES OF g_tab_b1 INTO TABLE l_tab_b1.
INSERT LINES OF g_tab_b2 INTO TABLE l_tab_b2.
INSERT LINES OF g_tab_b3 INTO TABLE l_tab_b3.
LOOP AT l_tab_b1 ASSIGNING <l_str_b1> WHERE info <= 9.
LOOP AT l_tab_b2 ASSIGNING <l_str_b2> WHERE key1 = <l_str_b1>-key1.
LOOP AT l_tab_b3 ASSIGNING <l_str_b3> WHERE fkey = <l_str_b2>-fkey.
wert = wert + <l_str_b3>-wert.
ENDLOOP.
ENDLOOP.
ENDLOOP.
ENDFORM.
*---------------------------------------------------------------------*
* FORM loesung5 *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> wert *
*---------------------------------------------------------------------*
FORM loesung5 CHANGING wert TYPE i.
DATA:
l_tabix2 LIKE sy-tabix,
l_tabix3 LIKE sy-tabix,
l_tabix2_2 LIKE sy-tabix,
l_tabix3_2 LIKE sy-tabix.
FIELD-SYMBOLS:
<l_str_b1> LIKE LINE OF g_tab_b1,
<l_str_b2> LIKE LINE OF g_tab_b2,
<l_str_b3> LIKE LINE OF g_tab_b3.
SORT g_tab_b1 BY key1.
SORT g_tab_b2 BY key1.
SORT g_tab_b3 BY fkey.
CLEAR: l_tabix2_2, l_tabix3_2.
LOOP AT g_tab_b1 ASSIGNING <l_str_b1> WHERE info <= 9.
l_tabix2 = l_tabix2_2.
LOOP AT g_tab_b2 FROM l_tabix2 ASSIGNING <l_str_b2>.
IF <l_str_b2>-key1 = <l_str_b1>-key1.
l_tabix2_2 = sy-tabix.
READ TABLE g_tab_b3 WITH KEY fkey = <l_str_b2>-fkey
BINARY SEARCH.
IF sy-subrc = 0.
l_tabix3 = sy-tabix.
LOOP AT g_tab_b3 FROM l_tabix3 ASSIGNING <l_str_b3>.
IF <l_str_b3>-fkey = <l_str_b2>-fkey.
wert = wert + <l_str_b3>-wert.
ELSE.
IF <l_str_b3>-fkey > <l_str_b2>-fkey. EXIT. ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
ELSE.
IF <l_str_b2>-key1 > <l_str_b1>-key1. EXIT. ENDIF.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDFORM.
*---------------------------------------------------------------------*
* FORM loesung5 *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> wert *
*---------------------------------------------------------------------*
FORM loesung6 CHANGING wert TYPE i.
DATA:
l_tabix2 LIKE sy-tabix,
l_tabix3 LIKE sy-tabix,
l_tabix2_2 LIKE sy-tabix,
l_tabix3_2 LIKE sy-tabix.
SORT g_tab_b1 BY key1.
SORT g_tab_b2 BY key1.
SORT g_tab_b3 BY fkey.
CLEAR: l_tabix2_2, l_tabix3_2.
LOOP AT g_tab_b1 WHERE info <= 9.
l_tabix2 = l_tabix2_2.
LOOP AT g_tab_b2 FROM l_tabix2.
IF g_tab_b2-key1 = g_tab_b1-key1.
l_tabix2_2 = sy-tabix.
READ TABLE g_tab_b3 WITH KEY fkey = g_tab_b2-fkey
BINARY SEARCH.
IF sy-subrc = 0.
l_tabix3 = sy-tabix.
LOOP AT g_tab_b3 FROM l_tabix3.
IF g_tab_b3-fkey = g_tab_b2-fkey.
wert = wert + g_Tab_b3-wert.
ELSE.
IF g_tab_b3-fkey > g_tab_b2-fkey. EXIT. ENDIF.
ENDIF.
ENDLOOP.
ENDIF.
ELSE.
IF g_tab_b2-key1 > g_tab_b1-key1. EXIT. ENDIF.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDFORM.
*---------------------------------------------------------------------*
* FORM loesung5 *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> wert *
*---------------------------------------------------------------------*
FORM loesung7 CHANGING wert TYPE i.
DATA:
l_tabix2 LIKE sy-tabix,
l_tabix3 LIKE sy-tabix,
l_tabix2_2 LIKE sy-tabix,
l_tabix3_2 LIKE sy-tabix.
DATA: l_tah_b3 TYPE HASHED TABLE OF t_tab3
WITH UNIQUE KEY fkey.
FIELD-SYMBOLS:
<l_str_b1> LIKE LINE OF g_tab_b1,
<l_str_b2> LIKE LINE OF g_tab_b2,
<l_str_b3> LIKE LINE OF g_tab_b3.
SORT g_tab_b1 BY key1.
SORT g_tab_b2 BY key1.
loop at g_tab_b3 assigning <l_Str_b3>.
collect <l_str_b3> into l_tah_b3.
endloop.
CLEAR: l_tabix2_2, l_tabix3_2.
LOOP AT g_tab_b1 ASSIGNING <l_str_b1> WHERE info <= 9.
l_tabix2 = l_tabix2_2.
LOOP AT g_tab_b2 FROM l_tabix2 ASSIGNING <l_str_b2>.
IF <l_str_b2>-key1 = <l_str_b1>-key1.
l_tabix2_2 = sy-tabix.
READ TABLE l_tah_b3 ASSIGNING <l_str_b3>
WITH KEY fkey = <l_str_b2>-fkey.
wert = wert + <l_str_b3>-wert.
ELSE.
IF <l_str_b2>-key1 > <l_str_b1>-key1. EXIT. ENDIF.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDFORM.
*---------------------------------------------------------------------*
* FORM loesung5 *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> wert *
*---------------------------------------------------------------------*
FORM loesung8 CHANGING wert TYPE i.
DATA:
l_tabix2 LIKE sy-tabix,
l_tabix3 LIKE sy-tabix,
l_tabix2_2 LIKE sy-tabix,
l_tabix3_2 LIKE sy-tabix.
DATA: l_tas_b3 TYPE sorted TABLE OF t_tab3
WITH UNIQUE KEY fkey.
FIELD-SYMBOLS:
<l_str_b1> LIKE LINE OF g_tab_b1,
<l_str_b2> LIKE LINE OF g_tab_b2,
<l_str_b3> LIKE LINE OF g_tab_b3.
SORT g_tab_b1 BY key1.
SORT g_tab_b2 BY key1.
loop at g_tab_b3 assigning <l_Str_b3>.
collect <l_str_b3> into l_tas_b3.
endloop.
CLEAR: l_tabix2_2, l_tabix3_2.
LOOP AT g_tab_b1 ASSIGNING <l_str_b1> WHERE info <= 9.
l_tabix2 = l_tabix2_2.
LOOP AT g_tab_b2 FROM l_tabix2 ASSIGNING <l_str_b2>.
IF <l_str_b2>-key1 = <l_str_b1>-key1.
l_tabix2_2 = sy-tabix.
READ TABLE l_tas_b3 ASSIGNING <l_str_b3>
WITH KEY fkey = <l_str_b2>-fkey.
wert = wert + <l_str_b3>-wert.
ELSE.
IF <l_str_b2>-key1 > <l_str_b1>-key1. EXIT. ENDIF.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDFORM.
*---------------------------------------------------------------------*
* FORM loesung5 *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> wert *
*---------------------------------------------------------------------*
FORM loesung9 CHANGING wert TYPE i.
DATA:
l_tabix2 LIKE sy-tabix,
l_tabix3 LIKE sy-tabix,
l_tabix2_2 LIKE sy-tabix,
l_tabix3_2 LIKE sy-tabix.
DATA: l_tas_b3 TYPE sorted TABLE OF t_tab3 with header line
WITH UNIQUE KEY fkey.
SORT g_tab_b1 BY key1.
SORT g_tab_b2 BY key1.
loop at g_tab_b3 .
collect g_tab_b3 into l_tas_b3.
endloop.
CLEAR: l_tabix2_2, l_tabix3_2.
LOOP AT g_tab_b1 WHERE info <= 9.
l_tabix2 = l_tabix2_2.
LOOP AT g_tab_b2 FROM l_tabix2.
IF g_tab_b2-key1 = g_tab_b1-key1.
l_tabix2_2 = sy-tabix.
READ TABLE l_tas_b3
WITH KEY fkey = g_tab_b2-fkey.
wert = wert + l_tas_b3-wert.
ELSE.
IF g_tab_b2-key1 > g_tab_b1-key1. EXIT. ENDIF.
ENDIF.
ENDLOOP.
ENDLOOP.
ENDFORM.
*---------------------------------------------------------------------*
* FORM loesung4 *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> wert *
*---------------------------------------------------------------------*
FORM loesung10 CHANGING wert TYPE i.
FIELD-SYMBOLS:
<l_str_b1> LIKE LINE OF g_tab_b1,
<l_str_b2> LIKE LINE OF g_tab_b2,
<l_str_b3> LIKE LINE OF g_tab_b3.
DATA: l_tab_b1 TYPE sorted TABLE OF t_tab1 WITH UNIQUE KEY key1.
DATA: l_tab_b2 TYPE sorted TABLE OF t_tab2 WITH UNIQUE KEY key1 key2.
DATA: l_tab_b3 TYPE sorted TABLE OF t_tab3 WITH UNIQUE KEY fkey key3.
INSERT LINES OF g_tab_b1 INTO TABLE l_tab_b1.
INSERT LINES OF g_tab_b2 INTO TABLE l_tab_b2.
INSERT LINES OF g_tab_b3 INTO TABLE l_tab_b3.
LOOP AT l_tab_b1 ASSIGNING <l_str_b1> WHERE info <= 9.
LOOP AT l_tab_b2 ASSIGNING <l_str_b2> WHERE key1 = <l_str_b1>-key1.
LOOP AT l_tab_b3 ASSIGNING <l_str_b3> WHERE fkey = <l_str_b2>-fkey.
wert = wert + <l_str_b3>-wert.
ENDLOOP.
ENDLOOP.
ENDLOOP.
ENDFORM.
*---------------------------------------------------------------------*
* FORM loesung4 *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
* --> wert *
*---------------------------------------------------------------------*
FORM loesung11 CHANGING wert TYPE i.
FIELD-SYMBOLS:
<l_str_b1> LIKE LINE OF g_tab_b1,
<l_str_b2> LIKE LINE OF g_tab_b2,
<l_str_b3> LIKE LINE OF g_tab_b3.
DATA: l_tab_b1 TYPE sorted TABLE OF t_tab1 WITH NON-UNIQUE KEY key1.
DATA: l_tab_b2 TYPE sorted TABLE OF t_tab2
WITH NON-UNIQUE KEY key1 key2.
DATA: l_tab_b3 TYPE sorted TABLE OF t_tab3
WITH NON-UNIQUE KEY fkey key3.
INSERT LINES OF g_tab_b1 INTO TABLE l_tab_b1.
INSERT LINES OF g_tab_b2 INTO TABLE l_tab_b2.
INSERT LINES OF g_tab_b3 INTO TABLE l_tab_b3.
LOOP AT l_tab_b1 ASSIGNING <l_str_b1> WHERE info <= 9.
LOOP AT l_tab_b2 ASSIGNING <l_str_b2> WHERE key1 = <l_str_b1>-key1.
LOOP AT l_tab_b3 ASSIGNING <l_str_b3> WHERE fkey = <l_str_b2>-fkey.
wert = wert + <l_str_b3>-wert.
ENDLOOP.
ENDLOOP.
ENDLOOP.
ENDFORM.