Текущее время: Чт, июл 24 2025, 02:29

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 15 ] 
Автор Сообщение
 Заголовок сообщения: Ошибка при создании второго заказа на поставку
СообщениеДобавлено: Ср, сен 29 2010, 11:34 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, мар 13 2007, 22:57
Сообщения: 71
Программа пробегая по внутренней таблице для каждой строки последовательно создает договор и по нему заказ на поставку.
Если просто создавать договора по каждой строке, все работает
Если только создавать заказы по каждой строке указывая номер договора как константу, все работает
Но при создании договора. А потом заказа валится в дамп на создании второго заказа.
Текст дампа.

    ----------------------------------------------------------------------------------------------------
    |Краткий текст |
    | Exception condition "FAILURE" raised. |
    ----------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------
    |Что произошло? |
    | The current ABAP/4 program encountered an unexpected |
    | situation. |
    ----------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------
    |Что Вы можете сделать? |
    | Note down which actions and inputs caused the error. |
    | |
    | |
    | To process the problem further, contact you SAP system |
    | administrator. |
    | |
    | Using Transaction ST22 for ABAP Dump Analysis, you can look |
    | at and manage termination messages, and you can also |
    | keep them for a long time. |
    ----------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------
    |Анализ ошибки |
    | A RAISE statement in the program "CL_PO_ITEM_HANDLE_MM==========CP" raised the |
    | exception |
    | condition "FAILURE". |
    | Since the exception was not intercepted by a superior |
    | program, processing was terminated. |
    | |
    | Short description of exception condition: |
    | |
    | |
    | For detailed documentation of the exception condition, use |
    | Transaction SE37 (Function Library). You can take the called |
    | function module from the display of active calls. |
    | - |
    ----------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------
    |Указания по устранению ошибки |
    | |
    | If the error occures in a non-modified SAP program, you may be able to |
    | find an interim solution in an SAP Note. |
    | If you have access to SAP Notes, carry out a search with the following |
    | keywords: |
    | |
    | "RAISE_EXCEPTION" " " |
    | "CL_PO_ITEM_HANDLE_MM==========CP" or "CL_PO_ITEM_HANDLE_MM==========CM00G" |
    | "GET_DATA" |
    | |
    | or |
    | |
    | "CL_PO_ITEM_HANDLE_MM==========CP" "FAILURE" |
    | |
    | or |
    | |
    | "ZCREATE_ORDER_POST " "FAILURE" |
    | If you cannot solve the problem yourself and want to send an error |
    | notification to SAP, include the following information: |
    | |
    | 1. The description of the current problem (short dump) |
    | |
    | To save the description, choose "System->List->Save->Local File |
    | (Unconverted)". |
    | |
    | 2. Corresponding system log |
    | |
    | Display the system log by calling transaction SM21. |
    | Restrict the time interval to 10 minutes before and five minutes |
    | after the short dump. Then choose "System->List->Save->Local File |
    | (Unconverted)". |
    | |
    | 3. If the problem occurs in a problem of your own or a modified SAP |
    | program: The source code of the program |
    | In the editor, choose "Utilities->More |
    | Utilities->Upload/Download->Download". |
    | |
    | 4. Details about the conditions under which the error occurred or which |
    | actions and input led to the error. |
    | |
    ----------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------
    |Системная среда |
    | SAP-Release 700 |
    | |
    | Application server... "ERD-Server" |
    | Network address...... "1.0.0.70" |
    | Operating system..... "Windows NT" |
    | Release.............. "5.2" |
    | Hardware type........ "4x AMD64 Level" |
    | Character length.... 16 Bits |
    | Pointer length....... 64 Bits |
    | Work process number.. 2 |
    | Shortdump setting.... "full" |
    | |
    | Database server... "ERD-SERVER" |
    | Database type..... "MSSQL" |
    | Database name..... "ERD" |
    | Database user ID.. "erd" |
    | |
    | Char.set.... "C" |
    | |
    | SAP kernel....... 700 |
    | created (date)... "May 3 2010 22:46:28" |
    | create on........ "NT 5.2 3790 Service Pack 2 x86 MS VC++ 14.00" |
    | Database version. "SQL_Server_8.00 " |
    | |
    | Patch level. 254 |
    | Patch text.. " " |
    | |
    | Database............. "MSSQL 9.00.2047 or higher" |
    | SAP database version. 700 |
    | Operating system..... "Windows NT 5.0, Windows NT 5.1, Windows NT 5.2, Windows |
    | NT 6.0, Windows NT 6.1" |
    | |
    | Memory consumption |
    | Roll.... 16192 |
    | EM...... 25139040 |
    | Heap.... 0 |
    | Page.... 90112 |
    | MM Used. 17554720 |
    | MM Free. 3390960 |
    ----------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------
    |Пользователь, транзакция... |
    | |
    | Client.............. 300 |
    | User................ "" |
    | Language key........ "R" |
    | Transaction......... "SE38 " |
    | Transactions ID..... "6C9ACBDFD3B3F101AA7700155D002004" |
    | |
    | Program............. "CL_PO_ITEM_HANDLE_MM==========CP" |
    | Screen.............. "ZCREATE_ORDER_POST 0100" |
    | Screen line......... 7 |
    ----------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------
    |Информация о месте прерывания |
    | Termination occurred in the ABAP program "CL_PO_ITEM_HANDLE_MM==========CP" - |
    | in "GET_DATA". |
    | The main program was "ZCREATE_ORDER_POST ". |
    | |
    | In the source code you have the termination point in line 29 |
    | of the (Include) program "CL_PO_ITEM_HANDLE_MM==========CM00G". |
    ----------------------------------------------------------------------------------------------------

    ----------------------------------------------------------------------------------------------------
    |Фрагмент исходного текста программы |
    ----------------------------------------------------------------------------------------------------
    |Строк|ИсхднТкст |
    ----------------------------------------------------------------------------------------------------
    | 1|METHOD get_data. |
    | 2| |
    | 3| DATA: l_hash_entry LIKE LINE OF po_item_hash_table, |
    | 4| l_ref TYPE REF TO data, |
    | 5| l_header TYPE REF TO cl_po_header_handle_mm. |
    | 6| |
    | 7| FIELD-SYMBOLS: <data> TYPE mepoitem_prop. |
    | 8| |
    | 9| CLEAR ex_data. |
    | 10| |
    | 11| IF state EQ c_verify. |
    | 12| READ TABLE po_item_hash_table INTO l_hash_entry |
    | 13| WITH TABLE KEY item = me. |
    | 14| IF sy-subrc NE 0. |
    | 15| RAISE failure. |
    | 16| ENDIF. |
    | 17| ex_data = l_hash_entry-data. |
    | 18| |
    | 19| ELSEIF state EQ c_available. |
    | 20| |
    | 21| CALL FUNCTION 'MEPO_DOC_ITEM_GET' |
    | 22| EXPORTING |
    | 23| im_ebelp = po_item_number |
    | 24| IMPORTING |
    | 25| ex_item = ex_data |
    | 26| EXCEPTIONS |
    | 27| failure = 01. |
    | 28| IF sy-subrc NE 0. |
    |>>>>>| RAISE failure. |
    | 30| ENDIF. |
    | 31| |
    | 32| ELSEIF state EQ c_new. |
    | 33|* propose data. |
    | 34| CALL METHOD check_proposer. |
    | 35| IF NOT my_item_proposer IS INITIAL. |
    | 36| CALL METHOD my_item_proposer->get_data |
    | 37| IMPORTING |
    | 38| ex_data = l_ref. |
    | 39| IF NOT l_ref IS INITIAL. |
    | 40| |
    | 41| ASSIGN l_ref->* TO <data>. |
    | 42| CHECK sy-subrc IS INITIAL. |
    | 43| MOVE-CORRESPONDING <data> TO ex_data. "#EC ENHOK |
    | 44| IF <data>-pstyp EQ '0'. |
    | 45| ex_data-pstyp = space. |
    | 46| ENDIF. |
    | 47| ENDIF. |
    | 48| ENDIF. |
    ----------------------------------------------------------------------------------------------------

