К основному контенту

ABAP

*пример простой программы с двумя строками текста:
report abaptest .
write 'Customerlist '.

*Программа должна начинаться с декларации REPORT
*Второй оператор выводит на экран слова
* комментарий в начале строки или " комментарий в любом месте строки

write 'Customer list ' at 10.
*комманда write содержит необязательное дополнение, задающее позицию появления текста

write: 'Custome rlist' ,
        'Booking'.
*общая часть перед двоеточием, последовательные части отделяются запятыми

*-------------------------------------------------------
*
*           ПОЛЯ
*
*-------------------------------------------------------

data: customer_name(25) type с ,
      vendor__name like customer_name.
*data - определяется поле (переменная), like - наследование
 
types t_name(25) type с.
data: customer_name type t_name,
    vendor_name type t_name.
*Тип, определенный как t_name, назначается для полей vendor_name и customer_name, и любые изменения в нем автоматически распространяются на определения обоих полей

data: name(25) type C,
    zip_code(5) type N,
    counter type I value 1 .
*типы заданной длины C Characters, N Numbers (тексты, состоящие из цифр), X Hexadecimal, P упакованное число (большие числа, в том числе с запятой)
*фиксированная длина I Integer, F Float, , d Date YYYYMMDD, T Time HHMMSS
*в круглых скобках длина поля, если не задано, то используется по умолчанию
*value задает начальное значение переменной
*если тип не указан,то по умолчанию присваивается C

constants: company_name(3) type C value 'SAP',
          max_counter type I value 9999.
data counter type I value max_counter.
* пример константы

data price type P decimals 2.
* поле определяется как упакованное число с 2 знаками после запятой

data today type D.
today = sy-datum.
write today.
*отображение текущей даты, формат по умолчанию YYYYMMDD

data ultimo type D.
ultimo = sy-datum.
ultimo+6(2) - '01'.
*устанавливает значение переменной как первый день текущего месяца
subtract 1 from ultimo. "вычитает 1 из даты, это день, так как они всегда содержатся в последних двух байтах
*устанавливает значение переменной как последний день предыдущего месяца

*---------------------------------------------------
*
*          ЗАПИСИ И ВНУТРЕННИЕ ТАБЛИЦЫ
*
*---------------------------------------------------

*Записи (или структуры) содержат фиксированное число объектов данных
*Внутренние  таблицы  могут  включать любое  количество  объектов  данных

data: begin of customer,
      id(8) type n,
      name(25),
      telephone(12),
      end of customer.
*Структура с названием customer начинается с ключевого слова data begin of и содержит три   поля: для идентификатора, фамилии и номера телефона (размеры  полей  объявлены). Структура  завершается ключевым словом data end of.

data vendor like customer.
customer-id = '87654321'.
customer-name = 'Edison'.
customer-telephone = '111-111-1111'.
move customer to vendor.
*like наследование, move копирование

constants: begin of path,
          root(3) value 'a:\',
          home_dir(5) value 'home\',
          end of path.
*постоянная структура path

data all_customers like customer occurs 100 "Внутренние таблицы определяются посредством ключевого слова occurs
*определяется внутренняя таблица, каждый элемент которой имеет структуру записи customer, в начальный момент резервирует память на 100 элементов. если будет добавлено более 100 элементов, таблица автомитически увеличится

types: begin of phone_fax_numbers,
      country_code(3) type n,
      area_code(3) type n,
      number(10) type n,
        end of phone_fах_numbers,
      begin of employee,
      name(25),
      phone type phone_fax_numbers occurs 10,
      fax type phone_fax_numbers occurs 5,
        end of employee.
data employees type employee occurs 100.
*В этом фрагменте программы сначала определена запись типа phone_fax_numbers с тремя компонентами, каждый из которых является полем. Вторая запись типа employee также имеет три компонента — поле и две внутренние таблицы. После этого оператор data определяет вложенную внутреннюю таблицу employees со строкой типа employee. А каждая строка внутренней таблицы employees содержит одно поле и две внутренние таблицы.

tables customers.
select * from customers.
  write: customers-name.
end select.
*объявляется таблица (таблица должна существовать в Dictionary), далее sql запрос

data all_customers like customers occurs 100
*определяется внутренняя таблица той же структуры, что и customers


*-------------------------------------------------------
*
*           РАБОТА С ДАННЫМИ
*
*-------------------------------------------------------

