понедельник, 7 сентября 2020 г.

среда, 8 июля 2020 г.

Run DTP, run!

Надо перегрузить данные из А в B
Но сделать надо это по некому признаку, в данном случае по дате.
Да, можно было через TVARV, но как то хотелось реализовать по другому.

В общем, идея простая...
Запускается DTP, находит последний загруженный пакет в B, смещает дату и аглы.



DATA: l_date type d.

"get target
DATA(l_target) = i_r_request->get_tgt( ).

"type of target
"DATA(l_target_type) = i_r_request->get_tgttp( ).

"ref to target
DATA(lo_request_list) = cl_rsdso_data_request_list=>create(
                          i_adsonm = l_target(30) ).
"refresh list
lo_request_list->refresh( ).

"get list of all requests in XREF format
DATA(lt_request_xref) = lo_request_list->get_t_request_xref( ).

IF lt_request_xref IS NOT INITIAL.
  "get last request
  SORT lt_request_xref BY SRC_POS DESCENDING.
  ASSIGN lt_request_xref[ 1 ]-SRC_TSN TO FIELD-SYMBOL(<SRC_TSN>).

  TRY.
    "ref to request object (DTP)
    DATA(lo_request) = cl_rsbk_request=>create_from_db(
                        i_process_tsn = <SRC_TSN>
                        i_request_tsn = <SRC_TSN> ).

    "get filters in table view
    DATA(lt_filter) = lo_request->get_th_range( ).
  CATCH cx_rs_not_found.
    p_subrc = 1.
    EXIT.
  ENDTRY.

  "get value for i_fieldnm
  READ TABLE lt_filter
    WITH KEY FIELDNM = i_fieldnm
    ASSIGNING FIELD-SYMBOL(<ls_filter>).

  IF sy-subrc = 0.
    "increment date
    l_date = <ls_filter>-LOW.
    l_date = l_date + 1.

    "set restriction in DTP
    READ TABLE l_t_range
      WITH KEY fieldname = i_fieldnm.

    IF sy-subrc = 0.
      l_t_range-low = l_date.
      modify l_t_range index sy-tabix.
    ELSE.
      l_t_range-FIELDNAME = i_fieldnm.
      l_t_range-SIGN = 'I'.
      l_t_range-OPTION = 'EQ'.
      l_t_range-LOW = l_date.
      append l_t_range.
    ENDIF.
  ENDIF.
ENDIF.

p_subrc = 0.


7.5
DATA: l_date type d.
DATA: l_fiscper type /BI0/OIFISCPER.
DATA: ls_tlogo       TYPE rstran_s_tlogo.

"fill TLOGO structure
ls_tlogo-tlogo = i_r_request->get_tgttp( ).
ls_tlogo-objnm = i_r_request->get_tgt( ).

"ref to target
DATA(lo_request_list) = cl_rsdso_data_request_list=>create(
                          i_s_tlogo   = ls_tlogo ).
"refresh list
lo_request_list->refresh( ).

"get list of all requests in XREF format
DATA(lt_request_xref) = lo_request_list->get_t_request_xref( ).

IF lt_request_xref IS NOT INITIAL.
  "get last request
  SORT lt_request_xref BY SRC_POS DESCENDING.
  ASSIGN lt_request_xref[ 1 ]-SRC_TSN TO FIELD-SYMBOL(<SRC_TSN>).

  TRY.
    "ref to request object (DTP)
    DATA(lo_request) = cl_rsbk_request=>create_from_db(
                        i_process_tsn = <SRC_TSN>
                        i_request_tsn = <SRC_TSN> ).

    "get filters in table view
    DATA(lt_filter) = lo_request->get_th_range( ).
  CATCH cx_rs_not_found.
    p_subrc = 1.
    EXIT.
  ENDTRY.

  "get value for i_fieldnm
  READ TABLE lt_filter
    WITH KEY FIELDNM = i_fieldnm
    ASSIGNING FIELD-SYMBOL(<ls_filter>).

  IF sy-subrc = 0.
    "increment date
    l_fiscper = <ls_filter>-LOW.
    l_date = |{ l_fiscper(4) }{ l_fiscper+5(2) }01|.
    l_date = l_date + 33.
    l_fiscper = |{ l_date(4) }0{ l_date+4(2) }|.

    "set restriction in DTP
    READ TABLE l_t_range
      WITH KEY fieldname = i_fieldnm.

    IF sy-subrc = 0.
      l_t_range-low = l_fiscper.
      l_t_range-sign = 'I'.
      l_t_range-option = 'EQ'.
      modify l_t_range index sy-tabix.
    ELSE.
      l_t_range-FIELDNAME = i_fieldnm.
      l_t_range-SIGN = 'I'.
      l_t_range-OPTION = 'EQ'.
      l_t_range-LOW = l_fiscper.
      append l_t_range.
    ENDIF.
  ENDIF.
ENDIF.

p_subrc = 0.

Вызов цепочки из отчета

ABAP функция на FOX

В общем надо запускать RSPC_API_CHAIN_START с параметром I_NOPLAN = 'X'

Иначе, странная хрень с теи какой статус завершения у цепочки может возникать.

понедельник, 18 ноября 2019 г.

Hierarchy 3.x >> 7.х

Давно не делал эту операцию, в общем даже как то подзабыл что надо подправить чтобы заработало нормально.


+ start routine:

    CALL METHOD cl_rstran_gen_step_hier_split=>reset_interval_nodes
      EXPORTING
        i_iobjnm      = '0COSTELMNT'
        i_t_intervals = SOURCE_PACKAGE_5
      CHANGING
        c_t_nodes     = SOURCE_PACKAGE_3.

То что DTP пакет внутри желтый - это в общем терпимо.

вторник, 11 декабря 2018 г.

Экстратор, виртуальник на трансформации

BI

Inverse routine:

  C_TH_FIELDS_INBOUND = I_TH_FIELDS_OUTBOUND.
  C_R_SELSET_INBOUND = I_R_SELSET_OUTBOUND.
  C_EXACT = RS_C_TRUE.

https://archive.sap.com/kmuuid2/f05d0b81-076a-2c10-44ab-f00b0b90ce38/Writing%20Inverse%20Routine%20with%20Expert%20Routine.pdf

http://www.denisreis.com/how-to-sap-bi-inverse-routinen-invertierungsroutinen-in-sap-bw/ - тут попонятней, хоть и на немецком...


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

ERP:

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

Полей было много... было лень перечислять их, поэтому

* Select ranges
 DATA:
    lt_where    TYPE STANDARD TABLE OF char200,
    lt_condtab  TYPE TABLE OF hrcond,
    ls_condtab  LIKE LINE OF lt_condtab.

"collect values of restrictions
    clear ls_condtab.
    LOOP AT s_s_if-t_select
      ASSIGNING FIELD-SYMBOL()
      WHERE sign   = 'I'.

      ls_condtab-field =  -fieldnm.
      ls_condtab-opera = -option.
      ls_condtab-high  = -high.
      ls_condtab-low   = -low.
      APPEND ls_condtab TO lt_condtab.
    ENDLOOP.

    "create WHERE clause
    CALL FUNCTION 'RH_DYNAMIC_WHERE_BUILD'
      EXPORTING
        dbtable         = SPACE
      TABLES
        condtab         = lt_condtab
        where_clause    = lt_where
      EXCEPTIONS
        empty_condtab   = 1
        no_db_field     = 2
        unknown_db      = 3
        wrong_condition = 4
        OTHERS          = 5.

      OPEN CURSOR WITH HOLD @s_cursor FOR
      SELECT *
      FROM ZVTETATET
        WHERE (lt_where).

The elements in the "SELECT LIST" list must be separated using commas.

Нужен был left outer join на курсоре

Пока было условие на 1й таблице всё было хорошо

OPEN CURSOR s_cursor FOR
      SELECT V~FORM V~ID D~DAT
      FROM Table1 as V
        LEFT OUTER JOIN Table2 as D
        ON  V~docnum = D~docnum
        WHERE V~FORM EQ 'LC'.

Но после добавления условия на 2й таблице, возникла ошибка

The elements in the "SELECT LIST" list must be separated using commas.

Вариант решения

OPEN CURSOR @s_cursor FOR
      SELECT V~FORM, V~ID, D~DAT
      FROM Table1 as V
        LEFT OUTER JOIN Table2 as D
        ON  V~docnum = D~docnum
        WHERE V~FORM EQ 'LC'
             AND  D~DAT GT '20180101'.

воскресенье, 9 декабря 2018 г.

MDX

SELECT
NON EMPTY
  { [00O2TOGA0GQMBY3GPSFLP5TIR].Members }
ON COLUMNS,
NON EMPTY
  {
    {FILTER([0COMP_CODE].MEMBERS,   "All" <> [0COMP_CODE].[20COMP_CODE])}
   *{FILTER([0CALYEAR].MEMBERS,"All" <> [0CALYEAR].[20CALYEAR])}
  }
DIMENSION PROPERTIES
   [0COMP_CODE].[20COMP_CODE]
  ,[0CALYEAR].[20CALYEAR]

ON ROWS
FROM
  [cube/query]

 SAP VARIABLES
[!V000001] INCLUDING [0CALDAY].[20180505]
[0CMPCODE] INCLUDING [0COMP_CODE].[0001]
[!V000003] INCLUDING [0CALYEAR].[2018]

Нашел более производительный вариант, использовать c Level01.Member

SELECT
  {[Measures].[00O2TOGA0GQMBWHEA5HWM60RN]}
ON COLUMNS,
NON EMPTY {
  {[ZDIM1].[LEVEL01].Members}
 *{[ZDIM2].[LEVEL01].Members}
 *{[ZDIM5].[LEVEL01].Members}
}
DIMENSION PROPERTIES
  [ZDIM1].[2ZATT1]
 ,[ZDIM1].[2ZATT2]
 ,[ZDIM1].[1ZATT3]
 ,[ZDIM5].[5ZITEM]
 ,[ZDIM5].[20CALDAY]
 ,[ZDIM5].[10COMP_CODE]

ON ROWS
FROM
  [cube/query]]

WHERE {
  {[ZDIM1__ZATTR1].[valA],[ZDIM1__ZATTR1].[valB],[ZDIM1__ZATTR1].[valG]}
 *{[0INFOPROV].[cubeA],[0INFOPROV].[cubeB],[0INFOPROV].[cubeC]}
 *{[ZDIM2__ZATTR1].[#]}
}

SAP VARIABLES
  [!V000001] INCLUDING [ZDIM2__ZATTR1].[D]
 ,[!V000002] INCLUDING [ZDIM2].[USD]
 ,[!V000012] INCLUDING [0CALDAY].[20200101] : [0CALDAY].[20200421]