Вы находитесь на странице: 1из 48

Ьорчанннов M.l уч.

4
M.Y.
Основы языка \В Л Р
№ 27 8С
Mo ПЗ 1668Q Г08Ч.2 мщения

Кафедра “Автоматизированные системы управления”

М.Г. Борчанинов

ОСНОВЫ ЯЗЫКА АВАР


(часть 2)

Рекомендовано редакционно-издательским советом


университета в качестве методических указаний по дисциплине
"Корпоративные информационные системы"

Для студентов специальностей


"Автоматизированные системы обработки информации и
управления" И " И н ф п р м я п и п н н ы е ц .т р у я п п п г н н "

М О С К В А - 2008
УДК 004
Б82

Борчанинов М.Г. Основы языка АВАР. Часть 2: Методические


указания к лабораторным работам по дисциплине "Корпоративные
информационные системы". — М.: МИИТ, 2008 48 с.

В методических указаниях представлены сведения о языке


программирования АВАР - внутреннем языке корпоративной
информационной системы SAP R/3 фирмы SAP AG. Главное
внимание уделено методам хранения и преобразования данных
в системе SAP R/3 в форме таблиц, размещенных на сервере баз
данных, и внутренних таблиц, размещенных на сервере
приложений.

© Московский государственный
университет путей сообщения
(МИИТ), 2008
Содержание.
1. Введение.......................................................................4
2. Таблицы и структуры............................................. 5
3. Таблицы баз данных................................................. 6
4. Совместная работа с таблицами баз данных и
внутренними таблицами.................................................. 11
5. Использование внутренних таблиц...................16
5.1. Создание внутренних таблиц.....................................16
5.2. Заполнение внутренней таблицы.............................. 20
5.3. Оператор move-corresponding........................... 21
5.4. Чтение строк из внутренней таблицы...................... 27
5.5. Изменения во внутренней таблице........................... 35
6. Управление при работе с внутренними
таблицами............................................................................ 38
7. Порядок выполнения работы.............................. 40
8. Рабочее задание............................................... 42
Лабораторная работа № 3............................. 42
Лабораторная работа № 4..................................................43
9. Содержание отчета..............................................44
10. Литература........................................................... 44
11. Тезаурус к методическим указаниям...............45

Цель: лабораторные работы предназначены для изучения


