Текущее время: Пт, июл 18 2025, 19:03

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 37 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Параллельные процессы и таймаут
СообщениеДобавлено: Ср, фев 12 2014, 12:30 
Начинающий
Начинающий

Зарегистрирован:
Ср, фев 12 2014, 12:25
Сообщения: 17
Доброе время суток, возможно такая тема уже поднималась, но поиском ничего не нашел похожего. В SAP только 4 месяца в качестве практиканта. Перелопатил уже море информации на немецком и английском но ничего не нашел что проблеме моей может помочь. Суть такова, имеется репорт, который длится очень долго, дабы его оптимизировать было решено разделить процесс на несколько параллельных заданий и по окончании все результаты с этих процессов собрать вместе. Сказано - сделано. В результате имеем до 10 параллельных заданий, которые идут как диалоговые процессы. На сервере разработки все прошло замечательно, улучшение производительности на 300 %, но вот когда запустили на производственный сервер вылезла проблема таймаута для диалоговых процессов. Вот такая проблема. Параллельные процессы запускаются через Call Function... Starting new task... естественно таймаут никто не даст изменить. Запустить функцию как backgroud тоже не вариант, так как нужно обработать результаты по окончанию, commit work тоже не катит :(. Вот такая вот проблема.
Сорри за терминологию, возможно не совсем точная, но я просто в Германии и как это в Русском варианте SAP называется не знаю. Исходный код не уверен что смогу выложить тут типа коммерческая тайна и за это могут наказать.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Ср, фев 12 2014, 12:42 
Младший специалист
Младший специалист

Зарегистрирован:
Чт, ноя 29 2012, 16:47
Сообщения: 85
Сделайте в фоне и по событию соберите части воедино ).
А Диалоговая программа может по таймеру дождаться завершения всех потоков.
и показать результат.
Диалоговые процессы всегда ограничены в прод. системах.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Ср, фев 12 2014, 13:12 
Начинающий
Начинающий

Зарегистрирован:
Ср, фев 12 2014, 12:25
Сообщения: 17
спасибо, можно чуть по подробнее. то есть каждый процесс запустить как background, как мне потом поймать результаты, я же говорю что я новичок совсем и с этим пока не сталкивался.

_________________
Ох, непростая эта работа из юриста делать программиста...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Ср, фев 12 2014, 13:16 
Старший специалист
Старший специалист

Зарегистрирован:
Чт, май 12 2011, 16:06
Сообщения: 351
Не совсем понятно, чего именно Вы хотите. Если обойти тайм-аут в диалоговом процессе, периодически вызывайте ФМ SAPGUI_PROGRESS_INDICATOR (для 4.6 точно работает) или TH_REDISPATCH (лично не проверял, но на форумах уверяют :)). Правда, это наверняка не добавит привлекательности Вашей разработке (а возможно, и лично Вам) в глазах базисников (количество диалоговых процессов ограничено, и для системы, юзеров и админов крайне нежелательно, чтобы какая-то программа надолго подгребала под себя процесс и прочие ресурсы). Если Вы хотите как-то оптимизировать работу программы - без исходного кода Вам вряд ли кто-то что-то дельное посоветует. Возможно даже, кода самого по себе будет тоже недостаточно :). Попробуйте найти наиболее затратные по времени куски кода с помощью транзакции se30 (в новых версиях - sat) и оптимизировать их. Если Вас интересует способ, как дать знать пользователю, что расчет окончен, это можно сделать, например, с помощью отсылки сообщения на почту (саповскую Business Workplace или внешнюю).
ЗЫ. А в целом не понятно: зачем оптимизировать диалоговый отчет, который "длится очень долго",чтобы в результате получить 10 диалоговых процессов, которые тоже длятся долго. Видимо, нужно либо оптимизировать отчет, либо переходить на работу в фоне.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Ср, фев 12 2014, 13:17 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
Crystal_Ra написал(а):
Сделайте в фоне и по событию соберите части воедино ).

"map-reduce" SAP best practices :wink:


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Ср, фев 12 2014, 13:44 
Начинающий
Начинающий