Как этого избежать.
Создание заказа
Code:
FORM CREATE_ORDER USING P_FROM_TABIX LIKE SY-TABIX.
  DATA:
      LT_HEADER       LIKE BAPIMEPOHEADER,
      LT_HEADERX      LIKE BAPIMEPOHEADERX,
      LT_RETURN       LIKE BAPIRET2           OCCURS 5 WITH HEADER LINE,
      LT_ITEMS        LIKE BAPIMEPOITEM       OCCURS 5 WITH HEADER LINE,
      LT_ITEMSX       LIKE BAPIMEPOITEMX      OCCURS 5 WITH HEADER LINE,
      LT_POACCOUNT     LIKE BAPIMEPOACCOUNT   OCCURS 5 WITH HEADER LINE,
      LT_POACCOUNTX    LIKE BAPIMEPOACCOUNTX   OCCURS 5 WITH HEADER LINE,
      LT_SCHEDULE     LIKE BAPIMEPOSCHEDULE   OCCURS 5 WITH HEADER LINE,
      LT_SCHEDULEX    LIKE BAPIMEPOSCHEDULX   OCCURS 5 WITH HEADER LINE,

      LT_ACCOUNT      LIKE BAPIMEPOACCOUNT    OCCURS 5 WITH HEADER LINE,
      LT_ACCOUNTX     LIKE BAPIMEPOACCOUNTX   OCCURS 5 WITH HEADER LINE,
      L_BAPI_NUMBER     LIKE BAPIMEPOHEADER-PO_NUMBER VALUE SPACE.

  DATA: L_CHAR_NUM(15),         "  для сохранения чисел как символов
        L_ERR,                  "  флаг ошибок при создании договора
        L_TABIX.                " номер позиции для создания заказа

  CLEAR:LT_HEADER,LT_HEADERX, LT_ITEMS[],LT_ITEMSX[], LT_POACCOUNT[], LT_POACCOUNTX[],L_BAPI_NUMBER.
