BAPI_AGREEMENT_MAINTAIN

Автор Паганель, Вересень 11, 2007, 02:03:21 ПП

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

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

Паганель

BAPI_AGREEMENT_MAINTAIN  - ктонибудь пользовался ?
А то что-то не проходит обновление измененных полей

Uukrul

Ну судя по всему это типичный бачинпут, так что ставишь точку останова на строке 200 где стоит вызов:

CALL TRANSACTION lv_transaction
                   USING         lt_bdcdata
                   MODE          lv_transaction_mode
                   UPDATE        'S'
                   MESSAGES INTO lt_bdcmsgcoll.

Перед выполнением этого оператора в отладчике меняешь lv_transaction_mode = 'A' и жмешь выполнить оператор. Бачинпут будет выполняться в видимом режиме, вот и посмотришь на чем оно вылетает.


Uukrul

Цитата: gerasim_sergey від Вересень 11, 2007, 02:56:25 ПП
Спасибо за совет
Ну о результате сюда надеюсь напишешь?

Паганель

напишу конечно
только попожже

пока вот тестовый вариант, может руки просто кривые

DATA agreement_header LIKE BAPIOAHEAD occurs 0 with header line.
  "DATA ls_agreement_header LIKE LINE OF agreement_header.
  DATA agreement_headerx LIKE BAPIOAHEAX occurs 0 with header line.
  "DATA ls_agreement_headerx LIKE LINE OF agreement_headerx.

  LOOP AT gt_alvtab INTO ls_alvtab.
    agreement_header-agmt_no    = ls_alvtab-ebeln.
    agreement_header-DOC_CAT    = ls_alvtab-bstyp.
    agreement_header-DOC_TYPE   = ls_alvtab-bsart.
    agreement_header-pur_group  = ls_alvtab-ekgrp.
    APPEND agreement_header.

    " agreement_headerx-agmt_no = ls_alvtab-ebeln.
    agreement_headerx-agmt_no = 'X'.
    agreement_headerx-pur_group = 'X'.
    APPEND agreement_headerx.

    CALL FUNCTION 'BAPI_AGREEMENT_MAINTAIN'
    EXPORTING
      IM_AGREEMENT_HEADER = agreement_header
      IM_AGREEMENT_HEADER_X = agreement_headerx
      "IM_ALL_ITEMS_PASSED = space
    TABLES
      EXT_RETURN = po_bapiret2
      .
   

  ENDLOOP.

Uukrul

#5
Да братан... чего-то ты тут накрутил, сам черт ногу сломает... вообще все кажется гораздо проще. Вот рабочий пример для конкретного документа контракта:


REPORT ytov_test_mk31k .

DATA: l_im_agreement_header LIKE bapioahead,
      l_im_agreement_header_x LIKE bapioaheax,
      lt_imt_agreement_items LIKE bapioaitem OCCURS 1 WITH HEADER LINE,
     lt_imt_agreement_items_x LIKE bapioaitex OCCURS 1 WITH HEADER LINE,
      lt_return LIKE bapiret2 OCCURS 1 WITH HEADER LINE.


CLEAR: l_im_agreement_header, l_im_agreement_header_x,
       lt_imt_agreement_items, lt_imt_agreement_items_x, lt_return,
       lt_imt_agreement_items[], lt_imt_agreement_items_x[],
       lt_return[].

* Параметры для обработки (номер документа, типа документа контракт -
* можно чиать из таблицы если это изменение для создания надо задать,
* код валюты - ну в 4.6 почему-то требует заполнения этого поля, иначе
* говорит, что ошибка валюта не определена, надо читать из таблицы EKKO
* ну если это изменение, а иначе заполняем).
l_im_agreement_header-agmt_no    = '4600000001'.
l_im_agreement_header-doc_cat    = 'K'.
l_im_agreement_header-currency   = 'UAH'.

* Изменяемые поля заголовка (Для примера группа закупок)
l_im_agreement_header-pur_group = '004'.
l_im_agreement_header_x-pur_group = 'X'.

* Параметры для обработки (номер изменяемой строки/позиции договора)
lt_imt_agreement_items-agrmt_item = '00010'.
lt_imt_agreement_items_x-agrmt_item = '00010'.

