Текущее время: Вс, авг 03 2025, 01:15

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


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


ВНИМАНИЕ!

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



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

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


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: 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
Сообщения: 304
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
Сообщения: 304
Бородин Игорь написал(а):
Ведь вызвать Ф.М. динамически можно с помощью 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
Сообщения: 304
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
Сообщения: 5258
Откуда: Ростов невеликий
Пол: Мужской
Валерка написал(а):
4.6

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

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

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


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

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

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


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

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


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

Сейчас этот форум просматривают: Yandex [Bot]


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

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