День добрый!
Имеется инфонабор с джойнами по таблицам KNVV, A552, TVKWZ; в секции Record Processing я вызываю ФМ BAPI_MATERIAL_AVAILABILITY для получения ATP-стока.
При запуске запроса, построенном на данном инфонаборе, получаю рантайм-ошибку ABAP:
Code:
Category ABAP programming error
Runtime Errors DBSQL_INVALID_CURSOR
Except. CX_SY_OPEN_SQL_DB
Ошибка возникает при получении (fetch) следующей строки курсора (см. строку 2):
Code:
while %l_no_further_fetch = space.
fetch next cursor %dbcursor
into (KNVV-KUNNR , KNVV-VKORG , KNVV-VTWEG , KNVV-SPART , A552-MATNR , A552-DATBI , A552-PLTYP , TVKWZ-WERKS , TVKWZ-VKORG
, TVKWZ-VTWEG ).
if ( ( %rtmode-acc_check = 'X' and
sy-dbcnt > %rtmode-acc_number )
or sy-subrc <> 0 ).
%l_no_further_fetch = 'X'.
else.
...
Проблема явно связана с BAPI_MATERIAL_AVAILABILITY. В ходе дебага выяснил, что ошибка возникает после
первого успешного получения информации по остаткам в BAPI_MATERIAL_AVAILABILITY, т.е. при обращении к следующей строке курсора отчет валится в ошибку. При определенных условиях я даже могу выгрузить данные из отчета, а именно когда ФМ не отработал успешно для каждой из строк в отчете, например, если материал не расшарен на указанном заводе и т.д. Такое ощущение, что где-то в недрах BAPI_MATERIAL_AVAILABILITY происходит закрытие основного курсора SAP Query в результате, к примеру, коммита транзакции. Кто-нибудь сталкивался с подобным? Заранее спасибо за помощь.
Секция Data в инфонаборе:
Code:
data:
lv_atpqty like bapicm61v-wkbst,
ls_return like bapireturn,
lt_wmdvsx type table of bapiwmdvs with header line,
lt_wmdvex type table of bapiwmdve with header line,
lv_matnr like a552-matnr,
lv_uom like mara-meins,
lv_plant like tvkwz-werks.
Секция Record Processing:
Code:
clear f_atpqty.
clear lv_matnr.
clear lv_uom.
clear lv_atpqty.
select
mvke~matnr,
mara~meins
into ( @lv_matnr, @lv_uom )
up to 1 rows
from mvke
join mara on
mara~matnr = mvke~matnr
where
mvke~pmatn = @a552-matnr and
mvke~vrkme = ''.
endselect.
call function 'BAPI_MATERIAL_AVAILABILITY'
exporting
plant = tvkwz-werks
material = lv_matnr
unit = lv_uom
check_rule = 'Z'
read_atp_lock = 'K'
read_atp_lock_x = 'X'
importing
av_qty_plt = lv_atpqty
return = ls_return
tables
wmdvsx = lt_wmdvsx
wmdvex = lt_wmdvex.
if ls_return is initial.
read table lt_wmdvex with key bdcnt = 0.
f_atpqty = lt_wmdvex-com_qty.
clear lt_wmdvsx[].
clear lt_wmdvex[].
endif.