РАЗРАБОТКА ABAPP1L3

CDS для финансовых данных: гранулярность, доступ и производительность

Как определять уровень строки и ключ CDS-модели, не искажать суммы связями и валютами, применять DCL и измерять запрос в целевой системе.

Ревизия 1 Общие понятия Частичное покрытие Контекст: CTX-GENERALКонтекст: CTX-S4-ONPREM документальная опора: недостаточно данных
Справочный материал. Контракты данных, архитектурные решения и ограничения применения. Источники приведены в материалах, где используются внешние основания.

CDS для финансовых данных: гранулярность, доступ и производительность#

CDS-модель для финансовой аналитики должна сохранять смысл каждой строки от исходного объекта до итоговой выборки. Наибольшие риски обычно связаны не с синтаксисом CDS, а с неверным уровнем детализации, размножением строк, суммированием несовместимых валют и неявными границами доступа.

Определите уровень строки до выбора полей#

Запишите, что представляет одна строка потребителю: документ, позицию документа, сальдо по счёту и периоду, открытую позицию на дату или агрегат по набору измерений. Для каждой модели зафиксируйте ключ, фильтры, валюту, дату среза и правила включения сторно, переноса остатков и незавершённых записей.

В документации SAP S/4HANA On-Premise 2023 CDS view I_JournalEntryItem представляет детали позиции бухгалтерского документа и содержит измерения вроде ledger, компании, счёта и мест назначения затрат; в числе мер указаны суммы в разных валютах. Это пример определённой модели и выпуска. Он не задаёт универсальный ключ для любого отчёта, не доказывает наличие объекта в другой редакции и не заменяет проверку актуальной версии опубликованного API.

Не считайте key в CDS гарантией уникальности источника или результата после соединения. Сверяйте естественный ключ и фактическую кратность на тестовом наборе. В финансовом примере ключ позиции может включать контекст ledger и документа, но точный состав зависит от объекта, продукта и требуемого уровня детализации.

Проверяйте связи на умножение строк#

Рассмотрим синтетический пример: одна позиция на 100 USD связана с двумя активными назначениями. После разворачивания связи результат содержит две строки по 100 USD, и сумма становится 200 USD, хотя исходная сумма документа не менялась. Причина не в арифметике, а в несовпадении гранулярности.

Перед включением пути или association проверьте:

  1. Сколько целевых записей может соответствовать одной исходной записи в нужный момент времени?
  2. Какие условия делают связь уникальной: ключ, действующий интервал, язык, статус или тип назначения?
  3. Нужно ли показать связь на уровне детализации строки, агрегировать её отдельно или вернуть только признак существования?
  4. Изменились ли число строк и контрольные суммы до и после добавления поля связи?

Кардинальность CDS описывает отношение строк и может использоваться оптимизатором. Она не заставляет данные соответствовать заявленному отношению. Ошибочно указанная кратность способна привести к неожиданным результатам оптимизации. Поэтому задавайте её по подтверждённым данным и тестируйте путь с фактическими ключами и условиями.

Если атрибут один-ко-многим нельзя без потерь свести к одному значению, не присоединяйте его к денежному факту до агрегации. Постройте отдельную проекцию на нужный уровень детализации или примените правило выбора, для которого есть бизнес-основание. Не выбирайте произвольную MAX, MIN или первую строку только ради устранения дублей.

Не складывайте несовместимые суммы#

Сумма должна иметь явную семантическую ссылку на валюту; количество - на единицу. Аналитическая мера должна иметь обоснованное правило агрегирования. SAP документирует @Aggregation.Default для мер и различает их от измерений. Агрегаты уважают одинаковую семантику: суммы в разных валютах возвращаются раздельно, а не превращаются автоматически в однородный итог.

Для финансового показателя определите перед агрегацией:

  • валютный тип: транзакционная, валюта компании, группы или другая явно названная;
  • дату и тип курса, если выполняется конвертация;
  • ledger, компанию, финансовый период и источник суммы;
  • включение дебетовых/кредитовых признаков, сторно и статистических записей;
  • допустимое правило округления и ожидаемое число строк.

