Главная страница

Р. Кречмер, В. Вейс - Разработка приложений SAP R3 на языке АВАР4. Р. Кречмер, В. Вейс - Разработка приложений SAP R3 на языке АВАР. Разработкаприложений sap r3Рюдигер Кречмерна языкеВольфганг Вейс


Скачать 28.36 Mb.
НазваниеРазработкаприложений sap r3Рюдигер Кречмерна языкеВольфганг Вейс
АнкорР. Кречмер, В. Вейс - Разработка приложений SAP R3 на языке АВАР4.pdf
Дата21.12.2017
Размер28.36 Mb.
Формат файлаpdf
Имя файлаР. Кречмер, В. Вейс - Разработка приложений SAP R3 на языке АВАР.pdf
ТипКнига
#12433
страница19 из 24
1   ...   16   17   18   19   20   21   22   23   24
Глава 23: Динамические языковые конструкции
Глава 24: Поля типа Field Symbol
Глава 25: Автоматическая генерация программы

Глава 23
Динамические языковые
конструкции
• Динамическое использование внутренних таблиц
• Динамические операции для работы
с базой данных
• Динамический вызов подпрограмм

268 Глава 23
До настоящего момента изучались исключительно статические
т.е. читая текст программы,
состоящей из таких команд, можно точно представить, как она будет выполняться. Например, если внутренняя таблица сортируется согласно правилам главы 12, то критерии сортировки заданы в про- грамме в явном виде. Однако иногда встречаются ситуации, когда программа должна реагировать на запросы, которые трудно предвидеть при ее разработке (например, сортировка внутренней таблицы должна производиться по критериям, определяемым конечным пользователем). Так, пользователь может отсортировать таблицу по значениям выбранного столбца, если дважды щелкнет мышью на столбце или управляющем элементе таблицы. В принципе, можно предусмотреть один и тот же стати- ческий алгоритм для всех вариантов сортировки. Однако такой подход приведет к созданию громозд- кого исходного текста программы, а любые новые модификации еще больше усложнят его. Всех этих проблем можно избежать, используя динамическую версию команды
Язык АВАР/4 содержит несколько динамических команд, позволяющих разработчику обрабатывать ситуации, в которых необходимая информация может быть получена только во время выполнения про- граммы. Эти динамические средства расширяют возможности и увеличивают гибкость прикладной про- граммы. В этой главе описываются наиболее важные динамические операции для работы с внутренними таблицами, с таблицами базы данных и для вызовов подпрограмм.
Динамические языковые конструкции делают программирование более гибким и позволя- ют
изящные решения многих задач. Но • то же время динамические
программы менее "читабельны" и не достаточно защищены, так как некоторые ошибки (например,
неверное имя поля) не определяются при синтаксической проверке, а обнаруживаются только на
этапе выполнения программы.
Операции с таблицами
Язык АВАР/4 позволяет использовать динамические команды как для работы с внутренними табли- цами, так и с таблицами баз данных.
Операции, используемые для внутренних таблиц и для таблиц базы
рассмотрены
в главах 11-13.
Динамические операторы для внутренних таблиц
Существует несколько динамических операций для работы с внутренними таблицами.
Динамическая команда sort
Типичное применение динамических операций с таблицами иллюстрируется следующим примером.
На экране выбора пользователь задает параметр, который управляет критерием сортировки внутренней таблицы. Без динамической версии команды sort пришлось бы разрабатывать сложный алгоритм, по- зволяющий предвидеть все возможные варианты для данного параметра. Пример подобной программы:

Динамические языковые конструкции 269
write: / all_customers-id,
all_customers-name,
all_customers-city,
all_customers-telephone,
endloop.
В данном примере значение поля сортировки по умолчанию — name. Оно может изменяться поль- зователем на экране критериев выбора до запуска программы (см. рис. 23.1).
Рис. 23.1
Пример использования
команды sort с экраном
выбора
После чтения таблицы базы данных customers во внутреннюю таблицу выполняется длинный оператор case, переключающий выполнение соответствующего статического оператора sort для разных значений полей сортировки. В завершение содержимое внутренней таблицы отображается в виде списка.
Основная проблема этого примера ясна: в программном тексте необходимо перечислить все возмож- ные значения критерия сортировки. К тому же, если внутренняя таблица или связанная с ней таблица
Dictionary изменяется (например, модифицируются имена полей), то программный текст тоже нужно корректировать.
Используя динамическую команду sort, можно значительно сократить объем программы, приведен- ной выше, например:
p a r a m e t e r s column(10) d e f a u l t 'NAME' .
t a b l e s c u s t o m e r s .
d a t a a l l _ c u s t o m e r s l i k e customers o c c u r s 100
w i t h h e a d e r l i n e .
s e l e c t * f r o m c u s t o m e r s i n t o t a b l e a l l _ c u s t o m e r s .
s o r t a l l _ c u s t o m e r s by (column) .
l o o p a t a l l _ c u s t o m e r s .
w r i t e : / a l l _ c u s t o m e r s - i d ,
all_customers-name,
a l l _ c u s t o m e r s - e i t y ,
а 1 1 _ с u s t o m e r s - t e l e p h o n e .
e n d l o o p .
Здесь при вводе имени поля таблицы в параметр column таблица будет отсортирована в порядке,
который определен в данном столбце. Синтаксически на динамическое использование команды sort ука- зывают круглые скобки, в которые заключено поле, содержащее критерий сортировки.
Для сортировки в порядке убывания можно добавить еще несколько динамических критериев сор- тировки:
10
Зак. 65

270 Глава 23
При динамическом использовании команды sort не нужно задавать все параметры сортировки при выполнении программы. Если какое-либо поле в круглых скобках окажется пустым, то команда не будет его использовать.
Если поле динамического оператора sort содержит имя, которое
• данную
таблицу, то система выведет сообщение об ошибке.
Динамическая команда read table
Ранее уже рассматривалось чтение одной строки внутренней таблицы с помощью задания ключа. В
динамической команде table разрешается задавать набор ключевых полей, заключенных в круглые скобки:
В данном примере ключевые поля по умолчанию — name и id — могут задаваться пользователем на экране выбора вместе с их значениями (см. рис. 23.2). После того как таблица базы данных customers будет считана во внутреннюю таблицу all_customers, команда table считает строку, введенную зователем. Пустые ключевые поля (так же, как и в команде sort) игнорируются.
Динамическое вычисление промежуточных сумм
Разработчик может определять подсуммы (или другие промежуточные результаты для набора значе- ний внутренней таблицы), используя в цикле группу команд at / endat. Например, операторы между "скобками" at new name и endat обрабатываются в том случае, если поле таблицы или одно из предшествующих ему полей было изменено. Если необходимо, чтобы уровень вычисления суммы определялся пользователем, можно задать имя поля таблицы в динамическом операторе at. Мо- дифицируем пример, приведенный в главе 12, для ввода в алгоритм программы действия пользователя при вычислении подсумм:

Динамические языковые конструкции 271
Рис. 23.2
Пример использования
команды read table
на экране выбора
В данном примере таблица базы данных во внутреннюю таблицу отсор- тированную по полям первичного ключа connid и fldate. Затем содержимое внутренней таблицы выводится на экран. Если пользователь дважды щелкнет мышью на каком-либо поле отображенной таб- лицы, то обработается событие at line-selection, и в программу будет передано имя указанного поля без префикса имени таблицы (для синтаксического анализа применяются команды get cursor и shift, рабо- тающие с переменной column). Это же имя динамической переменной столбца используется в последу- ющем цикле, в котором вычисляются подсуммы забронированных мест.
В данном разделе представлены различные возможности для динамической работы с внутренними таблицами. Теперь рассмотрим динамические операции для работы с таблицами базы данных.

272 Глава 23
Динамические команды Open SQL
Как уже рассматривалось в главах 11 и 13, команды Open SQL (select, insert, update, modify и delete)
поддерживают динамическое задание имени таблицы, поэтому динамический оператор select можно за- писать так:
В этом небольшом примере пользователь задает на экране выбора имя таблицы. Динамический опе- ратор select с дополнением count ( * ) определяет количество элементов в таблице. Так же, как и в предыдущих примерах, поле, содержащее динамически задаваемое имя таблицы, заключено в круглые скобки.
В операторе select разрешено не только динамически определять имя таблицы, но и использовать динамическое предложение where. В качестве примера определим внутреннюю таблицу where_tab и при выполнении программы заполним ее, используя предложение where:
Данная таблица заполняется символьными константами в соответствии с условием where.
Не следует забывать, что одинарные кавычки в символьных константах должны удваиваться.
Далее можно использовать внутреннюю таблицу where_tab в операторе select, который считывает таблицу customers:
Программа читает данные о тех клиентах, чьи номера идентификаторов укладываются в диапазон от 1 до 999, а фамилии и названия городов начинаются с букв Е и S соответственно. Конечно, такую программу можно написать и с использованием статического предложения where:
Динамическое предложение where следует использовать, если имя таблицы неизвестно, так как в этом случае поля предложения where необходимо определять при выполнении программы. К тому же,
если возможны различные действия пользователей, то непросто предвидеть все варианты условий where в статической программе.
Для того чтобы не допустить несанкционированного изменения базы данных, в языке
АВАР/4 динамическое предложение where поддерживается только для операции select.
Наиболее часто динамическое предложение where используется при задании пользователем крите- риев выборки для полей таблицы. В этом случае в динамическом предложении where используется со- ставной критерий выборки (см. главу 16).
Вызов подпрограмм
Иногда при разработке программ больших приложений бывает необходимо вызвать подпрограмму,
принадлежащую другой программе, причем имя этой подпрограммы или имя программы (которой она
принадлежит) может быть определено только в процессе выполнения. Используемая в примере версия
команды perform позволяет определить имя внешней формы:
report chap2307.

Динамические языковые конструкции 273
В процессе выполнения программа загружается вместе с текущей (выполняемой в данный момент) программой, и форма extform (внешняя подпрограмма) выполняется обычным образом. Внеш- ний оператор perform можно использовать внутри вызываемой извне формы, т.е. разрешается строить цепочку внешних вызовов. Кроме того, для вызова внешней подпрограммы так же, как и для локальной,
можно использовать параметры интерфейса.
Внешнюю подпрограмму можно вызывать динамически, используя имя формы и другой программы в круглых скобках. Особенно часто такой прием используется в процедурах обратного вызова, когда подпрограмма вызывающей программы запрашивает подпрограмму вызванной программы. В следующем примере программа вызывает форму extform из программы
Имя процедуры обратного вызова и имя текущей программы передаются как параметры:
Ниже приводится внешняя программа с динамической командой perform для вызова формы обрат- ного вызова:
В данном примере выполнение chap2309 инициирует выполнение extform в программе chap2310,
которая вызывает форму из программы chap2309. Схема вызовов приведена на рис. 23.3.
Рис. 23.3
Применение обратного
вызова подпрограмм
Данная программа содержит внешнюю команду perform, а программа chap2308 содержит определе- ние формы:

274 Глава 23
Использование процедур обратного вызова значительно упрощает программу, в которой требуется неоднократно применять вызванные функции для формирования специального диалога пользователя. На- пример, главная функция может отображать иерархические структуры, а каждой вызывающей программе должны соответствовать свои управляющие кнопки в данной иерархии. В этом случае вызывающая про- грамма может содержать подпрограмму задающую управляющую кнопку, а главная ция — динамический внешний оператор perform, вызывающий подпрограмму display_button.
Резюме
• Поля сортировки можно задавать динамически в команде sort.
• Ключевые поля можно задавать динамически а команде table.
• Поддерживаются динамические конструкции at new / endat для вычисления подсумм.
• В командах Open SQL (select, insert, update, modify и delete) разрешается использовать динамические имена таблиц.
• В команде select можно использовать динамическое предложение where.
• Подпрограмму из внешней программы, отличной от текущей, можно вызвать с помощью дополнения in program команды perform.
• Имя вызванной подпрограммы или имя программы, которой она принадлежит, можно задавать динамически.
В следующей главе рассматривается использование специальных полей типа Field Symbol, а так же описывается операция присвоения (assign), которая обеспечивает функциональную совместимость с ука- зателями, применяемыми в других языках программирования.

Глава 24
Поля типа Field Symbol
• Определение поля типа Field Symbol
• Использование операции assign
• Надежность и гибкость

276 Глава 24
Д
о сих пор в книге рассматривались объекты данных, имеющие фиксированный тип, не изменяе- мый при выполнении программы. В частности, поля характеризовались элементарным типом и разме- ром поля, записи — фиксированным числом компонент, каждая из которых имела фиксированный тип и размер. Аналогично и структура строки внутренней таблицы была полностью детерминирована опре- делением таблицы, а единственным параметром, который мог изменяться при выполнении программы,
являлось количество строк таблицы.
Однако иногда желательно обрабатывать разные объекты данных одинаково. Типичным примером такой задачи является чтение внешних данных из файла, у которого первые байта содержат размер записи, следующей сразу же за ними. Данные могут иметь следующий вид:
При обработке подобных данных нужно владеть методами считывания части записи (например,
5 байт для чтения Smith) с продолжением чтения. Для объектов данных фиксированной длины это сделать непросто. В этом случае необходимо использовать нечто, аналогичное указателю (pointer), ко- торый соответствует разным позициям в записи (т.е. позволяет иметь ссылку на позицию в строке).
В языке АВАР/4 поля типа Field Symbol и операция присвоения assign функционально сопоставимы с переменными типа указателей, используемых в других языках программирования. Поля типа Field
Symbol замещают собой другие поля и даже различные объекты данных. Такое поле не занимает память под объект данных, а указывает на объект, который был приписан полю при выполнении программы.
После выполнения операции assign с полем типа Field Symbol можно работать так же, как с самим объектом. Используя этот тип поля, разработчик может повысить степень защищенности своей про- граммы, так как в этом случае исключаются ошибки при обработке указателей.
Свойство
аналогичное указателю, обеспечивает широкие возмож-
ности, однако требует большого внимания при программировании, так как ссылки устанав-
ливаются только в процессе выполнения. Эффективная синтаксическая проверка не всегда возможна
для операций, использующих поля типа Field Symbol. Невнимательность может привести к ошибкам
выполнения или неверному присвоению данных.
Поля типа Field Symbol
Поле типа Field Symbol определяется объявлением field-symbols, после которого следует имя поля,
заключенное в угловые скобки. Такие скобки позволяют отличить этот тип поля от обычных объектов данных в исходном тексте программы:
f i e l d - s y m b o l s < f s > .
Определяя символ поля, разработчик создает "замещение" для объекта данных. Для работы с таким объектом нужно связать его с полем Field Symbol, используя операцию assign (присвоить).
Операция assign
Команда assign связывает объекты данных (поля или записи) с полем типа Field Symbol:
data f i e l d v a l u e
a s s i g n f i e l d t o
После операции присвоения поле Field Symbol наследует все свойства объекта, поэтому работать с этим полем можно как с самим объектом данных. Например, можно вывести на экран поле типа Field
Symbol в виде списка, используя оператор write:
w r i t e
Типичное применение этого поля приводится в следующей программе, использующей пример, опи- санный во введении к главе: чтение внешних данных из файла, у которого первые четыре байта пред- ставляют размер записи, расположенной следом. Если содержимое записи определяет логику управления, то программа может быть такой:

Поля типа Field Symbol 277
Предполагается, что в поле содержаться данные из файла, т.е. фамилии клиентов вместе с числом символов в фамилии:
Чтение из файла рассматривается в главе 26.
В начале цикла do вычисляется символов в фамилии клиента. Если оно равно 0, то цикл завершается. В противном случае счетчик position увеличивается на 4 для получения позиции, соответ- ствующей началу собственно данных. Затем значение, соответствующее части записи, присваивается полю типа Field Symbol с именем и выводится на экран. Счетчик позиции наращивается на величину длины предыдущей части. Цикл завершается, если счетчик превышает значение длины записи.
Переменное смещение и длина поля, используемые в операторе assign, позволяют гибко оперировать с позицией поля типа Field Symbol. Такие приемы часто применяются при работе со строками.
Операции со строками, которые используются • языке АВАР/4, охватывают все обычные
потребности для работы с текстом (см. главу 7).
Кроме манипуляций с текстовыми строками, существует ряд других полезных применений поля типа
Field Symbol. Одно из них рассматривается в следующем разделе.
Использование полей типа Field Symbol
для компонентов записи
Предположим, что нужно записать результат в виде таблицы с несколькими столбцами. Если разра- ботчик будет выводить все компоненты таблицы "сверху вниз", то каждый раз при изменении структуры таблицы программу нужно будет корректировать. Использование дополнения component of structure ко- манды assign позволяет автоматически создавать ссылки на табличные структуры:
Данная программа считывает все элементы таблицы customers. Для каждого из них команда assign component (в цикле) выполняет присвоение поля таблицы полю . Системный счетчик цикла используется для определения последовательности присвоения полей таблицы. В конце про- граммы содержимое поля , соответствующее текущему полю таблицы, выводится на экран.

278 Глава 24
Надежность или гибкость
Применение полей типа Field Symbol позволяет создавать гибкие и изящные программы. Однако,
поскольку эти поля являются "безымянными" объектами, при синтаксической проверке не всегда можно выявить ошибки несоответствия типов (как при статическом программировании). Например, следую- щий вызов программы приведет к синтаксической ошибке, так как типы фактических и формальных параметров несовместимы:
t a b l e s c u s t o m e r s .
s e l e c t *
d i s p l a y u s i n g form display using
like bookings.
write
В данной программе тип фактического параметра customers не соответствует типу bookings, который используется для формального параметра Л, и, следовательно, при синтаксической проверке будет вы- ведено на экран сообщение об ошибке (см. рис. 24.1).
Рис. 24.1
Синтаксическая ошибка при несовпадении типов
Ниже приводится аналогичная программа, использующая поле типа Field Symbol:
t a b l e s a s s i g n t o .
s e l e c t *
perform d i s p l a y u s i n g display using f1 like
write
В данной программе синтаксическая проверка не выявит ошибки, так как тип фактического пара- метра нельзя определить из статической информации программного текста. Вместо синтаксической,
при работе программы будет обнаружена ошибка выполнения. Первая страница сообщения, содержащая основную информацию об ошибке выполнения, приведена на рис. 24.2.

Поля типа Field Symbol 279
Рис. 24.2
Основная информация
об ошибке после выявления
несовпадения типов
Рис. 24.3
Оператор исходного текста,
вызвавший ошибку
После просмотра всего описания ошибки можно получить более подробную информацию о ее при- чинах. Например, в сообщении приводится оператор исходного текста, вызвавший ошибку (см. рис. 24.3).
Во избежание подобных ошибок следует объявить поле Field Symbol с типом. Тогда при синтакси- ческой проверке несовпадение будет выявлено сразу. Например, в следующей программе будет обнару- жена синтаксическая ошибка в операторе perform (так же, как показано на рис. 24.1) потому, что фактический и формальный параметры имеют разные типы:
t a b l e s
a s s i g n customers

280 ГЛАВА 24
Из приведенного примера ясно, что использование определенного типа для поля Field Symbol
водит к потере гибкости программирования, однако, ограничивая тип, разработчик может
ошибок, определяемых только при выполнении программы. В принципе, проблема выбора между
костью программирования и надежностью программы обычна для разработчиков ПО. Для
программы высокого качества рекомендуем применять гибкие конструкции с полями типа Field
обеспечивая эти конструкции той же надежностью использования, какую имеют статические объект
данных.
Резюме
• Поле типа Field Symbol определяется с помощью декларативного оператора field-symbols.
• Объекты данных связываются с полем типа Field Symbol помощью команды assign.
• Если при объявлении поля Field Symbol указывается его
то синтаксическая проверка
способна выявить ошибку несовпадения типов.
В следующей главе рассматривается другая возможность динамического программирования язьп
АВАР/4 — генерация программ при выполнении.

1   ...   16   17   18   19   20   21   22   23   24


написать администратору сайта