* Изменяемы позиции контракта (Для примера количество)
lt_imt_agreement_items-target_qty = '12'.
lt_imt_agreement_items_x-target_qty = 'X'.
APPEND: lt_imt_agreement_items, lt_imt_agreement_items_x.

CALL FUNCTION 'BAPI_AGREEMENT_MAINTAIN'
     EXPORTING
          im_agreement_header   = l_im_agreement_header
          im_agreement_header_x = l_im_agreement_header_x
          im_all_items_passed   = space
     TABLES
          ext_return            = lt_return
          imt_agreement_items   = lt_imt_agreement_items
          imt_agreement_items_x = lt_imt_agreement_items_x.

LOOP AT lt_return WHERE type = 'A' OR type = 'E'.
  MESSAGE ID lt_return-id TYPE lt_return-type NUMBER lt_return-number
          WITH lt_return-message_v1 lt_return-message_v2
               lt_return-message_v3 lt_return-message_v4.
ENDLOOP.

Опять же в структуру l_im_agreement_header_x, как и для lt_imt_agreement_items_x включаем галки только для полей которые меняем. Если поле не меняется, из примера это код валюты, то в эту структуру для поля валюты галку ставить не нужно.

Кстати по значению поля l_im_agreement_header-doc_cat, оно определяет тип транзакции которую следует вызвать для обработки документа. Вариантов там судя по тексту:

  CASE im_bstyp.
    WHEN 'K'.
      IF im_bapi_mode EQ gc_create_mode.
        IF sy-saprl(1) EQ '3'.
          ch_tcode = 'ME31'.
        ELSE.
          ch_tcode = 'ME31K'.
        ENDIF.
      ELSE.
        IF sy-saprl(1) EQ '3'.
          ch_tcode = 'ME32'.
        ELSE.
          ch_tcode = 'ME32K'.
        ENDIF.
      ENDIF.
    WHEN 'L'.
      IF im_bapi_mode EQ gc_create_mode.
        IF sy-saprl(1) EQ '3'.
          ch_tcode = 'ME31'.
        ELSE.
          ch_tcode = 'ME31L'.
        ENDIF.
      ELSE.
        IF sy-saprl(1) EQ '3'.
          ch_tcode = 'ME32'.
        ELSE.
          ch_tcode = 'ME32L'.
        ENDIF.
      ENDIF.
    WHEN OTHERS.
  ENDCASE.

т.е. может быть или K-Контракт или L-Соглашение о поставках, любой другой тип документа закупки проезжает мимо кассы. Ну и типа если система до версии 4, то используется старые транзакции, а если старше, то новые.

PS: Ну и это... тех коде-бокс не просто так присобачен для галочки, так что если текст вставляем, то и оформление делаем соответствующее.

Паганель

Цитата: Uukrul від Вересень 11, 2007, 07:49:28 ПП
PS: Ну и это... тех коде-бокс не просто так присобачен для галочки, так что если текст вставляем, то и оформление делаем соответствующее.

Исправлюсь.

За помощь спасибо. Сейчас буду пробывать.

Alexey

Спасибо за бапишку, помогла, а вот можете еще подсказать такую штуку: в 200 строке меняю параметр на А, захожу в видимый режим, вижу изменения - они применяются. А если не захожу в видимый режим, то изменения не применяются. Подскажите плиз причину и как с ней бороться

Uukrul

Цитата: Alexey від Січень 29, 2009, 04:18:29 ПП
Спасибо за бапишку, помогла, а вот можете еще подсказать такую штуку: в 200 строке меняю параметр на А, захожу в видимый режим, вижу изменения - они применяются. А если не захожу в видимый режим, то изменения не применяются. Подскажите плиз причину и как с ней бороться
Ну ты бы это... может свой коду привел? Может ты там COMMIT WORK не дергаешь? Хотя вроде как он там не нужен, но я бы поставил после вызова функции и проверил что получится.

Паганель

Эта же бапишка построена на bathinput, кажись вызывать COMMIT WORK не нужно .....

Все равно не помагает.

Alexey

код вырезан тот, что сверху
l_im_agreement_header-agmt_no    = '3000000065'.
l_im_agreement_header-doc_cat    = 'K'.
l_im_agreement_header-currency   = 'UAH'.