синтаксиса и базовых операций АВАР - внутреннего языка
корпоративной информационной системы SAP R/3. Эти
лабораторные работы являются продолжением цикла, начатого
в методических указаниях «Основы языка АВАР (часть 1)» [3].
1. Введение.
Корпоративная информационная система SAP R/3 фирмы
SAP AG предназначена для автоматизации бизнес-процессов на
средних и крупных предприятиях. Она фактически стала
стандартом информатизации самых крупных корпораций во
всем мире и, в настоящее время, широко используется
крупнейшими российскими предприятиями. Система SAP R/3
обеспечивает выполнение всех рутинных операций по
управлению любыми подразделениями предприятия в их
взаимосвязи. Это позволяет руководству сосредоточиться на
перспективных целях и контроле выполнения стратегических
планов.
Корпоративная информационная система SAP R/3
содержит в своем составе инструментальные средства
разработки, отладки и сопровождения модулей системы.
Причем править, отлаживать и сопровождать можно только
модули своей разработки, а в модули, поставляемые с системой,
нельзя вносить изменения. Их защищает специальный ключ,
который можно получить на фирме SAP AG, но, в этом случае,
фирма снимает с себя ответственность за дальнейшую
эксплуатацию системы.
Основы работы с инструментальными средствами
разработки были рассмотрены в методических указаниях
«Основы языка АВАР (часть 1)» [3]. Настоящие методические
указания «Основы языка АВАР (часть 2)» являются продолжением
первой части, и предполагают, что учащиеся ознакомились с
содержанием первой части и выполнили задания по лабораторным
работам 1 и 2. Поэтому в этой части приведены задания к
лабораторным работам 3 и 4. Если в первой части рассматривались
только особенности самого языка, то в этой части уже
просматривается структура системы, главной особенностью
которой является широкое использование при обработке данных из
таблиц БД внутренних таблиц, располагающихся в оперативной
памяти. Такой подход повышает скорость обработки данных, но,
одновременно, повышает требования к объему оперативной памяти.
Прикладные программы в SAP R/3 обычно содержат
обращения к большому числу таблиц баз данных. Таблицы баз
данных определены в АВАР-словаре и, в зависимости от
настроек системы, могут оставаться незаполненными, или
заполняться пользователями при нормальной эксплуатации
системы. Таблицы связаны между собой через ключевые поля.
Каждая связь соединяет две таблицы и имеет стороны
первичного и вторичного ключа. Первичный ключ обладает
свойством уникальности, то есть значения этого ключа не
повторяются. Вторичный ключ может содержать в любом
количестве значения, существующие в первичном ключе.
Нарушение этих принципов приводит к нарушению
целостности базы данных.
Обычно информационные системы работают
непосредственно с таблицами баз данных, считывая и
записывая в них данные по мере необходимости. В SAP R/3
предусмотрена другая технология общения. Очень часто
создаются внутренние таблицы, куда копируется часть данных
(или все данные) из таблицы баз данных, и с этими таблицами
ведется оперативное общение. Такая технология общения
существенно ускоряет взаимодействие пользователя с нужными
ему данными.
В первой части указаний рассмотрены типы и объекты
данных. Сложные типы представлены структурами и
таблицами. Структура в описаниях языка АВАР - это очень
многозначное понятие. С одной стороны, структура - это
объект данных, то есть физическое понятие, имеющее
представительство в оперативной памяти системы с четко
определенным объемом. С другой стороны, структура •- это тип
данных, то есть описание, относящееся к структуре, как к
объекту данных, так и к отдельной строке таблицы. Структурой
также является буфер, необходимый для передачи данных
между таблицами. Этим буфером может быть структура, как
объект данных, или «головная строка» - структура, как
составной элемент внутренней таблицы (подробности далее).
Наконец, понятие - глубоко структурированная структура,
говорит о том, что поля структуры могут быть структурами или
таблицами, причем степень вложения таких структур может
быть велика. Кроме того, трудно обойтись без понятия
«структу ра», говоря о физической структуре таблиц, например,
включающих головную строку.
Строки внутренних таблиц представляют собой структуры
(как объекты). Все строки одной внутренней таблицы имеют
одинаковую структуру (как тип). Внутренние таблицы могут
иметь структуру (как тип), совпадающую со структурой
соответствующей таблицы баз данных, а могут иметь
оригинальную структуру, если используются для
промежуточных вычислений. Больше того, в отличие от таблиц
баз данных, внутренние таблицы могут быть глубоко
структурированными. Использование таких таблиц повышает
гибкость и выразительность соответствующих блоков
программ, написанных на языке АВАР/4.
Для передачи данных между внутренней таблицей и
таблицей баз данных или между двумя внутренними таблицами
используется специальная буферная область, представляющая
собой структуру. Структура буферной области совпадает со
структурой строки соответствующей внутренней таблицы. Если
структуры двух внутренних таблиц, участвующих в передаче
данных, не совпадают, то для передачи данных нужны два
буфера, соответствующих структур.
3. Таблицы баз данных.
Для демонстрации возможностей различных операторов
языка АВАР/4 при работе с внутренними и внешними
таблицами нужно воспользоваться несколькими заполненными
таблицами баз данных. Будем пользоваться таблицами,
относящимися к работе туристического агентства:
customers - таблица клиентов туристического агентства;
carriers - таблица транспортных компаний;
planfli - таблица возможных рейсов между городами;
actfli - таблица реальных рейсов;
bookings - таблица заказов клиентов на авиабилеты.
Пример заполнения таблицы customers.
id паше city telephon
00000001 Иванов Москва 284-48-55
00000003 Петров Самара 264-33-25
00000025 Сидоров Пермь 227-56-37
1 12345678 Кузнецов - Саратов 223-43-52
В этой таблице названия полей означают следующее:
id - номер клиента, первичный ключ и уникальный
номер; это поле может использоваться всеми
связанными таблицами для получения информации о
клиенте, содержащейся в других полях таблицы;
паше - фамилия клиента;
city - город, в котором проживает клиент
telephon - телефон клиента.
Пример заполнения таблицы carriers.
carrid carrname currcode
ДАЛ Домодедовские авиалинии RR |
САЛ Сибирские авиалинии rr ;
AL ALITALIA ITL
В этой таблице катания, колей, означают следующее-,
carrid - код авиакомпании, ключевое поле;
conn id - название компании,
currcode - используемая валюта.
carrid connid | cityfrom cityto fltime deptime
ДАЛ оою | Москва Норильск 1 053700
САЛ 0356 | Томск Саратов 3 167400
AL 3214 i Москва . ...Рим ___1 7 .J 004500
В этой таблице названия полей означают следующее:
carrid - код авиакомпании;
connid - код связи с пунктом назначения, первые два поля
являются ключем;
cityfrom -- город вылета;
cityto - пункт назначения;
fltime - общее время полета
deptime - код времени вылета
Пример заполнения таблицы actfli.
carrid connid fldate | price currency seatsocc
ДАЛ оою 20050507 2400 RR 105
САЛ 0356 20050612j 1800 RR 36
AL ! 3214 10050623 120 USD 135
В этой таблице названия полей означают следующее:
carrid - код авиакомпании;
connid - код связи с пунктам назначения;
fldate - дата вылета, первые три поля являются ключем;
price - стоимость полета;
currency - валюта;
seatsocc - число занятых мест в самолете;
... ............... SAP
#| »' ; Л ©0в В*£ 'Щ'ЬОО ай
Сяоварь;просмотртабпицы
4»:»>,,7,,,„}
---- <Й1
!Н?ft>J— ;.оЬ ' ,с£»---■
---- : qV .„ £
'-В :8&
:.*»-.{^
< ;®■Те»л*«сииеп_а...раметрык*тройки.'ИвДв1tfcu./; Дрпопй.CTpyw
лТГГггу~ tw
>a—
:
легат:. . Щ
«здцвеггу.1. Vg
Г АДО/4-кмкга;.*дееы '
ШЁШШШШШ
<*ойст** 4 : froerawcsHведение. ' Поля- £. ш ж т

рис 1. Структура внутренней таблицы actfli (частично)


ш b r -,:m !. ^ QrVv-r.-.-.r* Г 1 .Ь 1,■ •''S.i'mh : ...>‘ ЛЧ «.IV -11 ; . SAP
©1 J: . ■у в©в о к а ®oaa ®й @Щ
b p av jep д а н н ы х: т з б т т э АС TFU, со в па де ни и 9
i s ? т а а Проверочная таблица

!* и ш ? е ^ й |ф И И 1 й ш я & ж ЩШШЖШШ (дЯ Ф гксУ m ( • M V M IS ! RfcYHUrrS'J*

ht u
, 8-00 AL 3214 2 3 .0 6 .2 0 0 5 1 2 0 ,0 0 USD 0 0 ,0 0
SOQ ДАЛ оою 0 7 .0 5 .2 0 0 5 2 .4 0 0 ,0 0 RR 120 105 0 ,0 0
600 ДАЛ 0138 0 6 .0 S .2 C C 5 3 .1 2 0 ,0 0 RR 0 30 0 ,0 0
воо ДАЛ 0138 0 8 .0 5 .2 0 0 5 3 .1 2 0 ,0 0 RR 0 51 0 ,0 0
аоо ДАЛ 0223 0 9 .0 5 .2 0 0 5 4 .5 0 0 ,0 0 RR 0 62 0 ,0 0
800 ДАВ 0223 1 5 .0 S .2005 4 .5 5 0 ,0 0 PR c 17 3 ,0 0
800 САЛ OlZfi 0 4 .0 5 .2 0 0 5 4 .8 1 0 ,0 0 RR 0 35 0 ,0 0
. |в 5 0 СМ 0356 1 2 .0 6 .2 0 0 5 1 .8 0 0 ,0 0 RR 36 36 0 ,0 0
...]в» 0 САХ 040$ 0 3 .0 5 .2 0 0 5 3 . S 2 0 ,0 0 PR 0 21 0 ,0 0

рис 2. Заполнение внутренней таблицы actfli (частично)


carrid connid fldate bookid customid orderdate
ДАЛ 0010 20050507 001 00000025 2050201
САЛ 0356 20050612 002 00000003 2050312
AL 3214 10050623 007 00000025 2050201
В этой таблице в составной первичный ключ входят
четыре первых поля, а названия полей означают следующее:
bookid - номер записи в регистрационной книге;
customid - номер клиента;
order date - дата регистрации клиента;
На практике все эти таблицы содержат больше полей, но
для целей демонстрации возможностей команд языка АВАР/4
приведенного вполне достаточно.
ру> А В Л Р с п о н а р ь : о т н о ш е н и я п о е * « * ш н е н у кпм Э чу
Объекты СД Обработать Перейти к Утилиты Параметры настройки Ракурс Справ.

& т elelei bihmi в| 244


€lllia|Q{lM| ИЙ|^ Входящие Исходящие | Проверочные таблицы |<*Я Таблица внешнего ключа ]1Ш|
“ Область представления------------------------------- " — ----------------------------------------------- ' — ' — — — —— — — —

рис 3. Связи между внутренними таблицами


4. Совместная работа с таблицами баз данных и
внутренними таблицами.
В этом разделе будут рассмотрены различные применения
оператора select для чтения всей таблицы и выборки строк по
заданному запросу. Допустим, менеджеру тур агентства
требуется ознакомиться с полным списком клиентов этого
агентства. Для этого в программе должен быть доступен
следующий блок,
tables customers.
select * from customers.
write: / customers-name.
endselect.
Первая строка с оператором tables всегда присутствует в
блоке, если далее действия будут связаны с обработкой с
таблиц баз данных. После оператора tables перечисляются
используемые таблицы. Такая конструкция обеспечивает
создание рабочей области, структура которой совпадает со
структурой таблицы базы данных, как она описана в АВАР-
словаре. Эта область служит для перемещения строк из таблицы
базы данных в область печати. Перебор будет вестись по всем
строкам таблицы базы данных. В результате выполнения блока
появится список всех клиентов агентства.
Те же действия можно описать другим образом,
tables customers,
data s_customer like customers.
select * from customers into s_customer.
write: / s-customer-name.
endselect.
В этом случае рабочая область явно задана структурой
s_customer, совпадающей со структурой строки таблицы
customers. Строки таблицы базы данных последовательно
переписываются в эту структуру, а затем уже из нее выводятся
на печать.
Эффективность приведенных конструкций одинакова,
однако первую из них следует применять в простейших
случаях. Вторая обеспечивает лучший контроль за процедурой
передачи данных и может использоваться в более сложных
случаях, например, когда нужно сравнивать разные записи или
хранить считанную запись о клиенте некоторое время.
Ту же операцию можно проделать более эффективно,
правда, истратив больше места в оперативной памяти,
tables customers.
data t_customer like table of customers
with header line.
select * from customers into table t_customer.
loop at t_customer.
write: / t-customer-name.
endloop.
Теперь для временного хранения данных использована
внутренняя таблица. Особенности работы с внутренними
таблицами, в том числе и организация цикла loop/endloop ,
будут подробно рассмотрены в следующем разделе. Здесь
следует сказать, что последний пример существенно отличается
от первых двух. Если в первых двух примерах из внешней
таблицы считывалось по одной строке, и эта строка сразу
выводилась на печать, то в последнем случае считывается сразу
вся таблица. Затем строки выводятся уже из внутренней
таблицы. Если при работе достаточно свободной оперативной
памяти, то такая конструкция может выполниться быстрее.
Если памяти недостаточно, то можно снизить
производительность приложения.
Для отбора строк в процессе считывания, в оператор select
можно вставить дополнительную конструкцию с ключевым
словом where. В эту конструкцию вносится условие
прохождения строк для дальнейшей обработки. Операторы
записи условий во многом совпадают с условиями для
оператора if, но есть и отличия.
символы буквенные считывание строки
математических символы выполняется, если
операций
a=b a eq b а равно b
a>b agt b а больше b
a<b a It b а меньше b
a<>b а пе b а не равно b
a>=b a ge b а не меньше b
a<=b a le b а не больше b
нет символа a between b and с интервал между а и
b
нет символа like шаблон отбора
нет символа in(a,b,c,) совпадение с одним
.
из а,Ь,с,.
Допустим из таблицы actfli нужно отобрать все рейсы,
вылетающие 12 июня 2005 года. Блок операторов для этой цели
будет выглядеть следующим образом.
tables actfli.
data t_flight like table of actfli
with header line.
select * from actfli into table t_flight
where fldate = ‘20050612’.
loop.
write: / t_flight-seatsocc.
endloop.
В результате будет отпечатано количество свободных мест
на тех рейсах, которые отправляются 12 июня 2005 года.
Большинство условий из таблицы могут быть использованы
совместно через логические операторы and или or.
tables actfli.
data t_flight like table of actfli
with header line.
select * from actfli into table t_flight
where fldate = ‘20050612’ and carrid = ‘САЛ’.
loop.
write: I t_flight-seatsocc.
endloop.
В этом случае, из строк отобранных по дате будут
исключены те, которые не относятся к компании Сибирские
авиалинии.
Шаблон отбора позволяет отобрать нечетко
сформулированные значения строчных полей. Например,
конструкция ‘С%’ означает, что будут отобраны строки любой
длины, начинающиеся с буквы С - Смирнов, Сидоров и так
далее. Знак подчеркивания означает, что на этом месте
может находиться любой другой знак. Конструкция ' _н’
означает, что будут отобраны строки длиной в три знака,
последний из которых, буква !н' - тон, лён, но не слон,
tables customers.
data t_customer like table of customers
with header line.
select * from customers into table t_customer
where name like ‘C%’.
loop.
write: / t customer-name.
endloop.
Если отбор ведется по ключевому полю, то на равенство
конкретному значению в условии отбора будет найдена
единственная запись. Такой отбор проводится по оператору
select single. , а в операторе where указываются все поля
первичного ключа. После выполнения операции требуется
проверка правильности ее выполнения, поскольку единственная
искомая запись может отсутствовать в таблице,
tables customers.
select single * from customers
where id eq ‘00000025’.
if sy-subrc = 0.
write: / customers-name.
else.
write ‘клиент не найден’.
endif.
Следует обратить внимание на то, что в качестве условия
отбора с select single используются только логические
операторы = или eq. Только они обеспечиваю единственность
выбора. Проверка исполнения условия отбора проводится по
значению системной переменной sy-subrc. Она принимает
нулевое значение, только если операция проведена успешно. В
остальных случаях попытка использовать результат отбора
может привести к останову из-за системной ошибки.
Оператор select позволяет не только отбирать нужные
строки из внешней таблицы, но и упорядочивать отобранные
строки по выбранному полю,
tables customers.
select * from customers
order by city name.
write: / customers- city,
customers-name.
endselect.
Здесь за оператором order be следуют имена полей, по
которым должны упорядочиваться выбираемые строки
таблицы. В данном случае, таблица сначала упорядочивается по
именам городов, а внутри блоков строк, относящихся к городу,
по фамилиям клиентов. В таком виде список выдается на
печать.
В принципе, возможен другой способ упорядочения строк:
переписать все строки во внутреннюю таблицу, а затем
упорядочить их. Этот способ использует специфические
механизмы языка АВАР/4. Эта технология будет рассмотрена в
следующем разделе.
Рассмотренная здесь технология существенно отличается
от механизмов систем управления базами данных (СУБД). В
данном случае язык АВАР/4 не использует механизмов СУБД.
Управление перехватывается методами SAP R/3 с отключением
механизмов СУБД.
Если поля будут сортироваться по ключевым полям, то
нужно использовать дополнение order by prim ary key.
5. Использование внутренних таблиц.
5.1. Создание внутренних таблиц.
Внутренние таблицы обычно создаются с помощью
ключевого слова data. В этом случае, таблица существует, пока
активен модуль, в котором она создана. Внутренняя таблица
является динамическим объектом, и содержит столько строк,
сколько в нее было считано или создано другим способом.
Описание таблицы отличается от описания структуры
наличием ключевого слова occurs, за которым следует
параметр. Этот параметр (числовое значение) не имеет
отношения к количеству строк в таблице, а влияет только на
размер рабочей области в оперативной памяти. Количество
строк во внутренней таблице не ограничено, однако, оно
должно быть таким, чтобы не превысить объема виртуальной
памяти.
tables customers.
data t_customer like customers occurs 100.
Внутренние таблицы могут также создаваться с помощью
ключевого слова table,
types begin of t_city,
name like customer-name,
city like customer-city,
end of t_city.
data vr_city like table of t_city.
Первая из рассмотренных форм декларации таблиц
устарела, она была основной до версии 4.0, позднее основной
стала форма с использованием слова table. Это изменение в
языке связано с появлением нового типа переменных -
табличного.
Кроме того, в определении могут присутствовать
уточнения, sorted и hashed для сортированных и
хешированных таблиц соответственно. Для сортированных
таблиц задается порядок сортировки. Доступ к ним обычный,
через головную строку или специальную рабочую область,
data vr_city like sorted table of t_city with unique key
name.
Такое определение таблицы обязательно должно
содержать ссылку на ключ, по которому и будет
упорядочиваться таблица. Таблица упорядочивается
параллельно с вводом данных.
Хешированные таблицы не имеют головной строки и
доступ к ним осуществляется через специальный механизм
хеширования, алгоритм которого зашит в системе. Определение
должно содержать ссылку на уникальный ключ,
types t_city like customer.
data vr_city like hashed table of t_city with unique key id.
Внутренние таблицы обычно используются как
«моментальные снимки» с таблиц баз данных. Работа с такими
снимками ускоряет общую работу системы, если в оперативной
памяти хватает места для хранения таблиц. Структура
внутренней таблицы может отличаться от внешней. Как
правило, во внутренней таблице появляются дополнительные
поля для хранения служебной информации. Но внутренние
таблицы могут иметь и самостоятельное значение. Внутренние
таблицы могут быть глубоко структурированными, т.е.
содержат вложенные структуры или даже внутренние таблицы.
Работа с такими таблицами делает язык АВАР/4 более гибким и
выразительным, чем обычные языки управления реляционными
базами данных. Иногда внутренние таблицы создаются вне
связи с таблицами баз данных. Это делается для решения
некоторых технологических задач, например, вывода отчетов.
Большим преимуществом внутренних таблиц оказывается
то, что они могут храниться в памяти достаточно долго, не
исчезать при потере активности, и к моменту следующего
обращения оказываются заполненными старыми данными.
Такие таблицы требуют статического распределения памяти и
создаются не с помощью ключевого слова data, а с помощью
ключевого слова statics. В остальном описание таблицы не
отличается от рассмотренного ранее. Статически определенные
внутренние таблицы требуют написания специальных процедур
для окончания работы и удаления их из памяти,
tables customers.
statics t_customer like table of customers.
Как уже отмечалось, для взаимодействия внутренних
таблиц с таблицами баз данных и между собой требуется
специальная рабочая область, структура которой совпадает со
структурой строки таблицы. Чаще всего, в качестве такой
области создается специальная структура, называемая
«головной строкой таблицы». Головная строка имеет ту же
№ поле a поле b поле с структуру, что и
3 a3 ЬЗ сЗ любая строка

таблицы, но ведет
поле a поле b поле c

1 a1 Ы cl
№ поле а поле b поле с себя относительно
1 d
а1 М
самостоятельно,
ГЧ
_Q

2 a2 c2
2 а2 Ь2 с2
3 a3 b3 c3
3 аЗ ЬЗ сЗ
например, при
4 a4 b4 c4
удалении всех
Таблица БД Внутренняя таблица строк в таблице, в
Рис -4.•Передагш-данных.'черечтолк>вн>’ю*строк\' j головной строке
хранится
последняя считанная строка,
tables customers.
data t_customer like table of customers
with header line.
Не всякая внутренняя таблица может иметь головную
строку. Глубоко структурированная таблица, содержащая
внутренние
№ поле а поле b поле с структуры или
3 аЭ ЬЗ сЗ таблицы, не может
Структура
иметь головной
№ поле а поле Ь поле с N9 поле а поле Ь поле с
1 а1 м d 1 а1 Ы d
строки. В этом
2 а2 Ь2 с2 2 а2 Ь2 с2 случае, для
3 аЗ ЬЗ сЗ 3 аЗ ЬЗ сЗ передачи данных
4 а4 Ь4 с4
создается
Таблица БД Внутренняя таблица
специальная
Р и с.5. П ередача данных через буферную структуру. структура,
имеющая явное определение. Работа с такой структурой
идентична работе с головной строкой таблицы. Однако,
использование головной строки удобнее и текст становится
более ясным для понимания.
Внутренняя таблица с головной строкой имеет следующий
вид:
carrid connid cityfrom cityto fltime | deptime
Головная строка
САЛ 0647 i Новосибирск Адлер } 4 056700
Тело таблицы
ДАЛ ; 0010 Москва Норильск 1 053700
САЛ 0356 Томск Саратов 3 167400
САЛ 0647 Новосибирск Адлер 4 056700
AL 3214 Москва Рим 7 004500
Здесь содержание головной строки и одной из строк
таблицы совпадают, и сразу видно, какая из строк введена
последней. Строки внутренней таблицы заполняются с
помощью операторов select, append, insert и move.
Большинство из них различают команды, связанные со
строками таблицы и с головной строкой. Команда move не
делает различий между строками таблицы и головной строкой,
и нужны специальные средства для пояснений.
5.2. Заполнение внутренней таблицы.
Строки внутренней таблицы заполняются с помощью
операторов append, insert и move. Большинство из них
различают команды, связанные со строками таблицы и с
головной строкой. Команда move не делает различий между
строками таблицы и головной строкой, и нужны специальные
средства для пояснений.
Источником данных для заполнения внутренней таблицы
может быть таблица баз данных, структура или другая
внутренняя таблица. Кроме того, передача данных во
внутреннюю таблицу идет через буферную область - структуру,
обязательно совпадающую со структурой записи таблицы. Если
эта буферная область представлена головной строкой таблицы,
го текстуально перепись через буферную область выглядит
просто как запись в таблицу. При записи в таблицу через
специальную буферную область, необходимо прописывать все
действия в явном виде. В рассмотренных случаях, собственно
для записи строки в таблицу используется оператор append.
При этом оператор append используется только для переписи
данных из буферной области во внутреннюю таблицу. Передача
данных в буферную область из внешних источников
производится оператором move,
tables actfli.
data tabH like standard table of actfli with header line,
select * from actfli into table tabu.
В этом случае все содержимое таблицы БД actfli
построчно переписывается во внутреннюю таблицу tab 1. Вся
операция проводится одним оператором.
Часто при создании таблицы возникает потребность
ввести в нее несколько строк, полученных в результате
вычислений или действий оператора. Если расположение строк
в результирующей таблице не имеет значения, то можно
воспользоваться оператором append и вводить их в порядке
поступления.
data: begin of t_dohod, name(16) type c, t_nurn type
i, v dohod type p decimals 2, end of t_dohod.
data vr_dohod like standard table of t_dohod with
header line.
vr_dohod-name = 'Иванов'.
vr_dohod-t_num = 15.
vr_dohod-v_dohod = '5430'.
append vr_dohod.

5.3. Оператор move-corresponding.


Передача данных производится из внешних источников
оператором move только в том случае, если структуры
внутренней таблицы и внешнего источника совпадают. Часто
возникает потребность переписать данные из таблицы баз
данных во внутреннюю таблицу, отличную от внешней
таблицы по структуре. Во внутренней таблице может
отсутствовать ряд полей из таблицы баз данных, что позволяет
экономить оперативную память. С другой стороны, в ней могут
присутствовать поля для хранения технологических данных.
Все это не позволяет переписывать данные оператором move.
Для передачи данных между таблицами, структуры
которых совпадают не полностью, существует оператор move-
corresponding. Этот оператор позволяет переписывать из одной
таблицы в другую только те поля, описания которых полностью
совпадают. Оператор имеет ограничения в применении, он
может использоваться для передачи данных между структурами
и, соответственно, между внутренними таблицами с головной
строкой. Для передачи данных, из таблиц баз данных нужно
явно прописать буферную структуру, совпадающую со строкой
таблицы БД. Переписать строку туда, а затем оператором move-
corresponding во внутреннюю таблицу через головную строку.
В приведенном далее примере оператор move-
corresponding обеспечивает перепись только нужных полей в
головную строку таблицы short fli из буферной области
long fli, структура которой совпадает со структурой таблицы
баз данных actfli. Затем из головной строки оператором append
to содержимое этих полей переписывается во внутреннюю
таблицу. Таким образом, строка во внутренней таблице
занимает значительно меньше места, чем в таблице базы
данных.
tables actfli.
types begin of short_type,
carrid like actfli-carrid,
fldate like actfli-fldate,
seatsocc like actfli-seatsocc,
end of short_type.
data long_fli like actfli.
data short_fli table type short_type with header line,
select * from actfli into long_fli.
move-corresponding long_fli to short_fli.
append short_fli.
endselect.
loop at short_fli.
write: / short_fli-carrid, short_fli-fldate, short_fli-
seatsocc.
endloop.
Команда append вставляет во внутреннюю таблицу строки
в порядке их поступления. Не всегда такой порядок следования
строк совпадает с планами программиста. В программе можно
точно указать место внутренней таблицы, в которое следует
вставить очередную строку. Это действие выполняется
операцией insert, в которой явным образом прописывается
номер строки таблицы, в которую следует поместить строку из
22
рабочей области. Допустим, в последнем примере мы хотим
вставить содержимое рабочей области во вторую строку. Тогда
последняя часть примера приобретет вид:
select * from customers into table cust_city.
insert work_str into cust_city index 2.
Вторая строка в таблице, скорее всего, занята, однако, это
не помешает выполнению операции. Более того, данные,
расположенные в этой строке не пострадают, просто бывшая
вторая строка переместится на место третьей, сдвигая за собой
все остальные строки. Общая длина таблицы увеличится на
одну строку.
Часто возникает потребность ввести в таблицу сразу
несколько строк. Программа станет значительно быстрее, если
вводить эти строки не по одной, а воспользоваться
специальным выражением. Для этого надо иметь
дополнительную таблицу.
data: cust_city like table of t_city
with header line,
dop_str like table of cust_city.
He будем задаваться вопросом, откуда взялись строки в
таблице dop_str, но мы можем все их сразу записать в таблицу
cu stcity.
append lines of dop_str to cust_city.
В результате все строки из таблицы dop_str будут
записаны в конец таблицы cust_city.
Если нужно записать строки не в конец таблицы, а
начиная с заданного места, то следует воспользоваться
вариантом оператора insert.
data: cust_city like table of t_city
with header line,
dop_str like table of cust_city.
И далее:
insert lines of dop_str
from 7 to 11
into cust_city index 5.
В результате строки с седьмой по одиннадцатую из
таблицы d o p s tr будут записаны в таблицу cust_city, начиная
со строки 5. Таким образом, строка, которая раньше стояла на
позиции 5, теперь окажется на 10 месте, а места с 5 по 9 будут
заняты строками из таблицы dop_str. Скорость такой вставки
строк может превышать построчную в 20 раз.
В последней конструкции выражения с ключевыми
словами from или to могут быть опущены. Если опущено to, то
перепись начнется с указанной строки, а закончится на
последней строке таблицы dop_str. Если же опущено from, то
перепись начнется с первой строки, а закончится указанной
строкой этой таблицы.
При необходимости суммировать значения некоторых
полей для строк, у которых совпадают значения вторичных
ключей, можно воспользоваться специальной формой переписи
строк из одной таблицы в другую. Допустим, у нас есть таблица
с текущими доходами сотрудников, а требуется получить
таблицу с суммарными доходами этих сотрудников. Для этого
можно воспользоваться командой collect следующим образом.

data: begin of t_dohod,


name(16) type c,
t_num type i,
v_dohod type p decimals 2,
end of t_dohod.
data vr_dohod like standard table of t_dohod with
header line.
data sum_dohod like sorted table of t_dohod with
unique key name with header line.
write / 'Фамилия таб.номер к выдаче '.
vr_dohod-name = 'Иванов'. vr_dohod-t_num = 15.
vrdohod-vdohod = '2354,50'.
append vr dohod.
vr_dohod-name = 'Петров'. vr_dohod-t_num = 18.
vr_dohod-v_dohod = '1678,00'.
append vrdohod.
vr_dohod-name = 'Иванов'. vr_dohod-t_num = 15.
vr_dohod-v_dohod = '1487,30*.
append vr_dohod.
vr_dohod-name = 'Сидоров'. vr_dohod-t_num = 25.
vr_dohod-v_dohod = '3600,00'.
append vr dohod.
collect vr_dohod to sum_dohod.
loop at sum_dohod.
write: / sum_dohod-name, sum_dohod-t_num,
sum_dohod-v_dohod.
endloop.
В таблице su m dohod ключевые поля: фамилия (name) и
табельный номер сотрудника (t_num). Не ключевое поле
v_dohod - текущий доход сотрудника, должно быть числового
типа, поскольку по этому полю и будет проводиться
суммирование. Если в таблице siim_dohod есть строка,
совпадающая по ключу с текущей строкой из таблицы
vr_dohod, то новая строка в таблице sum dohod не заводится, а
значение не ключевых полей в совпадающей по ключу строке
увеличивается на соответствующие значение этих полей. В
данном примере, к строке с суммарным доходом сотрудника
прибавляется текущее значение дохода из переписываемой
строки. Значение системной переменной sy-tabix после этого
действия равняется номеру строки, в которую произведена
запись.
Принимающая таблица должна быть отсортирована,
поэтому в ее декларацию вставлено определение like sorted
table of, обеспечивающее ее сортировку по указанному далее
ключу.
Пусть таблица vr_dohod, имеет следующий вид:
Ф ам илия Т а б ел ь н ы й н ом ер Д оход в рублях
nam e tnum vdohod
Иванов 0015 2 3 5 4 ,5 0

Петров 0018 1 6 7 8 ,0 0

Иванов 0015 1 4 8 7 ,3 0

Сидоров 0025 3 6 0 0 ,0 0

Тогда после переписи первых двух строк, таблица


sum dohod будет иметь вид:
Ф ам илия Т абел ь н ы й н ом ер Д оход в рублях
Иванов 0015 2 3 5 4 ,5 0

Петров 0018 1 6 7 8 ,0 0

Значение системной переменной sy-tabix равно 2. После


переписи следующей строки:
Ф ам илия Т а б е л ь н ы й н ом ер Д оход в рублях
Иванов 0015 3 8 4 1 ,8 0

Петров 0018 1 6 7 8 ,0 0

sy-tabix = 1
После переписи последней строки:
Ф ам илия Т абел ь н ы й н ом ер ! Д о х о д в р убл я х
Иванов 0015 3 8 4 1 ,8 0

Петров 0018 1 6 7 8 ,0 0

Сидоров 0025 3 6 0 0 ,0 0

sy-tabix = 3
Команду collect следует использовать без дополнительных
действий и преобразований в блоке переписи таблицы. При
одновременном выполнении других действий, могут появиться
дублирующие строки в результирующей таблице
суммирования.
Если возникает потребность продублировать внутреннюю
таблицу, то можно воспользоваться простой конструкцией на
основе команды move.
types begin of t_dohod,
name(16) type c,
t_num type i,
v_ dohod type p decimals 2,
end of t_dohod.
data vr_dohod like table of t_dohod,
dr_dohod like table of t_dohod.
move vr_dohod to dr_dohod.
По этой команде все содержимое внутренней таблицы
vr_dohod переписывается в таблицу d rd o h o d . В другом
контексте та же самая команда будет означать совсем другое
действие.
tables customers.
data: t_customer like table of customers
with header line.
select single * from customers
where id eq ‘00000005’.
move customers to t_customer.
append t_customer.
Здесь строка с оператором move обеспечивает перепись
одной строки из таблицы базы данных в головную строку
внутренней таблицы t_customer. Затем эта строка заносится в
таблицу t customer командой append.
5.4. Чтение строк из внутренней таблицы.
Читать строки из внутренней таблицы можно для разных
целей: изменения, удаления, сравнения с другой строкой, но
чаще всего они читаются для вывода таблицы на экран
монитора. В этом случае, не нужно употреблять специальных
команд чтения из таблицы. Достаточно организовать цикл по
внутренней таблице, и дать команду вывода строк:
loop at vr_dohod.
write / vr dohod-name.
endloop.
Все строки внутренней таблицы будут выведены в том
порядке, в котором к этому моменту они оказались. Если нам
надо разместить строки в определенном порядке, то таблицу
следует предварительно отсортировать. Команды сортировки
рассмотрим позже, а пока познакомимся с особенностями
построчного последовательного вывода всех строк таблицы.
Оператор loop at, так же как и select, может иметь
уточняющие дополнения. Дополнение начинается с оператора
where, за которым следует логическое выражение или шаблон.
Это дополнение позволяет отбирать для вывода отдельные
строки, удовлетворяющие этому условию,
loop at vr_dohod
where t__num<20.
write / vr_dohod-name.
endloop.
В данном случае будут выведены фамилии только тех
работников, табельный номер которых меньше 20. В этой
конструкции допустимы все логические выражения,
рассмотренные ранее, а так же их сочетания.

loop at vr_dohod
where v_dohod>3000 and name cp ‘И%’.
write / vr_dohod-name.
endloop.
На это логическое выражение будут выведены
начинающиеся с буквы ‘И’ фамилии всех работников, с
доходом более 3000 рублей. Возможны и более сложные
конструкции, например, вложенные циклы:
data: begin of t_dohod,
name(16) type c,
t_num type i,
v_ dohod type p decimals 2,
end of t_dohod,
begin of t_otdel,
otd type i,
name(16) type c,
city type c,
tel(13) type c,
prof type c,
end of t_otdel,
rab(16) type c.
loop at vr_otdel where prof eq ‘инженер’.
rab = vr_otdel-name
loop at vr_dohod where name eq rab.
write: / vr_dohod-name, vr_dohod-
v_dohod.
endloop.
endloop.
Пусть таблица vr_otdel, имеет следующий вид:
Отдел Ф а м и л и я Город Телефон Должность
otd nam e c it y te l prof

001 Иванов Москва 095-684-48-35 инженер


00) Петров Москва 095-684-48-53 менеджер
002 Кузнецов Санкт-Петербург 8 I2-334-22-33 инженер
00! Сидоров Москва 095-l I l-18-ЗЗ менеджер
В результате работы этого фрагмента, в первом цикле
будут отобраны все инженеры из таблицы vr_otdel, а во
внутреннем цикле, из таблицы vr_dohod выведены строки с
фамилией инженера и его доходом.
Команды сортировки играют важную роль в работе с
внутренними таблицами. Во-первых, некоторые операции с
внутренними таблицами можно проводить, только если таблица
заранее отсортирована. Во-вторых, различные виды сортировки
позволяют по-разному взглянуть и разнообразно анализировать
данные внутренней таблицы. Наконец, скорость некоторых
операций после сортировки значительно увеличивается.
Самый очевидный способ сортировки - это использовать
команду sort. Например, если применить этот способ к таблице
vr_dohod:
types begin of t_dohod,
name(16) type c,
t_num type i,
v_ dohod type p decimals 2,
end of t_dohod.
data vr_dohod like table of t_dohod.
sort vr_dohod.
то эта таблица будет упорядочена в соответствии с
порядком следования полей в структуре таблицы. Сначала по
полю name, затем по полю t_num и, наконец, по полю v_dohod,
несмотря на то, что табельный номер для сотрудника уникален
и не может быть у порядочен. Результат сортировки приведен в
следующей таблице:

