BAPI_BUS2054_CREATE_MULTI

Автор Sed0Y, Січень 12, 2012, 01:23:12 ПП

Попередня тема - Наступна тема

0 Користувачі і 1 Гість дивляться цю тему.

Sed0Y

(на данный момент  ;) )  - Добрый день.

Создаю Определение Проекта через BAPI_BUS2001_CREATE, потом мне нужно создать
Структурный план проекта (СПП), думаю это делается с помощью "BAPI_BUS2054_CREATE_MULTI",
так получается основной СПП, а как создавать ниже стоящие СПП?

ну и потом буду создавать Сетевой График (СГ)...

Или лучше (правильней) будет всю эту кашу создавать через BAPI_PROJECT_MAINTAIN, но заню, что через эту БАПИ скорость выполнения маленькая...?

Uukrul

Ну это... там же таблица передается: IT_WBS_ELEMENT STRUCTURE  BAPI_BUS2054_NEW, а в ней есть два вот таких вот ссылочных СПП-элемента, думаю что один из них это ссылка на вышестоящий СПП и т.д.

WBS_LEFT PS_POSID CHAR 24 0 Элемент структурного плана проекта (СПП-элемент)
WBS_UP PS_POSID CHAR 24 0 Элемент структурного плана проекта (СПП-элемент)

Так что не вопрос, описываем структуру и подчиненность объектов и создаем сеть.

Sed0Y


Uukrul

Цитата: Sed0Y від Січень 12, 2012, 07:08:35 ПП
Спасибо. Так и есть.
Ну с тебя пример того как это можно есть :-)

Sed0Y

#4
Примерно так:

FUNCTION Z_TEST.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  EXPORTING
*"     REFERENCE(RET_MESSAGE) TYPE  CHAR255
*"----------------------------------------------------------------------

DATA:
" структурный план проекта
      GT_BAPI_BUS2054  TYPE TABLE OF BAPI_BUS2054_NEW,
      GA_BAPI_BUS2054  TYPE BAPI_BUS2054_NEW,
      PROJ_DEF         TYPE BAPI_BUS2001_NEW-PROJECT_DEFINITION.

DATA:
      ET_RET           TYPE TABLE OF BAPIRET2,
      EA_RET           TYPE BAPIRET2.

DATA:
      count_i    TYPE i.

    CALL FUNCTION 'BAPI_PS_INITIALIZATION'.

    PROJ_DEF = '0400000220'.

    GA_BAPI_BUS2054-WBS_ELEMENT           = '0400000220'.
    GA_BAPI_BUS2054-DESCRIPTION           = 'Локальная задача'.
    GA_BAPI_BUS2054-plant                 = '1000'.
    GA_BAPI_BUS2054-business_area         = 'BS01'.
    GA_BAPI_BUS2054-WBS_PLANNING_ELEMENT  = 'X'.
    APPEND GA_BAPI_BUS2054 TO GT_BAPI_BUS2054.

    GA_BAPI_BUS2054-WBS_ELEMENT           = '0400000220-10'.
    GA_BAPI_BUS2054-DESCRIPTION           = '0400000220-10'.
    GA_BAPI_BUS2054-plant                 = '1000'.
    GA_BAPI_BUS2054-business_area         = 'BS01'.
    GA_BAPI_BUS2054-WBS_UP                = '0400000220'.
    GA_BAPI_BUS2054-WBS_PLANNING_ELEMENT  = 'X'.
    GA_BAPI_BUS2054-WBS_BILLING_ELEMENT   = 'X'.
    APPEND GA_BAPI_BUS2054 TO GT_BAPI_BUS2054.

    GA_BAPI_BUS2054-WBS_ELEMENT           = '0400000220-20'.
    GA_BAPI_BUS2054-DESCRIPTION           = '0400000220-20'.
    GA_BAPI_BUS2054-plant                 = '1000'.
    GA_BAPI_BUS2054-business_area         = 'BS01'.
    GA_BAPI_BUS2054-WBS_UP                = '0400000220'.
    GA_BAPI_BUS2054-WBS_PLANNING_ELEMENT  = 'X'.
    GA_BAPI_BUS2054-WBS_BILLING_ELEMENT   = 'X'.
    APPEND GA_BAPI_BUS2054 TO GT_BAPI_BUS2054.

    CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
    CALL FUNCTION 'BAPI_BUS2054_CREATE_MULTI'
      EXPORTING
          I_PROJECT_DEFINITION       = PROJ_DEF
      TABLES
          IT_WBS_ELEMENT             = GT_BAPI_BUS2054
          ET_RETURN                  = ET_RET.

    READ TABLE ET_RET WITH KEY type = 'E' TRANSPORTING NO FIELDS.
    IF sy-subrc = 0.
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
        DESCRIBE TABLE ET_RET LINES count_i.
        READ TABLE ET_RET INTO EA_RET INDEX count_i.
        RET_MESSAGE = EA_RET-MESSAGE.
        EXIT.
    ENDIF.

    REFRESH ET_RET. CLEAR EA_RET.
    CALL FUNCTION 'BAPI_PS_PRECOMMIT'
      TABLES
        ET_RETURN = ET_RET.

    READ TABLE ET_RET WITH KEY type = 'E' TRANSPORTING NO FIELDS.
    IF sy-subrc NE 0.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            WAIT = 'X'.
    ELSE.
        DESCRIBE TABLE ET_RET LINES count_i.
        READ TABLE ET_RET INTO EA_RET INDEX count_i.
        RET_MESSAGE = EA_RET-MESSAGE.
        EXIT.
    ENDIF.

