Автор Тема: Автоматическая установка новых периодов ММ/FI  (Прочитано 8033 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Uukrul

  • SAP ECC 6.0 Ehp(*)
  • Administrator
  • Epic Member
  • *****
  • Сообщений: 3 758
  • Репутация: +47/-0
  • Пол: Мужской
  • YearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYearsYears
    • Sapforum.BIZ
В общем-то смена периода, точнее открытие нового периода тема отдельная, некоторые к примеру его не открывают пока не произойдет какое-то событие (скажем проведены все задолженности), но часто существуют ситуации когда в ночь перехода периода требуется автоматически открыть новый период ММ (при этом конечно всегда доступен предыдущий) и так же открыть период FI. Можно это делать конечно и руками, но как говорится а чего бы эту дурную работу не поручить тупой машине. В общем давно была сделана такая программка, которая жужжит и вроде как никому не мешает.


Код: You are not allowed to view links. Register or Login
*&**********************************************************************
*& 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, но в общем-то оба написаны так как было сказано по приведенной выше ссылке. Опять же почему два ФМ, ну программе уже сто лет в обед, так что оптимизировать и сводить к одному вызову отправки списков спула как бы в облом. Кому не нравится переделайте.

Код: 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.


Код: You are not allowed to view links. Register or Login
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.