Работа в отчётах с параметром 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

 

Как быть?

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

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

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

 

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

(more…)

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

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

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

(more…)

Есть у пользователей транзакцией ABNA, а транзакция ABNAN их кое-чем не устраивает. Любое серийное использование подобных транзакций рано или поздно обрастает вариантами. И вот порешили сделать два варианта транзакции. И тут возникли затруднения.

(more…)

При разработке отчётных форм часто возникают задачи по их оптимизации. C’est la vie, возникают они уже на стадии продуктивной эксплуатации, потому что в тестовой среде нечасто заботит обработка больших объёмов данных.

Для примера, все разработчики ABAP должны знать о проблемах вложенных LOOP.

Сегодня речь несколько другом примере:

loop at lt_anlp.
  read table gt_report assigning <gs_report>
    with key bukrs = lt_anlp-bukrs 
             anln1 = lt_anlp-anln1 
             anln2 = lt_anlp-anln2.
  check sy-subrc = 0.
  …
  <gs_report>-fig_h_knafa = … lt_anlp-knafa …
endloop.

Так что же с ним не то?

(more…)

Не первый раз вижу удивление начинающих разработчиков, когда они видят в продуктивном стандартном коде строки вида:

IF 1 = 2. MESSAGE e035(crm_bupa_bol). ENDIF.

Так в чём же дело?

(more…)

Назначение

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

Под катом много текста и картинок.

(more…)

* * *

– Это для примера, – объяснила я, и дядя Юра сразу успокоился. – Так вот, ты решил жениться, и тебе надо разослать кучу пригласительных. Что будешь делать?

– Ну, Ир, я же журналист, – объяснил дядя Юра. – Достану свою машинку, куплю пригласительные и за час все приглашения отстукаю. Ты же знаешь, я печатаю с такой скоростью, что машинку раз в полгода менять приходится.

– Вот-вот, – продолжила я. – У тебя на это уйдет час. А программист – он на передовом рубеже науки! У него – научный подход! Поэтому он сваяет программулю, и программуля сама все напечатает. Понял?

– Понял, – сказал дядя Юра. – А сколько у него на это времени уйдет?

Я задумалась, вспоминая наш с Серегой опыт в создании приглашений.

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

– Пары дней? – удивился дядя Юра. – Ничего себе прогресс. Значит старый и пузатый дядя Юра любому программисту даст сто очков вперед.

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

– А ты сколько раз собралась замуж выходить? – прищурился дядя Юра.

Я задумалась. Дядя Юра меня явно подловил.

* * *

Циферблат для итеративного решения задач

* * *

Каждый пишет, как он слышит,
Каждый слышит, как он дышит,
Как он дышит, так и пишет,
Не стараясь угодить…
Так природа захотела,
Почему – не наше дело,
Для чего – не нам судить.