Sapforum.Biz
Инструменты => ABAP - Инструментальные средства => Тема начата: inik от Август 01, 2013, 09:57:22 am
-
Здравствуйте!
Моя задача - использовать классифиц. признаки в селекции(select) данных.
При этом надо признаки селектировать через select-options.
Может ли кто дать совет, как это можно реализовать?
Как понимаю, надо будет использовать динамически составленный select-options.
Но как его прикрутить к репорту? И т.д.
Пожалуйста поделитесь опытом или советом.
Inik
-
Не понял какая глубокая мысль была размещать вопрос в ветке управления материальными потоками, поэтому перенес тему в абап-разработки.
Моя задача - использовать классифиц. признаки в селекции(select) данных.
При этом надо признаки селектировать через select-options.
Как понимаю, надо будет использовать динамически составленный select-options.
Но как его прикрутить к репорту? И т.д.
Ну я знаю только одни вариант, выносить построение экрана в отдельный программный блок, дальше просто делать динамическое создание текста программы с последующей генерацией этого текста, ну и дальше формирование уже динамических запросов. Но если честно все это очень хлопотно и очень напряжно, так что я лично с этим не заморачивался бы.
-
UUkrul, большое спасибо за ответ!
Но "выносить построение экрана в отдельный программный блок, дальше просто делать динамическое создание текста программы с последующей генерацией этого текста" это уже второй шаг.
Вначале признаки не известны, через класс и вид класса их нужно селектировать.
Значит для первого шага уже нужен экран.
Потом только динамически можно создать select-options для признаков.
При этом это должен быть report, а не modulpool.
Получается какой-то салат.
-
Ну сначала давайте посмотрим на то как это делает сам SAP, а он это делает очень просто, без всяких селекционных экранов, для примера есть стандартная транзакции по работе с классификацией: CL30N - Поиск объекта в классах. Первый экран это ввод имени и типа класса, а далее переходим на второй экран, где признаки класса у нас перечисляются в виде таблицы, рисунок CL30N.png, т.е. ни о какой селекционный экран, никто даже и не пытается строить динамически. В общем я сильно советую задуматься почему даже гнездо этого решило не делать и таки не делать.
Если вам все таки хочется быть первопроходцем в этом не легком деле, не вопрос, можете попробовать:
Вначале признаки не известны, через класс и вид класса их нужно селектировать.
Значит для первого шага уже нужен экран.
1. На экране 1000 программы типа REPORT запрашиваете имя и тип класса по аналогии с транзакцией CL30N.
2. В основной программе есть include в котором описываете селеционный экран используя команду: SELECTION-SCREEN BEGIN OF SCREEN 0101 AS WINDOW.
3. После ввода имени класса у вас есть кнопка на экране по нажатию на которую, читаете признаки класса, формируете текст этого инклуда с перечислением поле = признак класса, генерируете этот инклуд и далее вызываете уже этот экран. Получите свой селекционный экран в диалоговом окне.
4. Пользователь заполняет значения нажимает ОК, программа возвращается на основной экран, где рисуете кнопку типа с иконкой, что есть подробные данные признаков и дальше уже выполняете программу.
PS: Но работать динамически с этими сгенерированными признаками, честно скажу устанете.
-
PS: Но работать динамически с этими сгенерированными признаками, честно скажу устанете.
ИМХО, не ввязывайтесь в это дело. В CO-PA видел такие фишки: есть отчет-образец, на основе которого генерируется рабочая программа, в зависимости от настроек, там и SELECT-OPTIONS и динамические критерии выбора... Оно, конечно, героически все можно преодолеть, но здесь будет такая тема: чем более универсально попытаетесь сделать, тем менее универсальным все это дело получится.
-
Спасибо за разъяснения!
К 3-му пункту:
"После ввода имени класса у вас есть кнопка на экране по нажатию на которую, читаете признаки класса, формируете текст этого инклуда с перечислением поле = признак класса, генерируете этот инклуд и далее вызываете уже этот экран. Получите свой селекционный экран в диалоговом окне."
Как же я получаю селекционный экран?
По пунктам:
1. "формируете текст этого инклуда с перечислением поле = признак класса" = т.е. динамически создаю инслуд, в инклуде select-options.
2. "генерируете этот инклуд "
3. "далее вызываете уже этот экран"
Пункты 2 и 3. Здесь моя цель: создать инслуд с селекционным экраном и этот инслуд в моём репорте сразу использовать(не во второй, а в первый старт репорта)
Для реализации пунктов 2 и 3 я ориентируюсь на 3ий вариант на странице
http://help.sap.com/saphelp_40b/helpdata/en/9f/db998835c111d1829f0000e829fbfe/content.htm
Проблема: таким образом я могу изменить и сразу использовать инклуд, но не могу писать в него селекционный экран.
Вы пишите "генерируете этот инклуд ", может вы имеете в виду другой способ?
"далее вызываете уже этот экран" - какой старт программы имеется в виду?
P.S. Совсем не связываться с этим не могу. В проекте нестыковки в передаче старых данных реализуются через классификацию...
Спасибо за помощь!
-
Спасибо за разъяснения!
Спасибо за помощь!
SAP Бог вам в помощь... Ищущий - и да обрящет.
-
Вы пишите "генерируете этот инклуд ", может вы имеете в виду другой способ?
"далее вызываете уже этот экран" - какой старт программы имеется в виду?
Похоже без примера, мне сложно будет объяснить что я имел в виду. Но к сожалению, раньше следующего понедельника, у меня скорее всего что доступа к системе не будет, поэтому раньше пример сделать не получиться.
-
Я построила мой первый вариант таким образом:
В report1 на селекционном экране parameters для класса и вида класса, плюс button.
После нажатия button через insert report пишется динамично селекционный экран для выбора кл.признаков в report2,
а также INITIALIZATION и START-OF-SELECTION. Таким образом report2 селектирует данные и при помощи
EXPORT TO MEMORY ID посылает внутреннию таблицу с результатами обратно.
1. Uukrul, вы такое имели в виду?
Если Вас не затруднит, приведите пожалуйста ваш пример.
2. Когда создаю select-options, например
select-options s_mm1 for zsel_help-zsnum,
то заранее создаю тип, здесь zsel_help-zsnum, тип для типа признака.
Это верно, или это делается по-другому?
3. При вызове первым report-ом report2( где selection-screen begin of screen 0101 as window.) естественно пропадает селекционный экран
от report1. Как можно реализовать всё это дело, чтобы селекционный экран не пропадал и report1 оставался report-ом?
Всем спасибо и удачных выходных!
-
EXPORT TO MEMORY ID
Difference Between SAP and ABAP Memory (http://www.sapnet.ru/viewtopic.php?t=426)
CREATE OBJECT obj AREA HANDLE hdl.
http://scn.sap.com/thread/1912099 (http://scn.sap.com/thread/1912099)
Глобальный класс сейчас делают вместо IMPORT/EXPORT, saphelp пишет, что быстрее, да и покошернее будет, галку ставите и F1. Там готовые куски кода вам покажет по использованию.
-
В report1 на селекционном экране parameters для класса и вида класса, плюс button.
После нажатия button через insert report пишется динамично селекционный экран для выбора кл.признаков в report2,
а также INITIALIZATION и START-OF-SELECTION. Таким образом report2 селектирует данные и при помощи
EXPORT TO MEMORY ID посылает внутреннию таблицу с результатами обратно.
1. Uukrul, вы такое имели в виду?
Да где-то такой вариант имел в виду. Ниже пример того как это реализовывал. Вызов репорта 2 как и его генерацию вешаем на кнопку, как вы и написали, в примере там просто все идет линейно, но это общий принцип так сказать.
*&---------------------------------------------------------------------*
*& Report YTSH_CLASS_REPORT
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ytsh_class_report.
DATA: lt_itab TYPE TABLE OF string,
l_prog TYPE sy-repid,
l_mess TYPE string,
l_lin TYPE i,
l_wrd TYPE string,
l_dir TYPE trdir.
*----
* Пишем код новой программы который формируем динамически, перечисляя в нем все
* поля из заданного на экране класса. Кстати там же можно получить и типы полей
*----
APPEND '*&---------------------------------------------------------------------*' TO lt_itab.
APPEND '*& YTSH_TEST_SELOPT' TO lt_itab.
APPEND '*&---------------------------------------------------------------------*' TO lt_itab.
APPEND 'REPORT ytsh_class_report.' TO lt_itab.
APPEND 'TABLES: ekko, ekpo.' TO lt_itab.
APPEND 'SELECTION-SCREEN BEGIN OF SCREEN 1200 AS WINDOW.' TO lt_itab.
APPEND 'SELECT-OPTIONS: s_werks FOR ekpo-werks,' TO lt_itab.
APPEND ' s_vendor FOR ekko-lifnr,' TO lt_itab.
APPEND ' s_order FOR ekko-ebeln,' TO lt_itab.
APPEND ' s_order1 FOR ekko-ebeln,' TO lt_itab.
APPEND ' s_order2 FOR ekko-ebeln.' TO lt_itab.
APPEND 'SELECTION-SCREEN END OF SCREEN 1200.' TO lt_itab.
APPEND 'CALL SCREEN 1200 STARTING AT 10 5.' TO lt_itab.
*----
* Далее введенные параметры экрана записываем во внутренню таблицу и эту таблицу например
* передаем через IMPORT\EXPORT в текущую вызываемую программу или через глобальный класс
*----
*----
* Было лень формировать структуру trdir, поэтому создал пустую программу YTSH_TEST_SELOPT,
* а далее просто читаю ее параметры. Наполнение программы типа - REPORT динамическое,
* сфорировано выше.
*----
SELECT SINGLE * INTO l_dir
FROM trdir WHERE name = 'YTSH_TEST_SELOPT'.
* Проверка синтаксиса
SYNTAX-CHECK FOR lt_itab MESSAGE l_mess LINE l_lin WORD l_wrd
DIRECTORY ENTRY l_dir.
IF sy-subrc = 0.
l_prog = 'YTSH_TEST_SELOPT'.
INSERT REPORT l_prog FROM lt_itab FIXED-POINT ARITHMETIC 'X'
UNICODE ENABLING 'X'.
COMMIT WORK AND WAIT.
GENERATE REPORT l_prog MESSAGE l_mess LINE l_lin WORD l_wrd.
COMMIT WORK AND WAIT.
* Вызов сгенерированного отчета
SUBMIT ytsh_test_selopt AND RETURN.
ENDIF.
*----
* Далее можем работать с полученными параметрами формирую динамческие запросы
* по переданным значениям.
*----
-
Большое спасибо за ответ!
Почти весь август в отпуске, допуска к системе поэтому нет.
Выйду, Всё ещё раз пересмотрю, в сентября вплотную приступаем к проекту.
Всем удачи!
-
Любителям писать динамические программы, собственно вот интересный модулЁк системы: LABRAF11, в котором создается на лету подпрограмма, она же генерируется и тут же вызывается на выполнение.
Кстати, имя отчета там начинается на ! и вообще хитрый отчетик создается. Похоже он доступен только в момент генерации в памяти и что самое интересное его можно сразу вызвать на выполнение, без всяких INSERT REPORT и т.д. кажется то что надо. В общем за пример берем работу этого модуля.
-
Здравствуйте!
К теме классификация.
Как вычитывается иерархия или наследственность классов?
Нужно вычитывать признаки класса, от которого наследуешь.
Пока кроме таблицы TCLA ничего не нашла, и то в ней к виду класса можно вычитать значок разрешения иерархии.
Спасибо!
-
Как вычитывается иерархия или наследственность классов?
Тут посмотрите, может что-то полезное будет из функций: http://sapforum.biz/index.php?topic=170.0