15. 3-я программа в SAP. Работа с INCLUDE и формами FORM.

Создадим программу где  будут задействованы формы FORM и INCLUDE. Программа также будет выводить данные из таблицы на экран, но в более удобочитаемой форме. Транзакция SE11.

image_151

Программа будет извлекать все данные из таблицы продуктов ZKRE_PRODUCTS плюс описание из текстовой таблицы ZKRE_PRODUCTST и еще дату поставки этого продукта из таблицы ZKRE_SUPPLY. Для начала создадим структуру ZKRE_S_HW3  и табличный тип ZKRE_T_HW3 который содержал бы все необходимые поля. Используем транзакцию SE11.

SAP рекомендует многократное использование одних и тех же объектов, в этой программе реализуем это через INCLUDE. INCLUDE это что-то типа контейнера где можно размещать как элементы данных, структуры, так и куски программного кода (INCLUDE с программным кодом могут использоваться в различных программах).

image_152

Вводим краткое описание. На вкладке Components в первой строке вводим .INCLUDE в качестве Component Type указываем структуру которую мы создали недавно. Допишем еще одну строку SUPPLY_DATE и развернем Include чтобы посмотреть что у нас получилось.

image_153

Сохраняем и активируем нашу новую структуру. Создаем на основе этой структуры табличный тип ZKRE_T_HW3.

image_154

Создадим два функциональных модуля. 1-й будет извлекать все данные из таблицы продуктов, а второй дату поставки.

Транзакция SE37.

image_155

image_156

image_157

Сохраняем, проверяем, активируем и нажимаем выполнить. Появляется такой экран.

image_158

Нажимаем еще раз Выполнить. Появится следующий экран.

image_159

Видим что выполнение модуля вернуло нам резальтат с 5 записями. Нажмем на значек таблицы.

image_160

Создадим 2-ой модуль который бы выбирал дату поставки товара ZKRE_FM3.

image_161

image_162

Выполним этот модуль.

image_163

При просмотре таблиц видно что модуль отработал корректно. Теперь напишем непосредственно саму программу. Транзакция SE38.

image_164

image_165

Начинаем писать такой код.

image_166

-

*&---------------------------------------------------------------------*
*& Report  ZKRE_HW3
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zkre_hw3.

DATA: gt_pro TYPE zkre_t_hw3,
      gs_pro LIKE LINE OF gt_pro,
      gt_pro2 TYPE zkre_t_hw3,
      gs_pro2 LIKE LINE OF gt_pro2,
      gt_pro3 TYPE zkre_t_hw3,
      gs_pro3 LIKE LINE OF gt_pro3,
      gt_pro4 TYPE zkre_t_hw3,
      gs_pro4 LIKE LINE OF gt_pro4.

PERFORM select_data CHANGING gt_pro gt_pro2 gt_pro4.

Объявляем переменные и делаем вызов подпрограммы select_data. Но данной подпрограммы еще нету, чтобы ее создать, делаем дабл клик мышью по названию подпрограммы. Выскочило окно с предупреждением, что объект еще не создан. Нажимаем YES.

image_167

Выскакивает еще одно окно, где необходимо указать место создания подпрограммы, выбираем новый INCLUDE.

image_168

Нажав Ввод выскакивает предупреждающее окно.

image_169

Нажимаем Ввод и появляется редактор где уже можно писать код самой функции.

image_170

Сохранив эту форму и вернувшись в нашу главную программу, можно увидеть что внизу появился новый INCLUDE.

image_171

Дабл клик по ней и снова проваливаемся в нашу форму. Можно кликать по объектам и проваливаться в них. Кликнув по табличному типу, перейдем в редактор табличного типа. Перейдя в навигатор объектов видим что появилась новая папка Includes где есть только что созданная нами форма.

image_172

Отредактируем нашу функцию таким образом.

image_173

*----------------------------------------------------------------------*
***INCLUDE ZKRE_HW3_SELECT_DATAF01 .
*----------------------------------------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  SELECT_DATA
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*      <--P_GT_PRO  text
*      <--P_GT_PRO2  text
*      <--P_GT_PRO4  text
*----------------------------------------------------------------------*
FORM select_data  CHANGING p_gt_pro
                           p_gt_pro2
                           p_gt_pro4.


  CALL FUNCTION 'ZKRE_FM1'
    IMPORTING
      et_products = p_gt_pro.

  CALL FUNCTION 'ZKRE_FM2'
    IMPORTING
      et_products2 = p_gt_pro2.

  CALL FUNCTION 'ZKRE_FM3'
    IMPORTING
      et_products4 = p_gt_pro4.

ENDFORM.                    " SELECT_DATA

 

Сохраняем и активируем. Переходим к редактированию главной программы. Введем такой текст.

image_174

