среда, 3 июня 2015 г.

Как мы сделали дельту сами

Исходная система не выдаёт нормальную дельты.
Но в таблицах есть поле даты, показывающее, когда были сделаны изменения.

Поехали.



1. Создаём переменную типа S в TVARVC.

2. Создаём ФМ, которым переменную будем читать:

FUNCTION znn_tvarvc_period_get.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     REFERENCE(IV_TVARVC_OPT_NAME) TYPE  STRING
*"     REFERENCE(IV_TVARVC_OPT_TYPE) TYPE  C DEFAULT 'S'
*"     REFERENCE(IV_IOBJNM) TYPE  RSIOBJNM
*"     REFERENCE(IV_FIELDNAME) TYPE  FIELDNAME
*"  CHANGING
*"     REFERENCE(CT_RANGE) TYPE REF TO  DATA
*"----------------------------------------------------------------------
  DATA:
    ls_range        TYPE tvarvc,
    ls_result_range TYPE rssdlrange.

  FIELD-SYMBOLS:
    <lfs_range_tab> TYPE STANDARD TABLE.
*-----------------------------------------------------------------------
  ASSIGN ct_range->TO <lfs_range_tab>.

  SELECT *
    FROM tvarvc
    INTO ls_range
   WHERE name EQ iv_tvarvc_opt_name
     AND type EQ iv_tvarvc_opt_type.

    ls_result_range-iobjnm    iv_iobjnm.
    ls_result_range-fieldname iv_fieldname.

    IF sy-subrc 0.
*"  Если переменная заведена
      IF ls_range-sign IS INITIAL.
        ls_result_range-sign 'I'.
      ELSE.
        ls_result_range-sign ls_range-sign.
      ENDIF.

      IF ls_range-opti IS INITIAL.
        ls_result_range-option 'EQ'.
      ELSE.
        ls_result_range-option ls_range-opti.
      ENDIF.

      IF ls_range-low IS INITIAL.
        ls_result_range-low '10000101'.
      ELSE.
        ls_result_range-low ls_range-low.
      ENDIF.

      IF ls_range-high IS INITIAL.
        ls_result_range-high '99991231'.
      ELSE.
        ls_result_range-high ls_range-high.
      ENDIF.

*"  Если переменная отсутствует
    ELSE.
      ls_result_range-sign    'I'.
      ls_result_range-option  'BT'.
      ls_result_range-low     '10000101'.
      ls_result_range-high    '99991231'.
    ENDIF.

    APPEND ls_result_range TO <lfs_range_tab>.
  ENDSELECT.
ENDFUNCTION.
*"----------------------------------------------------------------------

3. ABAP код на инфо-пакет:
program conversion_routine.
* Type pools used by conversion program
type-poolsrsarcrsarrrssm.
tablesrssdlrange.
* Global code used by conversion rules
*$*$ begin of global - insert your declaration only below this line  *-*
* TABLES: ...
* DATA:   ...
*$*$ end of global - insert your declaration only before this line   *-*
* -------------------------------------------------------------------
*     InfoObject      =
*     Fieldname       = LAEDA
*     data type       = DATS
*     length          = 000008
*     convexit        =
* -------------------------------------------------------------------
form compute_LAEDA
  tables   l_t_range      structure rssdlrange
  using    p_infopackage  type rslogdpid
           p_fieldname    type rsfnm
  changing p_subrc        like sy-subrc.
*       Insert source code to current selection field
*$*$ begin of routine - insert your code only below this line        *-*
*&---------------------------------------------------------------------*
  DATA:
    lo_range TYPE REF TO data.
*-----------------------------------------------------------------------
  DELETE l_t_range WHERE fieldname 'LAEDA'.

  lo_range REF #l_t_range[] ).
  CALL FUNCTION 'ZNN_TVARVC_PERIOD_GET'
    EXPORTING
      iv_tvarvc_opt_name 'ZSO_PERIOD_ZMATERIA_TXT'
      iv_tvarvc_opt_type 'S'
      iv_iobjnm          'LAEDA'
      iv_fieldname       'LAEDA'
    CHANGING
      ct_range           lo_range.
*&---------------------------------------------------------------------*
*$*$ end of routine - insert your code only before this line         *-*
endform.                    "

4. Код для программы в цепочке, после отработки инфо-пакета. На всякий случай, сдвигаем период на 1 день:

*&---------------------------------------------------------------------*
REPORT znn_md_period_update.

PARAMETERS:
  l_name  TYPE tvarvc-name.
*-----------------------------------------------------------------------
DATA(l_sydatsy-datum.
l_sydat l_sydat 1.

UPDATE tvarvc
   SET low  l_sydat
       high '99991231'
 WHERE name EQ l_name
   AND type EQ 'S'.
*&---------------------------------------------------------------------*


5. Profit.


2 комментария:

  1. Сереж, я как то недопонял, а просто экстрактор на таблице с generic delta?

    ОтветитьУдалить
    Ответы
    1. Коллеги из erp медленно реагируют на доработки, а время поджимало. Вот и пришлось колхозить...

      Удалить