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