пятница, 5 апреля 2019 г.
вторник, 26 марта 2019 г.
пятница, 22 марта 2019 г.
Управление параллельными фоновыми процессами
Очень полезная таблица, чтобы смотреть, какая операция самая опасная -
RSBATCHPARALLEL
RSBATCHPARALLEL
вторник, 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.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" 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
Таблица с параметрами проверки для объектов из таблицы 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.
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.
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.
Подписаться на:
Сообщения (Atom)