data: name(25),
    counter type i.
move: 'Edison' to name,
    17 to counter.
*После выполнения такой операции поле name содержит строку Edison, а счетчик поля — число 17. Команда move всегда копирует исходное поле в целевое: move:  исходное  to  целевое

data: begin of my_customer,
    id(8) type n,
    name(25),
    city(25),
      end of my_customer.
      begin of city_of_customer,
    city like my_customer-city,
    text(30),
    id like my_customer-id,
      end of city_of_customer.
move-corresponding my_customer to city_of_customer.
*Команда move-corresponding копирует содержимое полей id и city, которые содержатся в записи my_customer, в аналогичные поля записи city_of_customer.



compute целевое = исходное
*Если пользователь предпочитает писать целевое поле с левой стороны оператора, можно воспользоваться командой compute
целевое = исходное.
*Ключевое слово compute - единственное, которое разрешается опускать в операторах языка АВАР/4. Пропуск любого другого ключевого слова Syntax Check определит как ошибку

data: number_1(4), number_2(3), result type i.
    result = number_l + number_2.
*ПРЕОБРАЗОВАНИЕ СОДЕРЖИМОГО ПОЛЕЙ если у исходного и целевого полей разный тип и размер данных, то ABAP всегда преобразует к формату целевого
*Если поле number_l содержит строку 1771, a number_2 равно 005, тогда поле result будет содержать число 1776. Тот же результат получится, если number_2 содержит цифру 5 и впереди два пробела (__5), один пробел впереди и цифры 05 (_05) или цифры 05 и один пробел в конце  (05__).

data: directory_1(2), directory_2(10), file_name(10), path(24).
directory_l = 'a:'.
directory_2 = 'usr'.
file_name = 'programs'.
concatenate directory_l directory_2 filename "объединение
  into path
  separated by '\'.
*Содержимое path в этом примере будет 'a:\usr\programs'. Система возвращает не равное нулю значение переменной sy-subrc, если длина конкатенированной строки больше, чем длина поля, в которое она записывается.

name_l = 'Edison'.
name_2 = 'Smith'.
name_3 = 'Young'.
shift name_l. "сдвиг, результат dison
shift name_2 by 3 places. "th
shift name_3 right. "   Young

names = 'Alexander Bill Charles'.
shift names up to 'Bill'  "результат Bill Charles
*если подстрока не найдена, топеременная sy-subrc будет не равна нулю

паше = 'Joanna   '.
shift name right deleting trailing space. "удаляет все пробелы после последнего значащего символа

string_1 = 'Variable: fi. The  variable & is substituted  later'.
replace  'fi' with 'X' into string_1.
*Поле string будет равно Variable: X. The variable & is substituted later.
translate string_1 using '&X'
* translate позволяет заменить сразу несколько символов в строке. Правило замены записывается как последовательность пар, где первый символ всегда заменяется на второй
expression = 'a * 2 + Ь * 2 - с * 2'.
translate expression using 'axbycz'.
*Результатом  замены  будет  выражение х * 2 + у * 2 - z * 2

*Предположим, нужно отыскать строку California в символьном поле:
text = 'Texas California Mew Mexico Louisiana Oregon'.
search text for 'California'. "не различает регистр
if sy-subrc not 0.
  write 'Not found',
  endif.
*Поиск закончится успешно, и системный код возврата (sy-subrc) будет равен нулю. Кроме того, системное поле sy-fdpos содержит сдвиг найденной строки относительно начала (в этом примере sy-fdpos - 6)


*В АВАР/4 поддерживается поиск символьных строк во внутренних таблицах. Предположим, во внутренней таблице letter содержится текст письма:
types text_line(80).
data letter type teact_line occurs 100.
*Пусть первая строка письма letter равна Dear Sir, а вторая — thank you for your letter of 12/31/1999. Оператор имеет вид
search letter for 'you'.
*В этом случае оператор даст следующий результат:
* sy-subrc = 0,
* sy-tabix = 2,
* sy-fdpos = 6. Системное поле sy-tabix возвращает индекс строки таблицы, содержащей искомую строку, a sy-fdpos — сдвиг относительно начала этой строки. Кроме того, дополнения команды search позволяют ограничить диапазон поиска строк:
search letter for 'thank' starting at 2 ending at 100.
search letter for 'Sincerely' starting at 3.
*Первый оператор ограничивает поиск строками от второй до сотой, для второго оператора поиск будет производиться по всем строкам, начиная с третьей


