Как отлаживать ABAP в трансформациях

Трансформации в SAP BW представляют собой сгенерированные системой программы. Вы, как разработчик, используете стрелочки, если необходимо передать данные без изменений, и пишите небольшие програмы (рутины) для преобразования данных при передаче их от инфопровайдера-источника к инфопровайдру-цели. При активации трансформации система создает программу (уникальную для данной системы) , в которой указана вся логика преобразований. В этой программе система автоматически пропишет все необходимые проверки, учтет разбиение данных по пакетам, сама сформирует типы данных и переменные, которые ей необходимы для работы, отдельно пропишет всю мета-информацию, чтобы вы могли далее импортировать трансформацию в другие системы и т.д. За основу система берет программу RSTRAN_MASTER_TMPL, и подставляет туда нужные значения, например указывает тип исходной таблицы (source_package) и тип целеавой таблицы (result_package). При вызове DTP (Data Transfer Process) произойдет вызов этой программы. SAP дает возможность разработчику внедрить свою логику при обработке информации, например, подготовить данные на входе, изменить данные в момент передачи, удалить лишнее у результата преобразований. Т.к. все это происходит в программе, вам, как разработчику, необходимо понимать, насколько корректно она работает, как она отреагирует на возможные ошибки, все ли случаи были вами учтены. Для отладки программ используется отладчик. Читать далее «Как отлаживать ABAP в трансформациях»

Не запускается диспетчер

Без всяких причин перестал запускаться диспетчер. Запускаю через mmc, все запускается, но gateway и диспетчер — в желтом статусе.
Читать далее «Не запускается диспетчер»

Как создать дерево источников данных в исходной системе (SAP ERP)

Если вы делаете экстракцию из SAP системы, то вам повезло, компания SAP заранее подготовила сотни источников данных, структурировала их, разбила по соответствующим областям (компонентам) и представила разработчику ввиде одного дерева с источниками. В этом дереве не трудно ориентироваться по модулям. Если вам нужны источники данных по недвижимости, ищите ветку 0RE (Real Estate). Если вам нужны источники данных по финансам, ищите ветку 0FI (FinancialAccounting). Области называются в соответствии с компонентами SAP, данные которых вы собираетесь получить. По сути это набор данных, которыми данная система SAP (ERP) готова делиться с какой-либо BW системой. Эту же структуру источников (ветку) вы видите со стороны BW, когда спрашиваете у исходной системы — какими данными она готова делиться (тиражируете мета-данные из ERP в BW).

Читать далее «Как создать дерево источников данных в исходной системе (SAP ERP)»

Как создать тестовые данные в исходной системе (SAP ERP)

Для изучения возможностей ABAP компания SAP подготовила пакет разработок S_NWDEMO_BASIS, который поставляется с Netweaver и входит в компонент SAP_BASIS.
Это означает, что вероятнее всего в вашей системе так же есть данный пакет и вы можете проводить свое обучение непосредственно в системе на тех же объектах, что описаны здесь.

Читать далее «Как создать тестовые данные в исходной системе (SAP ERP)»

Как создать каталог инфообъектов

В вашей организации наверняка будет использоваться много инфообъектов для совершенно различных областей — одни инфообъекты необходимы для построения финансовой отчетности, другие необходимы для построения отчетности по логистике, третьи для HR, четвертые — для технических кубов (мониторинг системы, загрузки, контроль качества данных и т.д.).

Читать далее «Как создать каталог инфообъектов»

Генерация тестовых даных

Две интересных программы:

1. *CUBE*SAMPLE
Позволяет создавать mockup данные в провайдере. Использовать с осторожностью — при не правильных опциях система насоздает случайные SID в используемых признаках.

2. *ADSO*SAMPLE
То же самое, для ADSO. Позволяет в том числе генерить RECORDMODE, выставлять другую агрегацию. При создании записей с использованием существующих мастер-данных признаков — обратить внимание, будут использоваться только SID, у которых DATAFL = abap_true.

Удобно, если Reporting и DWH выполняют разные разработчики.

