В общем-то смена периода, точнее открытие нового периода тема отдельная, некоторые к примеру его не открывают пока не произойдет какое-то событие (скажем проведены все задолженности), но часто существуют ситуации когда в ночь перехода периода требуется автоматически открыть новый период ММ (при этом конечно всегда доступен предыдущий) и так же открыть период FI. Можно это делать конечно и руками, но как говорится а чего бы эту дурную работу не поручить тупой машине. В общем давно была сделана такая программка, которая жужжит и вроде как никому не мешает.
*&**********************************************************************
*& Comments : "Программа автоматической смены периодов MM, FI и т.д."
*& Platform : SAP R/3 V4.6B or later
*& Autor : Uukrul
*& Date create : 25.10.2007
*& Date change : 25.10.2007
*&**********************************************************************
*& Comments : Программа всегда запускается событием YCHECK_DAY в
*& ну скажем 00:01 и если это дата нового периода, то
*& вызывается программа для установки нового периода.
*& Информация отправляется на пользователя от чьего
*& имени запущена программа SY-UNAME
*&**********************************************************************
REPORT yxxx_change_periods LINE-SIZE 120.
TYPE-POOLS: slist.
DATA: l_date LIKE sy-datum.
l_date = sy-datum.
* Установку нового периода выполнять только первого числа
IF l_date+6(2) = '01'.
PERFORM set_new_period_fi USING l_date.
PERFORM set_new_period_mm USING l_date.
ENDIF.
*&---------------------------------------------------------------------*
*& Form set_new_period
*&---------------------------------------------------------------------*
* Вызывается программа для семены периода ММ
*----------------------------------------------------------------------*
FORM set_new_period_mm USING p_date LIKE sy-datum.
DATA: listobject LIKE abaplist OCCURS 10 WITH HEADER LINE,
listasci TYPE slist_list_tab WITH HEADER LINE,
l_lfmon LIKE rm03q-nperi,
l_lfgja LIKE rm03q-lfgja,
l_date(10) TYPE c,
l_datum LIKE sy-datum.
l_lfmon = p_date+4(2).
l_lfgja = p_date(4).
WRITE: p_date TO l_date DD/MM/YYYY.
CLEAR l_datum.
* Выполнить установку нового периода ММ
SUBMIT rmmmperi
WITH i_vbukr = space
WITH i_bbukr = space
WITH i_lfmon = l_lfmon
WITH i_lfgja = l_lfgja
WITH i_datum = l_datum
WITH i_xcomp = 'X' "Проверить и сменить период
WITH i_xinco = space "Только проверить период
WITH i_xmove = space "Только сменить период
WITH i_xnegq = space
WITH i_xnegv = space
EXPORTING LIST TO MEMORY
AND RETURN.
CALL FUNCTION 'LIST_FROM_MEMORY'
TABLES
listobject = listobject
EXCEPTIONS
not_found = 1
OTHERS = 2.
IF sy-subrc = 0.
CALL FUNCTION 'DISPLAY_LIST'
EXPORTING
fullscreen = 'X'
TABLES
listobject = listobject
EXCEPTIONS
empty_list = 1
OTHERS = 2.
IF sy-subrc <> 0.
WRITE: / 'Списки спула не сформированы.',
'Проверьте текущий период ММ'.
ENDIF.
ELSE.
WRITE: / 'Списки спула не надены.',
'Проверьте текущий период ММ'.
ENDIF.
* Отправить протокол выполнения операции если происходит фоновое вы-
* поленение программы.
IF sy-batch = 'X'.
CALL FUNCTION 'ZV_RSPO_SPOOLJOB_TO_OFFICE'
EXPORTING
rqident = sy-spono
receiver = sy-uname
desired_type = 'ALI'
express = 'X'
EXCEPTIONS
no_such_job = 1
job_contains_no_data = 2
selection_empty = 3
no_permission = 4
can_not_access = 5
read_error = 6
could_not_send = 7
type_no_match = 8
OTHERS = 9.
ENDIF.
ENDFORM. " set_new_period
*&---------------------------------------------------------------------*
*& Form set_new_period_fi
*&---------------------------------------------------------------------*
* Автоматическая смена периода в FI
*----------------------------------------------------------------------*
FORM set_new_period_fi USING p_date.
TABLES: t001b.
* Сменить период FI
UPDATE t001b SET:
toye2 = p_date(4)
WHERE rrcty = 0 AND ( mkoar = '+' OR
mkoar = 'S' OR mkoar = 'M' ),
tope2 = p_date+4(2)
WHERE rrcty = 0 AND ( mkoar = '+' OR
mkoar = 'S' OR mkoar = 'M' ).
IF sy-subrc = 0.
COMMIT WORK AND WAIT.
WAIT UP TO 1 SECONDS.
* Отправить протокол о смене периода на соответсвующего пользователя
WRITE: / 'Для FI установлен следущий',
'последний разрешенный период проводки (период 2)'.
SELECT * FROM t001b
WHERE rrcty = 0 AND ( mkoar = '+' OR
mkoar = 'S' OR mkoar = 'M' )
ORDER BY bukrs.
ON CHANGE OF t001b-bukrs.
WRITE: / '****', t001b-bukrs, '****'.
ENDON.
WRITE: /6 'Операция: ', t001b-mkoar,
'Счета с:', t001b-bkont, 'По', t001b-vkont,
'Период:', t001b-toye2 NO-GAP, '-' NO-GAP, t001b-tope2.
ENDSELECT.
ELSE.
* Ошибка смены периода FI
WRITE: / 'Семена периода FI не произошла, проверьте период',
'в ручном режиме'.
ENDIF.
* Отправить протокол об обработке смены периода
CALL FUNCTION 'ZV_LIST_TO_OFFICE'
EXPORTING
list_index = 0
receiver = sy-uname
express = space
EXCEPTIONS
list_index_invalid = 1
empty_list = 2
OTHERS = 3.
ENDFORM. " set_new_period_fi
Ну и два ФМ чтобы уже не гонять по ссылке You are not allowed to view links.
Register or
Login, но в общем-то оба написаны так как было сказано по приведенной выше ссылке. Опять же почему два ФМ, ну программе уже сто лет в обед, так что оптимизировать и сводить к одному вызову отправки списков спула как бы в облом. Кому не нравится переделайте.
FUNCTION zv_list_to_office.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" VALUE(LIST_INDEX) LIKE SY-LSIND DEFAULT 0
*" VALUE(RECEIVER) DEFAULT SY-UNAME
*" VALUE(EXPRESS) DEFAULT ' '
*" TABLES
*" LISTOBJECT STRUCTURE ABAPLIST OPTIONAL
*" EXCEPTIONS
*" LIST_INDEX_INVALID
*" EMPTY_LIST
*"----------------------------------------------------------------------
DATA so_ali LIKE soli OCCURS 100 WITH HEADER LINE.
DATA document_data LIKE sodocchgi1.
DATA objhead LIKE soli OCCURS 1 WITH HEADER LINE.
DATA objpara LIKE selc OCCURS 1 WITH HEADER LINE.
DATA objparb LIKE soop1 OCCURS 1 WITH HEADER LINE.
DATA: packing_list LIKE soxpl OCCURS 1 WITH HEADER LINE.
DATA: receivers LIKE somlreci1 OCCURS 1 WITH HEADER LINE.
DATA: default_receiver LIKE somlrec90.
receivers-receiver = receiver.
receivers-express = express.
APPEND receivers.
default_receiver-receiver = sy-uname.
CALL FUNCTION 'SAVE_LIST'
EXPORTING
list_index = list_index
TABLES
listobject = listobject.
CALL FUNCTION 'TABLE_COMPRESS' "Schneller Tabellencopy
TABLES
in = listobject
out = so_ali.
document_data-obj_langu = sy-langu.
document_data-obj_name = 'Liste'(sls).
document_data-obj_descr = sy-title.
document_data-sensitivty = 'O'.
CALL FUNCTION 'SO_NEW_DOCUMENT_SEND_API1'
DESTINATION 'NONE'
EXPORTING
document_data = document_data
document_type = 'ALI'
TABLES
object_content = so_ali
receivers = receivers
EXCEPTIONS
document_type_not_exist = 01
operation_no_authorization = 02
parameter_error = 03
x_error = 04.
IF sy-subrc <> 0.
IF NOT ( sy-msgty IS INITIAL ).
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ELSE.
MESSAGE i200(zz).
ENDIF.
ENDIF.
ENDFUNCTION.
FUNCTION zv_rspo_spooljob_to_office.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" VALUE(RQIDENT) LIKE SY-SPONO
*" VALUE(FIRST_LINE) TYPE I DEFAULT 1
*" VALUE(LAST_LINE) TYPE I OPTIONAL
*" VALUE(RECEIVER) LIKE SY-UNAME
*" VALUE(MAIL_TITLE) LIKE SODOCCHGI1-OBJ_DESCR OPTIONAL
*" VALUE(DESIRED_TYPE) LIKE SOODK-OBJTP OPTIONAL
*" VALUE(EXPRESS) DEFAULT ' '
*" EXCEPTIONS
*" NO_SUCH_JOB
*" JOB_CONTAINS_NO_DATA
*" SELECTION_EMPTY
*" NO_PERMISSION
*" CAN_NOT_ACCESS
*" READ_ERROR
*" COULD_NOT_SEND
*" TYPE_NO_MATCH
*"----------------------------------------------------------------------
DATA: data_is_otf TYPE c, linecount TYPE i.
DATA so_ali LIKE soli OCCURS 100 WITH HEADER LINE.
DATA: document_data LIKE sodocchgi1.
DATA rec_tab LIKE somlreci1 OCCURS 1 WITH HEADER LINE.
DATA: real_type LIKE soodk-objtp.
DATA: l_rqident LIKE tsp01-rqident.
l_rqident = rqident.
CALL FUNCTION 'RSPO_RETURN_SPOOLJOB'
EXPORTING
rqident = l_rqident
first_line = first_line
last_line = last_line
desired_type = desired_type
IMPORTING
real_type = real_type
TABLES
buffer = so_ali
EXCEPTIONS
no_such_job = 1
job_contains_no_data = 2
selection_empty = 3
no_permission = 4
can_not_access = 5
read_error = 6
type_no_match = 7
OTHERS = 8.
IF sy-subrc <> 0.
CASE sy-subrc.
WHEN 1. RAISE no_such_job.
WHEN 2. RAISE job_contains_no_data.
WHEN 3. RAISE selection_empty.
WHEN 4. RAISE no_permission.
WHEN 5. RAISE can_not_access.
WHEN 6. RAISE read_error.
WHEN 7. RAISE type_no_match.
ENDCASE.
ENDIF.
document_data-obj_langu = sy-langu.
document_data-obj_name = 'Liste'(sls).
IF mail_title IS INITIAL.
document_data-obj_descr = sy-title.
ELSE.
document_data-obj_descr = mail_title.
ENDIF.
document_data-sensitivty = 'O'.
MOVE: receiver TO rec_tab-receiver,
express TO rec_tab-express.
APPEND rec_tab.
CALL FUNCTION 'SO_NEW_DOCUMENT_SEND_API1'
EXPORTING
document_data = document_data
document_type = real_type
* PUT_IN_OUTBOX = ' '
* IMPORTING
* SENT_TO_ALL =
* NEW_OBJECT_ID =
TABLES
* object_header =
object_content = so_ali
* OBJECT_PARA =
* OBJECT_PARB =
receivers = rec_tab
EXCEPTIONS
too_many_receivers = 1
document_not_sent = 2
document_type_not_exist = 3
operation_no_authorization = 4
parameter_error = 5
x_error = 6
enqueue_error = 7
OTHERS = 8.
IF sy-subrc <> 0.
IF NOT ( sy-msgty IS INITIAL ).
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 RAISING
could_not_send.
ELSE.
MESSAGE e200(zz) RAISING could_not_send.
ENDIF.
ENDIF.
ENDFUNCTION.