Фамилия Табельный номер Доход в рублях


name t num v_dohod
Иванов 0015 1487,30
Иванов 0015 2354,50
Петров 0018 1678,00
Сидоров 0025 3600,00
В данном случае правильнее было бы использовать
сортировку по заданному набору полей.
data vr_dohod like table of t_dohod.
sort vr_dohod by name v_dohod.
Результат сортировки будет такой же, как и в предыдущем
случае, однако, будет исключена бессмысленная сортировка по
полю t num.
В предыдущих сортировках не оговаривался порядок
сортировки по выбранным полям. По умолчанию сортировка
всегда проводится в сторону возрастания значений в полях.
Если нужен обратный порядок сортировки, то следует ввести
уточнение descending (в порядке убывания). При следующем
задании на сортировку:
data vr_dohod like table of t_dohod.
sort vr_dohod by v_dohod descending,
получим такой результат.
Фамилия Табельный номер Доход в рублях
name t num vdohod
Сидоров 0025 3600,00
Иванов 0015 2354,50
Петров 0018 1678,00
Иванов 0015 1487,30
Эту таблицу можно вывести целиком, как было показано
ранее, а можно вывести отдельные строки.
Строки из внутренней таблицы считываются с помощью
оператора read. Этот оператор обеспечивает поиск нужной
строки и чтение ее содержимого. Сведения о правильном
выполнении команды read заносятся в системную переменную
sy-subrc. Если чтение из таблицы успешно выполнено, то в sy-
subrc заносится ноль. Если нужная строка не найдена, то sy-
subrc не равно нулю. Перед поиском строки, все строки
таблицы должны быть упорядочены в соответствии с ключом,
по которому отыскивается строка. Проще всего найти
требуемую строку путем прямого указания ее номера,
read table vr_dohod index 4.
if sy-subrc = 0.
write / vr_dohod-name.
else.
write / ‘нет искомой строки’.
endif.
В данном случае предполагается, что таблица всегда
упорядочена по номерам своих строк, и событие ‘sy-subrc не
равно нулю’ случается, только если таблица оказалась короче,
чем ожидалось. Другое дело, что в содержимое строки с
выбранным номером зависит от порядка внутреннего
упорядочения таблицы. Если внутренняя таблица не
упорядочена, то возможны ошибки при поиске заданной
строки.
После целенаправленного чтения строки, перед
выполнением каких-либо действий с этой строкой, желательно
проверить успешность чтения по системной переменной sy-
subrc. Если строка не прочиталась, то выполнение дальнейших
действий может привести к системной ошибке.
Для таблиц баз данных самой естественной является
сортировка по первичному ключу. Для внутренней таблицы это
не характерно, поскольку внутренняя таблица не обязана иметь
первичный ключ. Зато для внутренней таблицы возможно
упорядочение по любому полю как по ключевому. Это
обеспечивает дополнение binary search, если содержимое поля
соответствует понятию ключа. Упорядочение внутренней
таблицы для бинарного поиска существенно увеличивает
скорость выполнения операций, требующих регулярности
таблицы. К таким операциям относится чтение строк
внутренней таблицы по некоторому критерию, особенно, если
таблица большой длины.
Из всех ранее рассмотренных внутренних таблиц, только
t_customer имеет уникальный ключ, поэтому возьмем для
примера ее.
read table t_customer with key id = ‘00000026’ binary
search.
if sy-subrc = 0.
write / t_customer-name.
else.
write / ‘нет искомой строки’.
endif.
В этом примере перед чтением строки проведена бинарная
сортировка, а затем нужная строка найдена быстро и
однозначно. Если строка с таким значением ключа отсутствует,
то будет выведено сообщение «нет искомой строки». Для
организации бинарного поиска не обязательно выбирать поле,
полностью соответствующее понятию ключа. Можно взять
несколько полей, и организовать бинарный поиск по ним.
types begin of t_dohod,
name(16) type c,
t_num type i,
v_ dohod type p decimals 2,
end of t_dohod.
data vr_dohod like table of t_dohod
with header line,
read vr_dohod with key
name = ‘Иванов’
t_num = ‘0015’
v_dohod = ‘2354,50’
binary search,
if sy-subrc = 0.
write: / vr_dohod-name, vr_dohod- v_dohod.
else.
write / ‘нет искомой строки’.
endif.
Команда read предполагает, что внутренняя таблица имеет
головную строку или рабочую область для размещения
считанной строки. Именно в эту область помещается найденная
строка таблицы.
types begin of t_dohod,
name(16) type c,
t_num type i,
v_ dohod type p decimals 2,
end of t_dohod.
data: vr_dohod like table of t_dohod,
work_str like t_dohod.
read vr_dohod to work_str with key
name = ‘Иванов’
t num * ‘0015’
v_dohod = ‘2354,50’
binary search,
if sy-subrc = 0.
write: / vr_dohod-name, vr_dohod- v_dohod.
else.
write / ‘нет искомой строки’.
endif.
В данном случае, считанная строка помещается в рабочую
область work_str. Однако, при переносе выбранной строки в
другую таблицу, специальную рабочую область описывать не
обязательно, достаточно вместе с оператором read
использовать ключевое слово into. В этом случае, рабочая
область необходимой структуры выделяется автоматически.
data: vr_dohod like table of t_dohod,
s_dohod like table of t_dohod.
read vr_dohod to s_dohod with key
name - ‘Иванов’
t_num = ‘0015’
v_dohod = ‘2354,50’
binary search.
Тем не менее, выделение специальной области для чтения
строки из внутренней таблицы обладает определенными
преимуществами перед автоматическими действиями. Когда
выбранная строка помещена в рабочую область, с ней
возможны различные действия, а не только перепись из одной
таблицы в другую.
5.5. Изменения во внутренней таблице.
Рассмотрим задачу внесения измерений во внутреннюю
таблицу. Простейший случай - изменение одной строки. Перед
внесением изменений надо убедиться, что такая строка
существует. Для этого требуется, что бы строка выбиралась по
уникальному ключу, а записи в таблице были по этому ключу
упорядочены. Самый простой вариант упорядочения таблицы
по ключу, это организация бинарного поиска (binary search) в
таблице.
types begin of t_dohod,
name(16) type c,
t_num type i,
v_ dohod type p decimals 2,
end of t_dohod.
data vr_dohod like table of t_dohod with header line,
read vr_dohod with key t_num = ‘0025’ binary search,
if sy-subrc = 0.
vr_dohod-name = ‘Кузнецов’.
vr_dohod-t_num = ‘0014’.
vrdohod-vdohod = ‘2838,50’.
insert vr_dohod index sy-tabix.
endif.
В данном случае использован тот факт, что после
прочтения строки таблицы в системной переменной sy-tabix
остается порядковый номер считанной строки. В этом примере
порядковый номер 4. Этот номер можно использовать для
возвращения вставляемой строки на то место, где находилась
считанная строка. Сама эта строка окажется отодвинутой на
следующее место. Таблица приобретет следующий вид:
Ф ам илия Т абел ьн ы й н ом ер Д оход в рублях
nam e tnum vdohod

