Расскажу немного про BOL. Не так давно удалось посмотреть на проекте в SM. На полноту информация точно не претендую, но постараюсь ввести в курс дела.
BOL(Business Object Layer) - применяется в CRM и в SM для унифицированного доступа к данным. В общем и целом BOL дублирует функционал стандартных модулей, но позволяет это делать однообразным способом. Также заявляется, что использование BOL API позволяет ускорить работу за счет внутренней оптимизации
Как видно из картинки выше, BOL является промежуточным звеном между хранилищем данных и отображением. The Generic Interaction Layer (GenIL) - отвечает за непосредственно выборку данных на основе Genil модели. Т.е. если вы, например, хотиете добавить Zполя надо разбираться именно с ней
Чтобы понимать, что происходит, надо понять, как выглядит иерархия.
Зайдем в транзакцию CRM_ISU_BOL_BROWSER и попробуем найти какой либо номер сущности по его OBJECTID.
выберем критерий по которому будем искать сущность. В моем случае это objiect_id
Прописываем условие и нажимаем «Поиск»
В правом нижней области экрана появится список объектов подходящих под наши условия.
Как видно объект и его свойства представляют собой древовидную структуру. Собственно, работая при помощи BOL, мы ходим по этой структуре, при помощи предоставленных нам классов.
При помощи ранее указанных классов мы можем осуществлять навигацию по узлам через соединения
Давайте попробуем имея номер заказа добавить к нему текстовый комментарий.
Действуем точно также, как и в случае с транзакцией <Имя транзакции о которой рассказали выше>
Найдем объект по нашему OBJECTID, пройдем по структуре до зависимого объекта и создадим еще один.
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
DATA: lo_core_bol TYPE REF TO cl_crm_bol_core, lo_bt_order TYPE REF TO cl_crm_bol_entity, lo_textid TYPE REF TO cl_crm_bol_entity, lo_text_it TYPE REF TO if_bol_entity_col, ls_text TYPE crmst_textid_btil. TRY. lo_core_bol = cl_crm_bol_core=>get_instance( ). lo_core_bol->start_up( 'EMPTY' ). lo_core_bol->load_component( 'BT' ). lo_bt_order = lo_core_bol->get_root_entity( iv_object_name = 'BTOrder' iv_object_guid = ‘GUID исходного объекта’ ). DATA(lo_order_header) = lo_bt_order->get_related_entity( iv_relation_name = 'BTOrderHeader' ). lo_textid ?= lo_order_header->get_related_entities( EXPORTING iv_relation_name = 'BTHeaderTextIdSet' )->get_first( ). IF lo_textid IS NOT BOUND. RETURN. ENDIF. lo_text_it = lo_textid->get_related_entities( iv_relation_name = 'BTTextIdHAll' ). DATA(lo_text) = lo_text_it->get_first( ). IF lo_text IS NOT BOUND. lo_text = lo_textid->create_related_entity( iv_relation_name = 'BTTextIdHAll' ). ENDIF. lo_text->get_properties( IMPORTING es_attributes = ls_text ). ls_text-tdid = 'CR01'. " Описание изменений. ls_text-conc_lines = |{ iv_nexus_url }|. *Длинный текст надо немного преобразовать. Иначе съест символы DATA lt_itf_text TYPE comt_text_lines_t. CALL FUNCTION 'CONVERT_STREAM_TO_ITF_TEXT' EXPORTING stream_lines = VALUE STRING_TABLE( ( iv_nexus_url ) ) lf = abap_true TABLES itf_text = lt_itf_text. ls_text-conc_formatted_lines = cl_gstext_tools=>transform_itf_to_itfstring( lt_itf_text ). DATA(lo_entity_new) = lo_textid->create_related_entity( iv_relation_name = 'BTTextIdHAll' ). lo_entity_new->set_properties( EXPORTING is_attributes = ls_text ). lo_text_it->add( lo_entity_new ). lo_core_bol->modify( ). DATA(lo_transaction) = lo_core_bol->get_transaction( ). lo_transaction->save( ). lo_transaction->commit( ). CATCH cx_root. ENDTRY. |
Все готово. Другие узлы добавляются похожим образом.