На выше заданные вопросы объясняю ситуацию. Существует 12 клиентов в системе глобальной торговли(GTS). Стандартными средствами можно узнать сколько всего они вместе занимают места, надо затем через пропорцию вычислить занимаемое каждым клиентом место. Это и делает такая программа. Листинг прилагаю ниже. По поводу того, что рановато такие задачи ставить, то тут вы правы безусловно, но это больше моя инициатива, чувствую, если смогу это реализовать, то на основании этого смогу написать бакалаврскую работу

. Комментарии на русском добавил.
REPORT /gesgts/spacecheck_new_v2_0 MESSAGE-ID /gesgts/compliance.
TYPES: BEGIN OF ausgabe_ty,
mandant TYPE t000-mandt,
size TYPE memoryused_long,
size_fakt TYPE memoryused_long,
size_fakt_work TYPE memoryused_long,
proz(5) TYPE p DECIMALS 2,
END OF ausgabe_ty.
DATA: gt_free TYPE sdb_areavoldescript_tab,
gs_free TYPE sdb_areavoldescript,
gt_used TYPE /gesgts/sizetab_t,
gs_used TYPE /gesgts/sizetab,
gt_output TYPE TABLE OF ausgabe_ty,
gs_output TYPE ausgabe_ty,
used_space TYPE memoryused_long,
used_space_fakt TYPE memoryused_long,
used_space_fakt_work TYPE memoryused_long,
s_mandt-high TYPE t000-mandt,
s_mandt-low TYPE t000-mandt,
dd02l_tab LIKE dd02l OCCURS 0 WITH HEADER LINE,
gs_tab TYPE LINE OF /gesgts/tabname_t," /gesgts/tabname,
gt_tab TYPE /gesgts/tabname_t,
gt_tab_q1 TYPE /gesgts/tabname_t,
gt_tab_q2 TYPE /gesgts/tabname_t,
gt_tab_q3 TYPE /gesgts/tabname_t,
gt_tab_q4 TYPE /gesgts/tabname_t,
gt_tab_q5 TYPE /gesgts/tabname_t,
gt_tab_q6 TYPE /gesgts/tabname_t,
gt_tab_q7 TYPE /gesgts/tabname_t,
gt_tab_q8 TYPE /gesgts/tabname_t,
gt_tab_q9 TYPE /gesgts/tabname_t,
gt_tab_q0 TYPE /gesgts/tabname_t,
gt_tab_q11 TYPE /gesgts/tabname_t,
gv_lines TYPE i,
gv_start TYPE sy-timlo,
gv_end TYPE sy-timlo.
TYPES : BEGIN OF ty_task,
name(20) TYPE c.
TYPES : END OF ty_task.
DATA new_taskname(20) TYPE c.
DATA it_tasks TYPE TABLE OF ty_task.
FIELD-SYMBOLS <fs_task> TYPE ty_task.
DATA wa_task TYPE ty_task.
TABLES: t000, dd02l.
CONSTANTS:
opcode_arfc_noreq TYPE x VALUE 10.
DATA:
server TYPE msname,
reason TYPE i,
trace TYPE i VALUE 0,
dia_max TYPE i,
dia_free TYPE i,
taskid TYPE i VALUE 0,
taskname(20) TYPE c,
servergroup TYPE rzlli_apcl.
PARAMETERS: p_volume TYPE memoryused_long,
" p_tab TYPE dd02l-tabname DEFAULT '*' , "Nur zu Testen
p_clust TYPE oax,
p_nol TYPE oax ,
p_noa TYPE oax,
p_proz TYPE i DEFAULT dia_max.
START-OF-SELECTION.
* Выясняем количество свободных процессов в системе
*Anzahl von verfugbaren freie Prozessen ermittlen
CALL 'ThSysInfo' ID 'OPCODE' FIELD opcode_arfc_noreq
ID 'SERVER' FIELD server
ID 'NOREQ' FIELD dia_free
ID 'MAXREQ' FIELD dia_max
ID 'REASON' FIELD reason
ID 'TRACE' FIELD trace.
IF dia_free GT 1.
SUBTRACT 3 FROM dia_free. " Оставляем 3 процесса свободными для других пользователей.
"SUBTRACT 2 FROM dia_max.
ENDIF.
* Fьr sicherhet muss 3 Prozessen frei bleiben fьr stabile Arbeit
IF dia_free LE 1.
MESSAGE e000(38)
WITH 'Not enough processes free'.
ENDIF.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
IF sy-subrc <> 0.
* Implement suitable error handling here
ENDIF.
* Устанавливаем планку на максимальное число процессов в 10 штук
IF dia_free > 10.
dia_free = 10.
ENDIF.
*Wenn zu viel Prozesen oder 0 Prozessen ausgewhlt wдre,
* wird maximal Anzahl von Prozessen durchgefьhrt
IF p_proz = 0 OR p_proz > dia_free.
p_proz = dia_free.
ENDIF.
" ELSE.
gv_start = sy-timlo. "Startzeit von Operatinen
* Ermittlen Size nach SQL Angeben
* выясняем занимаемо епространство всеми клиентами через стандартные средства
CALL FUNCTION 'SDB_GET_DATA_AREA_SIZES_SQL'
* EXPORTING
* CON_NAME =
IMPORTING
sizedetails_tab = gt_free.
DATA free_ampel TYPE char4.
*создаем список имен таблиц, которые необходимо проверить.
*Full alle Tabellen
SELECT * INTO TABLE dd02l_tab
FROM dd02l
WHERE as4local = 'A'
AND clidep = 'X'
AND ( tabclass EQ 'TRANSP'
OR tabclass EQ 'POOL'
OR tabclass EQ 'CLUSTER' ).
IF p_clust = 'X'.
DATA: i TYPE i,
tabname TYPE tabname.
LOOP AT dd02l_tab WHERE tabclass EQ 'CLUSTER'.
i = sy-tabix + 1.
dd02l_tab-tabname = dd02l_tab-sqltab.
CLEAR dd02l_tab-sqltab.
CLEAR dd02l_tab-contflag.
dd02l_tab-tabclass = 'TABCLUST'.
MODIFY dd02l_tab.
tabname = dd02l_tab-tabname.
LOOP AT dd02l_tab FROM i
WHERE tabclass EQ 'CLUSTER'
AND sqltab = tabname.
DELETE dd02l_tab.
ENDLOOP.
ENDLOOP.
ENDIF.
SORT dd02l_tab.
DELETE ADJACENT DUPLICATES FROM dd02l_tab COMPARING tabname.
* выясняем количество таблиц
DESCRIBE TABLE dd02l_tab LINES gv_lines.
DATA: teiler TYPE i,
counter TYPE i .
LOOP AT dd02l_tab INTO gs_tab WHERE tabname EQ 'BALDAT'.
APPEND gs_tab TO gt_tab_q0.
DELETE dd02l_tab WHERE tabname EQ 'BALDAT'.
ENDLOOP.
" gv_lines = 100. "Nur fьr Testzwecke " это я только для теста делал, чтобы не гонять более 10 000 таблиц каждый раз
counter = 1.
WHILE counter <= gv_lines.
CLEAR: gs_tab, teiler.
teiler = counter MOD p_proz.
* разбиваем таблицу на несколько, для параллельных процессов
CASE teiler.
WHEN '1'.
READ TABLE dd02l_tab INTO gs_tab INDEX counter.
APPEND gs_tab TO gt_tab_q1.
WHEN '2'.
READ TABLE dd02l_tab INTO gs_tab INDEX counter.
APPEND gs_tab TO gt_tab_q2.
WHEN '3'.
READ TABLE dd02l_tab INTO gs_tab INDEX counter.
APPEND gs_tab TO gt_tab_q3.
WHEN '4'.
READ TABLE dd02l_tab INTO gs_tab INDEX counter.
APPEND gs_tab TO gt_tab_q4.
WHEN '5'.
READ TABLE dd02l_tab INTO gs_tab INDEX counter.
APPEND gs_tab TO gt_tab_q5.
WHEN '6'.
READ TABLE dd02l_tab INTO gs_tab INDEX counter.
APPEND gs_tab TO gt_tab_q6.
WHEN '7'.
READ TABLE dd02l_tab INTO gs_tab INDEX counter.
APPEND gs_tab TO gt_tab_q7.
WHEN '8'.
READ TABLE dd02l_tab INTO gs_tab INDEX counter.
APPEND gs_tab TO gt_tab_q8.
WHEN '9'.
READ TABLE dd02l_tab INTO gs_tab INDEX counter.
APPEND gs_tab TO gt_tab_q9.
WHEN '0'.
READ TABLE dd02l_tab INTO gs_tab INDEX counter.
APPEND gs_tab TO gt_tab_q0.
ENDCASE.
ADD 1 TO counter.
ENDWHILE.
CLEAR gt_tab.
PERFORM read_size.
* вывод результатов
IF gt_free IS NOT INITIAL.
READ TABLE gt_free INTO gs_free INDEX 3.
IF gs_free-size_pct < 5.
free_ampel = icon_red_light.
ELSEIF gs_free-size_pct < 10.
free_ampel = icon_yellow_light.
ELSE.
free_ampel = icon_green_light.
ENDIF.
CLEAR gs_free.
READ TABLE gt_free INTO gs_free INDEX 2.
used_space_fakt = gs_free-size_kb.
used_space_fakt_work = gs_free-size_kb - p_volume.
WRITE: 5 free_ampel.
LOOP AT gt_free INTO gs_free.
NEW-LINE.
WRITE: gs_free-descript,
gs_free-detailtype,
gs_free-size_kb,
gs_free-size_pct.
ENDLOOP.
ENDIF.
gv_end = sy-timlo.
NEW-LINE.
WRITE: 'Start:', gv_start.
NEW-LINE.
WRITE: 'End:', gv_end.
IF gt_used IS NOT INITIAL.
SORT gt_used BY size DESCENDING.
LOOP AT gt_used INTO gs_used.
ADD gs_used-size TO used_space.
ENDLOOP.
LOOP AT gt_used INTO gs_used.
CLEAR: gs_output.
gs_output-mandant = gs_used-mandt.
gs_output-size = gs_used-size.
IF gs_output-size NE 0.
gs_output-proz = 100 * gs_output-size / used_space. " пропорция пространства занимаемого клиентом
gs_output-size_fakt = gs_output-proz * used_space_fakt / 100.
gs_output-size_fakt_work = gs_output-proz * used_space_fakt_work / 100.
ENDIF.
APPEND gs_output TO gt_output.
ENDLOOP.
ULINE.
WRITE: ' '.
WRITE: 'Memory used:', (20)used_space, 'kB'.
NEW-LINE.
WRITE: ' '.
WRITE: 'Memory used nach SQL-Rechnung plus Volumen von Workbench:', (20)used_space_fakt, 'kB'. " пространство занимаемое Клинетами, включаея Workbench
NEW-LINE.
WRITE: ' '.
WRITE: 2 'Mandant',
17 ' Size',
37 ' Prozent',
57 ' Fakt Belegung'.
LOOP AT gt_output INTO gs_output.
NEW-LINE.
WRITE: (5)gs_output-mandant UNDER 'Mandant',
(20)gs_output-size UNDER 'Size',
(10)gs_output-proz UNDER ' Prozent',
(20)gs_output-size_fakt UNDER ' Fakt Belegung'.
ENDLOOP.
ULINE.
NEW-LINE.
WRITE: ' '.
WRITE: 'Memory used nach SQL-Rechnung minus Volumen von Workbench:', (20)used_space_fakt_work, 'kB'. " пространство занимаемое Клинетами, исключая Workbench
NEW-LINE.
WRITE: ' '.
WRITE: 2 'Mandant',
17 ' Size',
37 ' Prozent',
57 ' Fakt Belegung'.
LOOP AT gt_output INTO gs_output.
NEW-LINE.
WRITE: (5)gs_output-mandant UNDER 'Mandant',
(20)gs_output-size UNDER 'Size',
(10)gs_output-proz UNDER ' Prozent',
(20)gs_output-size_fakt_work UNDER ' Fakt Belegung'.
ENDLOOP.
ENDIF.
" ENDIF.
*&---------------------------------------------------------------------*
*& Form READ_SIZE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_GT_FREE text
* -->P_GT_TAB_Q1 text
* -->P_GT_TAB_Q2 text
* -->P_GT_TAB_Q3 text
* -->P_GT_TAB_Q4 text
*----------------------------------------------------------------------*
FORM read_size.
DATA gt_used_tmp TYPE /gesgts/sizetab_t.
DATA q_tab_tmp TYPE /gesgts/tabname_t.
DATA counter TYPE n.
counter = 1.
s_mandt-high = 800.
s_mandt-low = 500.
* Hier sollte jetzt zuerst eine Verarbeitung
* fьr die Ermittlung der zu verarbeitenden Pakete stehen
* und ein Loop statt der einzelnen Aufrufe
* Aber ! das System prьft ob es ьberhaupt freie WP
* und die Belastung nicht so hoch wird, ausserdem
* dьrfen hцchstens 10 Prozesse gestartet werden (ERP2004)
*инициируем параллельные процессы
WHILE counter < p_proz.
CASE counter.
WHEN '1'.
new_taskname = 'Prozess_1'.
q_tab_tmp = gt_tab_q1.
WHEN '2'.
new_taskname = 'Prozess_2'.
q_tab_tmp = gt_tab_q2.
WHEN '3'.
new_taskname = 'Prozess_3'.
q_tab_tmp = gt_tab_q3.
WHEN '4'.
new_taskname = 'Prozess_4'.
q_tab_tmp = gt_tab_q4.
WHEN '5'.
new_taskname = 'Prozess_5'.
q_tab_tmp = gt_tab_q5.
WHEN '6'.
new_taskname = 'Prozess_6'.
q_tab_tmp = gt_tab_q6.
WHEN '7'.
new_taskname = 'Prozess_7'.
q_tab_tmp = gt_tab_q7.
WHEN '8'.
new_taskname = 'Prozess_8'.
q_tab_tmp = gt_tab_q8.
WHEN '9'.
new_taskname = 'Prozess_9'.
q_tab_tmp = gt_tab_q9.
ENDCASE.
CALL FUNCTION '/GESGTS/RSTABLESIZE_NEW'
STARTING NEW TASK new_taskname DESTINATION IN GROUP servergroup
PERFORMING ende_rfc ON END OF TASK
EXPORTING
im_client_low = s_mandt-low
im_client_hi = s_mandt-high
im_noclassl = p_nol
im_noclassa = p_noa
im_tab = q_tab_tmp
* IMPORTING
* EX_SUMTAB = gt_used_q1
EXCEPTIONS
communications_failure = 1
system_failure = 2
OTHERS = 3 .
IF sy-subrc <> 0.
IF sy-subrc = 1.
MESSAGE i046.
ELSEIF sy-subrc = 2.
MESSAGE i047.
ELSEIF sy-subrc = 3.
MESSAGE i048 WITH new_taskname.
ENDIF.
ELSE.
wa_task-name = new_taskname.
APPEND wa_task TO it_tasks.
ENDIF.
CLEAR q_tab_tmp.
ADD 1 TO counter.
ENDWHILE.
* в случае если пользователь укажет только один процесс, то его можно будет вызвать в фоне, иначе сюда передастся тоже только часть от исходной таблицы
** Jetzt sind Mehrere asynchrone Prozesse unterwegs,
** damit der eigentliche JOB auch noch etwas zu tun bekommt
** rufen wir den FB auch noch direkt auf
CALL FUNCTION '/GESGTS/RSTABLESIZE_NEW'
EXPORTING
im_client_low = s_mandt-low
im_client_hi = s_mandt-high
im_noclassl = p_nol
im_noclassa = p_noa
im_tab = gt_tab_q0
IMPORTING
ex_sumtab = gt_used_tmp
EXCEPTIONS
communications_failure = 1
system_failure = 2
OTHERS = 3.
IF sy-subrc <> 0.
new_taskname = 'Prozess_0'.
IF sy-subrc = 1.
MESSAGE i046 WITH new_taskname.
ELSEIF sy-subrc = 2.
MESSAGE i047 WITH new_taskname.
ELSEIF sy-subrc = 3.
MESSAGE i048 WITH new_taskname.
ENDIF.
ELSE.
IF gt_used IS NOT INITIAL.
FIELD-SYMBOLS <fs> TYPE /gesgts/sizetab.
LOOP AT gt_used_tmp INTO gs_used.
READ TABLE gt_used ASSIGNING <fs> WITH TABLE KEY mandt = gs_used-mandt.
<fs>-size = <fs>-size + gs_used-size.
ENDLOOP.
ELSE.
LOOP AT gt_used_tmp INTO gs_used.
APPEND gs_used TO gt_used.
ENDLOOP.
ENDIF.
ENDIF.
* Ждем окончания обрабокти параллельных процессов
*
*** Warte bis keine Tasks mehr in Tabelle
WAIT UNTIL it_tasks IS INITIAL.
* Ergebnis ausgeben :
ENDFORM. " read_size
*&---------------------------------------------------------------------*
*& Form ende_rfc
*&---------------------------------------------------------------------*
* Diese Routine wird aus dem Baustein gerufen !
FORM ende_rfc USING taskname.
DATA gt_used_tmp TYPE /gesgts/sizetab_t.
*Ловим результаты ис параллельных процессов
* Hole die Rьckgabe aus dem FB
RECEIVE RESULTS FROM FUNCTION '/GESGTS/RSTABLESIZE_NEW'
IMPORTING
ex_sumtab = gt_used_tmp
EXCEPTIONS
communications_failure = 1
system_failure = 2
OTHERS = 3 .
IF sy-subrc <> 0.
new_taskname = 'Alle Aufgaben berechnung'.
IF sy-subrc = 1.
MESSAGE i046 WITH new_taskname.
ELSEIF sy-subrc = 2.
MESSAGE i047 WITH new_taskname.
ELSEIF sy-subrc = 3.
MESSAGE i048 WITH new_taskname.
ENDIF.
ELSE.
IF gt_used IS NOT INITIAL.
FIELD-SYMBOLS <fs> TYPE /gesgts/sizetab.
LOOP AT gt_used_tmp INTO gs_used.
READ TABLE gt_used ASSIGNING <fs> WITH TABLE KEY mandt = gs_used-mandt.
<fs>-size = <fs>-size + gs_used-size.
ENDLOOP.
ELSE.
LOOP AT gt_used_tmp INTO gs_used.
APPEND gs_used TO gt_used.
ENDLOOP.
ENDIF.
* Lцsche die Task aus der Tasktabelle
DELETE it_tasks WHERE name = taskname.
ENDIF.
ENDFORM. "ende_rfc
" READ_SIZE
просьба за код сильно не пинать, я только учусь.