*-------------------------------------------------------
*
*           ВНЕШНЕЕ УПРАВЛЕНИЕ: СОБЫТИЯ
*
*-------------------------------------------------------
*ABAP язык, управляемый событиями (т.е. действия пользователя или системные события управляют выполнением программы)
*Предположим,программа выводит на экран список следующим образом: все данные клиентов из базы данных считываются в цикле, содержащем оператор select и отображаются командой write:
select * from customers.
write/customers-name."/ с новой строки
endselect.
*Чтобы обеспечить переключение обработки,программа должна реагировать на выбор пользователем строки. Операторы этого события записаны послео ператора at line-selection:
at line-selection
select single * from customers where...
*При двойном щелчке мышью на какой-либо строке будут выполнены все команды между at line-se lection и следующим оператором события или концом программы.
*другие события:
at line-selection , at user-command  "реакция на действия пользователя
top-of-page, end-of-page "создание и вывод на экран заголовков и нижних колонтитулов
start-of-selection , get , end-of-selection "поиск данных с помощью Logical Databases
process before output, process after input: "действия системы до и после вывода на экран

if elseif else endif "ветвление по условию
case when endcase "ветвление в соответствии с фиксированным набором значений
case color.
when 'red'. write 'color is red'.
when 'green'. write 'color is green'.
when 'yellow'. write 'color is yellow'.
when others. write 'non-standardcolor'.
endcase.
* эквивалент
if color = 'red'.
  write 'color is red'.
elseif color = 'green'.
  write 'color is green'.
elseif color = 'yellow'.
  write 'color is yellow'.
else.
  write 'non-standard color'.
endif.

a eq b (вместо а = b)
a gt b (вместо а > b)
a ne b (а <> Ь)"а не равно b
a lt b (a < b)
a ge b (a >= b)
a le b (a <= b)
a between b and с (b <= a) and (а >= с)
a is initial "a имеет начальное значение (0 для чисел и пробел для символов)
*буквенные эквиваленты
if (not (f1 eq f2)) or (f3 = f4 and f5 = f6) 

data: c4(4) value '124', с5(5) value '00124'.
if c4 = с5.
write 'с4 and c5 are equal'.
endif.
*условине будет верным, так как при преобразовании с4 заполнится пробелами

a ca b (содержит любой)"содержит как минимум один символ из b
a co b (содержит только)"содержит только символы из b
a cs b (содержит строку)"содержит строку b - концевые пробелы игнорируются и регистр тоже
a cp b (содержит шаблон)"содержит любую символьную строку +- отдельный символ
*сравнение символьных строк

data: a(6) value 'ABAP/4',
    result(в).
if а ca 'ХP'.
  result = a + sy-fdpos(2).
endif.
"так как а содержит P, то условие выполняется. sy-fdpos (от field position) имеет сдвиг символа P относительно начала поля - в данном случае 3, следовательно result = 'P/'
if а со 'АВР'.
write 'a only contains А, В, and P'.
endif. "false
if a cs 'ВАР'.
write 'a contains the string BAP  '.
endif. "true
if а ср '*АР++'.
write 'a contains АР followed by two more characters'.
endif."true

'АВАР/4' со 'АВ' "false, sy-fdpos = 3 (сдвиг в строке АВАР/4, но не в строке АВ)
'АВАР/4' cs 'ВА' "true, sy-fdpos = l (сдвиг от строки ВА в АВАР/4)
'АВАР/4' cs 'AA' "false, sy-fdpos = 6 (длина АВАР/4)
'АВАР/4' ср '*ВА*' "true, sy-fdpos = l (сдвиг начала строки ВА в строке АВАР/4)
'АВАР/4' ср '++А+*' "true, sy-fdpos = 0 (сдвиг начала строки ++A+ встрокеАВАР/4)
'АВАР/4' ср '+А*' "false, sy-fdpos = 6 (длина АВАР/4)

do enddo "безусловный цикл
while endwhile "цикл с условием завершения

do 100 times
square_number = sy-index ** 2. "sy-index счетчик цикла от 1 и тд
write square_number.
enddo.
* квадраты первых 100 чисел