CLEAR: LT_RETURN[],L_BAPI_NUMBER.
* блок заполнения
  IF  L_ERR IS INITIAL.
    CALL FUNCTION 'BAPI_PO_CREATE1'
      EXPORTING
        POHEADER         = LT_HEADER
        POHEADERX        = LT_HEADERX
      IMPORTING
        EXPPURCHASEORDER = L_BAPI_NUMBER
      TABLES
        RETURN           = LT_RETURN
        POITEM           = LT_ITEMS
        POITEMX          = LT_ITEMSX
        POACCOUNT        = LT_POACCOUNT
*   POACCOUNTPROFITSEGMENT       =
        POACCOUNTX       = LT_POACCOUNTX

        .
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT = 'X'.
  * обработка ошибок создания
  ELSE.  ENDIF.
ENDFORM.                    " CREATE_CONTRACT 

Создание договора
Code:
FORM CREATE_CONTRACT .
  DATA: L_HEADER LIKE BAPIMEOUTHEADER,
        L_HEADERX LIKE BAPIMEOUTHEADERX,
        L_ITEM LIKE STANDARD TABLE OF BAPIMEOUTITEM WITH HEADER LINE,
        L_ITEMX LIKE STANDARD TABLE OF  BAPIMEOUTITEMX  WITH HEADER LINE,
        L_RETURN LIKE STANDARD TABLE OF  BAPIRET2 WITH HEADER LINE.
  DATA: L_ERR. "  флаг ошибок при создании договора

  DATA: L_CONTRACT LIKE BAPIMEOUTHEADER-NUMBER.  CLEAR: L_HEADER, L_HEADERX, L_ITEM[],L_ITEMX[],L_RETURN[], L_CONTRACT.

* блок заполнения
IF L_ERR IS INITIAL.
    CLEAR: L_CONTRACT, L_RETURN[].

    CALL FUNCTION 'BAPI_CONTRACT_CREATE'
      EXPORTING
        HEADER             = L_HEADER
        HEADERX            = L_HEADERX
      IMPORTING
        PURCHASINGDOCUMENT = L_CONTRACT
      TABLES
        RETURN             = L_RETURN
        ITEM               = L_ITEM
        ITEMX              = L_ITEMX.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT = 'X'.
   ELSE.
   ENDIF.

ENDFORM.                    " CREATE_CONTRACT


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка при создании второго заказа на поставку
СообщениеДобавлено: Ср, сен 29 2010, 12:54 
Младший специалист
Младший специалист

Зарегистрирован:
Сб, сен 13 2008, 08:50
Сообщения: 56
Добрый день.
Может все таки имеет смысл, перед тем как вызывать COMMIT проверять LT_RETURN на наличие ошибок? И если таковые имеются, то ессно COMMIT не делать.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка при создании второго заказа на поставку
СообщениеДобавлено: Ср, сен 29 2010, 14:05 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, мар 13 2007, 22:57
Сообщения: 71
abap.develop написал(а):
Добрый день.
Может все таки имеет смысл, перед тем как вызывать COMMIT проверять LT_RETURN на наличие ошибок? И если таковые имеются, то ессно COMMIT не делать.


не вопрос. но проблемы это не решает!!!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка при создании второго заказа на поставку
СообщениеДобавлено: Ср, сен 29 2010, 14:21 
Младший специалист
Младший специалист

Зарегистрирован:
Сб, сен 13 2008, 08:50
Сообщения: 56
А как Вы заполняете параметры(интерфейсные таблицы)?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка при создании второго заказа на поставку
СообщениеДобавлено: Ср, сен 29 2010, 15:08 
Председатель
Председатель

Зарегистрирован:
Чт, май 10 2007, 09:15
Сообщения: 1558
Видимо проблема в данных передаваемых таблиц.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ошибка при создании второго заказа на поставку
СообщениеДобавлено: Ср, сен 29 2010, 16:29 
Председатель
Председатель
Аватара пользователя

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Для проверки, вставьте задержку в 1 мин. между созданием договора и заказа. Если ошибка исчезнет, смотрите блокированные объекты и ожидайте их разбокировки.

_________________
С уважением, VGA
Мой блог


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка при создании второго заказа на поставку
СообщениеДобавлено: Чт, сен 30 2010, 08:29 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, мар 13 2007, 22:57
Сообщения: 71
hub2002 написал(а):
Видимо проблема в данных передаваемых таблиц.


Для того, чтобы не было такого момента, что договор еще не создан, а мы к нему обращаемся, просто временно поставим договор как константу,
ибо и при этих условиях дамп возникает

константы в программе для отладки только

вызов функций
Code:
FORM CREATE_DOC .
  DATA:  L_FROM_TABIX LIKE SY-TABIX.
  FIELD-SYMBOLS <FS_LT_ALL_TAB> LIKE GT_ALL_TAB .

* для каждого прихода создается свой заказ
  LOOP AT GT_ALL_TAB_ORD .
*  создаем контракт
    IF NOT GT_ALL_TAB_ORD-ID_CONTRACT IS INITIAL.
* по любой строке строим договор
      READ TABLE GT_ALL_TAB WITH KEY P_ID_POS = GT_ALL_TAB_ORD-P_ID_POS.
      CHECK SY-SUBRC = 0.
      L_FROM_TABIX = SY-TABIX.
      PERFORM CREATE_CONTRACT  .
      IF NOT GT_ALL_TAB_ORD-EVRTN IS INITIAL.
