пятница, 5 апреля 2019 г.

Ещё один способ удаления данных из таблиц

t-Code: SE16n (под которой программа RK_SE16N, в которой ФМ SE16N_START - если транзакции нет), имя таблицы, Enter:

В поле ввода кода транзакции - &sap_edit, Enter:

Фильтры на нужные записи, Выполнить:

вторник, 19 марта 2019 г.

Экстрактор на ФМ с nativeSQL и разбивкой на пакеты

function zpsb_w4_zds_accdtfr.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     VALUE(I_REQUNR) TYPE  SRSC_S_IF_SIMPLE-REQUNR
*"     VALUE(I_DSOURCE) TYPE  SRSC_S_IF_SIMPLE-DSOURCE OPTIONAL
*"     VALUE(I_MAXSIZE) TYPE  SRSC_S_IF_SIMPLE-MAXSIZE OPTIONAL
*"     VALUE(I_INITFLAG) TYPE  SRSC_S_IF_SIMPLE-INITFLAG OPTIONAL
*"     VALUE(I_READ_ONLY) TYPE  SRSC_S_IF_SIMPLE-READONLY OPTIONAL
*"     VALUE(I_REMOTE_CALL) TYPE  SBIWA_FLAG DEFAULT SBIWA_C_FLAG_OFF
*"  TABLES
*"      I_T_SELECT TYPE  SRSC_S_IF_SIMPLE-T_SELECT OPTIONAL
*"      I_T_FIELDS TYPE  SRSC_S_IF_SIMPLE-T_FIELDS OPTIONAL
*"      E_T_DATA STRUCTURE  ZACCDTFR OPTIONAL
*"  EXCEPTIONS
*"      NO_MORE_DATA
*"      ERROR_PASSED_TO_MESS_HANDLER
*"----------------------------------------------------------------------

* Auxiliary Selection criteria structure
  data:
        wa_data     like line of e_t_data.

* Maximum number of lines for DB table
  statics:
        s_s_if              type srsc_s_if_simple,

* counter
        s_counter_datapakid like sy-tabix,

* cursor
        s_cursor            type cursor,
        a(1).

* Initialization mode (first call by SAPI) or data transfer mode
* (following calls) ?
  if i_initflag = sbiwa_c_flag_on.

************************************************************************
* Initialization: check input parameters
*                 buffer input parameters
*                 prepare data selection
************************************************************************

* Check DataSource validity
    case i_dsource.
      when 'ZDS_ACCDTFR'.
      when others.
        if 1 = 2. message e009(r3). endif.
* this is a typical log call. Please write every error message like this
        log_write 'E'                  "message type
                  'R3'                 "message class
                  '009'                "message number
                  i_dsource   "message variable 1
                  ' '.                 "message variable 2
        raise error_passed_to_mess_handler.
    endcase.

    append lines of i_t_select to s_s_if-t_select.

* Fill parameter buffer for data extraction calls
    s_s_if-requnr   = i_requnr.
    s_s_if-dsource  = i_dsource.
    s_s_if-maxsize  = i_maxsize.

* Fill field list table for an optimized select statement
* (in case that there is no 1:1 relation between InfoSource fields
* and database table fields this may be far from beeing trivial)
    append lines of i_t_fields to s_s_if-t_fields.

  else.                 "Initialization mode or data extraction ?

************************************************************************
* Data transfer: First Call      OPEN CURSOR + FETCH
*                Following Calls FETCH only
************************************************************************
* First data package -> OPEN CURSOR
    if s_counter_datapakid = 0.

      a = 'X'.

      EXEC SQL.
        open with hold s for

select      c.TB_CAEXT,
            CASE WHEN ( select substr("/BIC/ZWPRODTXT",9,1)
                        from SAPSR3."/BIC/AZCONTRCT00" z
        where z.TB_CAEXT = c.TB_CAEXT ) IN ('S', 'B') AND c."/BIC/OPENUPIS" = ' '
        THEN c.TB_CAVALFR
        ELSE nvl(
                  ( select min("/BIC/CRDGVDT")
                  from   SAPSR3."/BIC/AMCRDFACT00" m
        where  m."/BIC/TBACAEXT" = c.TB_CAEXT
        and m."/BIC/ZCA_REGM"  NOT IN ('009','010')
        and m."/BIC/CRDGVDT" <> '00000000'  ),
        ( select min(cc.TB_CAVALFR)
          from   SAPSR3."/BIC/AZCONTRCT00" cc
        where  cc."/BIC/ZCONTROID" = c.TB_CAEXT
        and cc."/BIC/ZCONTCAT" in ('C')
        and cc."/BIC/ZPRODCAT" = 'C'
        and cc."/BIC/ZWBPCAT" = 'P') )
        END   as "/BIC/ACCDTFR"