do.
*terminate loop after 5 steps or when the color is red
if sy-index > 5 or color = 'red'.
exit. endif.
*mainloopstep
write.. *
enddo.

*-------------------------------------------------------
*
*           ПОДПРОГРАММЫ И ФУНКЦИИ
*
*-------------------------------------------------------

*Формы (или подпрограммы) — программные модули, локализованные в конкретной программе
*Функции — глобальные программные компоненты, которые могут вызываться из разных программ

data flag value 'G'.
write flag.
perform set_flag. "форма или подпрограмма вызывается с помощью оператора perform
write flag.
form set_flag. 
flag = 'L'.
write flag.
endform.
*форма или подпрограмма определяется парой операторов form и endform
*будет напечатано G L L

*Определение формы размещается в конце исходных текстов программы, как показано в приведенном выше примере, и этот факт отражает главный смысл формы — событие в системе. Следовательно, любой исходный текст программы, расположенный после определения формы, выполняется при работе программы, если он только содержит новую форму или событие (например, событие atline-selection).

data flag value 'G'.
write flag.
perform write_flag.
write flag .
form write_flag.
data l_flag.
l_flag = 'L'.
write l_flag .
endform.
*локальная переменная l_flag создается в форме write_flag, и после выполнения приведенной подпрограммы будет напечатано G L G

perform count.
perform count.
form count.
statics calls type i. "объявлен статик
calls = calls + 1.
write calls."result 1 2
endform.

types: t_name(25).
data: name_l type t_name value 'A',
    name_2 type t_name value 'B'.
perform set_name changing name_l. "1.1 обращение к форме с фактическим параметром name_l 
perform set_name changing name_2. "2.1 обращение к форме с фактическим параметром name_2
form set_name
changing f_name type t_name. "1.2 формальный параметр f_name получает значение name_l
                              "2.2 формальный параметр f_name получает значение name_2
write f_name. "1.3 вывод А
              "2.3 вывод В
f_name = 'Smith'.
write f_name. "1.4 вывод Smith
              "2.4 вывод Smith
endform.

changing value "изменяемые
using value "только для чтения

data all_customers like customers occurs 50 with header line. "создается таблица на 50 строк
perform read_customers tables all_customers. "обращение к форме с параметром таблица"
form read_customers tables f_customers structure all_customers.
select * from customers into table f_customers. "заполнение таблицы данными SQL запроса
end form.

*ФУНКЦИИ
*В отличие от подпрограмм функции обычно применяются во множестве различных программ и потому 
*содержат лишь строго инкапсулированные данные, т.е. данные в функции могут изменяться только 
*через ее интерфейс. Аргументы функции определяются с помощью имен, а не по их расположению в 
*списке параметров, как в подпрограмме. При необходимости добавления в функцию новых условий 
*или параметров это  можно  сделать,  не изменяя  все  вызывающие  программы  этой функции. 
*Кроме того, они обеспечивают удобную  обработку исключений

function "определение функции
endfunction 
call function "вызов функции


function 'CONVERT_TEMPERATURE'. "преобразование температуры из Фаренгейта в Цельсия
* Local interface:
* importing value (temp_unit) type с
*           value (degrees) type p
* exporting reference (conv_degrees) type p
if temp_unit = 'F'.
  conv_degrees = (degrees-32)*5/9.
else.
  conv_degrees = degrees*9/5+32.
endif.
endfunction.
*Этой функции соответствует следующий вызов:
data deg type p.
call function 'CONVERT_TEMPERATURE'
exporting temp_unit = 'F' "передает значения в фукцию
          degrees = 100
importing conv_degrees = deg. "импортирует ссылку и придает ее значение переменной


function read_customers.
* Local interface:
* importing value (i_name) like customers-name
* tables customer_table structure customers
* exceptions not_found
select * from customers into table customer_table
where name = i_name.
if sy-subrc ne 0.
raise not_found. "raise устанавливает исключение, если он выполняется, то функция завершается
endif.
endfunction.
* Данную функцию можно вызвать следующим образом:
call function 'READ_CUSTOMERS'
exporting i_name = 'Smith'
tables customer_table - Cust_tab
exceptions not_found = 1.
if sy-subrc = 1.
write 'Customer not found'.
endif.
* Если в вызывающей программе исключениям присвоены специальные номера, то каждое из них записывает присвоенное ему значение в системный код возврата sy-subrc