* создание заказа
        PERFORM CREATE_ORDER USING L_FROM_TABIX .
      ENDIF.
    ELSE.
* создание заказа
* по любой строке строим заголовок заказа
      READ TABLE GT_ALL_TAB WITH KEY P_ID_POS = GT_ALL_TAB_ORD-P_ID_POS.
      CHECK SY-SUBRC = 0.
      L_FROM_TABIX = SY-TABIX.
      PERFORM CREATE_ORDER USING L_FROM_TABIX .
    ENDIF.
    IF NOT GT_ALL_TAB_ORD-EBELN IS INITIAL.
      LOOP AT GT_ALL_TAB ASSIGNING <FS_LT_ALL_TAB> FROM L_FROM_TABIX.
        IF <FS_LT_ALL_TAB>-P_ID_POS = GT_ALL_TAB_ORD-P_ID_POS.
          <FS_LT_ALL_TAB>-P_SAP_EBELN = GT_ALL_TAB_ORD-EBELN.
          <FS_LT_ALL_TAB>-P_SAP_EVRTN = GT_ALL_TAB_ORD-EVRTN.
        ELSE.
          EXIT.
        ENDIF.
      ENDLOOP.
    ENDIF.
    MODIFY GT_ALL_TAB_ORD .
  ENDLOOP.


про рамочный договор
Code:
FORM CREATE_CONTRACT .
  DATA: L_HEADER LIKE BAPIMEOUTHEADER,
        L_HEADERX LIKE BAPIMEOUTHEADERX,
        L_ITEM LIKE STANDARD TABLE OF BAPIMEOUTITEM WITH HEADER LINE,
        L_ITEMX LIKE STANDARD TABLE OF  BAPIMEOUTITEMX  WITH HEADER LINE,
        L_RETURN LIKE STANDARD TABLE OF  BAPIRET2 WITH HEADER LINE.
  DATA: L_ERR. "  флаг ошибок при создании договора

  DATA: L_CHAR_NUM(15). "  для сохранения чисел как символов
  DATA: L_CONTRACT LIKE BAPIMEOUTHEADER-NUMBER.
  DATA: NUM_TXT(30). "  для перевода чисел в текст
  CLEAR: L_HEADER, L_HEADERX, L_ITEM[],L_ITEMX[],L_RETURN[], L_CONTRACT.
* заголовок

  L_HEADER-COMP_CODE = C_COMP_CODE_1000 .         "Балансовая единица
  L_HEADER-DOC_TYPE =  C_DOC_TYPE_RP.             "Вид документа закупки

* Номер счета поставщика
  L_CHAR_NUM = GT_ALL_TAB-LEGAL_PERSON.
  SHIFT  L_CHAR_NUM LEFT DELETING LEADING SPACE.
  SELECT SINGLE LIFNR FROM LFB1
   INTO   L_HEADER-VENDOR
   WHERE ALTKN = L_CHAR_NUM AND BUKRS = C_COMP_CODE_1000.
  IF SY-SUBRC <> 0.
    L_HEADER-VENDOR      =  '0001000001'.        "Номер счета поставщика
    "Номер счета поставщика
    CONCATENATE 'Для поставщика' L_CHAR_NUM  'не создан поставщик' INTO STRING1 SEPARATED BY SPACE.
    PERFORM ADD_LOG_MSG_ADD_FREE_TEXT USING GF_LOG_HANDLE MSGTY_E   PROBCLASS_HIGH  STRING1.
    L_ERR = 'X'.
  ENDIF.


  L_HEADER-PURCH_ORG  = C_PURCH_ORG_1000.         "Закупочная организация

  "Группа закупок
  SELECT  SINGLE PUR_GROUP
  FROM  ZMM_T_DIVIS_BKGR
  INTO  L_HEADER-PUR_GROUP
  WHERE DIVISIONS = GT_ALL_TAB-P_DIVISIONS.
  IF SY-SUBRC <> 0.
    L_HEADER-PUR_GROUP   = '001'.          "Группа закупок
    L_CHAR_NUM = GT_ALL_TAB-P_DIVISIONS.
    CONCATENATE 'Для подразделения' L_CHAR_NUM  'не создана группа закупок ' INTO STRING1 SEPARATED BY SPACE.
    PERFORM ADD_LOG_MSG_ADD_FREE_TEXT USING GF_LOG_HANDLE MSGTY_E   PROBCLASS_HIGH  STRING1.
    L_ERR = 'X'.
  ENDIF.

  L_HEADER-CURRENCY = C_CURRENCY_RUB.             "Код валюты
  L_HEADER-VPER_END = C_VPER_END_99991231.        "Конец времени выполнения
  NUM_TXT = GT_ALL_TAB-I_CONTRACT.

  L_HEADERX-COMP_CODE = 'X'."Балансовая единица
  L_HEADERX-DOC_TYPE = 'X'."Вид документа закупки
  L_HEADERX-VENDOR = 'X'."Номер счета поставщика
  L_HEADERX-PURCH_ORG  = 'X'."Закупочная организация
  L_HEADERX-PUR_GROUP  = 'X'."Группа закупок
  L_HEADERX-CURRENCY = 'X'."Код валюты
  L_HEADERX-VPER_END = 'X'."Конец времени выполнения