Иванов 0015 2354,50


Петров 0018 1678,00
Иванов 0015 1487,30
Кузнецов 0014 2838,50
Сидоров 0025 3600,00
Строки можно вставлять и целыми группами. Тогда для
хранения вставляемых строк следует использовать другую
внутреннюю таблицу.
data: vr_dohod like table of t_dohod with header line,
dr_dohod like table of t_dohod with header line.
Если говорить об изменениях в таблицах, то этому
понятию больше соответствует внесение изменений в
найденную строку. Для этого используется оператор modify:
data vr_dohod like table of t_dohod with header line,
read vr_dohod with key t n u m = ‘0025’ binary search,
if sy-subrc = 0.
vr_dohod-name = ‘Сидоров’.
vr_dohod-t_num = ‘0024’.
vr_dohod-v_dohod = ‘3666,60’.
modify vr_dohod index sy-tabix.
endif.
Таблица приобретает вид:
Ф ам илия Т абел ьн ы й н ом ер Д оход в рублях
nam e tnum vdohod

Иванов 0015 2354,50


Петров 0018 1678,00
Иванов 0015 1487,30
Кузнецов 0014 2838,50
Сидоров 0025 3666,60
Не всегда для модификации строки таблицы нужно знать
ее порядковый номер. Если строка считана в рабочую область
или головную строку таблицы в цикле loop/endloop, то после
модификации операцией modify строка будет возвращена на
свое место. Рассмотрим введенную раньше таблицу vr_otdel. В
ней приведены телефоны сотрудников с кодом города. Внесем в
эту таблицу изменения, связанные с изменение кода города
Москвы с 095 на 495.
data vr_otdei like table of t_otdei with header line,
loop at vr_otdel where city = ‘Москва’,
replace '095' with '495' into vr_otdel-tel.
modify vr_otdel index,
endloop.
Таблица vr_otdeI после изменений приобретет следующий
вид:
Отдел Фамилия Город Телефон Должность
otd name city tel prof
001 Иванов Москва 495-684-48-35 инженер
001 Петров Москва 495-684-48-53 менеджер
002 Кузнецов Санкт-Петербург 812-334-22-33 инженер
001 | Сидоров Москва 495-111-18-33 менеджер
Для удаления одной или нескольких строк из внутренней
таблицы используется команда delete. Если удаляется одна
строка, то ее нужно сначала найти.
data vr_dohod like table of t_dohod with header line,
read vr_dohod with key t num = ‘0025’ binary search,
if sy-subrc = 0.
delete vr_dohod index sy-tabix.
endif.
Но для удаления группы можно использовать команду
delete с уточнением в виде логического условия или шаблона,
data vr_otdel like table of t_otdel dohod with header
line.
delete vr_otdel where otd>001.
или
delete vr_otdel where name cp ‘П%’.
Если внутренняя таблица определена как static, то после
окончания работы с ней, ее можно удалить из памяти операцией
refresh.
refresh vr_otdel.
Внутренние таблицы, не распределенные статически,
исчезают из памяти сами, как только работа с ними
прекращается.
6. Управление при работе с внутренними таблицами.
При работе с внутренними таблицами иногда возникает
необходимость выделять некоторые события в текущей
обработке, и выполнять связанные с этим действия.
Вычислительная конструкция создается при помощи
операторных скобок at/endat. Вместе с оператором at
используются определения уровней прерывания:
first - при начальном обращении к таблице;
last - при завершении таблицы;
new col - если содержимое поля col изменилось на этом
шаге прохода по таблице;
end of col - если содержимое поля col должно измениться
на следующем шаге прохода по таблице;
Последние два события предполагают, что таблица
упорядочена по полю col. В этом случае, изменение поля col
означает, что начала обрабатываться следующая группа
записей.
Сортировка внутренней таблицы может проводиться и по
сложному ключу. В этом случае, поле col может находиться не
на первом месте в этом ключе, а изменение поля col означает,
что начала обрабатываться следующая подгруппа записей
внутри очередной группы. В такой сложной сортировке,
последние два события выделяются, даже если в самом поле col
изменения не произошло, но группа сортировки изменилась, то
есть произошло изменение в одном из полей, старших, чем поле
col в иерархии сортировки,
types: begin of t__otdel,
otd type i,
name(16) type c,
city type c,
tel(13) type c,
prof type c,
end of t_otdel.
data: vr_otdel like sorted table of t_otdel with key otd
name,
vsego type i.
vsego = 0.
loop at vr_otdel.
at first
write ‘список сотрудников’,
endat.
at new otd
write: / ‘отдел ’, otd.
endat.
at end of otd
write: / ‘всего сотрудников в отделе: vsego.
vsego = 0.
endat.
vsego = vsego + 1.
write: / vsego, ‘. ’, name,
endloop.
В этом блоке команд, только две последние (перед
оператором endloop) выполняются на каждом шаге программы.
Все остальные команды выполняются по мере необходимости,
когда возникают соответствующие события. В начале работы с
таблицей печатается заголовок ‘список сотрудников’ и
заголовок ‘отдел 00Г, если, конечно, в этом отделе есть-
сотрудники. Затем выводится список сотрудников с номерами,
начиная с первого, в алфавитном порядке. В конце списка
отдела печатается строка: ‘всего сотрудников в отделе: ’ и их
число. Эта строка печатается до появления номера нового
отдела, то есть до печати названия следующего отдела.
Одновременно обнуляется счетчик числа сотрудников отдела,
так что после этой операции снова выводится список
сотрудников с номерами, начиная с первого. Итоговая строка
печатается и в конце всего списка, поскольку отсутствие нового
отдела - это тоже изменение ситуации.
7. Порядок выполнения работы
Для выполнения работы необходимо иметь доступ к
программному обеспечению - SAP Applycation Server,
установленному на выделенном сервере. На рабочей станции
должен быть установлен SAPlogon, настроенный на IP SAP
Applycation Server. Доступ к SAP AS может быть реализован по
локальной сети, по сети Internet или Intranet (СПД).
Пользователь не увидит разницы между этими подключениями.
На одном SAPlogon может быть зарегистрировано несколько
подключений к разным SAP AS. Для подключения к SAP AS
студент должен выбрать строку с именем подключения, нажать
кнопку “Регистрация”, в появившемся окне ввести логин и
пароль, указанные преподавателем. После подключения к SAP
AS студент увидит функциональное меню учебной системы. В
этом меню надо выбрать пункты: «Инструменты», «АВАР-
инструментальные средства», «Разработка» и, наконец, «АВАР-
редактор», или набрать в верхнем окошке имя транзакции SE38.
В открывшемся окне выбора программы надо набрать имя
создаваемой Вами программы. Обязательное условие: имя
программы должно начинаться с буквы z. Затем следует
название группы, три буквы фамилии и порядковый номер
создаваемой программы. Наконец нажмите кнопку «Создать».
Если программа с таким именем уже есть, то возьмите 4 буквы
фамилии.
После регистрации имени нажмите кнопку «изменить». В
ответ появится заготовка программы-отчета. Обратите
внимание на точку, завершающую последнюю строку. Вводите
Ваш текст после этой точки.
Обращайте внимание на правильную расстановку
пробелов, точек, запятых и двоеточий. Начинающие часто не
отделяют знак равенства и другие знаки пробелами от
идентификаторов, и, наоборот, ставят пробел между именем
идентификатора и числом знаков в скобках. Редактор строг к
пробелам, а замечания, которые он делает, часто невнятны.
После исправления синтаксических ошибок программу
надо активировать. Это можно сделать только после
исправления всех ошибок. После активации программа
становится доступной всем пользователям системы, и для
запуска на исполнение. При внесении исправлений после
активации, проверка синтаксических ошибок часто не
срабатывает, поскольку система видит текст активированной
программы. Но проверка синтаксиса возможна, если
попытаться активировать исправленный текст.
При запуске программы на исполнение окно с текстом
закрывается результатами, но только в том случае, если в
программе предусмотрена печать. Для возвращения к тексту
программы надо нажать кнопку с зеленой стрелкой налево.
Для завершения работы нужно в главном меню (наверху
экрана) выбрать пункт «Система», а в выпадающем меню -
«Выход из системы».
8. Рабочее задание
Лабораторная работа Ns 3.
Таблицы баз данных и внутренние таблицы.
Задан и е.

