Выбери формат для чтения
Загружаем конспект в формате docx
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Лекция 3. Элементарные типы данных (продолжение). Структуры. Области видимости. Базовые операторы.
1. Символьные и байтовые объекты данных, дата и время, шестнадцатеричные числа, литералы и константы.
2. Структурные данные.
3.Области видимости и области действия объектов данных.
4. Базовые АВАР-операторы
Символьные и байтовые объекты данных
Классификация объектов данных как символьных определяется внутренним представлением символов. Поэтому сначала рассмотрим способы представления символов, прежде чем переходить к символьным объектам и их обработке.
Юникод и внутреннее представление символов
Таблица набора символов Юникода
Внутри системы символы представляются в виде последовательности битов. Ранее каждый символ в SAP-системе выражался одним байтом, т.е. одновременно можно было представить 256 символов. Для сопоставления последовательностей битов с символами в разных языковых регионах используются разные кодовые страницы.
На данный момент включена поддержка Юникода, что позволяет представлять каждый символ 2 байтами в системах надлежащей конфигурации. В этом случае присвоение символов последовательностям битов определяется набором символов Юникода (стандарт ISO/IEC 10646). Поскольку двухбайтная кодировка теоретически дает возможность представить 65536 уникальных символов, отпадает необходимость в переключении между кодовыми страницами.
Байтовые и символьные объекты данных
Элементарные объекты данных с байтовым типом данных (х, xstring) называются байтовыми объектами данных.
Элементарные объекты данных с символьным типом данных (с, n, d, t, string) называются символьными объектами данных.
Обработка символов и байтов
На следующем рисунке показаны АВАР-операторы, предназначенные для обработки символьных объектов данных:
Обзор АВАР-команд обработки строк
Операнды каждого из этих операторов рассматриваются как поля типа с, независимо от их фактического типа. Они не подлежат преобразованию. Все эти операторы, кроме TRANSLATE и CONDENSE, устанавливают поле sy-subrc. Оператор SEARCH также устанавливает системное поле sy-fdpos, в котором содержится смещение найденной символьной строки.
Рекомендация: Рекомендуется по возможности использовать оператор FIND вместо SEARCH, поскольку он быстрее выполняется. Следует иметь в виду, что оператор FIND не устанавливает системное поле sy-fdpos. Позиция найденной строки возвращается в параметре команды.
Обработка строки/последовательности байтов
Все эти операторы, за исключением CONDENSE и OVERLAY, можно также использовать для обработки байтовых объектов данных. В системе Юникода необходимо использовать дополнение IN BYTE MODE, чтобы анализировать байты каждый в отдельности, а не парами. Для обработки символьных объектов данных аналогичное дополнение IN CHARACTER MODE необязательно.
Длина и сравнение
Для определения длины строки служит стандартная функция STRLEN ( ). Для байтовых объектов данных предусмотрена аналогичная функция XSTRLEN( ).
Для сравнения содержимого символьных объектов данных применяются следующие операторы: СО, CN, CA, NA, CS, NS, СР и NP. С введением Юникода стали доступны аналогичные операторы для байтовых объектов данных - с префиксом BYTE- .
В программе можно обратиться непосредственно к фрагменту символьного или байтового объекта данных, указав соответствующие значения смещения и длины.
Доступ к элементарным объектам данных с указанием
смещения и длины
В программе можно обратиться непосредственно к фрагменту символьного или байтового объекта данных, указав соответствующие значения смещения и длины.
Спецификации длины и смещения интерпретируются как количества байтов для байтовых объектов данных или как количества символов для символьных объектов (т. е. количества одиночных байтов или пар байтов, в зависимости от системной настройки).
В плоских структурах доступ по смещению возможен даже в случае, если объект не полностью символьный (т. е. символьными являются только первые поля), при условии, что доступ производится только в пределах символьной области.
Доступ к структурам с указанием смещения и длины
Внимание: По возможности избегайте доступа к содержимому структуры этим методом. Используйте компоненты и строковые операции - это сделает программу гораздо более надежной и удобочитаемой.
Дата
Поле дата (date) имеет тип d с фиксированным размером поля в восемь знаков. Внутреннее представление поля дата : YYYYMMDD (Y — год, М — месяц, D — день). Начальное значение поля: 00000000.
Язык АВАР/4 поддерживает несколько выходных форматов записи поля типа date, отличающихся от внутреннего представления. Разрешено самостоятельно задавать формат записи поля date, используя команду write:
date today type d.
* Get actual date from system field sy-datum and display it
today = sy-datum.
write today.
Первое предложение является примером определения поля today. Последующие предложения передают реальную дату, содержащуюся в системном поле sy-datum в поле today, которое затем выводится на экран с помощью команды write.
Разрешается задавать специальный формат даты, добавляя дополнительные параметры в команду write или в определение поля в словаре Dictionary языка АВАР/4.
Необходимо отметить, что даже на начальной стадии изучения типов данных можно выполнять вычисления, используя поля типа date. Типичный пример определения последнего дня предыдущего месяца (ultimo):
date ultimo type d.
* Set variable to first day of current month.
ultimo = sy-datum.
ultimo+6(2) - '01'.
* Set variable to last day of previous month.
subtract 1 from ultimo.
Упоминавшийся ранее форматы выходной записи поля date абсолютно не влияют на внутреннее представление этого поля. Так, число, равное дню, всегда содержится в последних двух байтах внутреннего представления, независимо от задания вывода даты на экран.
Время
Поля для задания времени имеют фиксированную длину 6 и формат HHMMSS (часы, минуты, секунды). Подобно полям дат, вывод полей времени может быть модифицирован в команде write или с помощью дополнительных форматных определений Dictionary.
Использование полей даты и времени
Поля дат
В АВАР для дат и для времени используются разные типы данных. Это, как правило, символьные типы данных, состоящие соответственно из 8 и 6 цифр. Однако эти типы данных обладают также рядом особых свойств.
• При вводе и выводе учитывается пользовательский формат
• Если объект данных типа "Дата" используется в арифметических выражениях или присваивается числовому объекту данных, его содержимое преобразуется в число дней, прошедших с 1 января 0001 года.
• Если объект данных типа "Время" используется в арифметических выражениях или присваивается числовому объекту данных, его содержимое преобразуется в число секунд, истекших с полуночи.
Внимание: Для полей даты и времени необходимо указывать начальные значения (например, в дополнении VALUE оператора DATA) в виде текстовых литералов, поскольку числовые литералы имеют целочисленный тип и, следовательно, интерпретировались бы как число дней, прошедших с 1 января 0001 года, или число секунд, истекших с полуночи.
Шестнадцатеричное
Для шестнадцатеричных (или двоичных) представлений чисел используется тип х. Например, начальное значение шестнадцатеричного поля определяется последовательностью битов 1111000010001001:
data xstring(2) type ас value 'F089'.
Заметим, что две шестнадцатеричные цифры между 0 и F занимают один байт. Другими словами, шестнадцатеричное поле длиной n содержит 2 n цифр и длина результата также равна 2 n.
Литералы и константы
Фиксированные объекты данных имеют некоторое постоянное значение, которое фиксируется при написании исходного текста и не изменяется во время выполнения. Литералы и константы относятся к фиксированным объектам данных.
Литералы можно использовать для указания постоянных значений в программах. Существуют числовые литералы (указываются без верхних кавычек) и текстовые литералы (указываются с верхними кавычками). На представленном выше рисунке показаны некоторые примеры литералов.
Константы определяются с помощью оператора CONSTANTS. Тип константы определяется аналогично элементарным объектам данных. Для констант дополнение VALUE является обязательным. Таким образом определяются значения констант.
Присвоение значений и преобразование типов
Если в операции используются объекты данных АВАР разных типов, выполняется автоматическое преобразование типов.
Присвоение значений
Существует два способа копирования значения поля в объект данных совместимого типа:
MOVE source ТО target. и эквивалентный способ: target = source.
С помощью оператора WRITE source ТО target можно скопировать значение объекта данных в символьное поле в форматированном виде.
В результате содержимое объекта данных source будет помещено в конечное поле target в том виде, в каком оно выводилось бы в списке с использованием оператора WRITE. Те же правила форматирования применяются при присвоении значения с помощью операторов WRITE ... ТО и WRITE. О том, какие можно использовать дополнения, см. в документации по ключевым словам для оператора WRITE.
Довольно распространенной операцией является форматированное присвоение значения поля даты символьному объекту данных. В качестве примера предположим, что source - поле даты, содержащее "20001112", а в настройках пользователя выбран формат даты ММ/ДД/ГГГГ. В результате форматированного присвоения поле target будет содержать "11/12/2000".
Рекомендация: Следует иметь в виду, что конечное поле должно быть достаточной длины для того, чтобы вместить и разделители (в вышеприведенном примере длина поля target должна быть не меньше 10).
Объекты данных несовместимых типов при присвоении значения необходимо приводить к типу данных конечного объекта. Для большинства типов данных определены свои правила преобразования. В таких случаях тип преобразуется автоматически перед присвоением значения, иначе возникает (улавливаемая) динамическая ошибка. Значения в логических выражениях также необходимо преобразовывать при наличии компонентов разных типов.
Автоматическое преобразование типов при присвоении значения
Автоматическое преобразование типов выполняется удобным для пользователя способом и повышает надежность программы. Следует, однако, помнить, что каждое преобразование увеличивает время выполнения. Избегайте ненужных преобразований: старайтесь, чтобы поля, имеющие одинаковое назначение, принадлежали к одному и тому же типу данных.
Структурные данные
Определение структур
Определение структур
Структуры, как и элементарные объекты данных, можно описывать двумя способами: с помощью оператора TYPES предварительно определить явным образом тип структуры, на которую будет ссылаться оператор DATA, или неявно задать тип данных в операторе DATA.
Определение типа структуры содержит определения компонентов, включаемые между операторами BEGIN OF и END OF . Здесь обозначает имя типа структуры или имя структуры.
Обращение к компонентам структуры производится в формате
< stгucture_name>-.
Вложенные и глубокие структуры
В программе можно определить вложенную структуру с любым числом уровней, определив как тип структуры сам компонент типа структуры. Для обращения к компонентам подструктуры используются соответствующие цепочки имен компонентов (например, < stгucture_name >- - < comp_name >).
Определение вложенных структур
Глубокая структура - это структура, содержащая по крайней мере один компонент динамического типа; им может быть элементарный объект данных переменной длины (тип string или xstring), ссылка на другой объект или внутренняя таблица. Если в структуре нет компонентов этих типов, она называется плоской.
Рекомендация: Разница между глубокой и плоской структурами не связана с вложенностью. Структура может быть вложенной и одновременно плоской. Главное, в ней ни на одном из уровней вложенности не должны содержаться перечисленные выше типы.
Использовать глубокие структуры можно с некоторыми ограничениями. Например, их нельзя определять целиком в предложении INTO оператора SELECT (каждый компонент должен быть описан отдельно).
Именованные вложения
Иногда использовать вложенные структуры запрещается, например, при представлении данных в SAP List Hewer или в экранной таблице. Тем не менее в таких случаях бывает целесообразно сгруппировать части структуры по логическим признакам и обращаться к ним как к единому целому по имени. Для этого можно использовать именованные вложения.
Использование именованных вложений
Вместо оператора INCLUDE TYPE с последующим указанием типа структуры можно использовать оператор INCLUDE STRUCTURE со ссылкой на структуру (объект данных).
Для обращения ко всей подструктуре в целом используется имя вложения: -. К отдельным компонентам подструктуры можно обращаться двумя способами: либо непосредственно (-), либо с указанием имени вложения (--). Хотя во втором случае доступ к объекту производится как к вложенной структуре, формально он не является вложенным.
При возникновении конфликта имен компонентов, например, в результате включения подструктуры можно добавлять к именам компонентов суффикс, используя дополнение RENAMING.
Присвоение значений в структурах
Присвоение значений при использовании структур совместимых типов
Если содержимое одной структуры требуется присвоить другой структуре, они должны по возможности содержать значения одного типа, чтобы их не нужно было автоматически преобразовывать перед присвоением. То же самое относится к подструктурам. Если компоненты двух структур имеют совместимые типы, но разные имена, эти две структуры все равно считаются в целом совместимыми по типам.
Если отключить проверку Юникода, это даст возможность присваивать значения одной структуры несовместимой с ней структуре при условии, что обе структуры плоские, т. е. в них нет компонентов переменной длины. В режиме Юникода присвоение значений между несовместимыми структурами существенно ограничено.
Внимание: Поскольку присвоение значений между структурами несовместимых типов весьма уязвимо для ошибок, этого не следует делать даже в случаях, когда такое присвоение разрешено функцией проверки Юникода. Единственное исключение - присвоение между плоскими, чисто символьными структурами.
Содержимое глубокой структуры в общем случае можно присвоить только структуре совместимого типа.
Присвоение значений одноименным компонентам структуры
С помощью оператора MOVE-CORRESPONDING можно копировать содержимое исходной структуры в конечную структуру по компонентам. После этого каждое исходное поле автоматически копируется в конечное поле с таким же именем. Затем применяются правила преобразования для элементарных объектов данных.
Рекомендация: Следует иметь в виду, что система просто ищет компоненты с одинаковыми именами, но не проверяет, совместимы ли типы этих одноименных компонентов. Такая процедура бывает полезной, но чревата некоторыми опасностями.
Области видимости и области действия объектов данных
Видимость в классической АВАР-среде
Видимость объектов данных
Степень видимости объектов данных зависит от контекста. В отношении объектов данных, определенных с помощью оператора DATA, действуют следующие правила.
Если оператор DATA находится между FORM и ENDFORM, он определяет локальный объект данных подпрограммы.
Если оператор DATA находится между FUNCTION и ENDFUNCTION, он определяет локальный объект данных функционального модуля.
Во всех остальных случаях оператор DATA определяет глобальный объект данных, видимый в масштабе всей программы.
Если имена локального и глобального объектов данных совпадают, только локальный объект данных является видимым в пределах единицы модуляризации. Говорят, что он инвалидирует одноименный глобальный объект данных.
Внимание: Объекты данных в модулях и блоках событий всегда являются глобальными.
Если оператор DATA находится между MODULE и ENDMODULE, определяемый им объект будет глобальным объектом данных, видимым в масштабе всей программы. Аналогично объекты данных, описанные в блоке события АВАР, имеют глобальную видимость.
Во избежание путаницы рекомендуется описывать такие данные в начале программы, полностью исключая операторы DATA из модулей и блоков событий.
Оператор TABLES всегда создает объекты данных, видимые во всей программе.
Объекты данных, созданные с помощью оператора TABLES, всегда являются видимыми в масштабе всей программы, даже если этот оператор включен в подпрограмму или функциональный модуль. (Такие объекты могут быть видимыми даже в других программах, например, при вызове внешней подпрограммы.)
Видимость объектов АВАР
Если в приложении используются объекты, видимость объектов данных можно определять другими способами.
Области видимости объектов
Объекты данных, созданные в описательной части класса, называются атрибутами. У атрибутов существуют следующие области видимости:
Частные и защищенные атрибуты
Эти атрибуты являются видимыми только внутри объекта. Все методы объекта могут читать и изменять данные. Внешний доступ к таким атрибутам возможен только при помощи метода, определенного соответствующим образом.
Общие атрибуты
Общие атрибуты являются видимыми и доступными также и извне объекта.
Защищенные атрибуты
Защищенные атрибуты являются видимыми только в пределах объекта и его подобъектов.
Если оператор DATA находится внутри блока METHOD…ENDMETHOD, он определяет локальный объект данных в этом методе.
Жизненный цикл объектов данных
Жизненный цикл объектов данных
Продолжительность существования объектов данных обычно связана с их видимостью.
Глобальные объекты данных действительны до тех пор, пока соответствующая программа остается в памяти.
Жизненный цикл атрибутов объекта начинается с создания инстанции объекта во время выполнения и заканчивается с удалением последней ссылки на объект.
Период существования локального объекта данных, как правило, определяется временем выполнения содержащей его единицы модуляризации, т. е. содержимое объекта теряется в промежутке между двумя вызовами одной единицы модуляризации.
Рекомендация: Если для описания локального объекта данных используется оператор STATICS вместо DATA, жизненный цикл объекта расширяется до рамок жизненного цикла всей программы. Поэтому жизненный цикл подобных объектов данных такой же, как у глобальных объектов данных, однако их видимость по-прежнему ограничена рамками соответствующей единицы модуляризации.
Оператор STATICS можно использовать в функциональных модулях, подпрограммах и статических методах.
Поведение во время выполнения: начальное значение
В каждый объект данных в начале его жизненного цикла записывается начальное значение. Так, это происходит при загрузке программы в память в случае глобальных объектов данных и при создании инстанции объекта для определения атрибутов.
Локальный объект данных перезаписывается своим начальным значением каждый раз, когда он вызывается содержащей его единицей модуляризации (если он не описан оператором STATICS).
Начальное значение можно определить с помощью необязательного дополнения VALUE к оператору DATA. Если это дополнение опущено, используется начальное значение соответствующего типа данных.
Поведение во время выполнения: поля динамической длины
При входе в область действия необязательно резервировать память для элементарных объектов данных переменной длины - строк (типы string) и последовательностей байтов (xstring). Требуемая память выделяется только для переменных, которым присвоены значения.
Базовые ABAP-операторы
Присвоение значений
При запуске программы контекст программы загружается в область памяти сервера приложений, и память становится доступной для объектов данных, определенных в программе. Все элементарные объекты данных предварительно присваиваются специфичному для вида начальному значению, за исключением случая присвоения другого значения в результате добавления VALUE.
Оператор MOVE используется для переноса содержимого объекта данных в другой объект данных. Следующие два варианта синтаксиса дают один и тот же результат:
• MOVE var1 TO var2..
• var2 = var1..
Если оба объекта данных var1 и var2 относятся к различным типам, возникает конфликт типов. В этом случае при наличии правила преобразования автоматически выполняется преобразование типа.
Оператор CLEAR используется для перезаписи содержимого объекта данных специфичным для типа начальным значением.
В ABAP можно программировать арифметические выражения на любом уровне вложения. Можно выполнять следующие операции:
+
Сложение
-
Вычитание
*
Умножение
/
Деление
**
Возведение в степень
DIV
Деление на целое число без остатка
MOD
Деление на целое число с остатком
Внимание: Скобки и арифметические операции являются ключевыми словами ABAP и поэтому должны быть отделены от других слов по крайней мере одним пробелом.
Некоторые функции для различных типов данных предварительно определяются в среде выполнения ABAP. Например, следующий оператор определяет текущую длину содержимого символьной переменной.
length = STRLEN( cityfrom ) .
В случае функций открывающая скобка является частью имени функции. Остальные символы также должны быть отделены по крайней мере одним пробелом.
В целом, в отношении последовательности обработки применяются стандартные алгебраические правила: сначала обрабатываются выражения в скобках, затем степени, умножение/деление и, наконец, сложение/вычитание.
В ABAP существуют два способа выполнения различных последовательностей операторов, в зависимости от определенных условий:
• В конструкте IF можно определить в качестве условий проверки любые логические выражения. Если условие удовлетворяется, в системе выполняется соответствующий блок операторов. В противном случае проверяется условие, указанное в ветви ELSEIF (возможен ввод нескольких условий), и т.д. Если ни одно из указанных условий не выполнено, то выполняется ветвь ELSE, если она доступна. Ветви ELSEIF и ELSE являются необязательными.
• Конструкт CASE можно использовать для четкого разграничения блоков. Содержимое поля, указанное в компоненте CASE, проверяется по объектам данных, перечисленным в ветвях WHEN, для определения соответствия. Если содержимое поля совпадает, то обрабатывается соответствующий блок операторов. Если соответствие отсутствует, в системе выполняется ветвь OTHERS, если таковая доступна. Все дальнейшие дополнения необязательны, за исключением первой ветви WHEN.
В обоих конструктах проверка условия или соответствия выполняется последовательно с верху вниз. После выполнения блока операторов ветви осуществляется немедленный переход к ENDIF или ENDCASE.
Рекомендация: При необходимости выполнения проверок соответствия значения поля другим значениям следует выбрать конструкт CASE, а не оператор IF, поскольку он обеспечивает большую четкость и более верный результат.
В ABAP существуют четыре конструкта циклов. В циклах DO и WHILE системное поле SY-INDEX содержит номер текущего прогона цикла. Следовательно, запрос этого системного поля целесообразен только в рамках цикла. Во вложенных циклах поле SY-INDEX всегда содержит номер прогона цикла, к которому оно относится.
Безусловные/управляемые индексом циклы
Блок операторов между DO и ENDDO непрерывно выполняется до выхода из цикла с помощью команд прерывания, таких как EXIT. Также имеется возможность определения максимального количества прогонов цикла; в противном случае возможно образование бесконечного цикла.
Управляемые заголовком циклы
Блок операторов между WHILE и ENDWHILE непрерывно выполняется до тех пор, пока не перестанет удовлетворяться указанное условие. Перед очередным выполнением блока операторов всегда осуществляется проверка условия.
Циклы считывания
Цикл SELECT можно использовать для последовательного считывания нескольких записей из таблицы базы данных. Во внутренней таблице (табличной переменной в программе) та же функция считывания реализуется в цикле LOOP.
Оператор MESSAGE используется для отправки диалоговых сообщений пользователям программы. При этом необходимо указать трехзначный номер сообщения и класс сообщения.
Номера и классы сообщений однозначно определяют выводимое на экран сообщение. Тип сообщения используется для указания способа вывода сообщения. Способ отображения различных типов сообщений можно проверить при помощи демонстрационной программы DEMO_MESSAGES, поставляемой со стандартной системой SAP.
Если указанное сообщение содержит метки-заполнители, им можно присвоить значения путем добавления WITH. В тексте выводимого сообщения вместо меток-заполнителей будут отображаться перенесенные значения.