Про дилетантов

Не так давно на Хабре пробежала статья, в которой некий дилетант кидал камни в огород SAP.

Один из камней:

Почему люди переводившие продукт не понимали русский язык? Потому что даже при перепечатывании русскоговорящий человек должен был усомниться, увидев фразу «Пушномолочная свинья-несушка» — так до определенного времени называлась программа RAIMEWMS (сейчас название уже исправили). В оригинале она называется «Eierlegende Wollmilchsau», что переводится как «Мастер на все руки», но умный Magic Gooddy посчитал, что Wollmilchsau – это 3 отдельных слова (Woll, milch, sau) и перевел фразу «Eierlegende Woll milch sau» как «Яйцо укладки шерсти молока свиноматки». Остается только гадать, как это потом превратилось в «Пушномолочная свинья-несушка».

Вот вопрос: кто больший дилетант? Тот, кто сделал такой перевод, или тот, кто кинул камень?

По пунктам:

(далее…)

Куда пристроить модульные тесты в ABAP. Часть вторая. Первые грабли.

Первый шаг сделан. Теперь нужно расширить и углубить наше наступление. Глобальная цель – максимально полное покрытие тестами, в рамках целесообразности происходящего.

Грабля первая. Обработка ошибок.

Допустим, наш ФМ делает не замещение значений, а проверку:

function zfi_bte_00001120.

  if ls_bseg-zuonr eq space.
    message ‘Поле Присвоение обязательно для заполнения’ type ‘E’.
  endif.

endfunction.

Тут есть две проблемы.

(далее…)

Куда пристроить модульные тесты в ABAP. Часть первая. Первый тест.

В умных книгах и статьях много про это написано в целом. Но вопрос по части специфики в ABAP-программировании раскрыт мало.

ABAP-программирование может быть совсем разным. Но почти в любом большом проекте его можно разложить на следующие кучи:

  • Экзиты (user-exits). Сюда относятся: проверки, замещения, BTE, BAdI, CMOD и подобные способы расширения стандартной функциональности.
  • Собственное приложение. Вполне вероятно, что это будет вариация на тему CRUD.
  • Отчеты. Можно сказать, что отчёт – это такое собственное приложение, но у программ такого рода есть свои нюансы.
  • Входящая интеграция, исходящая интеграция. Мы вызываем, нас вызывают, как это часто не совпадает.
  • Вспомогательные библиотеки. Полуфабрикаты, необходимые для построения готового продукта.

А теперь отдельно про экзиты.

(далее…)

Формирование фоновых заданий и массовый запуск транзакции ASKB/ASKBN

Изначальная постановка задачи сводилась к тому, что в системе необходим еженедельный автоматический запуск транзакции ASKB. Ничего сложного.

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

Загвоздка вторая: транзакция ASKB не умеет работать с несколькими БЕ. Экран выбора не оставляет выбора. Если бы на нашем проекте было бы мало БЕ (одна-две-три), то можно было бы просто создать напрямую несколько фоновых заданий и дело в шляпе. Но если у нас сотня БЕ, то уже необходима собственная запускалка, раз стандартной нет никакой.

Отлично, приступаем к реализации.

(далее…)

Ещё один потолок

Работа в отчётах с параметром SELECT-OPTIONS проста.

Сначала определяем:

select-options: s_anln1 for anla-anln1.

Потом используем:

select * from anla into table gt_report where anln1 in s_anln1.

Всё просто на первый взгляд. При таком коде внутри Open SQL происходит простая работа: OpenSQL трансформируется в NativeSQL, а там подобной конструкции нет. Поэтому фактический запрос превращается приблизительно в следующее:

select * from dbchema.anla where anln1 = ‘1’ or anln1 = ‘2’ or anln1 = ‘3’;

И если бы забьём очень много значений в поле выбора, то длина получающегося в результате SQL запроса будет расти линейно. Именно где-то тут я встретился с узким местом, в котором меня стукнули по носу динамической ошибкой DBIF_RSQL_INVALID_RSQL. Интересно, а почему не SAPSQL_STMNT_TOO_LARGE?

В моём случае это примерно 9980 значений типа ANLN1. Это эмпирическое число видимо будет разниться от системе к системе, от используемого типа данных и прочих условий. И как его гарантированно предсказать в общем случае?

Есть в недавней игре Saints Row: Gat Out of Hell одно достижение: десять раз стукнуться головой о потолок.

 

Achievement unlocked

 

Как быть?

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

Аудит в ландшафте разработки ABAP. Часть 5. Функциональные модули и группы функций

Небольшой периодический аудит в системе разработки, как и периодическое медицинское обследование не бывает лишним. Это может понадобиться, если вы:

  • входите на проект с существующим большим историческим слоем разработок
  • принимаете большой объём разработок от подрядчика/субподрядчика
  • просто решаетесь на ежегодную генералку или ревизию

 

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

(далее…)

Полномочия на OB52 по БЕ

Так оказалось, что в транзакции переключения открытых периодов OB52 не предполагается разделение полномочий по БЕ (или вариантам периодов проводки). Но что делать, если у нас очень много БЕ и мы не готовы возложить такую ответственность на кого-либо.

OB52 - определение периодов проводки

Как добиться?

(далее…)