1. Используя средства просмотра АВ АР-словаря,


посмотреть структуру и содержимое таблицы баз
данных - actfli. Для этого можно использовать
транзакции: SE80 и SE16. Создать копии экранов
результатов и поместить в отчет.
2. Написать три программы для распечатки содержимого
таблицы баз данных - actfli. Первая - с прямой
печатью строк таблицы. Вторая - с печатью через
структуру, совпадающую со структурой таблицы баз
данных actfli. Третья - считывание содержимого
таблицы баз данных actfli во внутреннюю таблицу и
печать из нее. Печатать только заполненные поля
таблицы баз данных actfli. Снять копии экранов
результатов и поместить в отчет.
3. Отобрать из таблицы баз данных actfli строки в
соответствии с условием, заданным в предложенном
варианте. (Варианты зависят от набора данных в
таблице и предлагаются преподавателем в каждой
группе индивидуально.) Создать копии экранов
результатов и поместить в отчет.
4. Создать внутреннюю таблицу, включающую
отдельные столбцы таблицы баз данных actfli
(указанные в варианте). Использовать для заполнения
внутренней таблицы оператор move-corresponding.
Создать копии экранов результатов и поместить в
отчет.
варианты:
1. carrid connid fldate
2. carrid fldate price
3. carrid price currency
4- carrid currency seatsocc
5. fldate price currency
6. price currency seatsocc
7. currency seatsocc fldate
8. price currency connid
9. connid fldate currency
10. connid seatsocc currency
5. Создать внутреннюю таблицу и скопировать в нее
данные из таблицы баз данных actfli. Вставить перед
строкой 5 дополнительную строку. Содержание строки
в соответствии с вариантом. Создать копии экранов
результатов и поместить в отчет.
6. Создать внутреннюю таблицу и скопировать в нее
данные из таблицы баз данных actfli. Найти строку
таблицы в соответствии с вариантом. Вставить перед
ней дополнительную строку. Создать копии экранов
результатов и поместить в отчет.
Лабораторная работа № 4.
Преобразование внутренних таблиц.
Задан и е.

