ALV – это не только простые таблицы

Разрабатывая отчетики на базе ALV можно также обратить внимание на дополнительные аспекты – не всегда простой таблицы бывает достаточно, а рисовать свои экраны не сильно тянет.

Если покопаться в примерах, то можно найти несколько полезных вариантов.

Одна оговорка: в данном случае ALV представлено не своим красивым элементом управления, а ABAP-списком. В стандарте очень много отчётов строятся похожим образом.

 

Иерархический просмотр master-detail

Пример можно найти в программе BALVHD01.

Пример иерархической таблицы

Этот отчёт строится на базе функционального модуля REUSE_ALV_HIERSEQ_LIST_DISPLAY.

Основная ALV функциональность присутствует: управление вариантами, сортировки, суммы, группировки, фильтр и прочее.

Иерархичность тут не полная, а всего лишь отношение master-detail, чего в большинстве случаев может и хватить, так как покрывает стандартные отношения типа “заголовок документа – позиции документа”.

Ко всему прочему, такой вывод поддерживает многострочность одной строки (до трёх строк), что позволяет упаковать больше данных по ширине экрана.

Несколько независимых таблиц

Пример можно обнаружить в программе BALVBT01.

Последовательные таблицы ALV

Такой вариант реализуется на базе функциональных модулей REUSE_ALV_BLOCK_LIST_INIT, REUSE_ALV_BLOCK_LIST_APPEND, REUSE_ALV_BLOCK_LIST_HS_APPEND, REUSE_ALV_BLOCK_LIST_DISPLAY.

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

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

Задачка по программированию на любом языке

Просто к слову вспомнили задачку для начинающих.

Есть переменные A и B – целые числа.

Требуется поменять их местами, не прибегая к помощи других переменных и специальных методов. Перекладываю на язык ABAP:

Задачка по обмену значениями

Вот и требуется вписать в серединку несколько строчек.

Ответ давать и не буду, задачка решается и в уме.

“Порадовали” переводчики SAP

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

Как и в любой около-денежной системе в SAP есть справочник валют.

Сделал небольшой отчётик по курсам валют:

Курсы валют

Пару минут втуплял, что же за такая непредусмотренная колонка “Всего”, и откуда в ней ещё какое-то маленькое значение.

 

(далее…)

Использование двоеточий и запятых в ABAP

Вообще подход к двоеточиям и запятым в ABAP достаточно странный (если сравнивать с другими языками программирования). И я, как правило, использовал его или для определения данных DATA, или в операторах write.

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

Пример повтояющегося perform

Первый, второй и третий блоки выполняют одинаковое действие.

Трассировка транзакций и поиск провалов производительности

Если вдруг какая-то транзакция (отчёт) сильно притормаживает или даже виснет, то далеко не каждый администратор, консультант или продвинутый пользователь способен разобраться в этой проблеме.

С одной стороны администратор – это человек которому ничего не говорят транзакции и объекты бизнес-процессов, а с другой стороны консультанты и пользователи ничего не смыслят в базисе и программировании.

Есть несколько разных способов, пригодных для решения этой проблемы.

Самое главное – это выбрать достаточно точные шаги по многоразовому воспроизведению проблемы.

Один из основных – это динамический анализ (транзакция SE30).

(далее…)

Индикатор прогресса при обработке больших объёмов

Достаточно неприлично выглядит, если выполняется достаточно долгая обработка (от 10 секунд и больше) и при этом пользователю не показан ход процесса.

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

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

Этот индикатор можно вызвать и самому – функциональный модуль SAPGUI_PROGRESS_INDICATOR, в котором нет ничего сложного – передаётся рассчитанный процент и текст.

Маленькая тонкость: если вызывать его слишком часто, то:

  • Обновляется некрасиво и неразборчиво
  • Увеличивается обмен информацией между клиентом и сервером

(далее…)

Определение расширений BAPI

Переодически забываю этот метод. Запишу себе в блокнотик, чтоб не забывать.

Транзакция: se80

Класс: CL_EXITHANDLER

Метод: GET_INSTANCE

Точка прерывания: на первой строке CALL METHOD cl_exithandler=>get_class_name_by_interface

Имя искомого BADI: в переменной exit_name

Ставится точка прерывания и запускается нужная транзакция. В переменной exit_name будут всплывать имена подключаемых BADI.

Забавное использование стратегии деривации – в качестве хранилища данных

Транзакция FMDERIVE может использоваться как хранилище данных настроек.

    В первую очередь для того, чтобы не плодить Z-таблицы. Причем можно использовать и в целях не связанных с модулем FM.

В качестве минусов, конечно, можно отметить:

  • Нецелевое использование функциональности
  • Сложность распределения прав

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

Примеры использования:

  • Соответствие МВЗ и счетов затрат
  • Список допустимых комбинаций Счет + МВЗ + Заказ
    Для этого заходим в транзакцию FMDERIVE и создаём там новую стратегию:

(далее…)

Разбор вложенных структур

Проблемка и решение

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

Там в кишках слепок таблицы Excel перекладывается в целевую таблицу.

image

Дальше перекладываются значения в зависимости от типов колонок.

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

image

Соответственно ASSIGN COMPONENT стал вести не на целевое поле, а на структуру со всеми вытекающими неприятными последствиями.