* позиции
  L_ITEM-ITEM_NO = C_ITEM_NO_00010.               "Номер позиции документа закупки
  L_ITEM-ITEM_CAT   = C_ITEM_CAT_W.                 "Тип позиции в документе закупки

  L_ITEM-MATL_GROUP   = C_MATL_GROUP.               "Группа материалов
  L_ITEM-SHORT_TEXT =  C_SHORT_TEXT_SHORT_TXT.    " Краткий текст
  APPEND L_ITEM.

  L_ITEMX-ITEM_NO = C_ITEM_NO_00010.              "Номер позиции документа закупки
  L_ITEMX-ITEM_CAT  = 'X'.                        "Тип позиции в документе закупки
  L_ITEMX-MATL_GROUP  ='X'.                       "Группа материалов
  L_ITEMX-SHORT_TEXT = 'X'.                       " Краткий текст
  APPEND L_ITEMX.

  IF L_ERR IS INITIAL.
    CLEAR: L_CONTRACT, L_RETURN[].
* нет ошибок формирования, создаем договор
    CALL FUNCTION 'BAPI_CONTRACT_CREATE'
      EXPORTING
        HEADER             = L_HEADER
        HEADERX            = L_HEADERX
      IMPORTING
        PURCHASINGDOCUMENT = L_CONTRACT
      TABLES
        RETURN             = L_RETURN
        ITEM               = L_ITEM
        ITEMX              = L_ITEMX.
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT = 'X'.
    LOOP AT L_RETURN.
      GT_ERR_POST-ID_TAB = GT_ALL_TAB-P_ID_POS.
      GT_ERR_POST-ERR_NOTE = L_RETURN-MESSAGE.
      APPEND GT_ERR_POST.
    ENDLOOP.
    GT_ALL_TAB_ORD-EVRTN = L_CONTRACT.
    MODIFY GT_ALL_TAB_ORD.
* обработка ошибок создания
  ELSE.
* ошибки формирования
    GT_ALL_TAB_ORD-4_IC_ERR = ICON_DEFECT.
  ENDIF.

ENDFORM.                    " CREATE_CONTRACT


создание заказа
Code:
FORM CREATE_ORDER USING P_FROM_TABIX LIKE SY-TABIX.
  DATA:
      LT_HEADER       LIKE BAPIMEPOHEADER,
      LT_HEADERX      LIKE BAPIMEPOHEADERX,
      LT_RETURN       LIKE BAPIRET2           OCCURS 5 WITH HEADER LINE,
      LT_ITEMS        LIKE BAPIMEPOITEM       OCCURS 5 WITH HEADER LINE,
      LT_ITEMSX       LIKE BAPIMEPOITEMX      OCCURS 5 WITH HEADER LINE,
      LT_POACCOUNT     LIKE BAPIMEPOACCOUNT   OCCURS 5 WITH HEADER LINE,
      LT_POACCOUNTX    LIKE BAPIMEPOACCOUNTX   OCCURS 5 WITH HEADER LINE,
      LT_SCHEDULE     LIKE BAPIMEPOSCHEDULE   OCCURS 5 WITH HEADER LINE,
      LT_SCHEDULEX    LIKE BAPIMEPOSCHEDULX   OCCURS 5 WITH HEADER LINE,

      LT_ACCOUNT      LIKE BAPIMEPOACCOUNT    OCCURS 5 WITH HEADER LINE,
      LT_ACCOUNTX     LIKE BAPIMEPOACCOUNTX   OCCURS 5 WITH HEADER LINE,
      L_BAPI_NUMBER     LIKE BAPIMEPOHEADER-PO_NUMBER VALUE SPACE.

  DATA: L_CHAR_NUM(15),         "  для сохранения чисел как символов
        L_ERR,                  "  флаг ошибок при создании договора
        L_TABIX.                " номер позиции для создания заказа

  CLEAR:LT_HEADER,LT_HEADERX, LT_ITEMS[],LT_ITEMSX[], LT_POACCOUNT[], LT_POACCOUNTX[],L_BAPI_NUMBER.

*  заголовок
  CLEAR :  LT_HEADER.
  LT_HEADER-COMP_CODE   = C_COMP_CODE_1000.           " Балансовая единица
  LT_HEADER-DOC_TYPE    =  C_DOC_TYPE_NB .            "Вид документа закупки
  LT_HEADER-CREAT_DATE  = SY-DATUM.                   "Дата создания записи
  LT_HEADER-CREATED_BY  = SY-UNAME.                   "Имя исполнителя, создавшего объект
  LT_HEADER-REF_1       = GT_ALL_TAB-P_POSTING_NUMBER."Номер  документа приходования

* если есть договор
  IF  NOT GT_ALL_TAB_ORD-EVRTN IS  INITIAL.
    LT_HEADER-AGREEMENT    = '4600000077'."GT_ALL_TAB_ORD-EVRTN."Номер основного договора
  ELSE.
* Номер счета поставщика
    L_CHAR_NUM = GT_ALL_TAB-P_LEGAL_PERSON.
    SHIFT  L_CHAR_NUM LEFT DELETING LEADING SPACE.
    SELECT SINGLE LIFNR FROM LFB1
     INTO   LT_HEADER-VENDOR
     WHERE ALTKN = L_CHAR_NUM AND BUKRS = C_COMP_CODE_1000.
    IF SY-SUBRC <> 0.
      LT_HEADER-VENDOR      =  '0001000001'.        "Номер счета поставщика
      L_CHAR_NUM = GT_ALL_TAB-P_LEGAL_PERSON.
      "Номер счета поставщика
      CONCATENATE 'Для поставшика' L_CHAR_NUM  ' не создан поставщик ' INTO STRING1 SEPARATED BY SPACE.
      PERFORM ADD_LOG_MSG_ADD_FREE_TEXT USING GF_LOG_HANDLE MSGTY_E   PROBCLASS_HIGH  STRING1.
         L_ERR = 'X'.
    ENDIF.

    LT_HEADER-PURCH_ORG   = C_PURCH_ORG_1000.        "Закупочная организация

    "Группа закупок
    SELECT  SINGLE PUR_GROUP
    FROM  ZMM_T_DIVIS_BKGR
    INTO  LT_HEADER-PUR_GROUP
    WHERE DIVISIONS = GT_ALL_TAB-P_DIVISIONS.
    IF SY-SUBRC <> 0.
      LT_HEADER-PUR_GROUP   = '001'.          "Группа закупок
      L_CHAR_NUM = GT_ALL_TAB-P_DIVISIONS.
      CONCATENATE 'Для подразделения' L_CHAR_NUM  ' не создана группа закупок в' INTO STRING1 SEPARATED BY SPACE.
      PERFORM ADD_LOG_MSG_ADD_FREE_TEXT USING GF_LOG_HANDLE MSGTY_E   PROBCLASS_HIGH  STRING1.
       L_ERR = 'X'.
    ENDIF.
  ENDIF.

  LT_HEADER-CURRENCY    = C_CURRENCY_RUB  .          "Код валюты
  LT_HEADER-DOC_DATE    = SY-DATUM.       "Дата документа закупки

  CLEAR :  LT_HEADERX.
  LT_HEADERX-REF_1      =  'X'."Номер  документа приходования
  LT_HEADERX-COMP_CODE  =  'X'."  Балансовая единица
  LT_HEADERX-DOC_TYPE   =  'X'."Вид документа закупки
  LT_HEADERX-CREAT_DATE =  'X'."Дата создания записи
  LT_HEADERX-CREATED_BY =  'X'."Имя исполнителя, создавшего объект
* если есть договор
  IF  NOT GT_ALL_TAB_ORD-EVRTN IS  INITIAL.
    LT_HEADERX-AGREEMENT  =  'X'.       "Номер основного договора
  ELSE.
* иначе
    LT_HEADERX-VENDOR     =   'X'.        "Номер счета поставщика
    LT_HEADERX-PURCH_ORG  =  'X'.         "Закупочная организация
    LT_HEADERX-PUR_GROUP  =  'X'.          "Группа закупок
  ENDIF.

  LT_HEADERX-CURRENCY   =  'X'..          "Код валюты
  LT_HEADERX-DOC_DATE   =  'X'.       "Дата документа закупки

  FIELD-SYMBOLS <FS_LT_ALL_TAB> LIKE GT_ALL_TAB .
* элементы

  L_TABIX = 1.
  LOOP AT GT_ALL_TAB ASSIGNING <FS_LT_ALL_TAB> FROM P_FROM_TABIX.

    CLEAR: LT_ITEMS,LT_ITEMSX, LT_POACCOUNT, LT_POACCOUNTX.

    IF <FS_LT_ALL_TAB>-P_ID_POS = GT_ALL_TAB_ORD-P_ID_POS.

      CLEAR: LT_ITEMS, LT_ITEMSX,LT_POACCOUNT,LT_POACCOUNTX.
      LT_ITEMS-PO_ITEM    =  L_TABIX * 10." "Номер позиции документа закупки
      LT_ITEMSX-PO_ITEM     =  L_TABIX * 10." "Номер позиции документа закупки

      "Номер материала
      LT_ITEMS-MATERIAL   =  '000000001000000000'."Номер материала

      LT_ITEMS-PLANT      =  C_PLANT_1000 .   "Завод
      LT_ITEMS-STGE_LOC   =  ''.              "Склад
      LT_ITEMS-QUANTITY   =  <FS_LT_ALL_TAB>-IO_AMOUNT.            "Объем заказа на поставку

      "ЕИ заказа на поставку
      L_CHAR_NUM = <FS_LT_ALL_TAB>-ID_UNITS.
      SHIFT  L_CHAR_NUM LEFT DELETING LEADING SPACE.
      SELECT SINGLE MEINS
       INTO LT_ITEMS-PO_UNIT
       FROM ZMM_T_UNIT
       WHERE ID = L_CHAR_NUM.
      IF SY-SUBRC <> 0.
        LT_ITEMS-PO_UNIT    =  'ST'.            "ЕИ заказа на поставку
        L_CHAR_NUM = <FS_LT_ALL_TAB>-ID_UNITS.
        CONCATENATE 'Для ЕИ' L_CHAR_NUM  'не созданы ЕИ' INTO STRING1 SEPARATED BY SPACE.
        PERFORM ADD_LOG_MSG_ADD_FREE_TEXT USING GF_LOG_HANDLE MSGTY_E   PROBCLASS_HIGH  STRING1.
            L_ERR = 'X'.
      ENDIF.

      LT_ITEMS-NET_PRICE  =  <FS_LT_ALL_TAB>-ID_PRICE.           "Цена за единицу

      IF NOT <FS_LT_ALL_TAB>-PO_PROJECT IS INITIAL.