*-------------------------------------------------------
*
*           РАБОТА С ТАБЛИЦАМИ
*
*-------------------------------------------------------

* в большинств случаев синтаксис как в запросах SQL

data: cid like customers-id,
      cname like customers-name.
select id name into (cid, cname) from customers. "выборка одного поля и заполнение его в поле cid таблицы cname
  write: /cid, cname.
endselect.

data: tablename(10),
      count_rows type i.
move 'CUSTOMERS' to tablename.
select count(*) from (tablename) into count_rows. "если имя таблицы задается динамически, то внутри оператора select оно заключается в скобки

data all_customers like customers occurs 100 with header line. "создание внутренней таблицы с шапкой
select * from customers into table all_customers. "заполнение внутренней таблицы данными

* 4 метода заполнения внутренней таблицы
select * from customers into table all_customers 
*Считывание данных из таблиц баз с помощью команды select
select * from customers appending table all_customers
*Добавление строк с помощью команды append
insert lines of old_cities
from 2 to 5
into customer_cities index 3.
*Позиционная вставка строк с помощью команды insert (вставляет со сдвигом строк)
move all_customers to foreign_customers.
*Передача всей таблицы с помощью команды move

sort my_flights by fldate price.
*сортировка таблицы по полю

loop at all_customers
where name = 'Smith'. "можно ограничить цикл
write / all_customers-name.
endloop.
* пример программы для считывания строк в цикле, номер текущей строки всегда содержится  в системном поле sy-tabix

read table all_customers "поиск в таблице по двум ключам
with key name = 'Smith'
          city = 'Big City'
if  sy-subrc = 0. "если найдено, то код возврата sy-subrc будет равень нулю
  write: / all_customers-id, all customers-name.
else.
  write / 'Customer not found'.
endif.

select * from customers into table all_customers
        order by primary  key.
read table all_custoners with  key id = '87654321' binary search.
if sy-subrc = 0.
  write / all_customers-name.
else.
  write / 'Customer not found'.
endif.
*если внутренная таблица очень велика и поиск происходит медленно, то можно ускорить, используя бинарный поиск, но он также требует, чтобы таблица была отсортирована по первичному ключу

read table all_customers with key id = '00000005' binary search. "бинарный поиск ключа
if sy-subrc ne 0. "если ключ не найден
  all_customers-id = '00000005'.
  all_customers-name = 'Martinez'.
  all_customers-city = ' Phoenix'.
  all_customers-telephone = '354-321-4567':
  insert all customers index sy-tabix. "в таблицу добавляются данные в строку sy-tabix, добавятся они после ид  00000004 и до 00000006
endif.

read table all_customers with key id = '00000005'  binary  search.
if  sy-subrc = 0.
  all_customers-city = 'Big City'
  delete all_customers index sy-tabix.
endif.
*удаление строки

* работа с промежуточными суммами
* at first/endat (начало и конец отсчета).
* at new f/endat если  содержимое поля f или одного из предшествующих полей было изменено
* at end of f/endat если содержимое поля f или одного из предшествующих полей будет изменено на следующем шаге программы
* at last/end at по завершении работы с таблицей

tables bookings.
update bookings set fldate = '19991231'
                where carrid = 'ABC'
                and connid = '1234'
                and fldate = '19991230'.
* во всех записях рейса 1234 компании ABC изменяется его дата 30,12,1999 на 31,12,1999

data: all_customers like customers occurs 100,
      all_bookings like bookings occurs 1000.
export all_customers all_bookings
      to memory id 'CUSTBOOK'. "две внутренние таблицы передаются как единый кластер во временную рабочую область основной памяти, заданую посредством идентификатора CUSTBOOK

data: all_customers like customers occurs 100,
      all_bookings like bookings occurs 1000.
import all_customers all_bookings
      from memory id 'CUSTBOOK'. "внутренние таблицы находящиеся в кластере помяти копируются во внутренние таблицы с такими же именами. Если такого имени таблицы не будет найдено, то в нее ничего не скопируется
if sy-subrc ne 0.
  write 'Import failed.'.
endif.

data: new_booking like bookings occurs 50.
import all_bookings to new_booking "во внутреннюю таблицу new_booking считываются данные из таблицы all_bookings с кластера
      from memory id 'CUSTBOOK'.

