В данной статье опишу небольшие примеры работы с объектами BOPF.
Изменение данных.
Чтобы изменить те или иные данные в БО можно воспользоваться методом modify. Для этого нужно заполнить таблицу модификаций. При этом поле change_mode может принимать значение из константы /bobf/if_frw_c=>sc_modify_update для модификации существующего значения.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
ASSIGN lt_data[ 1 ] TO FIELD-SYMBOL(<ls_data>). DATA: lt_mod TYPE /bobf/t_frw_modification. APPEND VALUE #( change_mode = /bobf/if_frw_c=>sc_modify_update node = zif_time_client_c=>sc_node-root key = <ls_data>-key data = NEW ztime_s_client( remark = 'Клиент 1' ) changed_fields = VALUE #( ( zif_time_client_c=>sc_node_attribute-root-remark ) ) ) TO lt_mod. DATA(lo_tr_mgr) = /bobf/cl_tra_trans_mgr_factory=>get_transaction_manager( ). lo_srv_mng->modify( EXPORTING it_modification = lt_mod IMPORTING eo_change = DATA(lo_change) eo_message = lo_message ). eo_message->add( lo_message ). IF lo_message->check( ) = abap_true. eo_message = lo_message. RETURN. ENDIF. lo_tr_mgr->save( ). |
Для удаления строки в ноде используется значение /bobf/if_frw_c=>sc_modify_delete
Добавление строки задействуется значением /bobf/if_frw_c=>sc_modify_create
Более сложный случай — добавления строки в дочернюю ноду
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
ASSIGN lt_data[ 1 ] TO FIELD-SYMBOL(<ls_data>). DATA: lt_mod TYPE /bobf/t_frw_modification. DATA(lv_key) = /bobf/cl_frw_factory=>get_new_key( ). APPEND VALUE #( change_mode = /bobf/if_frw_c=>sc_modify_create node = zif_time_client_c=>sc_node-work root_key = <ls_data>-key source_key = <ls_data>-key source_node = zif_time_client_c=>sc_node-root association = zif_time_client_c=>sc_association-root-work data = NEW ztime_s_work( workname = 'Сопровождение' active = abap_true ) key = lv_key ) TO lt_mod. DATA(lo_tr_mgr) = /bobf/cl_tra_trans_mgr_factory=>get_transaction_manager( ). lo_srv_mng->modify( EXPORTING it_modification = lt_mod IMPORTING eo_change = DATA(lo_change) eo_message = lo_message ). eo_message->add( lo_message ). IF lo_message->check( ) = abap_true. eo_message = lo_message. RETURN. ENDIF. lo_tr_mgr->save( ). |
Проверка измененных значений в validation
Иногда возникает необходимость проверять изменение значений каких-либо полей. Однако в validation приходят уже новые значения. На помощь приходит параметр iv_before_image в методе retrieve
1 2 3 4 5 6 7 |
io_read->retrieve( EXPORTING iv_node = zif_time_client_c=>sc_node-root it_key = it_key IMPORTING et_data = lt_data ). io_read->retrieve( EXPORTING iv_node = zif_time_client_c=>sc_node-root it_key = it_key iv_before_image = abap_true IMPORTING et_data = lt_data_org ). |
Остается только сравнить старое значение в таблице lt_data_org с новым значением в lt_data и выполнить необходимые проверки