Использование соединений
Между двумя бизнес объектами могут быть созданы ссылочные связи. Например: к закупочному заказу мы можем привязать все материальные документы, которые относились к данному заказу. То в какой роли выступает объект, прописывается в ракурсе VROBJROLES. Например, для того чтобы иметь возможность присоединять плановые заказы в виде ссылок, необходимо внести соответствующую запись в указанный выше ракурс. Указать тип роли: REFERENZ.
Для создания соединений создан статический метод create_link (DELETE_LINK – для удаления) класса cl_binary_relation, данный метод не поддерживает все типы соединений, в этом случае необходимо воспользоваться ФМ BINARY_RELATION_CREATE (BINARY_RELATION_DELETE – для удаления).
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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
REPORT zgos_relation_create. * * CLASS lcl_relation DEFINITION. PUBLIC SECTION. TYPES: BEGIN OF ty_related. INCLUDE TYPE sibflporb. TYPES: relation TYPE oblreltype, END OF ty_related. TYPES: ty_t_related TYPE STANDARD TABLE OF ty_related. METHODS: CONSTRUCTOR IMPORTING obj_no TYPE sibfboriid obj_type TYPE sibftypeid obj_cat TYPE sibfcatid. METHODS: add_relation IMPORTING obj_no TYPE sibfboriid obj_type TYPE sibftypeid obj_cat TYPE sibfcatid relation TYPE oblreltype. METHODS: create_relations. PRIVATE SECTION. DATA: t_related TYPE ty_t_related, "sibflporbt, my_prop TYPE sibflporb. ENDCLASS. "lcl_relation DEFINITION * * CLASS lcl_relation IMPLEMENTATION. METHOD CONSTRUCTOR. * Установим id объекта к которому добавляем соединение me->my_prop-instid = obj_no. me->my_prop-typeid = obj_type. me->my_prop-catid = obj_cat. ENDMETHOD. "constructor METHOD add_relation. * Добавим соединение во внутреннюю таблицу FIELD-SYMBOLS: <lfs_relat> LIKE LINE OF me->t_related. APPEND INITIAL LINE TO me->t_related ASSIGNING <lfs_relat>. <lfs_relat>-instid = obj_no. <lfs_relat>-typeid = obj_type. <lfs_relat>-catid = obj_cat. <lfs_relat>-relation = relation. ENDMETHOD. "add_relation * METHOD create_relations. DATA: lwa_relate_key TYPE sibflporb. FIELD-SYMBOLS: <lfs_relat> LIKE LINE OF me->t_related. * DATA: ls_parent TYPE borident, ls_related TYPE borident, lv_relation TYPE binreltyp, lx_obl TYPE REF TO cx_obl, lp_errstr TYPE STRING, lv_done TYPE flag. * LOOP AT me->t_related ASSIGNING <lfs_relat>. MOVE-CORRESPONDING <lfs_relat> TO lwa_relate_key. TRY. CALL METHOD cl_binary_relation=>create_link EXPORTING is_object_a = my_prop is_object_b = lwa_relate_key ip_reltype = <lfs_relat>-relation. * lv_done = 'X'. * * Если соединение не может быть обработано данным классом * Воспользуемся ФМ CATCH cx_obl_model_error. * ls_parent-objkey = me->my_prop-instid. ls_parent-objtype = me->my_prop-typeid. ls_related-objkey = <lfs_relat>-instid. ls_related-objtype = <lfs_relat>-typeid. lv_relation = <lfs_relat>-relation. * CALL FUNCTION 'BINARY_RELATION_CREATE' EXPORTING obj_rolea = ls_parent obj_roleb = ls_related relationtype = lv_relation EXCEPTIONS no_model = 1 internal_error = 2 unknown = 3 OTHERS = 4. IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE 'S' NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ELSE. lv_done = 'X'. ENDIF. CATCH cx_obl INTO lx_obl. lp_errstr = lx_obl->get_text( ). MESSAGE lp_errstr TYPE 'S'. ENDTRY. * IF lv_done = 'X'. WRITE: / 'Связь создана: ', <lfs_relat>-instid(10), <lfs_relat>-relation. ENDIF. * ENDLOOP. * COMMIT WORK. * ENDMETHOD. ENDCLASS. * START-OF-SELECTION. DATA: o_relation TYPE REF TO lcl_relation. * * В качестве документа к которому создаем соединение выступает сбытовой заказ CREATE OBJECT o_relation EXPORTING obj_no = '1000010010' obj_type = 'BUS2032' obj_cat = 'BO'. * * Добавим поставку в качестве ссылки к сбытовому заказу o_relation->add_relation( obj_no = '8000020000' obj_type = 'LIKP' obj_cat = 'BO' relation = 'LINK' ). " Link * * Добавим IDOC в качестве ссылки к сбытовому заказу o_relation->add_relation( obj_no = '1000012345' obj_type = 'IDOC' obj_cat = 'BO' relation = 'IDC0' ). " IDOC * * Создаем соединения o_relation->create_relations( ). |
Работа с вложениями
Для получения списка вложений можно воспользоваться все тем же классом cl_binary_relation и его методом read_links. Для чтения содержимого вложения используется ФМ: SO_OBJECT_READ.
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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
REPORT zgos_note. START-OF-SELECTION. DATA: gs_lpor TYPE sibflporb, lt_relat TYPE obl_t_relt, la_relat LIKE LINE OF lt_relat. gs_lpor-instid = '4500000324'. gs_lpor-typeid = 'BUS2012'. gs_lpor-catid = 'BO'. la_relat-SIGN = 'I'. la_relat-OPTION = 'CP'. la_relat-LOW = '*'. APPEND la_relat TO lt_relat. DATA: t_links TYPE obl_t_link, la_links LIKE LINE OF t_links. DATA: lo_root TYPE REF TO CX_ROOT. TRY. CALL METHOD cl_binary_relation=>read_links EXPORTING is_object = gs_lpor it_relation_options = lt_relat IMPORTING et_links = t_links. CATCH CX_ROOT INTO lo_root. ENDTRY. DATA l_folder_id TYPE soodk. DATA l_object_id TYPE soodk. DATA document_id TYPE sofmk. READ TABLE t_links INTO la_links INDEX 1. document_id = la_links-instid_b. l_folder_id-objtp = document_id-foltp. l_folder_id-objyr = document_id-folyr. l_folder_id-objno = document_id-folno. l_object_id-objtp = document_id-doctp. l_object_id-objyr = document_id-docyr. l_object_id-objno = document_id-docno. DATA: document_content TYPE STANDARD TABLE OF soli, SOFM2 TYPE SOOD2. " Кто и когда создал * Получение содержимого файла. CALL FUNCTION 'SO_OBJECT_READ' EXPORTING folder_id = l_folder_id object_id = l_object_id IMPORTING object_hd_display = SOFM2 TABLES objcont = document_content EXCEPTIONS active_user_not_exist = 1 communication_failure = 2 component_not_available = 3 folder_not_exist = 4 folder_no_authorization = 5 object_not_exist = 6 object_no_authorization = 7 operation_no_authorization = 8 owner_not_exist = 9 parameter_error = 10 substitute_not_active = 11 substitute_not_defined = 12 system_failure = 13 x_error = 14 OTHERS = 15. IF sy-subrc NE 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF. |
Еще один полезный метод copy_linked_objects класса cl_gos_service_tools позволяет копировать вложения между двумя бизнес объектами.
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 |
REPORT Zсopy_gos_att. * * DATA: lt_services TYPE tgos_sels. " Services table typ DATA: ls_service TYPE sgos_sels. " Services structure type DATA: ls_source TYPE sibflporb, " Source ls_target TYPE sibflporb. " Target * START-OF-SELECTION. * * Service needs to be performed ls_service-SIGN = 'I'. ls_service-OPTION = 'EQ'. ls_service-LOW = 'PCATTA_CREA'. APPEND ls_service TO lt_services. * * Source ls_source-instid = 'CUST1'. ls_source-typeid = 'KNA1'. ls_source-catid = 'BO'. * * Target ls_target-instid = 'CUST2'. ls_target-typeid = 'KNA1'. ls_target-catid = 'BO'. * * Copy the objects between Source and Target cl_gos_service_tools=>copy_linked_objects( is_source = ls_source is_target = ls_target it_service_selection = lt_services ). * COMMIT WORK. |