*пример простой программы с двумя строками текста: 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
/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 содержит о...
Комментарии
Отправить комментарий