понедельник, 4 февраля 2013 г.

Конфигурация BOPF

Для конфигурации объектов и ваших расширений в в Business Object Processing Framework служит транзакция /BOBF/CONF_UI. Но по умолчанию она открывается в режиме просмотра, и любые кнопки для изменения, в том числе переключения режима, недоступны. Чтобы их активировать необходимо в окне команд ввести DEBUG и затем во всплывшем окне подтвердить свое намерение.

четверг, 24 января 2013 г.

Отправка EMAIL. Подтверждения доставки и прочтения

Программно Email из SAP удобно создавать и отправлять с помощью  Business Communication Service. Примеры можно найти в программах BCS_EXAMPLE_*.

По умолчанию к письмам почему-то добавляются запросы о доставке и прочтении. Иногда это совсем не нужно. Отменить их можно так:

lo_request->SET_STATUS_ATTRIBUTES( I_REQUESTED_STATUS = 'E'  ). ,
где lo_request - экземпляр класса CL_BCS.


Wait

Команда wait up to N seconds в ABAP  теоретически может принимать в качестве N вещественные числа. Например, так:
wait up to '0.1' seconds.

Но на практике оказывается, что она  их округляет. Таким образом, wait up to '0.5' seconds соответствует 1 секунде, а wait up to '0.4' seconds - 0 секунд. С одной и более секунд понятно, а вот 0 секунд на первый взгляд бессмысленны, но это не так. Например, если вы запустили новую задачу с помощью CALL FUNCTION '...' STARTING NEW TASK и в цикле ожидаете ее завершения, чтобы получить результаты, то пока вы не вызовите wait, у вас не отработает та форма или метод класса, которую/который вы назначили как callback для вашей задачи. Поэтому в цикле ожидания имеет смысл вызывать именно wait up to 0 seconds, потому что даже целая секунда в данном случае  - это много.

пятница, 28 сентября 2012 г.

понедельник, 6 августа 2012 г.

Встраивание своего обработчика в процесс вывода BSP приложения.

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

Вначале была идея написать свой HTTP Request Handler  и встроить его в систему. Но выяснились следующие вещи. Во-первых, просто присвоить свой обработчик  в транзакции SICF к своему Z-BSP-приложению  не получится, потому что все Z-BSP-приложения находятся на уровне /default_host/sap/bc/bsp/sap/*, а на раздел BSP уже назначен обработчик CL_HTTP_EXT_BSP, и все обработчике ниже этого узла работать не будут. Можно бы было добавить свой обработчик к узлу  /default_host/sap/bc/bsp/, либо  вообще его заменить своим, из которого уже вызывать изначальный. Но как показывает чужой опыт (вот, например) это может привести к тому, что сервис будет деактивирован после переноса запроса в целевую систему. Хотя его потом можно активировать вручную, хотелось бы избежать лишних телодвижений и дерганья базисников. И это - во-вторых.

Тогда был найден другой способ. Каждому BSP приложению можно назначить Класс приложения на вкладке Свойства. Этому классу (либо его родительскому классу) можно назначить интерфейс IF_BSP_APPLICATION_EVENTS и реализовать его. Реализовать нужно 4 метода   (ON_REQUEST, ON_RESPONSE,  ON_START и ON_STOP). Причем реализация может быть пустой - главное чтобы метод был.
Методы ON_START и ON_STOP вызываются при запуске и завершении всего BSP-приложения. Методы ON_REQUEST и ON_RESPONSE вызываются для каждого запроса, перед и после стандартного обработчика, соответственно.

В моем случае мне подходил ON_RESPONSE, так как мне нужно было менять готовый ответ. Текущую отдаваемую страницу можно было получить с помощью RESPONSE->GET_CDATA( ), а установить новую с помощью RESPONSE->SET_CDATA(), где RESPONSE - параметр метода ON_RESPONSE типа IF_HTTP_RESPONSE.

пятница, 13 июля 2012 г.

среда, 13 июня 2012 г.

Изменение позиций финансовых документов.

Финансы в SAP писали совсем другие люди, что писали например MM-SD. В последних есть какие-то BADI, BAPI, User-Exit и прочие технологии, которые позволяют внедрится в процесс создания/изменения логистических документов, либо просто их менять из своих программ. В FI для внедрения служат как правило замещения. Есть еще OpenFI, но в каких-то случаях он работает в каких-то нет. В любом случае если нужно поменять финансовый документ из своей программы, то как правило для этого нет никаких ФМ или BAPI, и вместо них приходится применять "пакетники" (batch input). Если кто не в курсе - это аналог макросов в продуктах  MS Office. "Пакетник" записывается на какую-то стандартную транзакцию и фактически эмулирует действия пользователя, когда он работает в этой транзакции. Это, конечно, относительно медленно, но других вариантов как правило нет. Вернее можно, конечно, напрямую обновлять BSEG, только это чревато получением неконсистентности данных.  Но основной минус "пакетников" - это то, что они, скажем так, однонаправленные. То есть, можно передать транзакции команды и тем самым сказать что делать, но невозможно прочитать из транзакции ее текущее состояние - то есть нельзя понять, что получилось в вычисляемых полях, получить данные списка в том порядке, как он выведен на экране (это часто нужно для позиционирования или выделения), даже нельзя получить номер экрана на котором мы находимся, если, например, следующий экран зависит от введенных данных. Вот последнее особенно портит нервы, поскольку команды в "пакетнике" привязаны к экрану.

Например, записали вы "пакетник" на изменение текста позиции FI-документа в транзакции FB02. Проверили на примерах - все вроде работает. Отдали в тест и выясняется, что когда то работает, а когда то нет.
Включили интерактивный режим, запустили пример на котором не сработало, выполнение дошло до нужного экрана как вам кажется и остановилось, причем текст не поменялся, сохранение не производится. Непонятно.

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

Можно, конечно, провести пару незабываемых часов в отладке выясняя почему уже оно так. Но к счастью  для изменения позиций финансового документа есть ФМ
FI_ITEMS_MASS_CHANGE, в котором вся эта логика уже зашита. По факту он точно также выполняет пакетник, но все заморочки с экранами решает за вас.