вторник, 18 февраля 2014 г.

tvatv constat's

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

Выход был найден в использовании инфо-объект ZCONST.
Получилось даже гибче, ибо:

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



Пример данных:

Пишем\Читаем из таблицы 

   SELECT SINGLE *
     INTO ls_PZCONST
     FROM /BIC/PZCONST
     WHERE /BIC/ZCONST 'LCM_OFFSET_DATE'
     AND OBJVERS 'A'.

    UPDATE /BIC/PZCONST
         SET TCTHIGH l_date
         WHERE /BIC/ZCONST 'LCM_OFFSET_DATE'
           AND OBJVERS 'A'.


Разобрать pivot обратно

Возникла задачка разобрать pivotTable обратно...
Понятно что можно руками, макросом, и ...

Есть вариант через PivotTable and PivotChart Wizard - Multiple Consolidation Ranges
http://www.launchexcel.com/pivot-table-flatten-crosstab/

Есть правда небольшое ограничение, что первая колонка ключ...
В моем случае, можно было преобразовать,а потом lookup'ом подтащить значения
Либо слить первые столбцы в один ключ, преобразовать, потом 1й столбец распарсить

Основная фишка, что все делается стандартными средствами
Функция присутствует в Excel c версии 2010

Нестандартное использование экстракторов

Порадовали коллеги необычностью подхода - использовать экстрактор в качестве ERP отчета - типа выдает как надо пользователю... o_O

Даже расширения экстрактора можно использовать для добавления характеристик в отчет...

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

Измерение времени выполнения в трансформации

Для измерения времени выполнение кода (или блока) использую следующую конструкцию.
Результаты измерений соответственно отражаются логе загрузки.

  CONSTANTS:
    c_msg_header(24type value 'RSRMON              W000',
    c_seconds type value 1000000.

MOVE c_msg_header TO monitor_rec.
.
.
.
.
GET RUN TIME FIELD l_timer1.
.
. <измеряемый код>
.
GET RUN TIME FIELD l_timer2.
monitor_rec-msgv1 'Block XX:'.
monitor_rec-msgv2 |{ l_timer2 l_timer1 / c_seconds   } сек (l_timer2 l_timer1 NUMBER USER })|.
append monitor_rec to MONITOR.



(другая тема)
Пример функции replace в string template
L_VNAM |{ replaceval I_VNAM off strlenI_VNAM 1  len with '0' }|.

(ещё одна другая тема - ведущий ноль)
DATA:
      l_val(2type c,
      l_val2 type string.

        l_val  |{ sy-index WIDTH ALIGN RIGHT PAD '0' }|.
        l_val2 |{ sy-index WIDTH ALIGN RIGHT PAD '0' }|.

DATAl_str TYPE string.
l_str |{ 'START:' } { sy-uname } { sy-datum DATE USER } { sy-uzeit TIME USER }|.

среда, 22 января 2014 г.

0PROJECT Conversion Routine

Я как то привык что CONVERSION_EXIT_* подпрограммы основаны на различных преобразованиях к идентификатором признака, ну там 0-ли добавить убрать и т.п..

Но рутина для 0PROJECT слегка удивила (CONVERSION_EXIT_PROJ_OUTPUT), оказалось что представление кода проекта она считывает из таблицы мастер-данных проекта /BI0/MPROJECT- 0PROJECT_EX.

В общем типа не палимся :)

среда, 25 декабря 2013 г.

Повторное использование кода в трансформации

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

Варианты:
PERFORM - не работает в классах с одной стороны, и не знает ничего о типах внутри класса с другой. Описывать допольнительно тип из класса, тоже не интересно.
ФМ - т.к. код тупой и не предполагается его где-либо использовать, некрасиво. Опять же типы.
INCLUDE - тоже вариант, но не самый безопасный.

 Предлагаемый выход - создать свой метод.

1) Объявляем свой метод внутри класса
*$*$ begin of global - insert your declaration only below this line  *-*
    METHODS
      simple
        EXPORTING
          MONITOR                  type rstr_ty_t_monitors
         CHANGING
          RESULT_PACKAGE           type _ty_t_TG_1.

*$*$ end of global - insert your declaration only before this line   *-*

2) Создаем реализацию (т.с. самая фишка - нам доступен только метод end_routine или inverse)
Но не все потеряно, мы закрываем метод end_routine просто написав ENDMETHOD.
А ниже пишем реализацию своего класса, которая будет закрываться ENDMETHOD, который нам достался от метода end_routine. 
*----------------------------------------------------------------------*
*       Method end_routine
*----------------------------------------------------------------------*
*       Calculation of result package via end routine
*       Note: Update of target fields depends on rule assignment in
*       transformation editor. Only fields that have a rule assigned,
*       are updated to the data target.
*----------------------------------------------------------------------*
*   <-> result package
*----------------------------------------------------------------------*
  METHOD end_routine.
*=== Segments ===

    FIELD-SYMBOLS:
         TYPE _ty_s_TG_1.

    DATA:
      MONITOR_REC     TYPE rstmonitor.

*$*$ begin of routine - insert your code only below this line        *-*
... "insert your code here
*--  fill table "MONITOR" with values of structure "MONITOR_REC"
*-   to make monitor entries
... "to cancel the update process
*    raise exception type CX_RSROUT_ABORT.

"Вызов нашего метода
    me->SIMPLE(
*      IMPORTING
*        MONITOR        =
      CHANGING
        RESULT_PACKAGE = RESULT_PACKAGE
    ).




  ENDMETHOD.  "закрываем метод end_routine

"реализация нашего метода
  METHOD simple.
    FIELD-SYMBOLS:
         TYPE _ty_s_TG_1.

    DATA:
      MONITOR_REC     TYPE rstmonitor.

    BREAK-POINT.

*$*$ end of routine - insert your code only before this line         *-*
  ENDMETHOD.                    "end_routine

upd. Будет работать только если нет ни одной рутины 

среда, 4 декабря 2013 г.

Инфо-источник типа без контекта

Давненько с этим не сталкивался, даже как то подзабыл.

Ситуация. По help'y нашли источник, вроде оно - активируем в RSA5
Тиражируем источник как новый- все ок. Он появился, сделали пару загрузок, данные устраивают... пытаемся найти следующие трансформации и цели.

И вот тут нас поджидает облом, т.к. в бизнес-контенте нету такого источника, ни нового, ни старого. Куб если находиться то активируется без трансформации\update rule к источнику.

Решение. Конвертируем с помощью RSDS в старый тип источника. Заходим, активируем и вот тут появляться окошко которое предлагает поднять данные из бизнес-контента. Когда старый data staging поднят, то его потом можно мигрировать в новые типы.

доп.фишка... по поводу суслика которого не видно, а он есть. Если Вы сделали пакеты к источнику, а потом его вернули к старому типу с помощью RSDS, то пакетов Вы не увидите, хотя они есть. Но пакеты созданные в старом источнике после миграции видны.