Текущее время: Пт, мар 29 2024, 12:41

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: DELETE REPORT sy-repid динамически созданной программы.
СообщениеДобавлено: Пн, авг 22 2016, 12:14 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 301
Ситуация N лет назад был написан функционал, который при HOTSPOT определяет есть ли для поля спец ФМ для просмотра значения и если он есть, то этот ФМ вызывается. Вызов ФМ-а был реализован через создание динамической программы, в которой формировался код для вызова. В эту динамическую программу передавалась таблица параметров.
К примеру есть ALV отчет, в нем есть номер проводки - по HOTSPOT по нему вызывается транзакция FB03.
Технически это реализовалось так:
1. Создаем динамическую программу с подпрограммой SHOW_HOTSPOT
2. Добавляем программу INSERT REPORT <rogname> FROM <lt_code>.
3. Вызываем подпрограмму SHOW_HOTSPOT
4. После вызова подпрограммы делаем DELETE REPORT <progname>.
Все это работало, но через N лет обнаружилось много лишних динамических программ, который возникли из-за того, что пользователи закрывали сеанс во время вызванной подпрограммы SHOW_HOTSPOT. Т.е. к примеру нажали на номер проводки, открылась FB3, посмотрели проводку и закрыли сеанс. Соответственно управление до пп.4 не дошло и программа осталась висеть в TRDIR.

В результате оптимизации этого процесса обнаружил, что можно делать
Code:
DELETE REPORT sy-repid
в начале подпрограммы SHOW_HOTSPOT и в этом случае программа удаляется даже если закрыли сеанс во время нахождения управления в ней. Однако меня "пугает" тот факт что получается удалить программу которая сейчас выполняет. Могут коллеги назвать причину почему нельзя таким образом вызывать DELETE REPORT sy-repid?

p.s.Реализовано все через INSERT REPORT было для того, чтобы обойти ограничение в 36 запусков, так как отчеты бывают большие и переходов по HOTSPOT-у может быть много.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DELETE REPORT sy-repid динамически созданной программы.
СообщениеДобавлено: Пн, авг 22 2016, 17:29 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
вероятно если произойдёт диалог или активация косвенного объекта,
то будет выполнена проверка версий и runtime error (дампик)

попробуйте на кошках в разработке и расскажите


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: DELETE REPORT sy-repid динамически созданной программы.
СообщениеДобавлено: Пн, авг 22 2016, 17:31 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 301
В разработке вроде все нормально, в течении суток пользователи не жаловались. Но чтобы ничего не сломать, сделаю данную функцию пока только для себя, перенесу в продуктив, там проверю под собой.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DELETE REPORT sy-repid динамически созданной программы.
СообщениеДобавлено: Пн, авг 22 2016, 20:13 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
Пока работает компилированный код, исходный текст ему неинтересен... казалось бы... Срабатывает транзакционный механизм - пока программа не завершится, работает старый компилированный код.
Однако наверно многие сталкивались с ситуацией, когда вываливается ошибка типа "программа изменена во время выполнения". Пока программка простая, вероятность получить ошибку невелика, но любая программа когда-нибудь изменится, и обычно в сторону усложнения. К тому же, поведение модифицированной во время выполнения программы, зависит от версии SAP_ABAP - я наступал на эти грабли.
Я думаю правильней поступить, создав ФМ мусорщика, которого будет запускать в фоне сама программа, а уже он будет удалять её. Но перед его вызовом блокировать саму себя, а мусорщик с некоторой периодичностью проверять блокировку. Тогда, каким бы способом ни умерла программа, мусорщик всё равно её удалит.

p.s.
Что-то непонятно, каким образом это помогает обойти ограничение в 36 уровней?

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DELETE REPORT sy-repid динамически созданной программы.
СообщениеДобавлено: Вт, авг 23 2016, 09:13 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 301
Parazit написал:
Что-то непонятно, каким образом это помогает обойти ограничение в 36 уровней?
через INSERT PROGRAM можно запустить сколько угодно программ, а через GENERATE SUBROUTINE POOL не больше 36 раз.
За идею с ФМ-ом сборщиком мусора спасибо, подумаю.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DELETE REPORT sy-repid динамически созданной программы.
СообщениеДобавлено: Вт, авг 23 2016, 11:19 
Почетный гуру
Почетный гуру

Зарегистрирован:
Пт, дек 04 2009, 12:52
Сообщения: 219
Валерка написал(а):
Вызов ФМ-а был реализован через создание динамической программы, в которой формировался код для вызова.
А зачем вообще использовать динамическую подпрограмму, чтобы иметь потом столько заморочек? Ведь вызвать Ф.М. динамически можно с помощью PARAMETER-TABLE и EXCEPTION-TABLE :
Code:
DATA: lt_par  TYPE abap_func_parmbind_tab,
      ls_par  TYPE abap_func_parmbind,
      lt_exc  TYPE abap_func_excpbind_tab,
      ls_exc  TYPE abap_func_excpbind.

