Исходная система не выдаёт нормальную дельты.
Но в таблицах есть поле даты, показывающее, когда были сделаны изменения.Поехали.
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-pools: rsarc, rsarr, rssm.
tables: rssdlrange.
* 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_sydat) = sy-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.
Сереж, я как то недопонял, а просто экстрактор на таблице с generic delta?
ОтветитьУдалитьКоллеги из erp медленно реагируют на доработки, а время поджимало. Вот и пришлось колхозить...
Удалить