RSOOFIELD

Интересная таблица RSOOFIELD — в ней можно скрыть поля источника данных исходной системы, так что BW при тиражировании не увидит их. Можно так же указать, имеет ли система получатель право делать выбор в инфопакете или нет

Статусы для объектов RE

Оказывается в варианте SPRO для решения RE-FX — RECACUST есть настройка для статусной схемы RE объектов. Статусы передаются стандартным источником и записываются в стандартные атрибуты признаков 0REBUILDING, 0REPROPERTY и т.д.

Найти можно  в ветке: tcode RECACUST — Information System — SAP Business Information Warehouse — Status Concept — Maintain BW Status Object for User Status.

Тут же можно сгенерировать источник для текстов.

Webi долго работает

Столкнулся с проблемой. BEx отчет отрабатывает за 8 секунд, Webi на нем отрабатывает 140 секунд.
Решал следующим образом:
1. Поставил трейс в ST01 на SQL. Не увидел ничего криминального
2. Поставил трейс в RSTT. Увидел, что большинство времени тратится на два FM:
  • RSR_MDX_BXML_GET_INFO — получает информацию от bex
  • RSR_MDX_BXML_GZIP_DATA — упаковывает запрос и передает неоднократно на сервер  BObj
3. Зашел в STAD, увидел то же самое. Заметил, что Memory Used около 500 мб. Подумал, что наверно, большой объем данных передается из BEx в BO.
4. Обратил внимание, что в BEx отображается 1000 строк, а в сводке запроса Webi 14000 строк. Это означает, что настройка подавления нулей была проигнорирована стороной Webi, Query Designer предупреждал об этом
5. Создал несколько фильтров на стороне запроса Webi, скрывающий нулевые строки. В результате в отчет стало передаваться меньше данных.
6. Уменьшил количество фильтров до одного — спустил расчет фильтруемых значений в BEX — сократил в семь раз время выполнения.

LOOP AT itab GROUP BY group

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

LOOP AT itab GROUP BY 
( comp_code = result_fields-comp_code
  busentity = result_fields-busentity
  rebuilding = result_fields-rebuilding )
REFERENCE INTO DATA (group_ref).
     LOOP AT group_ref ASSIGNING <result_fields>.
     <…>
     ENDLOOP
ENDLOOP.
Если есть записи:
comp_code busentity rebuilding cha1 cha2
1000            1001       1003          abc   xyz
1000            1001       1003          qwe  rty
1000            1001       1003          asd   dfg
1000            1001       1004          zxc   vbn
1000            1001       1004          yui   opp
То в первом цикле мы упакуем в группу group_ref первые три записи, и пройдемся по ним, 
во втором цикле упакуем следующие две записи и пройдемся по ним.

Отсутствуют полномочия Изменить для Query ‘QueryName’

Поймал ошибку полномочий в Query Designer. 

Открыл запрос, получил ошибку:

У пользователя SAP_ALL, трейс проблем не видит:
Оказалось, что запрос был создан  в GUI 7.40, при открытии в GUI 7.30 возникает такая ошибка. 
При обновлении ошибка устранилась.

#TOREFRESH

Для того, чтобы избежать ошибки #TOREFRESH в ячейке webi отчета при добавлении какого-либо нового показателя на лист можно пойти на хитрость и в юниверс-дизайнере принудительно установить способ требуемой агрегации для показателя (меры). Обычно это SUM. 
По умолчанию агрегация делегируется от источника — «БД делегирован».
Так же иногда помогает при #UNAVAILABLE

Не отображаются сведения в webi

Была такая проблема, которую никак не могу объяснить.
Имеем бекс на кубике. В кубике есть инфообъект. У него есть атрибут — «Дата создания».
Бекс вытягивает этот инфообъект и его атрибут, и отлично отображает.

Webi как известно, игнорирует атрибуты, которые мы выводим в бексе. Он видит абсолютно все атрибуты признака, поэтому в бексе их можно не выводить дополнительно. Но, отображает, к сожалению, не все. Например, в данном примере не отображает дату.