data: old_customers like customers occurs 10,
      old_bookings like bookings occurs 20.
export all_customers from old_customers
      all_bookings from old_bookings
      to memory id 'CUSTBOOK'. "экспорт таблиц под другим именем

free memory id 'CUSTBOOK'. "стирание содержимого кластера

tables zflight.
data: all_customers like customers occurs 100,
      all_bookings like bookings occurs 1000.
export all_customers all_bookings
      to database zflight(zz) id 'CUSTBOOK'. "запись в постоянное хранилище
* (zz) используется как идентификатор области для указания секции таблицы. Является обязательным и система объединяет его со следующим идентификатором после слова id. Символы указывают на секцию таблицы zflight, кудазаписываются внутренние таблицы и откуда будут считываться. Внутреннюю структура задает сам ABAP/4
import all_customers all_bookings
      from database zflight(zz) id 'CUSTBOOK'. "импорт из постоянного хранилища


*-------------------------------------------------------
*
*           Создание отчетов
*
*-------------------------------------------------------
* три способа создания отчетов
* задать размещение информации на экране с помощью средств ABAP/4 Query (автоматически)
* написать текст программы с применением Logical Database
    " упрощает и инкапсулирует методы доступа, т.е. например будет написано одно слово get, которое будет обрабатывать данные с логикой, прописаной в Logical Database
* использовать простейшие команды select

* пользовательский интерфейс для отчета:
* В АВАР/4  существует  два типа  полей  ввода  для  стандартного экрана  выбора:
Parameters         "Единичные поля
Select-Options      "Внутренние таблицы для задания составных критериев выборки (рекомендуется для динамических предложений where и операторов select)

parameters:
  p_city like customer_city, "параметр для города
  p_fldate like actfli-fldate default '19991231', "параметр для даты рейса
  p_flag as checkbox default 'X'. "поле для проверки выбранных критериев

*одновременно каждый параметр определяет поле, которое может использоваться программой-отчетом как обычное поле, определенное с помощью оператора data

*если Select-Options  необходимо заполнить значениями по умолчанию, то
sign (признак) = I (including) "включая
sign = E (Excluding) "исключая
option (операция) = BT (between)
option = CP (Contains Pattern)
option = EQ (equal) "равно
option = GE (greate than or equal to)

*события экрана выбора
initialization "выполняется сразу после начала создания отчета и до обработки значений, заданных на экране выбора
at selection-screen output "вывод на экран - выполняется до того как будет выведен экран выбора
at selection-screen on p/s "параметр или составной критерий - выполняется после задания пользователем параметра p или составного критерия s
*Событие initialization происходит только однажды, а событие at selection-screen output — при каждом нажатии Enter (ввод), если экран выбора активен. После обработки всех перечисленных событий АВАР/4 продолжает выполнение события start-of-selection

parameters pcode like customers-postcode.
data parameter_length type i.
at selection-screen on pcode.
  parameter_length = strlen (pcode).
  if parameter_length < 5.
    message e001 with 'Zip code invalid'.
  endif.
* если задано меньше 5 символов, то пользователь получит ошибку. Каждое сообщение об ошибке, получаемое по событию at selection-screen, немедленно останавливает программу-отчет и обновляет экран выбора


start-of-selection.
  write 'basic list'.
at line-selection. "действие при двойном клике мышкой
  write 'New list after double-click'.
*Вначале  по событию start-of-selection на экран выводится  список,  называемый  базовым. С помощью команды write при возникновении события at line-selection строится новый список, который перекрывает на экране начальный список. Новый  список "помещается"  в стек списков и называется стековым списком. При построении нового списка старый список не уничтожается, и к нему можно вернуться, используя  одну из стандартных функций: нажатие на кнопку Back  (функциональная  клавиша F3) или  кнопку Cancel  (клавиша F12).  В обоих случаях стековый список уничтожается.

*Активные зоны (Hotspots) — это элементами, предназначенные для указания возможных действий пользователя. Они представляют собой области списка, в которых курсор появляется в виде символа с изображением поднятой вверх правой руки. 
tables customers.
start-of-selection.
  select * from customers.
    write / customers-name hotspot on.
  endselect.
at line-selection.
  write 'New list after single-click on a hotspot area'.

