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

Часовой пояс: 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 часа


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

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


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

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