19. 5-я программа в SAP. Создание экрана (screen).

Здесь мы создадим программу производящую выборку данных из таблицы, но отображение данных будет реализовано уже не через списки, а с использованием созданного экрана. В ZKRE_HW5 двойной клик по 100.

image_220

При проектировании экрана обычно учитывается как размещение элементов, так и логика выполнения. Каждый экран связан с управляющей программой АВАР/4. Как правило, диалоговое приложение состоит из нескольких экранов, принадлежащих одной программе. Размещение экранов моделируется по принципу WYSIWYG (сокращение от английского предложения "What You See Is What You Get" — "Что видишь, то и получаешь"). Размещаемыми элементами могут быть поля ввода, метки поля (надписи), экранные кнопки, фреймы, переключатели, управляющие элементы таблиц и т.д. Их можно выбирать из Dictionary или помечать на инструментальной линейке и размещать на экране с помощью мыши. Логика выполнения структурирована по событиям, соответствующим действиям пользователя. При возникновении каждого события производится обработка данных, описываемая в модулях управляющей программы. Последовательность экранов зависит от вводимых пользователем данных и управляется модулями обработки соответствующих событий. Контроль вводимых данных осуществляется либо автоматически с помощью контрольных таблиц (например, допустимых идентификаторов клиентов), либо производиться самой программой АВАР/4. При неправильном вводе система сообщений оповещает пользователя об ошибке.

Под статусом GUI принято понимать те элементы, которые появляются в меню и на инструментальных линейках. Их можно строить динамически в управляющих программах АВАР/4 с помощью команды set pf-status. Заголовок GUI описывает заголовок экрана и может быть задан в программе с помощью команды set titlebar. Текст статуса GUI и заголовки могут выводиться на экран на естественном языке
страны пользователя без изменения исходного текста программы.

Появляется окно, где система спрашивает нас о создании экрана. Нажимаем YES.

image_221

Появляется экран, где необходимо задать основные параметры экрана.

image_222

Заполняем поле, краткое описание и переходим на вкладку Flow logic.

image_223

Раскоментируем вторую строку(уберем звездочку). Нажав два раза на STATUS_0100, создадим этот модуль.

image_224

Нажимаем YES.

image_225

Выбираем новый INCLUDE.  Нажимаем Enter и выскакивает предупреждающее окно, предупреждающее о том, что будет создан новый INCLUDE и сохранен в нашем Dictionary.

image_226

Нажимаем Enter. Появляется редактор с таким текстом.

image_227

Раскоментируем 10 и 11 строки и вместо иксов добавим названия наших GUI-status и GUI-title созданные недавно http://fibed.net/N/. В принципе GUI status и GUI title можно создать и при двойном клике на имена в строках 10 и 11.

image_228

Сохраняем и активируем.

Вернемся к редактированию главной программы. Нажимаем кнопку активации объектов и активируем не активные объекты.

image_229

Запустим на выполнение нашу программу и получим такой результат. 

image_230

На экране видны неактивные элементы меню (все правильно ведь мы же просто создали статус так и не отметив необходимый нам функционал). Также виден наш заголовок и пустое поле экрана, где по идее должны отображаться наши данные. Создадим Table Control для вывода наших данных на экран 100. Кстати убедиться в том что это наш созданный экран можно посмотрев его номер.

image_231

image_232

Итак создаем Table Control. Заходим в режим редактрования нашего экрана и нажимаем кнопку Layout.

image_233

image_234

Открылся редактор экрана. Он может быть как графическим так и текстовым. В нашем случае редактор графический. 

image_235

Нажимаем Change и Table Control с помощью Vizard. Поместив на экран контрол, у нас появляется окно визарда.

image_236

Выбираем Continue.

image_237

Вводим имя нашего контрола.

image_238

На этом шаге мы определили внутреннюю таблицу и ее рабочую область. Тем самым мы определили столбцы которые будут в контроле. Не забываем использовать F4.

image_239

Здесь определяем необходимые поля. Я отметил все.

Далее просто нажимаем кнопки Continue.

image_240

image_241

image_242

image_243

После всех манипуляций в нашем редакторе появляется Table Control.

image_244

Сохраняем, активируем и выходим из редактора. Если сейчас запустим программу на выполнение мы ничего не получим.

image_245

В исходном коде появились дополнительные конструкции. Итак изменим немного код нашей программы. Выделим блок извлекающий данные в отдельную форму.

