Тип ABAP задаёт форму данных, а тип внутренней таблицы дополнительно фиксирует модель доступа и свойства ключа. Это часть контракта метода: вызывающая сторона должна понимать, допускаются ли повторяющиеся ключевые значения, важен ли индекс и в каком порядке будут обрабатываться строки.
В документации SAP ABAP Cloud о ключах внутренних таблиц у каждой внутренней таблицы есть первичный ключ. У STANDARD TABLE он неуникальный и может быть пустым. SORTED TABLE поддерживает уникальный или неуникальный ключ и хранит строки в порядке ключа. HASHED TABLE требует уникальный хеш-ключ. Вторичные ключи дают дополнительные способы доступа, но требуют памяти и добавляют затраты при изменениях.
Как выбрать категорию#
| Категория | Подходит, когда | Что проверить |
|---|---|---|
STANDARD TABLE |
Нужны индекс, последовательная обработка и накопление строк; повтор ключевых значений допустим | Чтение по первичному ключу при большом наборе может обходить строки линейно. Если читать нужно по ключу, предусмотрите сортировку с бинарным поиском или подходящий ключ и проверьте, что порядок и заполнение согласованы |
SORTED TABLE |
Набор должен сохранять порядок ключа; нужны чтения по ключу и последовательная обработка по начальной части ключа | Вставка поддерживает сортировку. Уникальность выбирается отдельно. Поля первичного ключа обычно нельзя менять при изменении содержимого строки |
HASHED TABLE |
Главная операция - поиск по полному уникальному ключу | Индекса строк нет, а ключ всегда уникален. Если возможны несколько строк на один выбранный ключ, такой ключ не подходит |
Эти ориентиры основаны на официальном описании выбора категории таблицы. SAP описывает свойства и стоимость доступа; это не замер производительности конкретной программы.
Пример для финансового набора#
Предположим, программа получает синтетические строки документов для сверки. Один документ содержит несколько позиций, а при анализе требуется отобрать позиции по компании и финансовому году. Сначала разделите два понятия:
- Бизнес-идентичность строки отвечает, какая позиция является той же записью в предметной модели. Например, в синтетическом примере это может быть сочетание компании, года, документа и номера позиции.
- Ключ внутренней таблицы задаёт, как программа находит и упорядочивает строки в конкретном наборе данных. Он может повторять бизнес-идентичность, но может обслуживать другой частый доступ, например чтение по компании и году.
Если нужен исходный индексный порядок и строки только накапливаются, начните с STANDARD TABLE и не полагайтесь на неявный стандартный ключ. Если затем постоянно выбираются позиции по компании и году, сортированный ключ с этими полями в начале соответствует частичному последовательному чтению. Хешированный ключ уместен только для поиска строки по полному уникальному ключу; он не подходит для запроса, который должен вернуть несколько позиций одного документа.
Сумму храните вместе с валютой, а количество - вместе с единицей измерения. Это предметный контракт данных: тип числового поля сам по себе не сообщает, в какой валюте или единице интерпретировать значение. Не включайте сумму в ключ только ради ускорения чтения, если она не является частью идентичности строки.
Явно объявляйте ключи#
При объявлении через TYPES или DATA проверяйте, какой ключ задан явно и какой добавляется неявно. Для STANDARD TABLE пропуск ключа в объявлении DATA может добавить NON-UNIQUE DEFAULT KEY, который бывает пустым. В TYPES ключ DEFAULT KEY также может неожиданно оказаться пустым для стандартной таблицы. SAP советует явно указывать значимые компоненты; если первичный ключ для операций не нужен, можно осознанно задать EMPTY KEY. Для сортированных и хешированных таблиц первичный ключ должен быть указан явно.
Вторичный ключ может добавить путь чтения без изменения существующих обращений к таблице. Рассматривайте его как дополнительную структуру данных: выгода чтения должна оправдывать память и стоимость поддержания ключа при изменениях строк. Добавляйте его после того, как определили шаблоны доступа, а не по предположению, что больше ключей всегда лучше.
Проверка контракта перед реализацией#
Перед передачей внутренней таблицы через границу метода зафиксируйте:
- Какой набор полей идентифицирует строку предметно, и допускаются ли дубликаты в этом наборе?
- Как читают данные: по индексу, по полному ключу или по начальной части ключа?
- Требуется ли стабильный порядок строк или только порядок при конкретном чтении?
- Может ли вызывающий код изменять поля первичного ключа?
- Какие значения должны идти вместе: сумма и валюта, количество и единица, дата и её смысл?
Эти вопросы выявляют неоднозначный контракт до того, как выбор таблицы закрепится в коде. Вторичный ключ не исправляет ошибочную бизнес-идентичность, а уникальный ключ требует, чтобы повтор действительно считался ошибкой для этого набора.
Синтаксис и доступные API зависят от версии ABAP и модели разработки. Здесь описаны правила из документации ABAP Cloud, а не результат проверки компилятором или запуска SAP runtime; синтаксис нужно сверять с целевой системой.
Синтаксис и API различаются между классическим ABAP и ABAP Cloud. Код, допустимый в одной среде, может быть запрещён или непереносим в другой. Здесь нет заявления о запуске в ABAP runtime; точную грамматику сверяйте с документацией целевой версии.