Sapforum.Biz
Инструменты => ABAP - Инструментальные средства => SE37 - Построитель функций => Тема розпочата: Александра від Травень 18, 2012, 03:34:23 ПП
Добрый день! При создании заказа с контировкой 'V' возникает ошибка:
Ни одной инстанции типа объекта PurchaseOrder не создано. Внешняя ссылка:
Заказ на поставку еще содержит позиции с ошибками
К строке услуги 0000000010 контировок нет.
Никак не могу понять где ошибка. Проверила несколько раз. Помогите пожалуйста.
Код программы
DATA lt_poheader LIKE bapimepoheader.
DATA lt_poheaderx LIKE bapimepoheaderx.
DATA lt_poitem LIKE bapimepoitem OCCURS 0 WITH HEADER LINE.
DATA lt_poitemx LIKE bapimepoitemx OCCURS 0 WITH HEADER LINE.
DATA lt_poservices LIKE bapiesllc OCCURS 0 WITH HEADER LINE.
DATA lt_poaccount LIKE BAPIMEPOACCOUNT OCCURS 0 WITH HEADER LINE.
DATA lt_POACCOUNTX TYPE BAPIMEPOACCOUNTX OCCURS 0 WITH HEADER LINE.
DATA lt_expheader LIKE bapimepoheader .
DATA ls_bapi_te_mepoheader TYPE bapi_te_mepoheader. "Польз. поля
DATA ls_bapi_te_mepoheaderx TYPE bapi_te_mepoheaderx.
DATA ls_extensionin TYPE bapiparex.
DATA lt_extensionin TYPE TABLE OF bapiparex.
DATA lt_return LIKE bapiret2 OCCURS 0 WITH HEADER LINE.
DATA i_maxno TYPE num5.
DATA i_step TYPE bapimepoitem-po_item VALUE '00010'.
* Текущий номер пакета для создания цепочки услуг
DATA g_current_pckg_no TYPE bapimepoitem-pckg_no VALUE 0.
* Текущий номер контировки для позиции заказа
DATA assignment_serial_no TYPE bapiesklc-serial_no VALUE 1.
* Текущий номер строки в цепочке услуг
DATA service_line_no TYPE bapiesllc-line_no VALUE 1.
DATA l_answer(1).
Data: v_EXT_LINE type bapiesllc-EXT_LINE.
DATA: knttp_doc TYPE ekpo-knttp.
DATA: ls_BAPIESKLC TYPE BAPIESKLC,
lt_BAPIESKLC TYPE TABLE OF BAPIESKLC.
********************************************************
* Заполнение данных заголовка
********************************************************
CLEAR lt_poheader.
lt_poheader-creat_date = sy-datum.
lt_poheader-doc_date = p_bedat. "sy-datum.
lt_poheader-doc_type = p_bsart.
lt_poheader-comp_code = p_bukrs.
lt_poheader-vper_start = p_vpst.
lt_poheader-vper_end = p_vpend.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = p_lifnr
IMPORTING
output = lt_poheader-vendor.
lt_poheader-created_by = sy-uname.
lt_poheader-currency = 'RUB'.
* закупочная организация и группа
lt_poheader-purch_org = p_ekorg.
lt_poheader-pur_group = p_ekgrp.
data zterm like ekko-zterm.
select single zterm into zterm from ekko
where ebeln = dog_num.
lt_poheader-PMNTTRMS = zterm.
lt_poheader-agreement = DOG_NUM.
* Маска полей заголовка заказа
CLEAR lt_poheaderx.
lt_poheaderx-comp_code = 'X'.
lt_poheaderx-doc_date = 'X'.
lt_poheaderx-doc_type = 'X'.
lt_poheaderx-purch_org = 'X'.
lt_poheaderx-pur_group = 'X'.
lt_poheaderx-agreement = 'X'.
lt_poheaderx-vendor = 'X'.
lt_poheaderx-created_by = 'X'.
lt_poheaderx-currency = 'X'.
lt_poheaderx-status = 'X'.
lt_poheaderx-vper_start = 'X'.
lt_poheaderx-vper_end = 'X'.
lt_poheaderx-PMNTTRMS = 'X'.
lt_poheaderx-agreement = 'X'.
********************************************************
* Конец Заполнение данных заголовка
********************************************************
********************************************************
* Заполнение позиций
********************************************************
* Создание цепочки услуг
Data: line_num TYPE bapiesllc-line_no,
po_num TYPE bapiesllc-line_no,
t TYPE bapiesllc-line_no,
k TYPE bapiesllc-line_no,
v_curr TYPE bapiesllc-line_no,
po_num_1 type p decimals 3,
po_num_2 type p decimals 3.
Constants: con_line TYPE bapiesllc-line_no value '99'.
Describe table gt_list lines line_num.
po_num = line_num div con_line.
po_num_2 = line_num / con_line.
po_num_1 = frac( po_num_2 ).
if po_num_1 is not initial.
Add 1 to po_num.
endif.
Clear t.
Do po_num times.
*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
CLEAR i_maxno.
Add 1 to g_current_pckg_no.
CLEAR lt_poitem.
REFRESH lt_poitem.
* номер позиции
lt_poitem-po_item = i_maxno.
ADD i_step TO lt_poitem-po_item.
* тип контировки
CLEAR knttp_doc.
Read table gt_list index 1.
IF gt_list-knttp = 'V' .
lt_poitem-acctasscat = gt_list-knttp.
knttp_doc = gt_list-knttp.
else.
lt_poitem-acctasscat = 'U'.
knttp_doc = 'U'.
ENDIF.
lt_poitem-pckg_no = g_current_pckg_no.
lt_poitem-short_text = p_txmtr.
* группа материалов
lt_poitem-matl_group = p_grmtr.
* завод
lt_poitem-plant = p_werks.
* тип позиции в акте закупки
lt_poitem-item_cat = 'У'. " Услуги
lt_poitem-AGREEMENT = dog_num.
If p_item is not initial.
lt_poitem-AGMT_ITEM = p_item.
lt_poitemx-AGMT_ITEM = 'X'.
Else.
lt_poitem-AGMT_ITEM = '00010'.
lt_poitemx-AGMT_ITEM = 'X'.
EndIf.
lt_poitem-ACKN_REQD = 'X'.
lt_poitem-AGREEMENT = dog_num.
APPEND lt_poitem.
CLEAR gt_list.
* Маска полей позиции заказа
REFRESH lt_poitemx.
lt_poitemx-po_item = lt_poitem-po_item.
lt_poitemx-po_itemx = 'X'.
lt_poitemx-item_cat = 'X'.
lt_poitemx-acctasscat = 'X'.
lt_poitemx-matl_group = 'X'.
lt_poitemx-plant = 'X'.
lt_poitemx-pckg_no = 'X'.
lt_poitemx-short_text = 'X'.
lt_poitemx-AGREEMENT = 'X'.
lt_poitemx-ACKN_REQD = 'X'.
lt_poitemx-agreement = 'X'.
APPEND lt_poitemx.
REFRESH lt_poservices.
CLEAR lt_poservices.
Refresh: lt_poservices,
lt_poaccount,
lt_BAPIESKLC .
lt_poservices-pckg_no = g_current_pckg_no.
ADD 1 TO g_current_pckg_no.
lt_poservices-subpckg_no = g_current_pckg_no.
lt_poservices-line_no = service_line_no.
lt_poservices-outl_ind = 'X'.
APPEND lt_poservices.
Data: SERIAL_NO TYPE BAPIMEPOACCOUNT-SERIAL_NO VALUE 1.
ADD 1 TO service_line_no.
Clear k.
* Refresh lt_poservices.
Do con_line times.
add 1 to k.
v_curr = con_line * t + k.
Read table gt_list index v_curr.
If sy-subrc <> 0.
Exit.
EndIf.
CLEAR lt_poservices.
Add 10 to v_EXT_LINE.
lt_poservices-pckg_no = g_current_pckg_no.
lt_poservices-line_no = service_line_no.
lt_poservices-EXT_LINE = v_EXT_LINE.
lt_poservices-short_text = gt_list-ktext1.
lt_poservices-quantity = gt_list-menge.
lt_poservices-base_uom = gt_list-meins.
lt_poservices-gr_price = gt_list-tbtwr.
APPEND lt_poservices.
CLEAR lt_poaccount.
IF knttp_doc = 'V'.
lt_poaccount-po_item = lt_poitem-po_item. "Номер позиции документа закупки
lt_poaccount-SERIAL_NO = SERIAL_NO.
lt_poaccount-COSTCENTER = gt_list-MVZ. "МВЗ
lt_poaccount-ORDERID = gt_list-ORDER. "Заказ
lt_poaccount-GL_ACCOUNT = gt_list-sakto. "Номер Основного Счета
lt_poaccount-CO_AREA = '1000'. "Контролинг единица
lt_poaccount-WBS_ELEMENT = gt_list-PS_PSP_PNR. "СПП-элемент
APPEND lt_poaccount.
CLEAR lt_POACCOUNTX.
lt_POACCOUNTX-po_item = lt_poitem-po_item. "Номер позиции документа закупки
lt_POACCOUNTX-SERIAL_NO = SERIAL_NO.
lt_POACCOUNTX-SERIAL_NOX = 'X'.
lt_POACCOUNTX-PO_ITEMX = 'X'.
lt_POACCOUNTX-ORDERID = 'X'. "Заказ
lt_POACCOUNTX-COSTCENTER = 'X'. "МВЗ
lt_POACCOUNTX-GL_ACCOUNT = 'X'. "Номер Основного Счета
lt_POACCOUNTX-CO_AREA = 'X'. "Контролинг единица
lt_POACCOUNTX-WBS_ELEMENT = 'X'. "СПП-элемент
APPEND lt_POACCOUNTX.
* "Номер пакета
ls_BAPIESKLC-pckg_no = g_current_pckg_no.
* "Номер строки
ls_BAPIESKLC-line_no = service_line_no.
* "ТекущийНомерПрисвоенияКонтировки/сторокаУслуг
ls_BAPIESKLC-serno_line = SERIAL_NO.
* "%ставка: распред. стоимости при контировке
ls_BAPIESKLC-percentage = 100.
* "Текущий номер контировки
ls_BAPIESKLC-serial_no = SERIAL_NO.
* "Количество со знаком +/-
ls_BAPIESKLC-quantity = gt_list-menge.
* "Стоимость нетто позиции
ls_BAPIESKLC-net_value = gt_list-tbtwr.
APPEND ls_BAPIESKLC TO lt_BAPIESKLC.
ENDIF.
gt_list-EXT_LINE = v_EXT_LINE.
Modify gt_list index v_curr.
ADD 1 TO service_line_no.
ADD 1 TO assignment_serial_no.
add 1 to SERIAL_NO.
EndDo.
If lt_poservices[] is initial.
Exit.
EndIf.
*& Пользовательские поля
CLEAR zzdog_head.
SELECT SINGLE *
FROM zzdog_head
WHERE dog_num = dog_num.
ls_bapi_te_mepoheader-reg_number = zzdog_head-reg_number.
ls_bapi_te_mepoheaderx-reg_number = 'X'.
ls_bapi_te_mepoheader-reg_data_ot = zzdog_head-reg_data_ot.
ls_bapi_te_mepoheaderx-reg_data_ot = 'X'.
ls_bapi_te_mepoheader-pernr = zzdog_head-pernr.
ls_bapi_te_mepoheaderx-pernr = 'X'.
ls_bapi_te_mepoheader-dog_type = zzdog_head-dog_type.
ls_bapi_te_mepoheaderx-dog_type = 'X'.
ls_bapi_te_mepoheader-orgeh = zzdog_head-orgeh.
ls_bapi_te_mepoheaderx-orgeh = 'X'.
REFRESH lt_extensionin.
ls_extensionin-structure = 'BAPI_TE_MEPOHEADER'.
APPEND ls_extensionin TO lt_extensionin.
ls_extensionin-structure = 'BAPI_TE_MEPOHEADERX'.
MOVE ls_bapi_te_mepoheaderx TO ls_extensionin+c_lenstruc.
APPEND ls_extensionin TO lt_extensionin.
REFRESH lt_return.
CLEAR lt_expheader.
SET UPDATE TASK LOCAL.
IF lt_poitem is not initial.
IF knttp_doc = 'V'.
CALL FUNCTION 'BAPI_PO_CREATE1'
EXPORTING
poheader = lt_poheader
poheaderx = lt_poheaderx
* testrun = 'X'
IMPORTING
expheader = lt_expheader
TABLES
return = lt_return[]
poitem = lt_poitem[]
poitemx = lt_poitemx[]
poservices = lt_poservices[]
POACCOUNT = lt_poaccount[]
POACCOUNTX = lt_POACCOUNTX[]
POSRVACCESSVALUES = lt_BAPIESKLC[]
extensionin = lt_extensionin
.
Цитата: Александра від Травень 18, 2012, 03:34:23 ПП
Добрый день! При создании заказа с контировкой 'V' возникает ошибка:
Ну начнем с того, что я не знаю в стандарте типа контировки - V, т.е. это какая-то созданная вашими консультантами отдельная контировка. Так что давайте начнем с того что это за контировка? Далее это позиции у вас типа услуги которые вы там как-то хитро заполняете по тексту по своей логике. Текст программы ниже вряд ли сильно поможет, так как там куча переменных которые вряд ли кто-то кроме вас знает зачем вы используете и как считаете.
Далее по коду, у меня вообще ощущение, что был взять какой-то код из другой программы и из него постарались сделать что-то новое.