* с контировкой
        LT_ITEMS-ACCTASSCAT =   C_ACCTASSCAT_Q  ." Тип контировки
        LT_ITEMSX-ACCTASSCAT =  'X'." Тип контировки

* контировка
        LT_POACCOUNT-PO_ITEM  = L_TABIX * 10." "Номер позиции документа закупки
        DATA: L_PSPNR LIKE  PRPS-PSPNR.
        CLEAR: L_PSPNR.

        L_CHAR_NUM = GT_ALL_TAB-PO_PROJECT.
        SHIFT  L_CHAR_NUM LEFT DELETING LEADING SPACE.
        SELECT SINGLE PSPNR FROM ZMM_T_ORDER_PRPS
        INTO   L_PSPNR
        WHERE PROJECT = L_CHAR_NUM  .
        IF SY-SUBRC = 0.
          SELECT SINGLE POSID  FROM PRPS
          INTO   LT_POACCOUNT-WBS_ELEMENT
          WHERE PSPNR = L_PSPNR .
        ELSE.
          LT_POACCOUNT-WBS_ELEMENT =  '00001.01.001'." '00000111'." " Элемент структурного плана проекта (СПП-элемент)
          "Номер счета поставщика
          CONCATENATE 'Для заказа' L_CHAR_NUM  'не создан СПП ' INTO STRING1 SEPARATED BY SPACE.
          PERFORM ADD_LOG_MSG_ADD_FREE_TEXT USING GF_LOG_HANDLE MSGTY_E   PROBCLASS_HIGH  STRING1.
          GT_ERR-ID_TAB = GT_ALL_TAB-ID_TAB.
          GT_ERR-ERR_NOTE =  STRING1.
          APPEND GT_ERR.
          L_ERR = 'X'.
        ENDIF.
* перекодировка
*        <FS_LT_ALL_TAB>-IIO_PROJECT
        LT_POACCOUNT-SERIAL_NO = C_SERIAL_NO_01."Текущий номер контировки
        APPEND LT_POACCOUNT.

        LT_POACCOUNTX-PO_ITEM  = L_TABIX * 10." "Номер позиции документа закупки
        LT_POACCOUNTX-WBS_ELEMENT = 'X'." Элемент структурного плана проекта (СПП-элемент)
        LT_POACCOUNTX-SERIAL_NO = C_SERIAL_NO_01."Текущий номер контировки
        APPEND LT_POACCOUNTX.

      ENDIF.
      IF NOT  GT_ALL_TAB_ORD-EVRTN IS INITIAL.
* с договором
        LT_ITEMS-AGREEMENT  =  GT_ALL_TAB_ORD-EVRTN."Номер основного договора
        LT_ITEMSX-AGREEMENT  = 'X'."Номер основного договора
      ENDIF.
      APPEND LT_ITEMS.

      LT_ITEMSX-PO_ITEMX   = 'X'.
      LT_ITEMSX-MATERIAL   = 'X'."Номер материала
      LT_ITEMSX-PLANT      = 'X'."Завод
      LT_ITEMSX-STGE_LOC   = 'X'."Склад
      LT_ITEMSX-QUANTITY   = 'X'."Объем заказа на поставку
      LT_ITEMSX-PO_UNIT    = 'X'."ЕИ заказа на поставку
      LT_ITEMSX-NET_PRICE  = 'X'."Цена за единицу
      APPEND LT_ITEMSX.

    ELSE.
      EXIT.
    ENDIF.
    L_TABIX  =  L_TABIX  + 1.
  ENDLOOP.

  CLEAR: LT_RETURN[],L_BAPI_NUMBER.
  IF  L_ERR IS INITIAL.
    CALL FUNCTION 'BAPI_PO_CREATE1'
      EXPORTING
        POHEADER         = LT_HEADER
        POHEADERX        = LT_HEADERX
      IMPORTING
        EXPPURCHASEORDER = L_BAPI_NUMBER
      TABLES
        RETURN           = LT_RETURN
        POITEM           = LT_ITEMS
        POITEMX          = LT_ITEMSX
        POACCOUNT        = LT_POACCOUNT
        POACCOUNTX       = LT_POACCOUNTX

        .
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      EXPORTING
        WAIT = 'X'.
   
    GT_ALL_TAB_ORD-EBELN  = L_BAPI_NUMBER.
    PERFORM SAVE_EBELN_TAB.
* обработка ошибок создания
  ELSE.
* ошибки формирования
    GT_ALL_TAB_ORD-4_IC_ERR = ICON_DEFECT.
  ENDIF.
  .

