21. 5-я программа в SAP. Работа с сообщениями - Message class.

Здесь я создам несколько стандартных сообщений. После проделанной работы, при выполнении программы будут выскакивать стандартные диалоговые сообщения с полезной и не очень информацией. Лучший способ реализации сообщений - это создание и управление ими через Message class. Message class это своего рода контейнер для сообщений, он может использоваться в различных программах и функциональных модулях. Все сообщения хранятся в таблице T100, которую можно просмотреть используя транзакцию SE16.

image_268

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

Сообщения бывают следующих типов:

I - Information messages

Информационное сообщение, появляющееся в виде выскакивающего окна.

E - Error message
Сообщение об ошибке, отображается с строке статуса.

W - Warning message
Предупреждающее сообщение, отображается также в строке статуса.

S - Success/Status message
Успешное завершение

A - Termination/Abend
Ненормальное завершение

image_269

Итак создадим Message class. Можно создать через навигатор объектов SE80, а можно использовать транзакцию SE91.

image_270

image_271

Вводим краткий текст и сохраняем. Перейдем на вкладку Messages. На этой вкладке собственно и вводится текст сообщений.

image_272

Добавим в первую строку программы следующее :

REPORT  zkre_hw5 MESSAGE-ID ZKRE_M_HW5.


И добавим MESSAGE i002 в текст программы.

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

REPORT  zkre_hw5 MESSAGE-ID ZKRE_M_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.

  MESSAGE i002.

  CALL SCREEN 100.

  INCLUDE zkre_hw5_status_0100o01.
  INCLUDE zkre_hw5_dataf01.
  INCLUDE zkre_hw5_user_command_0100i01.

END-OF-SELECTION.

Запустим на выполнение программу.

image_273

Нажимаем F8. Выскочило наше сообщение.

image_274

Теперь добавим еще два выскакивающих сообщения о количестве выбранных строк.

Обьявим переменную amount которая будет в качестве счетчика.

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,
      amount TYPE n.


Зайдем в INCLUDE zkre_hw5_dataf01 и обнулим новую переменную. Сам подсчет можно организовать написав такой код:

amount = 0.
  LOOP AT gt_products INTO gs_products.
    amount = amount + 1.
  ENDLOOP.

Итоговый код INCLUDE zkre_hw5_dataf01 будет иметь вид:

*----------------------------------------------------------------------*
***INCLUDE ZKRE_HW5_1_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.
  amount = 0.
  LOOP AT gt_products INTO gs_products.
    amount = amount + 1.
  ENDLOOP.

ENDFORM.                    " DATA

Теперь зайдем в  INCLUDE zkre_hw5_user_command_0100i01. добавим следующий код

*----------------------------------------------------------------------*
***INCLUDE ZKRE_HW5_USER_COMMAND_0100I01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

  CASE sy-ucomm.
    WHEN 'BACK'.
      LEAVE PROGRAM.
  ENDCASE.

  IF amount > 0.
    MESSAGE i001.
  ELSE.
    MESSAGE e000.
  ENDIF.

ENDMODULE.                 " USER_COMMAND_0100  INPUT

image_275

Не забываемпользоваться кнопкой Pretty Printer. Сохраняем и проверяем на наличие ошибок. В моем случае ругнулся.

image_276

Но все равно сохраняем и активируем. Запускаем на выполнение программу. В зависимости от того были выбраны строки появится необходимое сообщение. Выбрано более 1 строки.

image_277

Не выбрано ни одной строки.

image_278

Добавим сообщение которое выводило бы количество выбранных записей.

Редактируем наш класс сообщений.

image_279

&1  место подстановки переменной. Изменим немного код

*----------------------------------------------------------------------*
***INCLUDE ZKRE_HW5_USER_COMMAND_0100I01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

  CASE sy-ucomm.
    WHEN 'BACK'.
      LEAVE PROGRAM.
  ENDCASE.

  IF amount > 0.
    MESSAGE i003 WITH amount.
  ELSE.
    MESSAGE e000.
  ENDIF.

ENDMODULE.                 " USER_COMMAND_0100  INPUT

image_280

image_281

Вот таким образом можно использовать сообщения в SAP. В следующей статье я создам средство поиска Search Help - http://fibed.net/R/.

Комментарии

  • Александра
    Александра

    Добрый день. Подскажите, а где мы считаем значения переменной amount ?
    Просто сначала в hw5 мы ее объявляем. Потом в инклуде INCLUDE zkre_hw5_dataf01 обнуляем.
    Следом, в инклуде INCLUDE zkre_hw5_user_command_0100i01 мы пишем условие для переменной amount. Но где мы ее считаем?? у меня она получилась всегда равной нулю и записи в программе перестали выводиться

    on 22.12.2014 15:49
    R K
    R K

    Подсчет строк реализован в INCLUDE zkre_hw5_dataf01. Я обновил статью, посмотрите.

    on 23.12.2014 09:22
    Александра
    Александра

    Да, спасибо :)

    on 23.12.2014 11:25

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