l_im_agreement_header-DOC_DATE = '20090228'.
l_im_agreement_header_x-DOC_DATE = 'X'.
l_im_agreement_header-VPER_START = '20090228'.
l_im_agreement_header_x-VPER_START = 'X'.
APPEND: lt_imt_agreement_items, lt_imt_agreement_items_x.

CALL FUNCTION 'BAPI_AGREEMENT_MAINTAIN'
     EXPORTING
          im_agreement_header   = l_im_agreement_header
          im_agreement_header_x = l_im_agreement_header_x
          im_all_items_passed   = space
     TABLES
          ext_return            = lt_return
          imt_agreement_items   = lt_imt_agreement_items
          imt_agreement_items_x = lt_imt_agreement_items_x.

COMMIT WORK AND WAIT.

Uukrul

Цитата: Паганель від Січень 29, 2009, 06:01:28 ПП
Эта же бапишка построена на bathinput, кажись вызывать COMMIT WORK не нужно .....
Да оно по разному может быть...  странно что не сохраняет, тот пример что я нарисовал работает без проблем и изменения проводит. А если в отладке выполнить и посмотреть что в таблице lt_return на выходе, т.е. в сам ФМ заходить не надо.

Alexey

в ls_return в меседже пишет: "Данные пакетного ввода для экрана SAPLSPO1 0300 отсутствуют."

Uukrul

Цитата: Alexey від Січень 29, 2009, 06:58:35 ПП
в ls_return в меседже пишет: "Данные пакетного ввода для экрана SAPLSPO1 0300 отсутствуют."
Ну так... тут уже совсем другой коленкор, это экран какого-то подтверждения которое надо нажать... а вот что это за подтверждение?  Уже надо смотреть на контракт который модифицируешь или вот что, можно еще просто, это функция POPUP_TO_CONFIRM_WITH_MESSAGE ну которой этот экран вызывается. Поставь в ней точку останова и попадешь в отладку как раз в тот момент, когда оно выскакивает, нажмешь F7 и посмотришь что спрашивает... и всех делов.

PS: Не забудь отписать результат...

Паганель

я так и думал, там выскакиевает сообщение, что выходные документы не найдены,
при этом все это есть как в манданте разработки так и в тестовом (давно собирался почистить/разобратся но руки так и не доходят), а в продуктиве нету

из-за этого и делали через batchinput предидущую разработку, а не через эту бапишку ...
т

Паганель

как отключить? с чего начать?
попробую убрать сейчас ...

Uukrul

Цитата: Паганель від Січень 29, 2009, 10:08:08 ПП
как отключить? с чего начать?
попробую убрать сейчас ...
С чего начать... ну наверное надо посмотреть какой выходной документ оно хочет вывести...

Alexey

Пытаюсь настроить выходные документы, выдает сообщение 515 (Для выходного документa NEU принтер не определен.)

Uukrul

Цитата: Alexey від Січень 30, 2009, 01:26:49 ПП
Пытаюсь настроить выходные документы, выдает сообщение 515 (Для выходного документa NEU принтер не определен.)
Ну попробуй присвоить принтер своей группе закупки, должно вроде как по быстрому сработать... а вообще из документации типа так:
Цитата
How is the printer determined for message output purposes?
The system checks whether a printer has been specified in the condition record.
If so, it is used.
If not, it checks the message type to see whether a print parameter has been set. If no parameter has been set, no message is generated.
If a parameter has been set, a printer is sought in accordance with this parameter. If a printer is found, it is used to output the message. If not, no message is generated.

Note:
You can change the printer when outputting messages (e.g. via the menu options Purchasing document> -> Messages -> Print/transmit). Select the desired message and choose Goto -> Message details -> Edit -> Means of communication.

PS: Кстати на будущее когда пишешь номер сообщения, то указывай так же и класс сообщений, так как 515 номер в каждом классе наверное есть.

Alexey

В этих настройках как раз и лазил, а вот группе закупок значение по умолчпанию поставил только сей час :) В общем получилось. Большое спасибо за помощь!!!

Паганель

Приятная новость, в 6-ке (возможно и в 5-ке) появились новые бапишки для нормальной работы с контрактами
BAPI_CONTRACT_CHANGE
BAPI_CONTRACT_CREATE
BAPI_CONTRACT_GETDETAIL
которые работают (судя по коду) не на бачинпуте.

SMF spam blocked by CleanTalk