ABAP-Функционал для консистентного (в рамках SAP LUW) обновления любой таблицы базы данных без создания дополнительных функциональных модулей обновления. Для импорта в целевую систему можно использовать:
Прошу обратить внимание, что сам функционал находится в пакете ZC8A_005, а отдельным под-пакетом ZC8A_005_DEMO прилагаются DEMO-программы по использованию функционала.
В этом случае Вы можете оставить DEMO-программы в системе разработки, а сам функционал без лишних объектов переносить по ландшафту.
Описание, что такое abapGit и как его использовать доступно по ссылке abapGit. Там же можно найти примеры импорта и экспорта ZIP-файла
Если остались вопросы - то воспользуйтесь пунктом Поддержка и обратная связь
Примеры для возможности запуска представлены в под-пакете ZC8A_005_DEMO Z8A005_AnyTabUpdate.zip
Простое использование: Сохранение одной внутренней таблицы с COMMIT
Внутренняя таблица заполняется, класс ZCL_C8A005_SAVE2DB
передает данные в режиме IN UPDATE TASK
, затем вызывается команда COMMIT
DATA lc_db_tab_sample TYPE tabname VALUE 'ZTC8A005_SAMPLE'.
DATA lt_sample_tab TYPE STANDARD TABLE OF ztc8a005_sample.
lt_sample_tab = VALUE #(
( entity_guid = 'ANY_SIMPL_GUID_MOD' entity_param1 = 'CHAR10' entity_param2 = '0504030201')
( entity_guid = 'ANY_SIMPL_GUID2_MOD' entity_param1 = '2CHAR10' entity_param2 = '0102030405')
( entity_guid = 'ANY_SIMPL_GUID2_DEL' entity_param1 = '2CHAR10' entity_param2 = '777909034')
).
NEW zcl_c8a005_save2db(
)->save2db( iv_tabname = lc_db_tab_sample
it_tab_content = lt_sample_tab )->do_commit_if_any( ).
Частое использование: Сохранение нескольких внутренних таблиц с COMMIT по завершению
Внутренние таблицы (пустые или с данными) передаются классу ZCL_C8A005_SAVE2DB
. НЕобязательно, чтобы это была одна инстанция. По завершению вызывается команда COMMIT
.
DATA lc_db_tab_sample TYPE tabname VALUE 'ZTC8A005_SAMPLE'.
DATA lt_sample_tab TYPE STANDARD TABLE OF ztc8a005_sample.
DATA lt_sample_empty_tab TYPE STANDARD TABLE OF ztc8a005_sample.
DATA lt_head_tab TYPE STANDARD TABLE OF ztc8a005_head.
DATA lt_item_tab TYPE STANDARD TABLE OF ztc8a005_item.
DATA lv_ts TYPE timestamp.
DATA lo_saver_anytab TYPE REF TO zcl_c8a005_save2db.
GET TIME STAMP FIELD lv_ts.
lt_sample_tab = VALUE #(
( entity_guid = 'ANY_GUID_MOD' entity_param1 = 'CHAR10' entity_param2 = '0504030201'
entity_param3 = sy-uzeit entity_param4 = sy-datum entity_param5 = lv_ts )
( entity_guid = 'ANY_GUID2_MOD' entity_param1 = '2CHAR10' entity_param2 = '0102030405'
entity_param3 = sy-uzeit entity_param4 = sy-datum entity_param5 = lv_ts )
( entity_guid = 'ANY_GUID2_DEL' entity_param1 = '2CHAR10' entity_param2 = '777909034'
entity_param3 = sy-uzeit entity_param4 = sy-datum entity_param5 = lv_ts )
).
lt_head_tab = VALUE #(
( head_guid = 'ANY_GUID_UPD' head_param1 = 'ANY_GUID_ADD' head_param2 = '9988776655'
head_param3 = sy-uzeit head_param4 = sy-datum head_param5 = lv_ts )
( head_guid = 'ANY_GUID2_UPD' head_param1 = 'ANY_GUID2_ADD' head_param2 = '9988776655'
head_param3 = sy-uzeit head_param4 = sy-datum head_param5 = lv_ts )
( head_guid = 'ANY_GUID_DEL' head_param1 = 'ANY_GUID_ADD' head_param2 = '9988774444'
head_param3 = sy-uzeit head_param4 = sy-datum head_param5 = lv_ts )
( head_guid = 'ANY_GUID2_DEL' head_param1 = 'ANY_GUID2_ADD' head_param2 = '9988774444'
head_param3 = sy-uzeit head_param4 = sy-datum head_param5 = lv_ts )
).
lt_item_tab = VALUE #(
( head_guid = 'ANY_GUID_UPD'item_guid = 'ANY_ITEM_GUID_ADD'
item_param1 = '2CHAR10'item_param2 = '9988776655'
item_param3 = sy-uzeit item_param4 = sy-datum item_param5 = lv_ts )
( head_guid = 'ANY_GUID2_UPD'item_guid = 'ANY_ITEM_GUID2_ADD'item_param1 = '2CHAR10'
item_param3 = sy-uzeit item_param4 = sy-datum item_param5 = lv_ts )
( head_guid = 'ANY_GUID_DEL'item_guid = 'ANY_ITEM_GUID_ADD'item_param2 = '9988776655'
item_param3 = sy-uzeit item_param4 = sy-datum item_param5 = lv_ts )
( head_guid = 'ANY_GUID2_DEL'item_guid = 'ANY_ITEM_GUID2_ADD'item_param1 = '2CHAR10'
item_param3 = sy-uzeit item_param4 = sy-datum item_param5 = lv_ts )
).
CREATE OBJECT lo_saver_anytab.
lo_saver_anytab->save2db( EXPORTING iv_tabname = lc_db_tab_sample
it_tab_content = lt_sample_tab ).
lo_saver_anytab->save2db( EXPORTING iv_tabname = 'ZTC8A005_HEAD'
it_tab_content = lt_head_tab ).
lo_saver_anytab->save2db( EXPORTING iv_tabname = 'ZTC8A005_ITEM'
it_tab_content = lt_item_tab ).
CLEAR lt_sample_empty_tab.
lo_saver_anytab->save2db( EXPORTING iv_tabname = lc_db_tab_sample
it_tab_content = lt_sample_empty_tab ).
" обновление всех таблиц будет одномоментно после commit
" а по пустой таблицы ничего происходить не будет (не будет поставлен Update Task)
lo_saver_anytab->do_commit_if_any( ).
Обновление конкретных полей (обновление в режиме U).
в БД передаются только непустые поля из внутренней таблицы. Обновление происходит по ключевым полям.
DATA lt_tab_with_key_2fields TYPE STANDARD TABLE OF ztc8a005_item. "в таблице в ключе 2 поля
DATA lc_tab_trg TYPE tabname VALUE 'ZTC8A005_ITEM'.
lt_tab_with_key_2fields = VALUE #(
( head_guid = 'ANY_GUID_UPD' item_guid = 'ANY_ITEM_GUID_ADD' item_param2 = '1234563214' )
( head_guid = 'ANY_GUID2_UPD' item_guid = 'ANY_ITEM_GUID2_ADD' item_param1 = '2UPDCHAR' )
).
" обновление по ключу, но в обновляемых непустые поля
NEW zcl_c8a005_save2db( )->save2db(
EXPORTING
iv_tabname = lc_tab_trg
it_tab_content = lt_tab_with_key_2fields
iv_do_commit = ABAP_true " можно включать COMMIT сразу
iv_kz = 'U'
).
Сохранение данных без COMMIT в текущем процессе
Внутренняя таблица передается в БД в отдельном процессе через опцию DESTINATION 'NONE'
. Сохранение данных происходит сразу же.
DATA lc_db_tab_sample TYPE tabname VALUE 'ZTC8A005_SAMPLE'.
DATA lt_sample_tab TYPE STANDARD TABLE OF ztc8a005_sample.
lt_sample_tab = VALUE #(
( entity_guid = 'AVOID_CUR_COMMIT1_MOD' entity_param1 = 'DEST1NONE'
entity_param2 = '1234512121' entity_param3 = sy-uzeit entity_param4 = sy-datum )
( entity_guid = 'AVOID_CUR_COMMIT2_MOD' entity_param1 = 'DEST2NONE'
entity_param2 = '0102030405' entity_param3 = sy-uzeit entity_param4 = sy-datum )
( entity_guid = 'AVOID_CUR_COMMIT3_MOD' entity_param1 = 'DEST3NONE'
entity_param2 = '220629909' entity_param3 = sy-uzeit entity_param4 = sy-datum )
).
" обновление происходит не в текущем процессе, а параллельном через DESTINATION 'NONE'
" нужно для случаев, когда в текущем процессе необходимость COMMIT пока не определена,
" или он будет позже
NEW zcl_c8a005_save2db(
)->save2db( iv_tabname = lc_db_tab_sample
it_tab_content = lt_sample_tab
iv_dest_none = abap_true ).
Класс ZCL_C8A005_SAVE2DB
SAVE2DB
SAVE2DB_LINE
Позволяет отправить значения в базу на основе структуры, а не внутренней таблицы. Предназначается, чтобы не создавать ненужных переменных.
DO_COMMIT_IF_ANY
Вызывает команду COMMIT
.
COMMIT
будет вызван в любом случае; если abap_false, то только в том случае, если инстанции была передана непустая таблица (хотя бы одна)
Для предоставления комментариев/багов/прояснений/обратной связи можно использовать:
Ожидаемый ответ по всем каналам не более 3х календарных дней. Моментального ответа не будет точно :-)