Зарегистрирован:
Ср, фев 12 2014, 12:25
Сообщения: 17
Суть программы сбор информации о занимаемом таблицами БД месте на физическом носителе. обработка ведется через ФМ который получает наименования таблиц в виде списка. Изначально только один список направлялся. Сейчас сделано мной, что исходный список делится на несколько частей, в зависимости от количества свободных диалоговых процессов)и для каждой из этих частей запускается ФМ. По окончании обработки все данные собираются воедино и выдаются пользователю. Даже если запускать репорт в фоне, он все-равно будет вызывать ФМ в качестве диалога. Мне бы хотелось чтобы ФМ запускался как фоновый процесс, но я не представляю как потом получить результаты по окончанию, чтобы сформировать окончательный отчет. Завтра попробую исходный код выложить. Что же касается оптимизации кода, то наиболее долгая часть, как раз чтение значений каждой таблицы, я и так уже сбрасываю через commit work таймаут после обработки каждой таблицы, но этого не достаточно. ФМ, который обрабатывает таблицы мне сильно калечить не дадут :( Обидно что идея работает на сервере разработки, а вот в прод возникают проблемы. Всем большое спасибо за участие.

_________________
Ох, непростая эта работа из юриста делать программиста...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Ср, фев 12 2014, 14:50 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
massimots: ээээ... а какая у Вас субд? Может для такой задачи воспользоваться ее инструментами?
К примеру для оракла вот такой запрос.. Причем всего 1 и из 1 таблицы.
Цитата:
select segment_name,segment_type,bytes/1024/1024 MB
from dba_segments
where segment_type='TABLE' and segment_name='<yourtablename>';

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Ср, фев 12 2014, 23:30 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
massimots написал(а):
Суть программы сбор информации о занимаемом таблицами БД месте на физическом носителе.


Кодер +1.
Вы уверены, что такая задача должна решаться средствами ABAP? :?
Вообще-то для любой нормальной БД есть инструмент администрирования, который решает подобные задачи.

По сути задачи: делите общее количество таблиц не пропорциями от общего количества таблиц, а фиксированным количеством таблиц.
Одновременно запускайте столько задач, сколько свободных процессов, дожидайтесь окончания выполнения всех задач и запускайте следующий пакет задач.

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Чт, фев 13 2014, 14:08 
Начинающий
Начинающий

Зарегистрирован:
Ср, фев 12 2014, 12:25
Сообщения: 17
Предложение хорошее но не получится, так уже пробовал сделать Диалоговый процесс висит на подсчете конкретной таблицы, а не группы таблиц. Таких таблиц к сожалению несколько. По поводу того, чтобы решить проблему средствами БД я уже думал, но там именно хотят через ABAP запилить, почему мне не очень понятно. Как вариант один человек предложил сделать все с использованием кластера и впоследствии по окончании всех процессов считать данные оттуда. Буду пробовать на следующей неделе. Сегодня остался без машины и работа накрылась медным тазом.

_________________
Ох, непростая эта работа из юриста делать программиста...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Чт, фев 13 2014, 14:24 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
massimots написал(а):
но там именно хотят через ABAP запилить, почему мне не очень понятно.

Пусть объяснят :)
Какая БД используется?

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Пн, фев 17 2014, 14:55 
Старший специалист
Старший специалист

Зарегистрирован:
Сб, окт 21 2006, 20:34
Сообщения: 280
посмотрите пакеты BANK_PP_JOBCTRL, FPP - это фремйворки для параллельной обработки в фоновых процессах с возможностью сбора результата и перезапуска в случае ошибок. Документации мало - придется поковыряться. Вам все верно подсказали - в этих фреймворках "общение" идет через кластеры. Для новичка конечно рановато такие задачи делать.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Пн, фев 17 2014, 21:46 
Начинающий
Начинающий

Зарегистрирован:
Ср, фев 12 2014, 12:25
Сообщения: 17
На выше заданные вопросы объясняю ситуацию. Существует 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 &#40;ERP2004&#41;


*инициируем параллельные процессы

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

*&amp;---------------------------------------------------------------------*
*&amp; Form ende_rfc
*&amp;---------------------------------------------------------------------*
* 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


просьба за код сильно не пинать, я только учусь.

_________________
Ох, непростая эта работа из юриста делать программиста...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Пн, фев 17 2014, 22:42 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, окт 06 2005, 16:44
Сообщения: 3080
Откуда: Москва
massimots написал(а):
просьба за код сильно не пинать, я только учусь.

Учитесь пользоваться тегом Code :?
PS: Повторю вопрос - какая БД используется?

_________________
С уважением,
Удав.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Чт, фев 20 2014, 17:51 
Начинающий
Начинающий

Зарегистрирован:
Ср, фев 12 2014, 12:25
Сообщения: 17
MaxDB esli ya pravilno ponyal. Sorry za translit pishu s raboty. Poproboval ismenit programmu, vecherom otpishu chto izmenil.

_________________
Ох, непростая эта работа из юриста делать программиста...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Параллельные процессы и таймаут
СообщениеДобавлено: Чт, фев 20 2014, 19:18 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
massimots: При такой постановке задачи(найти размер, который занимает часть таблицы) легкого решения не будет(инструмент уровня СУБД тут наверное не подойдет). Нужно проанализировать, на чем именно происходит замедление (тут вам в помощь ранее упоминавшиеся транзакции SAT и ST05). По факту, очень интересует исходный код ФМ /GESGTS/RSTABLESIZE_NEW. Это ваш собственный? В нашей системе на MaxDB такого нет. Как я понимаю, он подсчитывает по каждому манданту кол-во записей и умножает на их размер? Данная операция, скорее всего не оптимальна с точки зрения производительности БД. Но это только предположения.

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 37 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB