ABAP: выражения, текст, время и динамические данные
Как читать выражения и поток выполнения ABAP, обрабатывать текст и время, безопасно работать со ссылками, field symbols и динамическими типами.
5 мин чтения·База знаний
Ревизия 1Общие понятияЧастичное покрытиеКонтекст: CTX-GENERALдокументальная опора: недостаточно данных
Справочный материал. Контракты данных, архитектурные решения и ограничения применения. Источники приведены в материалах, где используются внешние основания.
ABAP: выражения, текст, время и динамические данные#
Эта статья связывает пять языковых тем: управление выполнением и выражения (ABAP-03), текстовую обработку (ABAP-06), даты и время (ABAP-07), ссылки и field symbols (ABAP-08), динамические типы и introspection (ABAP-09). Примеры синтаксиса зависят от версии ABAP и языковой версии репозитория. Сверяйте их в документации целевого релиза; статья не утверждает, что код компилировался или запускался в SAP.
Операторы IF, CASE, циклы и вызовы процедур задают поток выполнения. Выражения COND, SWITCH, VALUE, NEW, CONV, CORRESPONDING и REDUCE вычисляют значение и могут уменьшать число временных переменных. Итерационное выражение FOR используется в конструкторах и редукциях внутренних таблиц. Выбирайте форму по читаемости контракта, а не по краткости: многоуровневое вложение может скрывать порядок вычисления, преобразования и обработку пустого набора.
Для каждого преобразования укажите ожидаемые типы, допустимые значения и поведение при некорректном входе. Не полагайтесь на неявное преобразование текста в сумму, даты или числовой ключ, особенно если вход внешний. Конструкция языка, доступная в одном релизе или языковой версии, может отсутствовать либо быть запрещённой в другом контексте.
Строковые шаблоны удобны для сборки текста и форматирования значения, но текстовое представление не заменяет типизированный контракт. Перед объединением форматированных чисел или дат с текстом определите формат, язык и часовой пояс. Не используйте локализованную строку как машинный ключ или значение для обратного преобразования без явно заданного формата.
Поиск, замена, разбиение и регулярные выражения решают разные задачи. Зафиксируйте, рассматриваются ли байты или символы, как учитываются пробелы и пустые значения, и может ли вход содержать Unicode. Для регулярного выражения ограничьте размер входа, ожидаемую сложность шаблона и поведение на крайних случаях. Библиотеки и языковые конструкции проверяйте по доступности в целевой версии.
Дата календарного события (DATS) не является моментом времени. Время суток (TIMS) не содержит дату и временную зону. Метка времени UTC описывает момент и пригодна для упорядочивания событий, но для пользовательского отображения требуется явная временная зона. Системные поля даты и времени могут отражать системную или пользовательскую зону; само их имя не означает, что это UTC.
Поля DATS и TIMS способны хранить некорректные последовательности символов, поэтому проверка должна предшествовать использованию и преобразованию. Для преобразования локальных даты и времени в timestamp укажите временную зону и определите поведение на переходах летнего времени и неоднозначных локальных часах. Производственный календарь и рабочие дни зависят от календаря, страны и настройки системы; арифметика календарных дней не заменяет проверку рабочего дня.
Ссылка на данные (REF TO data) хранит доступ к объекту данных; IS BOUND проверяет, назначена ли ссылка. Статический тип задаёт операции, разрешённые при компиляции, а динамический тип описывает фактический объект во время выполнения. Разыменование и изменение по ссылке меняют исходный объект, поэтому передавайте такие ссылки только с понятным контрактом владения и времени жизни.
Field symbol похож на типизированный псевдоним уже существующего объекта: он не является отдельной копией значения. Присваивание делает его связанным с объектом, а запись через field symbol меняет этот объект. Перед доступом проверяйте, что назначение выполнено (IS ASSIGNED); динамическое присваивание отдельно обрабатывает неудачу. После завершения области или смены объекта не сохраняйте предположение, что псевдоним всё ещё связан с прежней строкой.
RTTI исследует тип существующих объектов; RTTC позволяет описывать и создавать типы во время выполнения. Динамический доступ бывает полезен в универсальных таблицах, сериализаторах и инфраструктуре отображения, когда структура действительно определяется во время выполнения. Для обычной бизнес-логики статические типы предпочтительнее: они показывают контракт компилятору и сопровождающему разработчику.
Проверьте динамическое имя до передачи его в динамический оператор. Не принимайте имена компонентов, типов или фрагменты синтаксиса напрямую от внешнего пользователя: проверяйте их по allowlist и ограничивайте допустимые операции. Обрабатывайте отсутствие компонента, несовместимый тип, не назначенную ссылку и исключение создания типа. Документация SAP NetWeaver AS ABAP 7.52 о dynamic programming не доказывает доступность тех же API в ABAP Cloud или современном S/4HANA; для облачной модели отдельно проверяйте released API и языковую версию.
Материал является частичным языковым справочником. Источники по ABAP Cloud и Standard ABAP относятся к разным документированным контекстам; раздел о динамическом программировании ссылается на SAP NetWeaver AS ABAP 7.52 и не переносится на облачную среду. В этой рабочей среде нет подтверждённой SAP-компиляции или runtime-проверки; источники зарегистрированы как метаданные без сохранённых локальных снимков.
This article connects five language topics: control flow and expressions (ABAP-03), text processing (ABAP-06), dates and time (ABAP-07), references and field symbols (ABAP-08), and dynamic types and introspection (ABAP-09). Syntax examples depend on the ABAP release and repository language version. Check the target release documentation; this article does not claim that code was compiled or run in SAP.
Statements such as IF, CASE, loops, and procedure calls define control flow. Expressions such as COND, SWITCH, VALUE, NEW, CONV, CORRESPONDING, and REDUCE compute values and can reduce temporary variables. The FOR iteration expression is used in internal-table constructors and reductions. Choose a form for a readable contract, not for brevity: deep nesting can hide evaluation order, conversions, and empty-set handling.
For every conversion, state the expected types, allowed values, and behavior for invalid input. Do not rely on implicit conversion of external text into an amount, date, or numeric key. A language construct available in one release or language version may be unavailable or forbidden in another context.
String templates are useful for composing text and formatting values, but a textual representation is not a substitute for a typed contract. Before combining formatted numbers or dates with text, define the format, language, and time zone. Do not use a localized string as a machine key or round-trip value without an explicitly defined format.
Search, replacement, splitting, and regular expressions solve different problems. Specify whether processing is byte-based or character-based, how spaces and empty values are treated, and whether input can contain Unicode. Bound regular-expression input size, expected pattern complexity, and edge-case behavior. Check library and language-feature availability for the target version.
A calendar date (DATS) is not a point in time. A time of day (TIMS) has no date or time zone. A UTC timestamp describes a point in time and can order events, but user-facing display requires an explicit time zone. System date and time fields may reflect system or user time zones; their names alone do not mean UTC.
DATS and TIMS fields can store invalid character sequences, so validate before use and conversion. When converting local date and time to a timestamp, specify the time zone and define behavior around daylight-saving transitions and ambiguous local hours. Factory-calendar and working-day rules depend on calendar, country, and system configuration; calendar-day arithmetic does not replace a working-day check.
A data reference (REF TO data) provides access to a data object; IS BOUND checks whether the reference is assigned. The static type determines operations permitted at compile time, while the dynamic type describes the actual object at runtime. Dereferencing and writing through a reference mutate the original object, so pass references only with a clear ownership and lifetime contract.
A field symbol behaves like a typed alias for an existing object; it is not a separate copy of the value. Assignment binds it to an object, and writing through it changes that object. Before access, check that it is assigned (IS ASSIGNED); handle failed dynamic assignment separately. After a scope ends or an object changes, do not assume the alias still refers to the previous row.
RTTI inspects existing objects; RTTC describes and creates types at runtime. Dynamic access can help in generic tables, serializers, and display infrastructure when the structure is truly determined at runtime. For ordinary business logic, static types are preferable: they expose the contract to the compiler and maintainers.
Validate dynamic names before passing them to a dynamic statement. Do not accept component names, type names, or syntax fragments directly from external users: validate against an allowlist and restrict allowed operations. Handle missing components, incompatible types, unbound references, and type-creation exceptions. SAP NetWeaver AS ABAP 7.52 documentation about dynamic programming does not prove that the same APIs are available in ABAP Cloud or modern S/4HANA; check released APIs and language version for the cloud model separately.
Find where a value first becomes dynamic or is converted to text.
Record its type, format, time zone, locale, and possible empty or invalid values.
Check the reference or field-symbol assignment immediately before access and mutation.
Use an allowlist for dynamic names and verify the actual type before the operation.
Add tests for an empty set, invalid date, period boundaries, Unicode, missing component, and incompatible type.
Check syntax, released APIs, and behavior on the target release. A local text-level ABAP source review is not a substitute for compilation, ABAP Unit, or runtime.
This is a partial language reference. ABAP Cloud and Standard ABAP sources describe different contexts; the dynamic-programming section cites SAP NetWeaver AS ABAP 7.52 and is not generalized to cloud environments. No SAP compilation or runtime result has been verified in this workspace; source records are metadata without retained local snapshots.