ENDFORM.                    " CREATE_ORDER


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка при создании второго заказа на поставку
СообщениеДобавлено: Чт, сен 30 2010, 08:47 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
Напоминает проблему про "бапи в цикле".
http://sapboard.ru/forum/viewtopic.php?p=378575#p378575
http://www.sapboard.ru/forum/viewtopic.php?f=13&t=58258


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка при создании второго заказа на поставку
СообщениеДобавлено: Чт, сен 30 2010, 08:57 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, мар 13 2007, 22:57
Сообщения: 71
Besa написал:


особо сходства не нашла. меня больше не нравится вот этот момент

Если просто создавать договора по каждой строке, все работает
Если только создавать заказы по каждой строке указывая номер договора как константу, все работает
Но при создании договора. А потом заказа на другой договор, который есть в системе и был когда-то уже создан, валится в дамп на создании второго заказа.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка при создании второго заказа на поставку
СообщениеДобавлено: Чт, сен 30 2010, 09:04 
Гуру-эксперт
Гуру-эксперт
Аватара пользователя

Зарегистрирован:
Чт, ноя 11 2004, 16:25
Сообщения: 3109
Пол: Мужской
birds написал(а):
Для того, чтобы не было такого момента, что договор еще не создан, а мы к нему обращаемся, просто временно поставим договор как константу, ибо и при этих условиях дамп возникает

birds написал(а):
Если только создавать заказы по каждой строке указывая номер договора как константу, все работает

Не понятно...

В отладчике пошагово проходили?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка при создании второго заказа на поставку
СообщениеДобавлено: Чт, сен 30 2010, 09:30 
Специалист
Специалист

Зарегистрирован:
Чт, мар 22 2007, 14:40
Сообщения: 142
Пол: Мужской
Попробуйте перед вызовом каждой BAPI по созданию контакта, заявки
добавить
SET UPDATE TASK LOCAL.

есть подозрения, что данные которые обновляться в UDPATE TASKE для заказа еще используются контрактом.

+ еще можно добавить
CALL FUNCTION 'MEPO_DOC_INITIALIZE'. (хотя по идее он внутри и так должен вызываться)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка при создании второго заказа на поставку
СообщениеДобавлено: Чт, сен 30 2010, 10:50 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Вт, июн 02 2009, 22:28
Сообщения: 228
Откуда: MOW
Пол: Мужской
А мне лично больше напоминает вот это:
http://www.sapboard.ru/forum/viewtopic.php?f=13&t=57912&p=388643&hilit=submit#p388643

Попробуйте полечить вызовом разных BAPI в разных сессиях, подробности в ссылке


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Ошибка при создании второго заказа на поставку
СообщениеДобавлено: Чт, сен 30 2010, 14:27 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, мар 13 2007, 22:57
Сообщения: 71
Besa написал:
birds написал(а):
Для того, чтобы не было такого момента, что договор еще не создан, а мы к нему обращаемся, просто временно поставим договор как константу, ибо и при этих условиях дамп возникает

birds написал(а):
Если только создавать заказы по каждой строке указывая номер договора как константу, все работает

Не понятно...

В отладчике пошагово проходили?

да, конечно, ничего примечательного или может быть Вы подскажете на что обратить внимание


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка при создании второго заказа на поставку
СообщениеДобавлено: Чт, сен 30 2010, 15:57 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, мар 13 2007, 22:57
Сообщения: 71
Pokusannoe_Zubilo написал:
Попробуйте перед вызовом каждой BAPI по созданию контакта, заявки
добавить
SET UPDATE TASK LOCAL.

есть подозрения, что данные которые обновляться в UDPATE TASKE для заказа еще используются контрактом.

+ еще можно добавить
CALL FUNCTION 'MEPO_DOC_INITIALIZE'. (хотя по идее он внутри и так должен вызываться)


не помогло


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Ошибка при создании второго заказа на поставку
СообщениеДобавлено: Пт, янв 28 2011, 18:52 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Чт, авг 19 2004, 17:37
Сообщения: 1962
Откуда: Москва
Пол: Мужской
Столкнулись с этой же проблемой.
В BAPI_PO_CREATE1 в инклуде L2012F51 есть такой текст:
Code:
* The below method is called to check if the BAPI_PO_CHANGE
* has been called from some other report program which in turn
* would like to work with the new items which the BAPI has created
* If there is a report program which has called the BAPI , then the
* header and item handles shall not be cleared and po_close shall not
* be called.In most cases the below method shall return space and
* po_close shall be called
  IF cl_mmpur_bapi_po=>check_repid_loaded( ) EQ cl_mmpur_constants=>no.
    CALL METHOD im_po->po_close( ).
  ENDIF.



Что означает, если вызывались модули функциональной группы 2014 (BAPIs for Outline Agreements), то CALL METHOD im_po->po_close( ) не будет вызван и не очистится соотвествующий буфер (вн. табл. MTH_HASH объекта CL_PO_HEADER_HANDLE_MM)

Вылечилось так, вставляем перед вызовом BAPI_PO_CREATE1:
Code:
            Data:
              obj type ref to CL_PO_HEADER_HANDLE_MM.
            Create object obj.
            If sy-subrc = 0 and obj is bound.
              Call method obj->PO_CLOSE.
              Free: obj.
            EndIf.

_________________
"For all entries" не в SAP-ах, "for all entries" в головах! :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 15 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB