вторник, 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]