*&---------------------------------------------------------------------*
*& Report  ZKRE_HW3
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zkre_hw3.

DATA: gt_pro TYPE zkre_t_products,
      gs_pro LIKE LINE OF gt_pro,
      gt_pro2 TYPE zkre_t_hw3,
      gs_pro2 LIKE LINE OF gt_pro2,
      gt_pro3 TYPE zkre_t_hw3,
      gs_pro3 LIKE LINE OF gt_pro3,
      gt_pro4 TYPE zkre_t_hw3,
      gs_pro4 LIKE LINE OF gt_pro4.

PERFORM select_data CHANGING gt_pro gt_pro2 gt_pro4.

LOOP AT gt_pro2 INTO gs_pro2.
  LOOP AT gt_pro INTO gs_pro
    WHERE id = gs_pro2-id.
    LOOP AT gt_pro4 INTO gs_pro4
      WHERE id = gs_pro2-supply_id.
      WRITE: / gs_pro2-id,
               gs_pro2-supply_id,
               gs_pro2-name,
               gs_pro2-purchase_cost,
               gs_pro2-sale_cost,
               gs_pro2-quantity,
               gs_pro-description,
               gs_pro4-supply_date.
    ENDLOOP.
  ENDLOOP.
ENDLOOP.



INCLUDE zkre_hw3_select_dataf01.

 

Сохранаяем, активируем, нажимаем выполнить F8, получаем такой результат.

image_175

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

*&---------------------------------------------------------------------*
*& Report  ZKRE_HW3
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zkre_hw3.

DATA: gt_pro TYPE zkre_t_products,
      gs_pro LIKE LINE OF gt_pro,
      gt_pro2 TYPE zkre_t_hw3,
      gs_pro2 LIKE LINE OF gt_pro2,
      gt_pro3 TYPE zkre_t_hw3,
      gs_pro3 LIKE LINE OF gt_pro3,
      gt_pro4 TYPE zkre_t_hw3,
      gs_pro4 LIKE LINE OF gt_pro4.

PERFORM select_data CHANGING gt_pro gt_pro2 gt_pro4.

WRITE: 'Day and time of program execution: ',sy-datum, ' ', sy-uzeit.
SKIP 4.


WRITE: AT (2) 'ID', AT (10) 'SUPPLY_ID', AT (20) 'NAME', AT (10) 'PURCHASE_COST',
       AT (15) 'SALE_COST', AT (35) 'QUANTITY', 'DESCRIPTION', 'SUPPLY_DATE'.

LOOP AT gt_pro2 INTO gs_pro2.
  LOOP AT gt_pro INTO gs_pro
    WHERE id = gs_pro2-id.
    LOOP AT gt_pro4 INTO gs_pro4
      WHERE id = gs_pro2-supply_id.
      WRITE: / gs_pro2-id COLOR COL_KEY,
               gs_pro2-supply_id COLOR COL_KEY,
               gs_pro2-name COLOR COL_NORMAL,
               gs_pro2-purchase_cost COLOR COL_NORMAL,
               gs_pro2-sale_cost COLOR COL_NORMAL,
               gs_pro2-quantity COLOR COL_NORMAL,
               gs_pro-description COLOR COL_NORMAL,
               gs_pro4-supply_date COLOR COL_NORMAL.
    ENDLOOP.
  ENDLOOP.
ENDLOOP.



INCLUDE zkre_hw3_select_dataf01.

 

Выполним программу.

image_176

Внесем кое какие-изменения в код программы. Изменим отображение данных на экране.

Код программы:

*&---------------------------------------------------------------------*
*& Report  ZKRE_HW3
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  zkre_hw3_1 NO STANDARD PAGE HEADING.

DATA: gt_pro TYPE zkre_t_products,
      gs_pro LIKE LINE OF gt_pro,
      gt_pro2 TYPE zkre_t_hw3,
      gs_pro2 LIKE LINE OF gt_pro2,
      gt_pro3 TYPE zkre_t_hw3,
      gs_pro3 LIKE LINE OF gt_pro3,
      gt_pro4 TYPE zkre_t_hw3,
      gs_pro4 LIKE LINE OF gt_pro4.

PERFORM select_data CHANGING gt_pro gt_pro2 gt_pro4.

NEW-PAGE LINE-SIZE 138.
WRITE: 'Day and time of program execution: ',sy-datum, ' ', sy-uzeit.
SKIP 2.


ULINE.

WRITE: / sy-vline,
 AT (4) 'ID', sy-vline, AT (10) 'SUPPLY_ID', sy-vline, AT (17) 'NAME', sy-vline, AT (13) 'PURCHASE_COST', sy-vline,
       AT (13) 'SALE_COST', sy-vline, AT (10) 'QUANTITY', sy-vline, AT (35) 'DESCRIPTION', sy-vline, 'SUPPLY_DATE', sy-vline.

ULINE.
LOOP AT gt_pro2 INTO gs_pro2.
  LOOP AT gt_pro INTO gs_pro
    WHERE id = gs_pro2-id.
    LOOP AT gt_pro4 INTO gs_pro4
      WHERE id = gs_pro2-supply_id.
      WRITE: / sy-vline,
      gs_pro2-id COLOR COL_KEY,
      sy-vline,
               AT (10) gs_pro2-supply_id COLOR COL_KEY,
               sy-vline,
               AT (17) gs_pro2-name COLOR COL_NORMAL,
               sy-vline,
               AT (13) gs_pro2-purchase_cost COLOR COL_NORMAL,
               sy-vline,
               AT (13) gs_pro2-sale_cost COLOR COL_NORMAL,
               sy-vline,
               AT (10) gs_pro2-quantity COLOR COL_NORMAL,
               sy-vline,
               AT (35) gs_pro-description COLOR COL_NORMAL,
               sy-vline,
               AT (11) gs_pro4-supply_date COLOR COL_NORMAL,
               sy-vline.
    ENDLOOP.
  ENDLOOP.
ENDLOOP.

ULINE.

TOP-OF-PAGE.
  WRITE: 'Name of report - ', sy-repid.
  SKIP 1.
  WRITE:  'Executed by ', sy-uname.



  INCLUDE zkre_hw3_select_dataf01.

 

В результате получим такой вывод данных.

image_176-1

Уже лучше. В следующей статье - http://fibed.net/L/ познакомимся с экранами выбора - Selection Screens.

 