1.Создать две внутренних таблицы методом


формирования и добавления новых строк. Таблицы
имеют следующие атрибуты:
№ ФИО Табельный Должность Город Телефон
отдела сотрудника №
вторая:
№ п/п ФИО сотрудника j Табельный № [ Должность Зар. плата
Следует завести 3 отдела, в каждом отделе 3 сотрудника, у
каждого сотрудника зарплата за 3 месяца. Телефоны
записываются с кодом города. Один из городов - Москва.
Распечатать таблицу после ввода. Этот ввод будет
заготовкой для выполнения дальнейших заданий.
2. Отсортировать таблицу 2 по ФИО сотрудников.
3. Отсортировать таблицу 2 по должности и ФИО
сотрудников.
4. Отсортировать таблицу 2 по ФИО сотрудников в
обратном порядке.
5. Отобрать всех сотрудников отдела 2 по таблице 1,
вывести строки с их зарплатой из таблицы 2.
6. В таблице 1 заменить код города Москва с 495 на 499
везде, где он встречается.
7. Из таблицы 2 создать новую таблицу, в которой все
сотрудники должны встречаться однократно, а их
зарплаты должны быть просуммированы.
9. Содержание отчета
Отчет должен содержать:
1. Название и цель работы.
2. Результаты работы: текст программы на языке АВАР и
скриншоты результатов.
3. Пояснения к сделанному выбору программного решения.
10. Литература
1. Рюдигер Кречмер, Вольфганг Вейс. Разработка приложений
SAP R/3 на языке АВАР. Пер.с англ. Москва, издательство
«Лори», 2001 г.
2. документация АВАР Programming (ВС-АВАР) с сайта
http://help.sap.com/printdocu/core/Print46c/en/Data/htm/english.htm
3. Борчанинов М.Г. Основы языка АВАР. Часть 1. Методические
указания к лабораторным работам по дисциплине " Корпоративные
информационные системы ". — М.: МИИТ, 2008 г.
1. АВАР АВАР - Advanced Business Application
Programming - язык программирования четвертого
поколения. Предназначен для развитого
программирования бизнес-приложений. АВАР
разработан компанией SAP AG, и положен в
основу системы R/3 .
2. АВАР- АВАР-словарь содержит всю информацию
сло- об объектах информационной системы,
варь описанных глобально. Словарь содержит
метаданные о данных, записанных в таблицах БД.
3. SQL Structured Query Language - язык запросов
реляционных баз данных. В системе SAP R/3
представлен двумя составляющими: Open SQL и
Native SQL. Open SQL - это часть языка АВАР,
предназначенная для взаимодействия с базами
данных.Он не зависит от платформы базы данных.
Native SQL - внутренний язык системы
управления базы данных. Он зависит от
платформы БД, и передается в систему
управления БД без преобразований.
4. база База данных (БД) - это хранилище данных в
данных информационной системе, снабженное системой
управления (СУБД). В основе БД SAP могут
лежать различные стандарты баз данных: Oracle,
MS SQL Server и ряд других. При этом управление
данными производится на уровне системы
управления SAP. Разработчик программы на
АВАР обычно может не задумываться, какая
реализация БД размещена в системе.
5. Внут­ Внутренние таблицы используются для
ренняя временного хранения данных из таблиц баз
табли­ данных в оперативной памяти сервера
ца приложений; они значительно ускоряют
обработку данных за счет быстрого доступа. Они
используются для формирования и накопления
данных для вывода на печать.
6. голов- Головная строка внутренней таблицы - это
ная специально выделенная буферная область в
строка оперативной памяти, предназначенная для
временного хранения записей, поступающих для
записи в таблицу или для передачи в другие
таблицы. Структура головной строки совпадает со
структурой записей таблицы.
7. данные Данными называется любая информация,
собранная при управлении предприятием и
хранимая в базах данных. Данные используются
при текущем управлении предприятием, анализе
эффективности управления и прогнозе развития
бизнес-процессов.
8. декла- Все переменные, константы и структуры
рация должны быть продекларированы в программе до
начала их использования. Локальные переменные
описываются в процедурах и модулях, там, где
они используются. Блок деклараций в АВАР
программе выделяется в специальный модуль, и
располагается сразу после строки с названием
программы.
9. запись Записи - это строки таблицы. Записи
(строка внутренней таблицы представляют собой
таблиц структуры, причем все записи имеют одну и ту же
ы БД) структуру. Записи таблицы БД представляют
собой плоские структуры.
10. запрос Запрос - это основное средство общения
между клиентом и сервером в реляционных базах
данных. В частности, запрос позволяет разместить
в одной записи поля из разных, связанных между
собой таблиц. В системе SAP аналогичные
возможности предоставляют ракурсы.
11. Инсгру В комплексное окружение языка АВАР/4
мента­ входят инструментальные средства, предоставля­
льные ющие разработчику широкий выбор инструмен­
сред­ тария для создания, тестирования, регистрации и
ства хранения программных модулей. Эти же средства
обеспечивают просмотр, анализ и коррекцию
существующих программных элементов. Инстру­
ментарий АВАР/4 включает в себя: редактор
АВАР, интерфейс к АВАР-словарю, разработчик
моделей данных, построитель функций, постро­
итель меню, построитель экранов и ряд других.
12. Инфор­ Информационная система - это термин,
мацией используемый для обозначения двух разных
пая понятий. Во-первых это инструментальные сред­
систе­ ства для разработки информационных технологий.
ма Во-вторых, это конкретная реализация системы
управления предприятием, выполненная на
инструментальных средствах, и наполненная
данными, собранными при управлении этим
предприятием. Здесь под информационной
системой понимается конкретная реализация
системы со всей наполняющей ее информацией.
13. ключ Ключ таблчцы л SAP чомчтаю
(перви первичный ключ в реляционных базах данных.
чный Создание ключа обязательно для сортированных и
ключ) хешированных таблиц. Стандартные внутренние
таблицы могут и не иметь ключа. Этот ключ
задается специальным дополнением в строке
декларации таблицы. По умолчанию, ключ
создается уникальным, но можно создать не
уникальный ключ внутренней таблицы.
Борчанинов Михаил Георгиевич

ОСНОВЫ ЯЗЫКА АВАР


(часть 2)
Методические указания по дисциплине "Корпоративные
информационные системы"

Подписано в печать 2 9 . J2. 07. Тираж 100 экз.

уел.-п.л. 3,0 Заказ №?<?#Формат 60x84.16 Изд.№ 203-07

127994 Москва, ул. Образцова, 15.


Типография МИИТа

Вам также может понравиться