from       SAPSR3."/BIC/ATBCAEXTD00" c
        where      c."/BIC/ZCONTCAT" in ('A')
        and        c."/BIC/ZPRODCAT" = 'C'
        and        c."/BIC/ZWBPCAT" = 'P'
        and        c."/BIC/ACCDTFR" <> CASE WHEN ( select substr("/BIC/ZWPRODTXT",9,1)
        from SAPSR3."/BIC/AZCONTRCT00" z
        where z.TB_CAEXT = c.TB_CAEXT ) IN ('S', 'B') AND c."/BIC/OPENUPIS" = ' '
        THEN c.TB_CAVALFR
        ELSE nvl(
                    ( select min("/BIC/CRDGVDT")
                      from   SAPSR3."/BIC/AMCRDFACT00" m
        where  m."/BIC/TBACAEXT" = c.TB_CAEXT
        and    m."/BIC/ZCA_REGM"  NOT IN ('009','010')
        and m."/BIC/CRDGVDT" <> '00000000' ),
        ( select min(cc.TB_CAVALFR)
          from   SAPSR3."/BIC/AZCONTRCT00" cc
        where  cc."/BIC/ZCONTROID" = c.TB_CAEXT
        and    cc."/BIC/ZCONTCAT" in ('C')
        and    cc."/BIC/ZPRODCAT" = 'C'
        and    cc."/BIC/ZWBPCAT" = 'P') )
        END
      ENDEXEC.

    endif.                             "First data package ?

    refresh e_t_data.

    if a is initial.
      raise no_more_data.
    endif.

    s_counter_datapakid = s_counter_datapakid + 1.

    do s_s_if-maxsize times.
      clear wa_data.

      EXEC SQL.
        fetch next s into :wa_data
      ENDEXEC.

      if ( wa_data is initial ) or sy-subrc <> 0.
        EXEC SQL.
          close s
        ENDEXEC.
        clear a.
        exit.
      endif.
      append wa_data to e_t_data.

    enddo.
  endif.              "Initialization mode or data extraction ?
endfunction.

среда, 27 февраля 2019 г.

Внутренние проверки витрин

Вначале делали проверки через ABAP, там же формировали результат в виде отчёта и отправляли на почту.

С возможностью создавать отчёты SAP BO на произвольном SQL-скрипте стало проще.

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

Таблица ZPSB_BWA_MAP:
AUDITS_FLAG CHAR 3 0 Флаг\ключ проверки
TIME_VALUE DEC 10 2 Глубина проверки
DESCRIPTION TEXT255 CHAR 255 0 Текст, 255 знаков
Настроечная таблица для проверяемых в BW объектов
Таблица с параметрами проверки для объектов из таблицы ZPSB_BWA_OBJ.
Поле TIME_VALUE определяет глубину времени проверки, "Период С".
Так как на языке SQL арифметические операции с датами выполняются в часах, получаем значение TIME_VALUE по формуле = (1*нужное_значение_в_часах)/24.
Округляйте до двух знаков после запятой.

Таблица ZPSB_BWA_OBJ:
DSO_NAME RSBKTGTNM CHAR 45 0 Имя цели данных процесса переноса данных
AUDITS_FLAG CHAR 3 0 Флаг\ключ проверки
Список проверяемых в BW объектов и код проверки
Таблица связь объекта и типа проверки.

Параметры проверки ведутся в таблице ZPSB_BWA_MAP


пятница, 1 февраля 2019 г.

Арифметические операции с timestamp

DATA:
      lv_time_stamp_sy TYPE timestamp.


CONVERT DATE  sy-datlo TIME sy-timlo INTO TIME STAMP lv_time_stamp_sy TIME ZONE sy-zonlo.

TRY.
    CALL METHOD cl_abap_tstmp=>add
      EXPORTING
        tstmp   = lv_time_stamp_sy
        secs    = -1200  "20minutes
      RECEIVING
        r_tstmp = lv_time_stamp_sy.
  CATCH cx_parameter_invalid_range .
  CATCH cx_parameter_invalid_type .
ENDTRY.

четверг, 24 января 2019 г.

Отправка писем через АБАП

DATA:
      lt_mailsubject    TYPE sodocchgi1,
      lt_mailtxt        TYPE STANDARD TABLE OF soli,
      wa_mailtxt        LIKE LINE OF lt_mailtxt,
      lt_mailrecipients TYPE STANDARD TABLE OF somlrec90,
      wa_mailrecipients LIKE LINE OF lt_mailrecipients.
*"----------------------------------------------------------------------
lt_mailsubject-obj_name     = `Audit Check`.
lt_mailsubject-obj_langu    = sy-langu.
lt_mailsubject-obj_descr    = `Результат проверок`.

wa_mailtxt                  = `Это письмо отправлено из АБАПа :)`.
APPEND wa_mailtxt TO lt_mailtxt.
wa_mailtxt                  = `Программа такая-то`.
APPEND wa_mailtxt TO lt_mailtxt.

wa_mailrecipients-rec_type  = `C`.  "Список рассылки, ведётся через SO15
                                    "Между системами не переносится...
wa_mailrecipients-receiver  = `SUPPORT_TEAM`.

*wa_mailrecipients- rec_type  = 'U'. "Адрес напрямую
*wa_mailrecipients- receiver  = 'mail@mail.com'.
APPEND wa_mailrecipients TO lt_mailrecipients.


CALL FUNCTION 'SO_NEW_DOCUMENT_SEND_API1'
  EXPORTING
    document_data              = lt_mailsubject
  TABLES
    object_content             = lt_mailtxt
    receivers                  = lt_mailrecipients
  EXCEPTIONS
    too_many_receivers         = 1
    document_not_sent          = 2
    document_type_not_exist    = 3
    operation_no_authorization = 4
    parameter_error            = 5
    x_error                    = 6
    enqueue_error              = 7
    OTHERS                     = 8.
IF sy-subrc EQ 0.
  COMMIT WORK.
*   Push mail out from SAP outbox
  SUBMIT rsconn01 WITH mode = 'INT' AND RETURN.
ENDIF.