Комментарии

  • Adinf Ik
    Adinf Ik

    Спасибо за курс - очень понятно и доходчиво! Извиняюсь а продолжение будет или уже со временем совсем беда ?

    on 15.04.2014 08:01
    R K
    R K

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

    on 22.04.2014 17:50
  • Александра
    Александра

    Добрый день.

    Подскажите, таблица ZKRE_SUPPLY у вас не описана в начале, какие там поля необходимы и по каким ключевым связывается с другими таблицами?

    Спасибо

    on 18.12.2014 13:33
    R K
    R K

    Таблица ZKRE_SUPPLY имеет 4 поля (MAND, ID, SUPPLIER_ID, SUPPLY_DATE) со следующими элементами данных (MAND, ZKRE_ID, ZKRE_ID, ZKRE_DATE) соответственно. Ключевые поля (MAND, ID). Связана с таблицей ZKRE_PRODUCTS.

    on 18.12.2014 16:41
    Александра
    Александра

    Спасибо. Подскажите, тогда еще вопрос :)
    Застряла на создании zkre_hw3, при выполнении тестовом программа падает в дамп.
    Делала по вашей инструкции, по отдельности ФМ1, 2 и 3 запускаются и отрабатывают.
    проблема начинается в инклюде ZKRE_HW3_SELECT_DATAF01 , при чем после вызова CALL FUNCTION 'ZKRE_FM1'. в самом дампе указано Type conflict in the call of a function module. The current ABAP program "ZKRE_HW3" had to be terminated because it has
    come across a statement that unfortunately cannot be executed. Не подскажете, на что обратить внимание?

    on 18.12.2014 17:37
    Александра
    Александра

    Проблема, как написано, скорее всего в том, что ФМ1 'ZKRE_FM1'
    IMPORTING
    et_products = p_gt_pro. а параметр наш et_products из фмника экспортировался с типом табличным ZKRE_T_PRODUCTS . если изменить ссылочный тип таблицы на ZKRE_T_HW3 (как в принципе и можно было догадаться из начала программы REPORT zkre_hw3.
    DATA: gt_pro TYPE zkre_t_hw3,
    gs_pro LIKE LINE OF gt_pro,) но сейчас почему-то при тестовом выполнении программы он ничего не выдает. Под отладчиков видно, как отрабатывают фмники, но видимо у меня с данными где-то косяк :(

    on 18.12.2014 17:54
  • R K
    R K

    Запустил сейчас ФМники, они всен отработали корректно. А вы разобрались с проблемой?

    on 19.12.2014 10:24
    Александра
    Александра

    Нет. я пока не понимаю почему не работает. первая проблема ушла - я выше написала, из-за разницы в определении.
    Сейчас вроде все отрабатывает (в дамп по крайней мере не валится) - но данных никаких не выводит. То есть после нажатия "выполнить" ничего не происходит.
    Если смотреть под отладчиком как происходит процесс -
    LOOP AT gt_pro2 INTO gs_pro2. //-из gt_pro2, где есть 4 записи положим одну в структуру gs_pro2
    LOOP AT gt_pro INTO gs_pro // из gt_pro , где так же у меня 4 записи положим одну в структуру gs_pro
    WHERE id = gs_pro2-id. // при условии что id из структуры gs_pro равен gs_pro2-id.

    Но тут возникает вопрос, в структуре gs_pro лежит только описание - мы же ее заполняли из текстовой таблице продуктов ZKRE_PRODUCTST. - там поле айдишника пустое. То есть наше условие не выполнится никогда.

    Подскажите, где я запуталась )

    on 19.12.2014 11:09
    R K
    R K

    Т.е как я понял ФМники у вас отработали также корректно и данные извлекают, а проблема в Loop который выводит данные непосредственно на экран. Ниже мой loop сверте со своим.

    LOOP AT gt_pro2 INTO gs_pro2.
    LOOP AT gt_pro INTO gs_pro
    WHERE id = gs_pro2-id.
    LOOP AT gt_pro4 INTO gs_pro4
    WHERE id = gs_pro2-supply_id.
    WRITE: / gs_pro2-id COLOR COL_KEY,
    gs_pro2-supply_id COLOR COL_KEY,
    gs_pro2-name COLOR COL_NORMAL,
    gs_pro2-purchase_cost COLOR COL_NORMAL,
    gs_pro2-sale_cost COLOR COL_NORMAL,
    gs_pro2-quantity COLOR COL_NORMAL,
    gs_pro-description COLOR COL_NORMAL,
    gs_pro4-supply_date COLOR COL_NORMAL.
    ENDLOOP.
    ENDLOOP.
    ENDLOOP.

    id я брал из таблицы ZKRE_SUPPLY

    on 19.12.2014 11:19
    R K
    R K

    Хотя нет,
    вот мой код из FM1
    SELECT prod_id as id description FROM zkre_productst INTO CORRESPONDING FIELDS OF TABLE et_products
    WHERE lang EQ 'E'.

    Мой FM1 при выполнении возвращает и ID и Description.

    on 19.12.2014 11:25
    Александра
    Александра

    Проблему решила.
    Смотрите, в чем было дело. Loop у меня такой же как у Вас.

    У вас во второй и третьей строчке указано
    LOOP AT gt_pro INTO gs_pro
    WHERE id = gs_pro2-id.

    Где gt_pro получается, если коротко при отработке FM1

    В Фм 1 указан следующий код (у меня выборка по русскому языку, у вас в уроке английский указан)

    SELECT * FROM zkre_productst INTO CORRESPONDING FIELDS OF TABLE et_products
    WHERE lang EQ 'RU'.

    ENDFUNCTION.

    То есть мы берем данные из таблицы текстовой, просто описания.
    (урок 13 Создание функционального модуля) То есть там всегда поле ID будет пустое. Поэтому у меня луп и не отрабатывал. У вас в ФМ1 наверное код другой.

    я исправила код в фм1 - беру данные теперь из таблицы zkre_products и убрала условие с языком. Буду дальше смотреть ваши уроки.

    Спасибо еще раз огромное вам за помощь.

    on 19.12.2014 11:37
    Александра
    Александра

    УУииии^^ с вашим условием и описание добавилось. Все, теперь все работает корректно. Я как раз ломала голову, как описание выдернуть.

    И еще раз спасибо :)

    on 19.12.2014 11:48
    R K
    R K

    Да, именно в этом и была проблема. Я изменил код ФМ по сравнению с (урок 13 Создание функционального модуля) и не указал это. Сорри:).
    вот мой код из FM1
    SELECT prod_id as id description FROM zkre_productst INTO CORRESPONDING FIELDS OF TABLE et_products
    WHERE lang EQ 'E'.
    В вашем случае вы выбираете все поля в et_products, а в ней есть ID но не PROD_ID (как в текстовой таблице). Использование такого селекта SELECT prod_id as id решает эту проблему.

    on 19.12.2014 11:51
    Александра
    Александра

    Вы и так материал подаете на блюдечке с голубой каемочкой :) Так хоть интересно голову поломать было в чем причина. И все оказалось достаточно просто.

    Спасибо! )

    on 19.12.2014 11:54
  • RIP
    RIP

    Пипец, простейшая программа а такой запутанный и неоптимизированный код с 3 циклами вложенности. Неужели в SAP-е всегда так. Почему бы не обойтись одним хорошим запросом с соединениями?

    on 15.01.2015 21:01
  • A P
    A P

    Все равно не запускается программа. При F8 ничего не происходит

    on 02.11.2016 15:27
  • Виталий Бауман
    Виталий Бауман

    Действительно, в урок нужно добавить, что в FM1 необходимо измнеть тип данных экспортной структуры на ZKRE_S_HW3, иначе программа будет падать с ошибкой типа данных.

    on 09.02.2017 11:33

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