Меню

TAW10, селекционные экраны и параметры

В данной части курса описывается как использовать в своих программах селекционные экраны и конфигурировать их.

TAW10, селекционные экраны и параметры

В этом посте я хотел бы рассказать о следующем:

  1. Что такое селекционный экран.
  2. Что такое параметры селекционного экрана.
  3. Конфигурирование селекционного экрана.

Хотел бы перейти сразу к делу и показать то, о чем пойдет речь в данном посте:

На рисунке выше вы можете видеть мой отчет по продажам компании, в которой я работаю, а точнее вызванный селекционный экран. Как видно на рисунке имеется группа полей и стандартный набор функций типа «выполнить(F8)», «вернуться на пред. экран(F3)», «выйти из программы(shift+F3)», «отмена(F12)». Селекционные экраны удобны тем, что они имеют очень гибкие настройки и не требуют дополнительно создавать вручную экраны, разрисовывать поля на них и т.д. Предложенный выше вариант может быть описан следующим образом:

На рисунке отображено описание селекционного экрана, т.к. мне было удобно сделать в одном едином блоке все поля ввода, то я начал с описания SELECTION-SCREEN BEGIN OF BLOCK …, если же требуется разнести поля по разным блокам, то достаточно написать SELECT-OPTIONS и описать отдельно каждую опцию. Также по умолчанию у полей указывается интервал значений и расширение для интервала ( критерии отбора ). Для того, чтобы кастомизировать поля можно указать NO INTERVALS NO-EXTENSION, в таком случае будет выводится обычное поле для ввода без расширения:

Для большей красоты отчета можно задать заголовок своему экрану, делается это так WITH FRAME TITLE text-001 – таким образом мы описали заголовочную часть и написали в ней текст. При объявлении text-001 генерируется пустая запись для текста заголовка, в ней я написал «данные для отбора». Если нам требуется уже указанное значение по умолчанию в поле, то делаем так: SELECT-OPTIONS: s_status for  zorder-status DEFAULT «1419» - таким образом указали изначальное значение статуса равное числу 1419. Если же нужно указать верхнюю и нижнюю границу, то используем уже модуль инициализации: INTIALIZATION s_status-low = ‘1419’, s_status-high = ‘1501’ -  в данном случае у нас будет заполнена верхняя и нижняя граница значений для статуса. Теперь я хотел бы поговорить о параметрах. В качестве параметров обычно используют чекбоксы или радиокнопки. Если поле будет указываться как чекбокс, то используем следующую конструкцию:

p_budat AS CHECKBOX – в данном случае будет чекбокс, в дальнейшем описываем для него логику к примеру через IF … ENDIF. Используем метод что если p_budat = ‘x’ – значит чекбокс нажат и выполняется следующая логика …, если p_budat = ‘’ – пустое значение, значит выполняется часть, писанная в ELSE, к примеру так:

IF p_budat = 'X'.
    SELECT  zorder~werks
            bismt
            MAX( kwmeng ) AS max
            SUM( kwmeng ) AS sum
            COUNT( DISTINCT zorder~vbeln ) AS count
            budat
      INTO TABLE s_table
      FROM zorder JOIN zorderpos ON zorder~vbeln = zorderpos~vbeln
      WHERE bismt        IN s_bismt AND
            zorder~werks IN s_werks AND
            budat        IN s_budat AND

Если хотите прочитать статью полностью и оставить свои комментарии присоединяйтесь к sapland

У вас уже есть учетная запись?

Войти

Обсуждения Количество комментариев1

Комментарий от  

Олег Точенюк

  |  11 января 2013, 20:24

Роман ну что же вы так жестоко то с селекционными экранами поступили. Даже не знаю откуда начинать исправлять. Потому основное, это разница между объявлениями PARAMETERS и SELECT-OPTIONS, вы похоже не поняли, причем ниже приведенный код SELECT явно указывает на это. Так что считайте что я прицепился, но пять копеек вставлю.
 
И так, переменная объявленная через PARAMETERS это именно переменная которая может принимать одно значение. Например в вашем случае код завода (если это обязательное поле), можно было объявит через PARAMETERS, тогда в операции SELECT в условии WHERE можно было бы написать WERKS = p_werks. А вот переменная объявленная через SELECT-OPTIONS это на самом деле внутренняя таблица фиксированной структуры а именно содержащая поля sign, option, low и high, где:
sign - знак выбора, принимает значения I - включить в выбор  или E - исключить из выбора.
option - тип операции сравнения, например если в поле low задать одно значение тогда в операции надо указать константу EQ, кстати если в поле задан маска например 47* тогда тип операции CP и т.д. это уже сами придумайте как узнать все типы операций :-)
low и high переменные содержащие значения, в данном случае введенные с экрана, но можно и сформировать в ручную, что вы кстати попытались сделать, но не правильно в блоке INTIALIZATION, а правильно было бы сделать так:
 
s_status-sign = 'I'.
s_status-option = 'EQ'.
s_status-low = ‘1419’.
append s_status.
s_status-high = ‘1501’.
append s_status.
 
тогда ниже в операции WHERE вместо катастрофически не правильного:
 
( zorderpos~status = '1419' OR           zorderpos~status = '1501' )
 
правильно было бы написать zorderpos~status IN s_status.
 
и все. В вашем же случае вы видно вообще не поняли как работать и что из себя представляют переменные селекционного экрана объявленного через SELECT-OPTIONS, потому что на экране у вас есть поля для ввода статуса заказа, а вот по тексту программы в объявлении экрана, этого поля нет. Зато в операции выбора данных вы просто вбили константами выбираемый статус для заказов, видно присвоение в INTIALIZATION не отработало, ну а не отработало оно потому что... из курса у вас какая-то каша в голове появилась и мне как то жаль пользователей которые пользуются вашим отчетом по продажам :-(
 
Кстати я вообще не понимаю как у вас там что-то работает, потому что в описании у вас везде вы сравниваете с маленьким 'x', в таком случае просто скопируйте у себе и выполните вот такую программку:
 
PARAMETERS p_test AS CHECKBOX.
 
IF p_test = 'x'.
  WRITE: / 'Маленький х'.
ELSEIF p_test = 'X'.
  WRITE: / 'Большой Х'.
ELSE.
  WRITE: / 'Вообще ничего не отметили'.
ENDIF.
 
И посмотрите какая ветка кода и по какому условию выполнится. У меня почему-то все время при установке чек-бокса отрабатывает: WRITE: / 'Большой Х'. Если у вас другой результат, то ответ в студию, так как мою парадигму в ABAP? этим ответом вы явно подвинете.