REFRESH it_ran_quant.
  wa_ran_quant-sign = 'I'.
  wa_ran_quant-option = 'EQ'.
  wa_ran_quant-low = '555'.
  wa_ran_quant-high = ''.
  APPEND wa_ran_quant TO it_ran_quant.

  IF p_s2 EQ 'X'.
    CALL FUNCTION 'ZKRE_FM4'
      EXPORTING
        ir_quant    = it_ran_quant
      IMPORTING
        er_products = gt_products.
  ELSEIF p_s1 EQ 'X'.

    SELECT zkre_products~id supply_id name purchase_cost sale_cost quantity description supply_date
    INTO CORRESPONDING FIELDS OF TABLE gt_products
    FROM ( ( zkre_products INNER JOIN zkre_productst ON zkre_productst~prod_id = zkre_products~id )
    INNER JOIN zkre_supply ON zkre_supply~id = zkre_products~supply_id )
    WHERE zkre_products~name EQ p_name.


  ENDIF.

Зайдем в инклуд INCLUDE ZKRE_HW5_STATUS_0100O01. И добавим там такую строку PERFORM data.

image_246

Сохраняем и нажимаем два раза на data

image_247

Выбираем новый Include.

image_248

image_249

image_250

И копируем туда вырезанный кусок кода. 

REFRESH it_ran_quant.
  wa_ran_quant-sign = 'I'.
  wa_ran_quant-option = 'EQ'.
  wa_ran_quant-low = '555'.
  wa_ran_quant-high = ''.
  APPEND wa_ran_quant TO it_ran_quant.

  IF p_s2 EQ 'X'.
    CALL FUNCTION 'ZKRE_FM4'
      EXPORTING
        ir_quant    = it_ran_quant
      IMPORTING
        er_products = gt_products.
  ELSEIF p_s1 EQ 'X'.

    SELECT zkre_products~id supply_id name purchase_cost sale_cost quantity description supply_date
    INTO CORRESPONDING FIELDS OF TABLE gt_products
    FROM ( ( zkre_products INNER JOIN zkre_productst ON zkre_productst~prod_id = zkre_products~id )
    INNER JOIN zkre_supply ON zkre_supply~id = zkre_products~supply_id )
    WHERE zkre_products~name EQ p_name.


  ENDIF.

Сохраняем и активируем.

Из тела главное программы можно удалить следующий блок:

LOOP AT gt_products INTO gs_products.
    WRITE: /   gs_products-id COLOR COL_KEY,
               gs_products-supply_id COLOR COL_KEY,
               gs_products-name COLOR COL_NORMAL,
               gs_products-purchase_cost COLOR COL_NORMAL,
               gs_products-sale_cost COLOR COL_NORMAL,
               gs_products-quantity COLOR COL_NORMAL,
               gs_products-description COLOR COL_NORMAL,
               gs_products-supply_date COLOR COL_NORMAL.
  ENDLOOP.

Главный текст программы будет иметь такой вид:

*&---------------------------------------------------------------------*
*& Report  ZKRE_HW4
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zkre_hw5.
TABLES: sscrfields.
DATA: gt_products TYPE zkre_t_hw3,
      gs_products LIKE LINE OF gt_products,
      it_ran_quant TYPE zkre_r_quant,
      wa_ran_quant LIKE LINE OF it_ran_quant.

SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE text-001.
PARAMETERS: p_id TYPE zkre_products-id.
PARAMETERS: p_name TYPE zkre_products-name MODIF ID m1.
SELECT-OPTIONS: p_quant FOR gs_products-quantity.
SELECT-OPTIONS: p_desc FOR gs_products-description NO INTERVALS.
PARAMETERS: p_s1 RADIOBUTTON GROUP uc1,
            p_s2 RADIOBUTTON GROUP uc1.

SELECTION-SCREEN END OF BLOCK bl1.

SELECTION-SCREEN SKIP.
SELECTION-SCREEN PUSHBUTTON 1(10) bt1 USER-COMMAND uc2.

INITIALIZATION.
  bt1 = text-bt1.

AT SELECTION-SCREEN.
  CASE sscrfields-ucomm.
    WHEN 'UC2'.
      CLEAR: p_id, p_name, p_quant[], p_desc[].
  ENDCASE.

START-OF-SELECTION.

  CALL SCREEN 100.



  INCLUDE zkre_hw5_status_0100o01.

*&SPWIZARD: DECLARATION OF TABLECONTROL 'ZK_100' ITSELF
  CONTROLS: zk_100 TYPE TABLEVIEW USING SCREEN 0100.