Не суммируйте transaction currency без группировки по валюте либо без отдельно обоснованного преобразования. Не складывайте разные ledger или типы валют только потому, что поле названо Amount. Аннотация помогает потребителю интерпретировать столбец, но не исправляет неверную дату курса или потерянный измерительный контекст.

Сохраняйте происхождение финансовых данных#

Для показателя сохраняйте путь от исходной позиции к отчётному результату: исходный документ и позицию, ledger, компанию, период, версию модели и правила фильтра. Header-поля могут повторяться на каждой позиции; объединение по заголовку допустимо только если модель сохраняет отношение «многие к одному». Для переходов и сверок отдельно учитывайте ссылочный документ, исходную систему и признаки реверса, если они доступны в выбранном контракте.

Полезный тестовый набор содержит: одну позицию без связи, связь один-к-одному, связь один-ко-многим, два документа с одинаковой суммой, две валюты, реверс, граничную дату и пустое необязательное измерение. Сравнивайте не только общий итог, но и состав по естественным ключам и измерениям. Взаимно компенсирующиеся пропуски и дубли могут оставить общий итог неизменным.

Защищайте каждый публикуемый слой#

CDS access control на ABAP SQL задаётся DCL-ролями и условиями чтения. Не предполагайте автоматическое наследование DCL от нижней сущности к потребляющей CDS-модели: защищайте каждый слой, который требуется ограничить, и отдельно проверяйте путь конкретного приложения. WITH PRIVILEGED ACCESS может обойти CDS access control, поэтому его применение требует явного обоснования и аудита.

Проверяйте выборку от имени пользователей с разными разрешёнными company code, ledger или сегментами. Сверяйте отсутствие данных, доступные строки, значения фильтров и поведение потребителя. DCL не заменяет проверку права запустить приложение и не доказывает, что все внешние потребители используют защищённый путь. В Public Edition учитывайте отдельную модель business roles и restriction types; ABAP Cross-Product DCL документация сама по себе не подтверждает конкретную конфигурацию tenant.

Измеряйте запрос в целевой среде#

Сначала проверьте правильность строк и суммы на небольшом наборе. Затем измеряйте обычный сценарий пользователя с реалистичными фильтрами и объёмом. Для указанного релиза документация SAP описывает SQL Trace в ADT/ABAP Workbench: включить запись перед действием, выполнить сценарий, выключить запись и анализировать зафиксированные SQL-операции. Трасса подтверждает только наблюдённый запуск с его пользователем, параметрами, данными и моментом времени.

Проверяйте фактически сформированные условия, количество обращений, повторные запросы, отбор по ключам, join-цепочки и объём результата. Не переносите цифры из синтетического Python-примера на SAP HANA и не оптимизируйте, удаляя обязательные условия доступа. После изменения кардинальности, DCL, projection или фильтров повторите функциональную сверку и замер.

Статус источников и проверки#

Сведения о Journal Entry Item ограничены SAP S/4HANA On-Premise 2023; SQL Trace - документированному контексту ABAP Platform 2025 FPS01. Остальные описания задают общие понятия CDS и не подтверждают доступность функции в конкретной системе. Источники зарегистрированы как metadata_only; исходные снимки не сохранены. Синтетический пример не является SAP-реализацией. В этом проекте не подключались к SAP, не запускали DCL, CDS, SQL Trace или финансовый тест.

Источники и документация

  1. Journal Entry Item, SAP S/4HANA On-Premise 2023 ↗
  2. Annotating Aggregate Functions in CDS, 2025 FPS01 ↗
  3. Cardinality, ABAP CDS Data Models ↗
  4. Access Control, ABAP CDS Data Models ↗
  5. SQL Trace Analysis, ABAP Platform 2025 FPS01 ↗

Источники нужны для самостоятельной проверки. Примеры и интерпретации на сайте могут быть учебными упрощениями.