Академический Документы
Профессиональный Документы
Культура Документы
4
M.Y.
Основы языка \В Л Р
№ 27 8С
Mo ПЗ 1668Q Г08Ч.2 мщения
М.Г. Борчанинов
М О С К В А - 2008
УДК 004
Б82
© Московский государственный
университет путей сообщения
(МИИТ), 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
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
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.
Петров 0018 1 6 7 8 ,0 0
Иванов 0015 1 4 8 7 ,3 0
Сидоров 0025 3 6 0 0 ,0 0
Петров 0018 1 6 7 8 ,0 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