*&SPWIZARD: OUTPUT MODULE FOR TC 'ZK_100'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
MODULE zk_100_change_tc_attr OUTPUT.
  DESCRIBE TABLE gt_products LINES zk_100-lines.
ENDMODULE.                    "ZK_100_CHANGE_TC_ATTR OUTPUT

INCLUDE zkre_hw5_dataf01.

 Перенесем блок:

MODULE zk_100_change_tc_attr OUTPUT.
  DESCRIBE TABLE gt_products LINES zk_100-lines.
ENDMODULE.                    "ZK_100_CHANGE_TC_ATTR OUTPUT

В Инклуд  INCLUDE zkre_hw5_status_0100o01.

*----------------------------------------------------------------------*
***INCLUDE ZKRE_HW5_STATUS_0100O01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'ZKRE_HW5_100'.
  SET TITLEBAR 'ZKRE_HW5_TITLE'.

  PERFORM data.

ENDMODULE.                 " STATUS_0100  OUTPUT

*----------------------------------------------------------------------*
*  MODULE zk_100_change_tc_attr OUTPUT
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
MODULE zk_100_change_tc_attr OUTPUT.
  DESCRIBE TABLE gt_products LINES zk_100-lines.
ENDMODULE.                  

Сохраняем и активируем.

После манипуляций текст программы будет следующий:

*&---------------------------------------------------------------------*
*& Report  ZKRE_HW4
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zkre_hw5.
*&SPWIZARD: DECLARATION OF TABLECONTROL 'ZK_100' ITSELF
CONTROLS: zk_100 TYPE TABLEVIEW USING SCREEN 0100.
TABLES: sscrfields.
DATA: gt_products TYPE zkre_t_hw3,
      gs_products LIKE LINE OF gt_products,
      it_ran_quant TYPE zkre_r_quant,
      wa_ran_quant LIKE LINE OF it_ran_quant.

SELECTION-SCREEN BEGIN OF BLOCK bl1 WITH FRAME TITLE text-001.
PARAMETERS: p_id TYPE zkre_products-id.
PARAMETERS: p_name TYPE zkre_products-name MODIF ID m1.
SELECT-OPTIONS: p_quant FOR gs_products-quantity.
SELECT-OPTIONS: p_desc FOR gs_products-description NO INTERVALS.
PARAMETERS: p_s1 RADIOBUTTON GROUP uc1,
            p_s2 RADIOBUTTON GROUP uc1.

SELECTION-SCREEN END OF BLOCK bl1.

SELECTION-SCREEN SKIP.
SELECTION-SCREEN PUSHBUTTON 1(10) bt1 USER-COMMAND uc2.

INITIALIZATION.
  bt1 = text-bt1.

AT SELECTION-SCREEN.
  CASE sscrfields-ucomm.
    WHEN 'UC2'.
      CLEAR: p_id, p_name, p_quant[], p_desc[].
  ENDCASE.

START-OF-SELECTION.

  CALL SCREEN 100.

  INCLUDE zkre_hw5_status_0100o01.
  INCLUDE zkre_hw5_dataf01.


INCLUDE zkre_hw5_status_0100o01.

*----------------------------------------------------------------------*
***INCLUDE ZKRE_HW5_STATUS_0100O01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  STATUS_0100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS 'ZKRE_HW5_100'.
  SET TITLEBAR 'ZKRE_HW5_TITLE'.

  PERFORM data.

ENDMODULE.                 " STATUS_0100  OUTPUT

*&SPWIZARD: OUTPUT MODULE FOR TC 'ZK_100'. DO NOT CHANGE THIS LINE!
*&SPWIZARD: UPDATE LINES FOR EQUIVALENT SCROLLBAR
*----------------------------------------------------------------------*
*  MODULE zk_100_change_tc_attr OUTPUT
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
MODULE zk_100_change_tc_attr OUTPUT.
  DESCRIBE TABLE gt_products LINES zk_100-lines.
ENDMODULE.                    "ZK_100_CHANGE_TC_ATTR OUTPUT



INCLUDE zkre_hw5_dataf01.

