Создадим программу где будут задействованы формы FORM и INCLUDE. Программа также будет выводить данные из таблицы на экран, но в более удобочитаемой форме. Транзакция SE11.
Программа будет извлекать все данные из таблицы продуктов ZKRE_PRODUCTS плюс описание из текстовой таблицы ZKRE_PRODUCTST и еще дату поставки этого продукта из таблицы ZKRE_SUPPLY. Для начала создадим структуру ZKRE_S_HW3 и табличный тип ZKRE_T_HW3 который содержал бы все необходимые поля. Используем транзакцию SE11.
SAP рекомендует многократное использование одних и тех же объектов, в этой программе реализуем это через INCLUDE. INCLUDE это что-то типа контейнера где можно размещать как элементы данных, структуры, так и куски программного кода (INCLUDE с программным кодом могут использоваться в различных программах).
Вводим краткое описание. На вкладке Components в первой строке вводим .INCLUDE в качестве Component Type указываем структуру которую мы создали недавно. Допишем еще одну строку SUPPLY_DATE и развернем Include чтобы посмотреть что у нас получилось.
Сохраняем и активируем нашу новую структуру. Создаем на основе этой структуры табличный тип ZKRE_T_HW3.
Создадим два функциональных модуля. 1-й будет извлекать все данные из таблицы продуктов, а второй дату поставки.
Транзакция SE37.
Сохраняем, проверяем, активируем и нажимаем выполнить. Появляется такой экран.
Нажимаем еще раз Выполнить. Появится следующий экран.
Видим что выполнение модуля вернуло нам резальтат с 5 записями. Нажмем на значек таблицы.
Создадим 2-ой модуль который бы выбирал дату поставки товара ZKRE_FM3.
Выполним этот модуль.
При просмотре таблиц видно что модуль отработал корректно. Теперь напишем непосредственно саму программу. Транзакция SE38.
Начинаем писать такой код.
-
*&---------------------------------------------------------------------*
*& 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.
Выскакивает еще одно окно, где необходимо указать место создания подпрограммы, выбираем новый INCLUDE.
Нажав Ввод выскакивает предупреждающее окно.
Нажимаем Ввод и появляется редактор где уже можно писать код самой функции.
Сохранив эту форму и вернувшись в нашу главную программу, можно увидеть что внизу появился новый INCLUDE.
Дабл клик по ней и снова проваливаемся в нашу форму. Можно кликать по объектам и проваливаться в них. Кликнув по табличному типу, перейдем в редактор табличного типа. Перейдя в навигатор объектов видим что появилась новая папка Includes где есть только что созданная нами форма.
Отредактируем нашу функцию таким образом.
*----------------------------------------------------------------------*
***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
Сохраняем и активируем. Переходим к редактированию главной программы. Введем такой текст.
*&---------------------------------------------------------------------*
*& 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, получаем такой результат.
Изменим текст главной программы для улучшения восприятия выводимого результата.
*&---------------------------------------------------------------------*
*& 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.
Выполним программу.
Внесем кое какие-изменения в код программы. Изменим отображение данных на экране.
Код программы:
*&---------------------------------------------------------------------*
*& 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.
В результате получим такой вывод данных.
Уже лучше. В следующей статье - http://fibed.net/L/ познакомимся с экранами выбора - Selection Screens.
Adinf Ik
Спасибо за курс - очень понятно и доходчиво! Извиняюсь а продолжение будет или уже со временем совсем беда ?
R K
Будет, на самом деле весь курс очень интересный и довольно большой, затрагивающий различные аспекты SAP. Думаю в ближайшее время я добавлю информации.
Александра
Добрый день.
Подскажите, таблица ZKRE_SUPPLY у вас не описана в начале, какие там поля необходимы и по каким ключевым связывается с другими таблицами?
Спасибо
R K
Таблица ZKRE_SUPPLY имеет 4 поля (MAND, ID, SUPPLIER_ID, SUPPLY_DATE) со следующими элементами данных (MAND, ZKRE_ID, ZKRE_ID, ZKRE_DATE) соответственно. Ключевые поля (MAND, ID). Связана с таблицей ZKRE_PRODUCTS.
Александра
Спасибо. Подскажите, тогда еще вопрос :)
Застряла на создании 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. Не подскажете, на что обратить внимание?
Александра
Проблема, как написано, скорее всего в том, что ФМ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,) но сейчас почему-то при тестовом выполнении программы он ничего не выдает. Под отладчиков видно, как отрабатывают фмники, но видимо у меня с данными где-то косяк :(
R K
Запустил сейчас ФМники, они всен отработали корректно. А вы разобрались с проблемой?
Александра
Нет. я пока не понимаю почему не работает. первая проблема ушла - я выше написала, из-за разницы в определении.
Сейчас вроде все отрабатывает (в дамп по крайней мере не валится) - но данных никаких не выводит. То есть после нажатия "выполнить" ничего не происходит.
Если смотреть под отладчиком как происходит процесс -
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. - там поле айдишника пустое. То есть наше условие не выполнится никогда.
Подскажите, где я запуталась )
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
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.
Александра
Проблему решила.
Смотрите, в чем было дело. 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 и убрала условие с языком. Буду дальше смотреть ваши уроки.
Спасибо еще раз огромное вам за помощь.
Александра
УУииии^^ с вашим условием и описание добавилось. Все, теперь все работает корректно. Я как раз ломала голову, как описание выдернуть.
И еще раз спасибо :)
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 решает эту проблему.
Александра
Вы и так материал подаете на блюдечке с голубой каемочкой :) Так хоть интересно голову поломать было в чем причина. И все оказалось достаточно просто.
Спасибо! )
RIP
Пипец, простейшая программа а такой запутанный и неоптимизированный код с 3 циклами вложенности. Неужели в SAP-е всегда так. Почему бы не обойтись одним хорошим запросом с соединениями?
A P
Все равно не запускается программа. При F8 ничего не происходит
Виталий Бауман
Действительно, в урок нужно добавить, что в FM1 необходимо измнеть тип данных экспортной структуры на ZKRE_S_HW3, иначе программа будет падать с ошибкой типа данных.