DEFINE set_exc.
  ls_exc-name  = '&1'.
  ls_exc-value = &2.
  insert ls_exc into table lt_exc.
END-OF-DEFINITION.

DEFINE set_par.
  ls_par-name = '&1'.
  ls_par-kind = &2.
  get reference of &3 into ls_par-value.
  insert ls_par into table lt_par.
END-OF-DEFINITION.

DEFINE set_par_1.
  set_par &1 &2 &1.
END-OF-DEFINITION.

DEFINE set_par_o.
  if &1 is supplied.
    set_par &1 &2 &1.
  endif.
END-OF-DEFINITION.

set_par_1 p_pernr        abap_func_exporting.
set_par_1 p_begda        abap_func_exporting.
set_par   p_endda        abap_func_exporting gc_high_date.
set_par_o p_molga        abap_func_exporting.
set_par_o p_enl          abap_func_exporting.
set_par_o p_noholes      abap_func_exporting.
set_par_o p_tab_class    abap_func_exporting.
set_par_o p_tab_criteria abap_func_exporting.
set_par   p_phifi        abap_func_importing lt_hifi.

set_exc no_molga        1.
set_exc no_infotype_reg 2.
set_exc error           3.
set_exc others          4.

DATA lv_function_name  TYPE char30 VALUE 'HR_RU_HIRE_FIRE_DATES' .

CALL FUNCTION lv_function_name
  PARAMETER-TABLE
    lt_par
  EXCEPTION-TABLE
    lt_exc.

CASE sy-subrc.
  WHEN 1.      RAISE no_molga.
  WHEN 2.      RAISE no_infotype_reg.
  WHEN 3 or 4. RAISE error.
ENDCASE.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: DELETE REPORT sy-repid динамически созданной программы.
СообщениеДобавлено: Вт, авг 23 2016, 11:39 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 301
Бородин Игорь написал(а):
Ведь вызвать Ф.М. динамически можно с помощью PARAMETER-TABLE и EXCEPTION-TABLE :
К сожалению версия системы не поддерживает такое :(


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DELETE REPORT sy-repid динамически созданной программы.
СообщениеДобавлено: Вт, авг 23 2016, 11:47 
Почетный гуру
Почетный гуру

Зарегистрирован:
Пт, дек 04 2009, 12:52
Сообщения: 219
Валерка написал(а):
К сожалению версия системы не поддерживает такое :(
А какая версия системы ? 4.7 поддерживает, неужели у вас старше?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: DELETE REPORT sy-repid динамически созданной программы.
СообщениеДобавлено: Вт, авг 23 2016, 12:00 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 301
4.6

Я уже проверил, вставив в код - ругается и в справке нет про такой способ вызова.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DELETE REPORT sy-repid динамически созданной программы.
СообщениеДобавлено: Вт, авг 23 2016, 22:10 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 20:32
Сообщения: 2470
Пол: Мужской
Валерка написал(а):
Code:
DELETE REPORT sy-repid

Я вам больше скажу - так можно делать и со стандартными программами. Нечаянно, если увлечься идеей динамической генерацией программ.
По поводу ФМа-сборщика - возможно будет проще сделать программу-сборщик, которая в фоне по ночам будет чистить такие сгенерированные программы. Но не дай б-г вам недостаточно жестко задать условия

_________________
- Может ли настоящий мастер кунг-фу получить по морде?
- Настоящий мастер может все!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DELETE REPORT sy-repid динамически созданной программы.
СообщениеДобавлено: Ср, авг 24 2016, 08:26 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Вт, авг 31 2004, 14:57
Сообщения: 5257
Откуда: Ростов невеликий
Пол: Мужской
Валерка написал(а):
4.6

Я уже проверил, вставив в код - ругается и в справке нет про такой способ вызова.

переезжать нуно - небезопасно всё это :)

_________________
Нет сегодняшних проблем -
есть вчерашние ошибки
(с)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: DELETE REPORT sy-repid динамически созданной программы.
СообщениеДобавлено: Ср, авг 24 2016, 11:22 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Чт, дек 21 2006, 16:38
Сообщения: 301
ArmAnn написал:
проще сделать программу-сборщик
Так и сделали, но все-таки более правильное, на мой взгляд, избежать мусора, так как "не дай бог" :)

Skif написал:
переезжать нуно
не я решаю этот вопрос, так что приходиться мучиться


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

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


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

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


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

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