Атрибуты webi видит как «Сведения». 

Проблема самоустранилась с переходом на 7.4 on HANA.

DTP перестал забирать записи

Возникла странная ситуация на BI7.4 on HANA. Запросы загружались в PSA в нулевую таблицу /BIC/B000xxx000. Далее забирались вверх потоком. Через 16 минут они почему-то стали загружаться уже в первую таблицу /BIC/B000xxx001. Дельта DTP их по прежнему забирал, но передавал 0 записей. 

Источник не был изменен за это время. Объем — примерно 40-50 записей.

Исправить удалось так:
1. Откатил все последние запросы из таблицы /BIC/B000xxx001
2. Убрал в DTP оптимизацию под HANA
3. Заново запустил DTP — процесс увидел записи
4. Снова включил оптимизацию под HANA
5. На всякий случай сделал полный откат запросов и загрузил их все. Подхватил из обоих таблиц.

Ошибка при активации DSO

В исходной ERP системе была одна запись из трех миллионов, в котором одно поле было, видимо, null. 
При инициализации дельты эти три миллиона записей из PSA передавались в DSO и активировались там около 3х часов. В итоге на одной записи активация падала со словами что-то вроде «Can’not generate SID for object ‘iOBJ’ value »». Соответственно даже зная объект, отловить эту некорректную запись было не возможно. 
Коллега подсказал такой кусок кода в rule routine к этому объекту:
data: lv_char(60) type c.
lv_char = source_fields-iobj(60).
replace all occurrences of regex ‘[[:cntrl:]]’ in lv_char with ».
result = lv_char.
Что такое ‘[[:cntrl:]]’ мне не понятно, но кривого значения как небывало.

Импорт объектов

При импорте запросов особенно часто возникают ошибки из-за отсутствия объектов в целевой системе. Я для себя выработал следующую стратегию:
  • Разделяю все активируемые объекты на разные запросы, и импортирую их в следующем порядке:
  1. Инфопровайдеры
  2. ABAP
  3. Источники
  4. Инфопакеты
  5. Инфообъекты
  6. ETL  — Трансформации, DTP, рутины
  7. Цепочки процессов
  8. BEx
  • Перед импортом захожу в RS09. Транзакция показывает объекты в запросе с соответствующими иконками — визуально можно оценить все ли хватает
  • Перед деблокированием копий жму Shift + F12 — Моделировать деблокирование. 
  • Захожу в «Связь с переносом», выбираю просмотр списком, выбираю нужный измененный объект. Как известно инструмент этот опасный, может захватить лишнего, поэтому отменяю весь выбор и вручную прощелкиваю объекты и расфасовываю их по разным запросам.
Такая последовательность действий очень хорошо позволяет снизить вероятность ошибок при импорте уже деблокированных запросов.

Неудачный импорт объекта ELEM

Часто бывает так, что при импорте запроса возникает ошибка с восьмеркой — объект ELEM такой то не импортирован. Без объяснения причин. Скорее всего это происходит, когда мы корректируем BEx запрос, в котором присутствуют некоторые объекты, созданные непосредственно на инфопровайдере, а не в запросе. При этом объект может находится в локальных объектах, либо не донесен до целевой системы по ландшафту. Поэтому при импорте объектов запроса в целевую систему TMS не пишет ошибок, однако на стадии активации  BEx запроса выясняется что тот или иной объект отсутствует, поэтому активация query (объект REP) не возможна.
Понять какой именно объект отсутствует в целевой системе можно двумя способами. Посмотреть в таблице RSZELTDIR описание объекта, вспомнить в каком query он используется и добавить его в запрос на импорт, либо непосредственно найти через «Связь с переносом». Тип объекта (запрос, фильтр, показатель, расчетный показатель и т.д.) можно узнать из таблицы. Так же можно посмотреть в SE03, может быть он уже где то блокирован, поэтому не захватился при активации query.

Визуально заранее оценить целостность запроса на импорт к сожалению не возможно. При импорте двух-трех более менее сложных отчетов можно получить более двухсот объектов в запросе.