Все больше ABAP разработчиков используют в разработке различные CDS. Внутри CDS можно выбирать данные из таблиц и выполнять некоторые манипуляции с выборками через AMDP-методы и виртуальные элементы. Однако выбрать, например, SAPScript-тексты в CDS не получится, так как тексты хранятся в таблице в бинарном виде. Расскажу о собственном решении и о найденном позже стандартном.
Предыстория или собственный велосипед
С проблемой выборки SAPScript-текста внутри CDS мы столкнулись пару месяцев назад. В Fioiri-приложении списка договоров нужно было добавить фильтр по признаку "Тип цены". Значение параметра определялось наличием текста для определенного идентификатора TDID SapScript-текстов. Если текста не было, тип определялся как фиксированный, в противном случае — как индексный. Список был реализован через AMDP-метод.
Ответ мы искали преимущественно со стороны выборки, т.е. как выбрать текст внутри CDS. Ничего толком не найдя, мы решили сохранять текст в Z-таблицу и выбирать из нее. Создали две таблицы: одна определяла, какие тексты будут сохраняться, вторая хранила сами данные.
В методе, сохранявшем SAPScript-тексты мы добавили сохранение в наши таблицы. В CDS добавили выборку из ZABAP_LTEXT_DAT. Задача была решена.
Через четыре месяца обнаружились проблемы — у некоторых договоров текст сохранялся в других процессах, где не работало сохранение в ZABAP_LTEXT* таблицы. Мы начали искать такое место в коде, которое бы отрабатывало при любом изменении SAPScript-текста и где мы могли бы его сохранить в Z-таблицы. Такого места мы не нашли, но нашли стандартное решение этой проблемы.
Стандартное решение
В процессе поиска расширений в функциональном модуле COMMIT_TEXT мы обнаружили класс CL_RSTX_TEXT_CHANGE_POSTPROC, который появился в 740 релизе. У этого класса мы наткнулись на метод HANDLE_TEXT_CHANGES, внутри которого динамически вызывается метод UPDATE_LONGTEXT_DB класса CL_ESH_SR_LTXT_UTLY. Скромный комментарий напротив константы подтвердил гипотезу о том, что это то, что нам нужно:
Дальше мы обнаружили таблицы ESH_SR_TXT_OBJ и ESH_SR_LTXT. В ESH_SR_TXT_OBJ хранятся идентификаторы длинных текстов, которые при сохранении копируются в ESH_SR_LTXT. Их схема очень похожа на то, что сделали мы:
Осталось создать ракурс ведения для ESH_SR_TXT_OBJ, добавить нужные идентификаторы в таблицу и выбирать незашифрованный текст из ESH_SR_LTXT в CDS.
Надеюсь, эта статья сохранит время не одному разработчику, а также покажет, как разные взгляды на задачу могут дать разные решения. Хоть наше решение и было похоже на стандартное, было бы здорово обнаружить стандартное раньше.