И вот сделал такую переборку внутренних вложенных структур:

image

Тип “u” это как раз вложенные структуры (плоские).

Ну решение простое, можно конечно ещё извернуться с рекурсией и типом “v” (это уже посложнее – deep structure). Но это пока не требуется.

Вот так и использование DESCRIBE FIELD помогает.

Между делом

Вообще использование вложенных структур сильно может помочь. Основные преимущества подхода:

  • Возможность сравнения подструктур
  • Возможность использование move-corresponding в подструктурах

В моём случае подструктуры – это блоки дебета и кредита бухгалтерской проводки.

Можно сильно сократить объём кода и его понятность в некоторых местах, например:

image

Может также использоваться для пар старых-новых значений, или для сравнения данных (источник-назначение).

От Экселя до Шахмат

ABAP2XLSX

Началось всё с осмотра одной разработки – abap2xlsx. Ещё один движок экспорта данных в Excel. Движок как движок – есть преимущества и недостатки.

Фишки:

  • Экспорт происходит через  обработку XML.  Никаких OLE, CSV, HTML, макросов и прочих костылей
  • Теоретически – самый быстрый вариант при большом количестве данных
  • Теоретически доступны все возможности, если написать к ним верные обёртки – они не все написаны, но кое-что планируется по roadmap
  • Клиент не участвует в обработке – файл полностью генерируется на сервере

Недостатки:

  • Пока только развивается – ещё не совсем понятно, что из этого выйдет
  • До поддержки шаблонного подхода похоже ещё очень далеко – ещё несколько мажорных версий по roadmap (если я правильно понимаю фразу “v.3.0 — Add xlsx reader”

Выводы:

  • уже можно использовать в качестве замены чистому OLE-подходу
  • не годится для Excel 2003 в общем случае – требуется установка адд-она на клиентскую машину

Ничего особенно удивительного, но это погрузило меня в другое – целую кучу другого.

http://code.google.com/p/abap2xlsx/

Google Code

 

http://code.google.com/

Больше напомнило, чем удивило. Goole Code является альтернативой старому SourceForge. Просто и доступно, как и всё что Гугл делает. Что там есть:

  • страница проекта
  • документация в стиле Wiki
  • раздел файлов для загрузки
  • баготреккер
  • репозитарий на базе SVN

А что ещё нужно для коллективной работы над исходниками?

Google Wave

 

http://wave.google.com/

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

 

ZSAPLINK

 

http://code.google.com/p/saplink/

ZSAPLINK – это движок, через который можно обмениваться разработками. Интересный проект со своими заморочками.

Основная задача: формировать что-то вроде запросов – некоторый файл в формате XML, в котором лежат объекты разработки (отчёты, классы, таблицы, группы функций и так далее).

Этот файл можно получить из одной системы и развернуть на другой системе.

Как альтернатива файлам запросов имеет некоторые преимущества:

  • не требует деблокирования
  • не требует вмешательства администатора системы и транспортной системы
  • работает также и с локальными объектами
  • прозрачность файла-контейнера – формат XML
  • контейнер можно нормально класть в репозитарий (SVN) со всеми вытекающими
  • контейнер дополняем

В качестве заморочек можно отметить, что движку неизвестны все типы объектов разработки. К основным единицам разработки сделаны “плагины”, а к остальным плагины пока никто не написал – к таким можно отнести например объекты авторизации, диапазоны номеров и другие мелочные штучки.

Ещё из заморочек можно упомянуть необходимость ручной активации всех перенесённых объектов.

Тем не менее — полезная штука.

Есть к ней и альтернатива ZAPLINK – что-то похожее, но со своими заморочками.

Шахматы – ZSAPChess

 

http://code.google.com/p/sapchess/

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

image

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

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

SAP-Commander

 

http://code.google.com/p/sapcommander/

Двух-панельный файловый интерфейс с базовой функциональностью – F5-F6-F7-F8.

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

ZAKE

А это просто штука, которая позволяет работать с SVN-клиентом. Работает в паре с ZSAPLink.

В самом ABAP необходимости в SVN/CVS необходимости нет, потому что:

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

А пригодиться это может в двух случаях:

  • если ввязаться в какой-то проект на том же Google Code
  • если есть несколько систем с большим перечнем общих разработок универсального характера – тут синхронизация через SVN поможет
    Пока такой необходимости нет.

ABAP Report Wizard

 

http://code.google.com/p/abap-report-wizard/

Забавный генератор отчетов в виде мастера.

Основные шаги:

  1. С помощью визуального редактора добавляются таблицы и выстраиваются связи между ними
  2. Галочками отмечаются поля, которые необходимо вынести на селективный экран
  3. Галочками отмечаются поля, которые надо вынести на экран

В результате работы этого мастера в исходный код вставляется заготовка, которая работает практически без доработки напильником – выводит достаточно приличный ALV-отчет.

Заготовка содержит:

  • Селективный экран
  • Описание внутренней таблицы
  • Выборку данных (select … inner join …)
  • Подготовку и вывод ALV-grid

Ну а затем можно уже и напильником.

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

Есть к нему ещё более специализированная штука (ABAP Join Wizard), которая только выдаёт заготовку сложной выборки – описание внутренней таблицы и соответствующий оператор select.

Вот такая забавная штука.