ENDFUNCTION.


И в результате получается такое (см. рис cj02_01.jpg):
1   0400000220
2    0400000220-20
2    0400000220-10

а что бы было:
1   0400000220
2    0400000220-10
2    0400000220-20

то как я понял, нужно в порядке от большего к меньшему добавлять в таблицу "GT_BAPI_BUS2054":
GA_BAPI_BUS2054-WBS_ELEMENT           = '0400000220'.
.....
GA_BAPI_BUS2054-WBS_ELEMENT           = '0400000220-20'.
....
GA_BAPI_BUS2054-WBS_ELEMENT           = '0400000220-10'.
......


Sed0Y

Подскажите правильную логику?

К примеру есть у нас программа в которой идет такой вызов


1. BAPI_PS_INITIALIZATION ( "Initilize )
2. BAPI_BUS2001_SET_STATUS ( to set Project status)

3. CALL FUNCTION 'ZZZZZZ'
    в функции есть такое:
    3.1. BAPI_PS_INITIALIZATION ( "Initilize )
    3.2. BAPI_BUS2054_SET_STATUS
    3.3. BAPI_BUS2002_SET_STATUS
    3.4. BAPI_PS_PRECOMMIT ( "Precommit )
    3.5. BAPI_TRANSACTION_COMMIT ( "Commit ) OR BAPI_TRANSACTION_ROLLBACK (Rollback)

4. BAPI_PS_PRECOMMIT ( "Precommit )
5. BAPI_TRANSACTION_COMMIT ( "Commit )



так вот вопрос такой.

если мы с программы вызвали INITIALIZATION то нужно ли еще и в ФМе ее вызывать И если сделать Commit/Rollback в ФМе то отнесется ли этот комит/ролбек и к тому что в программе?

Uukrul

Цитата: Sed0Y від Лютий 21, 2012, 09:21:00 ДП
Подскажите правильную логику?
Ну в такой логике, ROOLBACK строки 3.5 откатит все что было до него и поэтому строке 5 уже коммитить будет как бы нечего.

r00xus

здравствуйте коллеги.

у меня почему-то не получается создать иерархию спп с помощью BAPI_BUS2054_CREATE_MULTI. Вылетает с ошибкой:

E   CNIF_PI   070   Заключительная проверка определения проекта и элементов СПП: Ошибка

Что де не так?
Вот код:
* str
  DATA lv_prj_def TYPE bapi_bus2001_new-project_definition.
* str
  DATA ls_wbs_elm TYPE bapi_bus2054_new.
* str
  DATA ls_ret TYPE bapiret2.
*----------------------------------------------------------------------*
* tab
  DATA lt_wbs_elm TYPE STANDARD TABLE OF bapi_bus2054_new.
* tab
  DATA lt_ret TYPE STANDARD TABLE OF bapiret2.
* tab
  DATA lt_ret_pr TYPE STANDARD TABLE OF bapiret2.
************************************************************************
* определение проекта
*----------------------------------------------------------------------*
  lv_prj_def = 'U-D-1406-11-001'.
*----------------------------------------------------------------------*
* спп элементы
*----------------------------------------------------------------------*
*
  CLEAR ls_wbs_elm.
  ls_wbs_elm-wbs_element = 'U-D-1406-11-001'.
  ls_wbs_elm-description = 'Оборудование профнастил (СМЦ Петровское)'.
  ls_wbs_elm-proj_type = '04'.
  ls_wbs_elm-priority = '1'.
  ls_wbs_elm-company_code = '1400'.
  ls_wbs_elm-business_area = '1405'.
  ls_wbs_elm-plant = '1406'.
  ls_wbs_elm-user_field_char20_1 = ''.
  ls_wbs_elm-equipment = ''.
  ls_wbs_elm-funct_loc = ''.
  ls_wbs_elm-responsible_no = '14000001'.
  ls_wbs_elm-respsbl_cctr = ''.
  ls_wbs_elm-invest_profile = ''.
  ls_wbs_elm-scale = '2'.
  ls_wbs_elm-inv_reason = '01'.
  ls_wbs_elm-wbs_basic_start_date = '20111201'.
  ls_wbs_elm-wbs_basic_finish_date = '20140701'.
  ls_wbs_elm-wbs_forecast_start_date = '20111201'.
  ls_wbs_elm-wbs_forecast_finish_date = '20140701'.
  APPEND ls_wbs_elm TO lt_wbs_elm.
*
  CLEAR ls_wbs_elm.
  ls_wbs_elm-wbs_element = 'U-D-1406-11-001-01'.
  ls_wbs_elm-wbs_up = 'U-D-1406-11-001'.
  ls_wbs_elm-description = 'Стан ПС-8'.
  ls_wbs_elm-proj_type = '04'.
  ls_wbs_elm-priority = '1'.
  ls_wbs_elm-company_code = '1400'.
  ls_wbs_elm-business_area = '1405'.
  ls_wbs_elm-plant = '1406'.
  ls_wbs_elm-user_field_char20_1 = ''.
  ls_wbs_elm-equipment = ''.
  ls_wbs_elm-funct_loc = ''.
  ls_wbs_elm-responsible_no = '14000001'.
  ls_wbs_elm-respsbl_cctr = ''.
  ls_wbs_elm-invest_profile = '100040'.
  ls_wbs_elm-scale = '2'.
  ls_wbs_elm-inv_reason = '01'.
  ls_wbs_elm-wbs_basic_start_date = '20111201'.
  ls_wbs_elm-wbs_basic_finish_date = '20140701'.
  ls_wbs_elm-wbs_forecast_start_date = '20111201'.
  ls_wbs_elm-wbs_forecast_finish_date = '20140701'.
  APPEND ls_wbs_elm TO lt_wbs_elm.
*
  CALL FUNCTION 'BAPI_PS_INITIALIZATION'.
* создаем спп-элементы
  CALL FUNCTION 'BAPI_BUS2054_CREATE_MULTI'
    EXPORTING
      i_project_definition = lv_prj_def
    TABLES
      it_wbs_element       = lt_wbs_elm
      et_return            = lt_ret.
*
  CALL FUNCTION 'BAPI_PS_PRECOMMIT'
    TABLES
      et_return = lt_ret_pr.
  READ TABLE lt_ret_pr INTO ls_ret WITH KEY type = 'E'.
  IF sy-subrc EQ 0.
    EXIT.
  ENDIF.
*
  CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
    EXPORTING
      wait = 'X'.

Sed0Y

по идеи должно быть:

1.
WBS_PLANNING_ELEMENT  = 'X'.

1.1.
WBS_PLANNING_ELEMENT  = 'X'.
WBS_BILLING_ELEMENT   = 'X'.

1.2.
WBS_PLANNING_ELEMENT  = 'X'.
WBS_BILLING_ELEMENT   = 'X'.

ну и указывать кто у него родитель:
WBS_UP

Uukrul

Цитата: Sed0Y від Липень 02, 2013, 12:51:53 ДП
ну и указывать кто у него родитель:
WBS_UP
Есть одна тонкость,в BAPI содержится ошибка и все элементы создаются на первом уровне. По этому поводу есть нота от: Validity: valid since 24.06.2013 ( Note 1718799 - BAPI_BUS2054_CREATE_MULTI: Creates WBS at level 1), которая корректирует проблему. А иначе оно там флажки не правильно расставляет при построении иерархии.

Sed0Y

Спасибо, но странно, что-то я не замечал, чтобы структура(иерархия) была неправильная а может в системе 7 уже нет этой ошибки...

Uukrul

Цитата: Sed0Y від Липень 24, 2013, 04:32:27 ПП
Спасибо, но странно, что-то я не замечал, чтобы структура(иерархия) была неправильная а может в системе 7 уже нет этой ошибки...
Если честно я системы с номером 7 не знаю... ECC вроде все еще 6.0 но разные Ehp*,  но а то что там внутри ядро уже NW 7.30, так это к этой ошибке отношения не имело, там абаповский код не правильный был:


   loop at it_wbs_element into ls_wbs_element.
*   move WBS element to the correct place in the hierarchy
*   as there is no update structure for new objects
*  note_1615195
*  mark flags based on values passed
      data: l_flag_up type bapiupdate value con_yes,
            l_flag_left type bapiupdate value con_yes.
      if ls_wbs_element-wbs_left is initial.
        clear l_flag_left.
      endif.
      if ls_wbs_element-wbs_up is initial.
        clear l_flag_up.
      endif.
      call function 'CJ2054_BUILD_HIERARCHY'
           exporting
                i_posid_source  = ls_wbs_element-wbs_element
                i_posid_left    = ls_wbs_element-wbs_left
                i_posid_up      = ls_wbs_element-wbs_up
                i_update_left   = l_flag_left "*  note_1615195
                i_update_up     = l_flag_up "*  note_1615195
           exceptions
                hierarchy_error = 1.
      if sy-subrc <> 0.
        message e074(cnif_pi) with ls_wbs_element-wbs_element into null.
*       Hierarchieaufbau für PSP-Element & nicht möglich
        perform put_sy_message(saplco2o).
        lv_error = con_yes.
      endif.
    endloop.

т.е. как видим флажки l_flag_left и l_flag_up присвоены дефолтные значения = Х, но после первого же элемента, который например имеет уровень 1, флажки больше никогда не становятся равными = Х, и соответственно, присвоения не происходит. Конечно же если у вас уровень 1 не создается, а вы присваиваете СПП уже к созданному ранее СПП вышестоящего уровня, то на эту ошибку наткнуться не должны были. В моем случае я делал сам проект и все СПП к нему, поэтому все СПП были уровня 1 и присвоения уровень/подуровень не происходило. Нота это дело исправляет.

Uukrul

Цитата: Sed0Y від Липень 24, 2013, 04:32:27 ПП
Спасибо, но странно, что-то я не замечал, чтобы структура(иерархия) была неправильная а может в системе 7 уже нет этой ошибки...
Как совсем уже ни странно, но сап почему-то так и не сподобился исправить данную проблему. И даже сейчас в послдених версиях S/4HANA для OnPrem она есть?! Для исправления есть новая нота: 1934899 — Ошибка при выполнении BAPI_BUS2054_CREATE_MULTI, которую и надо поставить чтобы походу все работало.