*ЕСЛИ пользователь нажимает на функциональную клавишу или щелкает мышью на экранной кнопке,то возникает событие at user-command.  Каждый элемент меню, экранная кнопка или функциональная клавиша  имеет  в  системе функциональный  код размером  4 байта  (например,  FREE), который можно получить из системного поля sy-ucomm после действий пользователя.
at user-command.
  if sy-ucomm = 'FREE'.
  free_seats = actfli-seatsmax - actfli-seatsocc.
  write: 'Number of free seats: ', free_seats.
endif.
*В программе статус GUI задается с помощью команды set pf-status


*-------------------------------------------------------
*
*           Выполнение программы-отчета
*
*-------------------------------------------------------
*Запуск программы-отчета из любой другой программы выполняется командой submit. При этом каждый критерий выборки вызываемого отчета можно задать в вызывающей программе с помощью дополнения with команды submit.
report abap1801.
  tables: customers, bookings.
  parameters p_date type d.
  select-options s_name for customers-name.
  select * from customers
          where name in s_name.
    write / customers-name.
    select * from bookings
            where order_date = p_date.
                  and id = customers-id.
      write: / bookings-carrid,
                bookings-connid,
                bookings-fldate.
    endselect.
  endselect.
* вызов предыдущего отчета с другими критериями:
report abap1802.
  tables customers.
  select-options s_name for customers-name.
  submit abap 1801
          with p_date = sy-datum
          with s_name in s_name.

submit abap1801
        via selection-screen. "вызов отчета с экраном выбора критериев

submit abap1801
      and return.
write 'Processed after report abap1801'.
*В процессе выполнения  команда submit останавливает  вызывающую программу и  выполняет  вызываемый отчет. Поэтому, если на экране присутствует список вызванных отчетов, а пользователь  нажимает на клавишу Back (возврат), то система "не возвращает его" в вызывающую программу, содержащую команду submit. Однако иногда необходимо продолжить выполнение вызывающей программы после вызова отчета. Для этого  в команде submit следует использовать дополнение and  return


страница 225

Комментарии

Популярные сообщения из этого блога

ABAP кратко

/h - start debugging  /hs - system debugging  /ha - debugging - no screens  l_         - локальная переменная с единственным значением lt_        - локальная таблица ls_       - локальная структура lr_        - локальная переменная типа Range lv_        - локальная переменная lty_     - локальный тип t_           - локальный тип p_        - параметр so_      - selection option <ls_>  - field symbol на структуру (все остальное по аналогии) lcl_      - локальный класс lo_       - объект rg_       - range range это внутренняя таблица, которая состоит из 4 полей: sign, options, low и high. По сути range это аналог select-options и заполняется точно также: SIGN = 'I' (включить) или 'E' (исключить), OPTIONS содержит о...

стандарт MM

Материал MM01 - Создание материала &   ME11 - Создание инфо-записи //внести артикул поставщика   CV04N - Поиск документа // сертификат смотреть здесь   MEK1 - Создание условий (закупки)   MR22 - Дебетование/кредитование материала   V/LD - Выполнение списка условий // просмотр (zs)   MM60 - Каталог материалов   Запас MB52 - Ведомость складских запасов // остатки, но сколько в резерве не указано   MB5B - Запасы на дату проводки // остатки на указанный период   MB5T - Запас в пути - БЕ // запас в пути   MMBE - Обзор запасов   Документ материала MB03 - Просмотреть документ материала   MB51 - Список документов материала // все движения по материалу (перемещения тут)   MBGR - Просмотреть ДокумМтрл к ПричДвижен //причина движения   MIGO - Движение материала ...

стандарт SD

Сбытовой заказ VA01 - Создание заказа клиента // возврат ZRE2   VK11 - Создать условие //ZSP1   V/LD - Выполнение списка условий // выгрузить прайс в эксель   VA05 - Список заказов VA05N - Список заказов   V.02 - Список неполных заказов   V_RA - Обработка отставаний: список выбора   Заявка ME51N - Создание заявки   ME55 - Групповое деблокирование заявок // для MM   ME54N - Деблокировать заявку //для MM   ME56 - Присвоение заявке источника поставки // присвоение договора   Печатные формы NACR - WFMC: ведение записей условий ВыхДок // привязать печатную форму   VL71 - ВыходДокументы из исходящих поставок // печать паллетного листа   Дебитор XD03 - Просмотр дебитора (центральный)   IDOC WE02 - Просмотреть IDOC   ...