DATA: s_marv LIKE marv.
CALL FUNCTION 'MARV_SINGLE_READ'
EXPORTING
kzrfb = 'X'
bukrs = l_bukrs
IMPORTING
wmarv = s_marv
EXCEPTIONS
not_found = 1
wrong_call = 2
OTHERS = 3.
Из параметров вроде как все и так ясно: DATA: l_oper LIKE t001b-frpe1.
CALL FUNCTION 'FI_PERIOD_CHECK'
EXPORTING
i_bukrs = l_bukrs
i_gjahr = s_marv-lfgja
i_koart = '+'
i_konto = '+'
i_monat = l_monat
IMPORTING
e_oper = l_oper
EXCEPTIONS
error_period = 1
error_period_acc = 2
OTHERS = 3.
i_gjahr - Год, для которого хотим получить разрешенные периоды проводки.Что то не совсем понятно как с FI-периодами, у меня при тестировании функция что-то показывает, только если дата отличается от текущего периода на целый год.У меня вызывалось так:
* Проверим текущий период проводки
l_monat = s_marv-lfmon.
CALL FUNCTION 'FI_PERIOD_CHECK'
EXPORTING
i_bukrs = l_region
i_gjahr = s_marv-lfgja
i_koart = '+'
i_konto = '+'
i_monat = l_monat
IMPORTING
e_oper = l_oper
EXCEPTIONS
error_period = 1
error_period_acc = 2
OTHERS = 3.
IF sy-subrc = 0.
CONCATENATE s_marv-lfgja s_marv-lfmon INTO lr_period-low.
APPEND lr_period.
ENDIF.
* Проверим предыдущий период проводки
l_monat = s_marv-vmmon.
CALL FUNCTION 'FI_PERIOD_CHECK'
EXPORTING
i_bukrs = l_region
i_gjahr = s_marv-vmgja
i_koart = '+'
i_konto = '+'
i_monat = l_monat
IMPORTING
e_oper = l_oper
EXCEPTIONS
error_period = 1
error_period_acc = 2
OTHERS = 3.
IF sy-subrc = 0.
CONCATENATE s_marv-vmgja s_marv-vmmon INTO lr_period-low.
APPEND lr_period.
ENDIF.
FORM check_co_period
USING rs_date TYPE sy-datum
CHANGING is_open.
DATA: cond(72) TYPE c,
itab LIKE TABLE OF cond,
lt_kaps LIKE kaps OCCURS 0 WITH HEADER LINE.
CONCATENATE 'KOKRS = ''1000''' '' INTO cond.
APPEND cond TO itab.
CONCATENATE 'AND GJAHR = ''' sy-datum+0(4) '''' INTO cond.
APPEND cond TO itab.
CONCATENATE 'AND VERSN = ''0''' '' INTO cond.
APPEND cond TO itab.
CONCATENATE 'AND PSP0' sy-datum+4(2)' = ''X''' INTO cond.
APPEND cond TO itab.
TRY.
SELECT *
FROM kaps INTO CORRESPONDING FIELDS OF TABLE lt_kaps
WHERE (itab).
CATCH cx_sy_dynamic_osql_error.
MESSAGE `Wrong WHERE condition!` TYPE 'I'.
ENDTRY.
IF sy-subrc NE 0. " Записи в таблице блокирования не найдены
is_open = 'X'.
ENDIF.
ENDFORM.
P.S. Спасибо Уукрулу за помощь в формировании динамического селекта, а то что то я сплоховалу тебя там кавычки лишние это раз, два пробелы забыл ставить между равно.. это ж абап сука.. там пробелы важно ставить
REPORT zmm_period.
DATA: is_open TYPE c, L_KOART LIKE T001B-MKOAR.
DATA: s_marv LIKE marv, stdat TYPE sy-datum, edat TYPE sy-datum , l_oper LIKE T001B-FRPE1.
PARAMETERS: p_date TYPE sy-datum OBLIGATORY.
START-OF-SELECTION.
PERFORM check_mm_period
USING p_date
'X'
CHANGING s_marv
is_open.
WRITE:/ 'MM is open', is_open.
*L_KOART = '+'. " Общий
*
*PERFORM check_fi_period
* USING L_KOART
* s_marv
* CHANGING
* l_oper
* is_open.
*
* WRITE:/ 'FI is open +', is_open, 'период', l_oper.
*
* L_KOART = 'M'. " Общий
*
*PERFORM check_fi_period
* USING L_KOART
* s_marv
* CHANGING
* l_oper
* is_open.
*
* WRITE:/ 'FI is open - M', is_open, 'период', l_oper.
*
* L_KOART = 'D'. " Дебиторка
*
*PERFORM check_fi_period
* USING L_KOART
* s_marv
* CHANGING
* l_oper
* is_open.
*
* WRITE:/ 'FI is open - M', is_open, 'период', l_oper.
PERFORM check_fi_period_new
USING p_date
CHANGING is_open.
WRITE:/ 'FI is open - ', is_open.
*&---------------------------------------------------------------------*
*& Form check_fi_period
*&---------------------------------------------------------------------*
FORM check_fi_period
USING I_KOART LIKE T001B-MKOAR
rs_marv LIKE marv
CHANGING
l_oper LIKE T001B-FRPE1
is_open type c.
" DATA: l_OPER LIKE T001B-FRPE1,
data: current_open type c, I_MONAT LIKE T001B-FRPE1.
CLEAR is_open.
i_monat = rs_marv-lfmon .
* Проверим текущий период проводки
CALL FUNCTION 'FI_PERIOD_CHECK'
EXPORTING
i_bukrs = '1020'
i_gjahr = rs_marv-lfgja
i_koart = '+'
i_konto = '+'
i_monat = i_monat
IMPORTING
e_oper = l_oper
EXCEPTIONS
error_period = 1
error_period_acc = 2
OTHERS = 3.
IF sy-subrc = 0.
current_open = 'X'.
ENDIF.
* Проверим предыдущий период проводки
i_monat = rs_marv-vmmon.
CALL FUNCTION 'FI_PERIOD_CHECK'
EXPORTING
i_bukrs = '1020'
i_gjahr = rs_marv-vmgja
i_koart = '+'
i_konto = '+'
i_monat = i_monat
IMPORTING
e_oper = l_oper
EXCEPTIONS
error_period = 1
error_period_acc = 2
OTHERS = 3.
IF sy-subrc = 0 and current_open = 'X'.
is_open = 'X'.
ENDIF.
ENDFORM. "check_fi_period
FORM check_fi_period_new
USING rs_date TYPE sy-datum
CHANGING is_open.
DATA: monat LIKE t001b-frpe1.
DATA: e_monat LIKE bkpf-monat.
DATA: e_gjahr LIKE bkpf-gjahr.
DATA: h_poper LIKE ckmlpp-poper. "Месяц
DATA: h_bdatj LIKE ckmlpp-bdatj. "Год
is_open = 'X'.
CALL FUNCTION 'FI_PERIOD_DETERMINE'
EXPORTING
i_bukrs = '1020'
i_budat = rs_date
IMPORTING
e_monat = e_monat
e_gjahr = e_gjahr.
h_poper = e_monat.
h_bdatj = e_gjahr.
monat = h_poper.
CALL FUNCTION 'FI_PERIOD_CHECK'
EXPORTING
i_bukrs = '1020'
i_gjahr = h_bdatj
i_koart = '+'
i_konto = '+'
i_monat = monat
EXCEPTIONS
error_period = 1
error_period_acc = 2.
IF sy-subrc NE 0.
CLEAR is_open.
ENDIF.
ENDFORM.
Видимо лыжи не едут или... не получается каменный цветок, в смысле проверить FI периода, ниже куча разных вариантов ни один из них не работает, и где ошибка? (Вариант "в ДНК" не предлагать) :)