*----------------------------------------------------------------------*
***INCLUDE ZKRE_HW5_DATAF01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM data .

  REFRESH it_ran_quant.
  wa_ran_quant-sign = 'I'.
  wa_ran_quant-option = 'EQ'.
  wa_ran_quant-low = '555'.
  wa_ran_quant-high = ''.
  APPEND wa_ran_quant TO it_ran_quant.

  IF p_s2 EQ 'X'.
    CALL FUNCTION 'ZKRE_FM4'
      EXPORTING
        ir_quant    = it_ran_quant
      IMPORTING
        er_products = gt_products.
  ELSEIF p_s1 EQ 'X'.

    SELECT zkre_products~id supply_id name purchase_cost sale_cost quantity description supply_date
    INTO CORRESPONDING FIELDS OF TABLE gt_products
    FROM ( ( zkre_products INNER JOIN zkre_productst ON zkre_productst~prod_id = zkre_products~id )
    INNER JOIN zkre_supply ON zkre_supply~id = zkre_products~supply_id )
    WHERE zkre_products~name EQ p_name.


  ENDIF.


ENDFORM.                    " DATA



CALL SCREEN 100.


PROCESS BEFORE OUTPUT.
*&SPWIZARD: PBO FLOW LOGIC FOR TABLECONTROL 'ZK_100'
  MODULE zk_100_change_tc_attr.
*&SPWIZARD: MODULE ZK_100_CHANGE_COL_ATTR.
  LOOP AT   gt_products
       INTO gs_products
       WITH CONTROL zk_100
       CURSOR zk_100-current_line.
*&SPWIZARD:   MODULE ZK_100_CHANGE_FIELD_ATTR
  ENDLOOP.

  MODULE status_0100.
*
PROCESS AFTER INPUT.
*&SPWIZARD: PAI FLOW LOGIC FOR TABLECONTROL 'ZK_100'
  LOOP AT gt_products.
    CHAIN.
      FIELD gs_products-id.
      FIELD gs_products-supply_id.
      FIELD gs_products-name.
      FIELD gs_products-purchase_cost.
      FIELD gs_products-sale_cost.
      FIELD gs_products-quantity.
      FIELD gs_products-description.
      FIELD gs_products-supply_date.
    ENDCHAIN.
  ENDLOOP.
*&SPWIZARD: MODULE ZK_100_CHANGE_TC_ATTR.
*&SPWIZARD: MODULE ZK_100_CHANGE_COL_ATTR.

* MODULE USER_COMMAND_0100.

И наконец выполним нашу программу.

image_251

image_252

Нажимаем Enter и появляются наши данные.

image_253

Доделаем GUI status и GUI title - http://fibed.net/P/ .

Комментарии

  • Дмитрий
    Дмитрий

    Классный курс. Я изучаю). Спасибо автору!

    on 02.11.2014 13:11
  • Gleb
    Gleb

    Здравствуйте. Очень познавательный курс. Доступно написано. Огромное спасибо!
    Немного критики: хорошо бы в начале описать задачу: мол, должен получиться такой то функционал.
    А так же: если бы отдельной страницей было описание всех таблиц, доменов, элементов, то было бы значительно легче.
    Например, таблица zkr_supply, раньше не была описана, а вот в статье: "15. 3-я программа в SAP. Работа с INCLUDE и формами FORM. " она стала необходима. А придумывать по ходу довольно сложно, так как можно сильно не угадать, и запутаться.

    on 01.12.2014 13:48
    R K
    R K

    Спасибо за отзыв. Очень хорошо, что вы указываете на недостатки (с такими отзывами можно действительно попробовать создать курс для входа в область SAP), постараюсь следующие статьи организовывать именно таким образом.

    on 03.12.2014 17:56
  • Михаил
    Михаил

    А что делать если редактор текстовый?

    on 06.09.2016 10:38
  • A P
    A P

    У вас код Call screen 100 появился из ниоткуда. И при запуске программы высвечивается1000. Что с этим делать, подскажите?

    on 13.11.2016 21:01
    R K
    R K

    Странно вроде все старался описать. Не могли бы указать место в статье где у вас возникли проблемы?

    on 13.11.2016 22:03
  • A P
    A P

    Ну вот как статья начинается. У вас есть код Call screen 100. Вы говорите нажать на 100. А такого кода нет после копирования 4 программы и создания GUI Status и Title.
    Там в 4 программе еще 1000-й экран. Вот он и отображается при запуске программы

    on 16.11.2016 09:28
  • Ирина
    Ирина

    Огромное спасибо автору! Изучаю его курс. Для начинающих это единственное толковое пособие. Очень благодарна Вам !

    on 18.03.2017 09:10
    R K
    R K

    Спасибо за отзыв :)

    on 29.03.2017 01:38

Чтобы оставить комментарий, необходимо Войти или Зарегистрироваться.