Текущее время: Ср, июл 30 2025, 01:45

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: Рекурсивный вызов одного и того же экрана
СообщениеДобавлено: Пт, мар 26 2010, 18:53 
Начинающий
Начинающий

Зарегистрирован:
Пт, июл 10 2009, 07:32
Сообщения: 11
Пол: Мужской
Задача: Создаю свою транзакцию. По логике работы предполагаются нормальные ситуации, когда в рамках одной транзакции происходят повторные вызовы ОДНОГО И ТОГО ЖЕ ЭКРАНА. Представляется, что уровень таких вот вложенностей может быть 2-3, ну может быть 4-5, не более.
Насколько я понимаю, диалоговые экраны в ABAP являются сугубо статическими вещами и не могут быть динамически (пере)создаваться в процессе выполнения кода. Поэтому, при повторном вызове одного и того же экрана в одной сессии в нём будут оставаться данные от предыдущего уровня стека..(( так что если такой экран тронуть, то при возврате в вызывающую процедуру всё пойдёт всмятку. (((

Вопрос: можно ли как-то обойти эту фишку? может быть чем-нибудь обернуть типа функционального модуля или какой процедуры, которая бы, имела внутри себя собственную, изолированную версию этого вот экрана, не затрагивая одноименного экрана из вызывающей процедуры.

Немного своих, ИМХО, мыслей: Что саповские экраны являются ну очень статичными вещами и в динамике с ними можно делать довольно-таки немного манипуляций пришлось узнать уже давно. В том числе, экраны можно создавать только в построителе экранов - никаких динамических созданий изнутри кода! (селекционные экраны в коде не в счет..) Поэтому, приходилось быть внимательным и избегать возможности рекурсий на одни и те же экраны. И была надежда, что так и можно выкручиваться. Но в этот раз иные варианты, увы, ведут к ну очень мрачному увеличению объемов кодирования самого тупого свойства, так что хотелось бы поискать варианты обхода нехороших моментов со статичностью..((

Может быть у кого есть что присоветовать по этому поводу?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Рекурсивный вызов одного и того же экрана
СообщениеДобавлено: Пт, мар 26 2010, 21:11 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, мар 03 2009, 12:33
Сообщения: 141
Думаю их просто надо научиться готовить - посмотри курс BC410 для начала.
Если действительно есть потребность хранить снэпшоты - я бы создал класс для данных экрана и для каждой итерации создавал объект.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Рекурсивный вызов одного и того же экрана
СообщениеДобавлено: Сб, мар 27 2010, 06:47 
Начинающий
Начинающий

Зарегистрирован:
Пт, июл 10 2009, 07:32
Сообщения: 11
Пол: Мужской
на 410м я учился, и транзакций с экранами создал вполне достаточно. Про рекурсию в курсе пусто. Ну не любит сап лишний раз показывать свои не самые лучшие места.
Вроде бы можно вызывать из транзакции другую транзакцию, которая выполняется в своей сессии и тогда получаем отдельный экранный контекст. Но сессий то можно открыть максимум 6, что маловато будет. Да и передачу/возврат параметров нужно думать.
Да, действительно, вариант с сохранением всех внутренностей экрана в какой-нить динамически создаваемый объект класса, затем вызов процедуры и по возвращении восстановление исходного экрана имеет место быть. Хоть и некрасиво, но работать должен. Но и здесь есть вопросы - например, как принудительно обновить содержимое восстановленного экрана? имитировать нажатие клавиши? как-то нехорошо.. впрочем, это нужно пробовать.

Собственно, хотелось бы услышать о каких-то иных вариантах решений, чем "в лоб" сохранять-восстанавливать экраны. Возможно, кто-то уже сталкивался с подобной проблемой..


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Рекурсивный вызов одного и того же экрана
СообщениеДобавлено: Сб, мар 27 2010, 07:37 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
Insect написал:
на 410м я учился, и транзакций с экранами создал вполне достаточно. Про рекурсию в курсе пусто. Ну не любит сап лишний раз показывать свои не самые лучшие места.
Вроде бы можно вызывать из транзакции другую транзакцию, которая выполняется в своей сессии и тогда получаем отдельный экранный контекст. Но сессий то можно открыть максимум 6, что маловато будет. Да и передачу/возврат параметров нужно думать.
Да, действительно, вариант с сохранением всех внутренностей экрана в какой-нить динамически создаваемый объект класса, затем вызов процедуры и по возвращении восстановление исходного экрана имеет место быть. Хоть и некрасиво, но работать должен. Но и здесь есть вопросы - например, как принудительно обновить содержимое восстановленного экрана? имитировать нажатие клавиши? как-то нехорошо.. впрочем, это нужно пробовать.

Собственно, хотелось бы услышать о каких-то иных вариантах решений, чем "в лоб" сохранять-восстанавливать экраны. Возможно, кто-то уже сталкивался с подобной проблемой..

Что то не видно, что Вы "транзакций с экранами создали вполне достаточно".
Если бы действительно "достаточно", то тогда Вы знали бы что у экрана, фактически, нет никаких данных, которые можно было бы где то сохранять, а потом востанавливать.
Экран, на текущем диалоговом шаге в PBO получает данные (глобальные) и отображает их в соответствующих полях. В PAI наоборот, из полей, по мере необходимости, возвращает их в ABAP.
Так что претензии в данном случае следует предъявлять не SAP-у, а криворуким разработчикам, не предусмотревшим рекурсию, либо криворукому постановщику задачи, который не может избавиться от рекурсии.
Например ФМ REUSE_ALV_GRID_DISPLAY вполне себе и безпроблемно допускает многократный рекурсивный вызов. Там просто об этом подумали и реализовали.

Да, и число 6 не имеет отношения к глубине вызовов по CALL TRANSACTION

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рекурсивный вызов одного и того же экрана
СообщениеДобавлено: Сб, мар 27 2010, 20:18 
Начинающий
Начинающий

Зарегистрирован:
Пт, июл 10 2009, 07:32
Сообщения: 11
Пол: Мужской
Ваша мысль про то, что использование рекурсии является признаком криворукости весьма любопытна. ))

Спасибо, конечно, за переложение хелпа по транзакциям, но ничего полезного по сабжу я из него не смог увидеть.
Фишка в том, что переменные с которыми экран обменивается данными при PAI/POB являются ГЛОБАЛЬНЫМИ в пределах текущей сессии. Так что варианты
динамического создания объектов, которые так вот, автоматом делали бы отдельные независимые наборы этих "зеркальных" переменных не проходят.
Остается разве что вариант перезаписи и последующего восстановления "зеркальных" переменных из неких других буферных структур, но про него я уже упоминал.

Про ALV-шные возможности были мысли. Используем понемногу. Но функционала, сравнимого со стандартным функционалом саповских транзакций (BC410) в ALV нет.
Например, нет возможности управлять обновлением данных, вся работа с базой, ИМХО, делается в "черном ящике". В простых случаях это и не нужно, конечно, но как только
нужно что-то более сложное, то начинаются вопросы. А так безусловно более продвинутая технология, втч с поддержкой рекурсии, что не может не радовать. )

Совершенно верно, число 6 не имеет отношения к глубине вызовов CALL TRANSACTION, только не о том была речь.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Рекурсивный вызов одного и того же экрана
СообщениеДобавлено: Сб, мар 27 2010, 21:01 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
Insect написал:
Ваша мысль про то, что использование рекурсии является признаком криворукости весьма любопытна. ))

Ещё более любопытно как Вы её(мысль) извратили.
Цитата:
Спасибо, конечно, за переложение хелпа по транзакциям, но ничего полезного по сабжу я из него не смог увидеть.

Жаль что ничего полезного Вы так и не поняли
Цитата:
Фишка в том, что переменные с которыми экран обменивается данными при PAI/POB являются ГЛОБАЛЬНЫМИ в пределах текущей сессии.

Фишка состоит в том, что эти глобальные переменные относятся к программе, и Ваши причитания по поводу статичности экранов в SAP тут не уместны, т.к. динамическое создание экранов ничего не изменило бы
Цитата:
Так что варианты
динамического создания объектов, которые так вот, автоматом делали бы отдельные независимые наборы этих "зеркальных" переменных не проходят.
Остается разве что вариант перезаписи и последующего восстановления "зеркальных" переменных из неких других буферных структур, но про него я уже упоминал.

Про ALV-шные возможности были мысли. Используем понемногу. Но функционала, сравнимого со стандартным функционалом саповских транзакций (BC410) в ALV нет.
Например, нет возможности управлять обновлением данных, вся работа с базой, ИМХО, делается в "черном ящике". В простых случаях это и не нужно, конечно, но как только
нужно что-то более сложное, то начинаются вопросы. А так безусловно более продвинутая технология, втч с поддержкой рекурсии, что не может не радовать. )
Плохому танцору всегда ноги мешают. Какую цель Вы преследуете своими стенаниями про несовершенство SAP?
Цитата:
Совершенно верно, число 6 не имеет отношения к глубине вызовов CALL TRANSACTION, только не о том была речь.

Но Вы вполне не двусмысленно связали число 6 с CALL TRANSACTION
Цитата:
Вроде бы можно вызывать из транзакции другую транзакцию, которая выполняется в своей сессии и тогда получаем отдельный экранный контекст. Но сессий то можно открыть максимум 6, что маловато будет

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рекурсивный вызов одного и того же экрана
СообщениеДобавлено: Вс, мар 28 2010, 14:41 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Чт, мар 09 2006, 10:12
Сообщения: 565
Откуда: Волгодонск
Пол: Мужской
ИМХО Зря ругаетесь, ну да в САП экраны не такие как допустим в Delphi отсюда и проблемы у человека... к сапу нужно привыкнуть.

Действительно экран в САПе отображает глобальные данные программы.
Я бы сделал функциональный модуль примерно с такой концепцией
Code:
Function CallMayScreen.
  data: lx1 like gx1.
  data: lx2 like gx2.
....
* Перед новым вызовом экрана копируем предыдущие значения глобальных переменных  в локальные
  lx1 = gx1.
  lx2 = gx2.
...
  Call Screen...

* После завершения работы экрана восстанавливаем значения глобальных переменнх
  gx1 = lx1.
  gx2 = lx2.

EndFunctinon.


таким образом нет мороки с организацией стека для хранения переменных

_________________
Изображение Попытка не пытка


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рекурсивный вызов одного и того же экрана
СообщениеДобавлено: Вс, мар 28 2010, 18:42 
Начинающий
Начинающий

Зарегистрирован:
Вс, мар 28 2010, 18:36
Сообщения: 3
Пол: Мужской
Как вариант создать свою группу функций имеющую свой скрин и интерфейс к выводу ALV, а в ней можно крутить уже что угодно.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рекурсивный вызов одного и того же экрана
СообщениеДобавлено: Пн, мар 29 2010, 10:54 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Ср, ноя 01 2006, 22:58
Сообщения: 794
Откуда: Заарбрюкен
Пол: Мужской
Да чтож за хрень!!! (пардоньте)
Тут может и не в сапе дело? Для чего интересно в принципе рекурсивный вызов экрана нужен? Может автор просто к задаче не с того угла подошел?


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

Зарегистрирован:
Пт, окт 03 2008, 17:20
Сообщения: 162
Рекурсия экранов прекрасно реализуется, необходимо только включать моск и воображение!
Была как-то одна задача по созданию динамической формы следующего формата
Code:
Уровень 1 :<Название группы парметров>
  Уровень 2: <список параметров в виде checkbox-ов>
Причём для каждого Уровня 1 было свое кол-во Уровней 2. Понятно, что легче было бы создать дерево, но... заказчик сказал в морг, значит в морг. :?
Единственным ограничением является глубина рекурсии. Точно не помню, но что-то около 100.

Insect, если Вы действительно читали курс BC410, то должны были бы знать про такую конструкцию как LOOP для экранов.

_________________
В SAPе есть всё, просто вы чего-то не нашли.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рекурсивный вызов одного и того же экрана
СообщениеДобавлено: Пн, мар 29 2010, 14:53 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Чт, мар 09 2006, 10:12
Сообщения: 565
Откуда: Волгодонск
Пол: Мужской
Цитата:
Рекурсия экранов прекрасно реализуется....должны были бы знать про такую конструкцию как LOOP для экранов.

А вот с этого места пожалуйста по подробней, посвятите убогих

ЗЫ: очень не приятно когда новичкам так отвечают, это не ответы а издевательство какое-то

_________________
Изображение Попытка не пытка


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рекурсивный вызов одного и того же экрана
СообщениеДобавлено: Пн, мар 29 2010, 14:57 
Гуру-эксперт
Гуру-эксперт

Зарегистрирован:
Вт, сен 07 2004, 17:47
Сообщения: 2988
DKiyanov написал:
...

ЗЫ: очень не приятно когда новичкам так отвечают, это не ответы а издевательство какое-то

Новичкам? Человек помнит ещё как SAP R/3 3.0 работала, а Вы говорите "новичкам".
А ответы соответствуют вопросу.

_________________
"После" - не значит "вследствие"


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рекурсивный вызов одного и того же экрана
СообщениеДобавлено: Пн, мар 29 2010, 15:53 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Пт, окт 03 2008, 17:20
Сообщения: 162
DKiyanov написал:
А вот с этого места пожалуйста по подробней, посвятите убогих

Code:
<Логика экрана 0100>
PROCESS BEFORE OUTPUT.
  MODULE  get_data_dynnr.
  CALL SUBSCREEN body   INCLUDING sy-repid  gv_data_dynnr.
  MODULE  get_next_dynnr.
  CALL SUBSCREEN next   INCLUDING sy-repid  gv_next_dynnr.
...

MODULE get_next_dynnr       OUTPUT.
  IF <условие>.
*---... Продолжаем рекурсию
    gv_next_dynnr = '0100'.
  ELSE.
*---... Пустой подэкран, только его необходимо создать
    gv_next_dynnr = '9999'.
  ENDIF.
ENDMODULE.
Ну, и на самом экране 0100 должно быть 2 подэкрана. Про LOOP, я думаю, нет смысла рассказывать.

DKiyanov написал:
ЗЫ: очень не приятно когда новичкам так отвечают, это не ответы а издевательство какое-то
Я указал путь поиска, не писать же за него весь код. А то в последнее время на форуме наблюдается тенденция, что при малейшей проблеме сразу создается тема.

_________________
В SAPе есть всё, просто вы чего-то не нашли.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Рекурсивный вызов одного и того же экрана
СообщениеДобавлено: Пн, мар 29 2010, 16:50 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Ср, ноя 01 2006, 22:58
Сообщения: 794
Откуда: Заарбрюкен
Пол: Мужской
SYS написал(а):
Code:
<Логика экрана 0100>
PROCESS BEFORE OUTPUT.
  MODULE  get_data_dynnr.
  CALL SUBSCREEN body   INCLUDING sy-repid  gv_data_dynnr.
  MODULE  get_next_dynnr.
  CALL SUBSCREEN next   INCLUDING sy-repid  gv_next_dynnr.
...

MODULE get_next_dynnr       OUTPUT.
  IF <условие>.
*---... Продолжаем рекурсию
    gv_next_dynnr = '0100'.
  ELSE.
*---... Пустой подэкран, только его необходимо создать
    gv_next_dynnr = '9999'.
  ENDIF.
ENDMODULE.
Ну, и на самом экране 0100 должно быть 2 подэкрана. Про LOOP, я думаю, нет смысла рассказывать.


А как проблему с размерами обошли? Если таких вложений хотя бы штук пять, да по двадцать полей на каждом, экраны же поплывут...


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

Зарегистрирован:
Пт, окт 03 2008, 17:20
Сообщения: 162
Konstantin Anikeev написал:
SYS написал(а):
А как проблему с размерами обошли? Если таких вложений хотя бы штук пять, да по двадцать полей на каждом, экраны же поплывут...
По началу тоже столкнулся с таким :) . Но удалось преодолеть эту особенность "играясь" с параметрами мин.размер подэкрана методом тыка. Постараюсь завтра найти это решение.

_________________
В SAPе есть всё, просто вы чего-то не нашли.


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

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


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

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


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

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