Поле FKSAF в таблице FPLT содержит неактуальное значение, т.к. FKSAF вычисляется динамически. Уже было 3 задачи связанных с этой проблемой, когда нужно было получить реальное значение FKSAF. Путем прочесывания гугла заметил, что не я один сталкивался с этой задачей. Поэтому выложу решение проблемы (тестировалось поверхностно, но вроде работает корректно).
{for international search systems: ME22 FPLT FKSAF real dynamic value calculate to detemine exact billing status}
На входе ключ EKPO, на выходе таблица типа FPLT с рассчитанным FKSAF:
{Import: key of EKPO, export: FPLT table with calculated FKSAF }
Code:
FUNCTION z_fplt_mget_fksaf_ekpo .
*"----------------------------------------------------------------------
*"*"Lokale interface:
*" IMPORTING
*" REFERENCE(IC_EBELN) TYPE EBELN
*" REFERENCE(IN_EBELP) TYPE EBELP
*" EXPORTING
*" REFERENCE(ETB_FPLT) TYPE Z_FPLT_TB
*" EXCEPTIONS
*" NOT_FOUND
*"----------------------------------------------------------------------
DATA:
ltb_fplt_o TYPE TABLE OF fpltvb,
ltb_fpla_o TYPE TABLE OF fplavb,
ltb_fplt_n TYPE TABLE OF fpltvb,
ltb_fpla_n TYPE TABLE OF fplavb,
ltb_fplts TYPE TABLE OF fplts,
ltb_bet TYPE TABLE OF ekbe,
ltb_bets TYPE TABLE OF ekbes.
DATA:
ls_ekko TYPE ekko,
ls_ekpo TYPE ekpo,
ls_commrp TYPE commrp,
ls_fpltvb TYPE fpltvb,
ls_fplt TYPE fplt.
REFRESH etb_fplt.
SELECT SINGLE *
FROM ekko
INTO ls_ekko
WHERE ebeln = ic_ebeln.
CASE sy-subrc.
WHEN 4.
RAISE not_found.
ENDCASE.
SELECT SINGLE *
FROM ekpo
INTO ls_ekpo
WHERE ebeln = ic_ebeln
AND ebelp = in_ebelp.
CASE sy-subrc.
WHEN 4.
RAISE not_found.
ENDCASE.
SELECT *
FROM fpla
INTO CORRESPONDING FIELDS OF TABLE ltb_fpla_n
WHERE fplnr = ls_ekpo-fplnr.
CASE sy-subrc.
WHEN 4.
RAISE not_found.
ENDCASE.
SELECT *
FROM fplt
INTO CORRESPONDING FIELDS OF TABLE ltb_fplt_n
WHERE fplnr = ls_ekpo-fplnr.
CASE sy-subrc.
WHEN 4.
RAISE not_found.
ENDCASE.
MOVE-CORRESPONDING ls_ekko TO ls_commrp. "#EC ENHOK
MOVE-CORRESPONDING ls_ekpo TO ls_commrp. "#EC ENHOK
ls_commrp-hwaer = ls_ekko-waers.
CALL FUNCTION 'ME_READ_HISTORY'
EXPORTING
ebeln = ic_ebeln
ebelp = in_ebelp
webre = ls_ekpo-webre
TABLES
xekbe = ltb_bet
xekbes = ltb_bets.
PERFORM re_verteilung IN PROGRAM saplmlrp
TABLES ltb_fplts
ltb_bets
ltb_bet
USING ls_commrp.
PERFORM az_verteilung IN PROGRAM saplmlrp
TABLES ltb_fplts
ltb_bet
USING ls_commrp
ls_ekko-bukrs.
CALL FUNCTION 'BILLING_SCHEDULE_STATUS'
EXPORTING
i_fplnr = ls_ekpo-fplnr
TABLES
fpla_old = ltb_fpla_o
fpla_new = ltb_fpla_n
fplt_old = ltb_fplt_o
fplt_new = ltb_fplt_n
i_fplts = ltb_fplts.
LOOP AT ltb_fplt_n INTO ls_fpltvb.
CLEAR ls_fplt.
MOVE-CORRESPONDING ls_fpltvb TO ls_fplt.
APPEND ls_fplt TO etb_fplt.
ENDLOOP.
ENDFUNCTION.