Автор Тема: Установка индикатора удаления на позиции заявок  (Прочитано 6533 раз)

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

Оффлайн Uukrul

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

Код: You are not allowed to view links. Register or Login
*&**********************************************************************
*& Comments    : Установка индикатора удаления на позиции невыполненных
*&               заявок по заданным критериям обработки
*& Platform    : SAP R/3 V4.6C or later
*& Autor       :
*& Date create :
*& Date change :
*&**********************************************************************
*& Date change :
*&**********************************************************************
*& Текстовые элементы:
*& P_BADAT Датат создания документа
*& P_BANFN Номера документа заявки
*& P_BSART Вид документа
*& P_COMMIT COMMIT WORK
*& P_EBAKZ Только открытые позиции заявок
*& P_EKGRP Группа закупки
*& P_EKORG Закупочная организация
*& P_ERNAM Автор документа
*& P_IDNLF Номер материала поставщика
*& P_LGORT Код склада
*& P_MATKL Группа материалов
*& P_MATNR Код материала
*& P_TXZ01 Текст позиции/материала
*& P_WERKS Код завода
*&
*& 001 Дополнительные критерии выбора
*&**********************************************************************
REPORT y_set_delete_ind_eban MESSAGE-ID yy LINE-SIZE 100.
TABLES eban.

*&**********************************************************************
SELECT-OPTIONS: p_bsart FOR eban-bsart DEFAULT 'NB',
                p_banfn FOR eban-banfn,
                p_badat FOR eban-badat.
SELECTION-SCREEN BEGIN OF BLOCK block001 WITH FRAME TITLE text-001.
SELECT-OPTIONS: p_ekorg FOR eban-ekorg,
                p_ekgrp FOR eban-ekgrp,
                p_werks FOR eban-werks,
                p_lgort FOR eban-lgort,
                p_idnlf FOR eban-idnlf,
                p_ernam FOR eban-ernam,
                p_matkl FOR eban-matkl,
                p_matnr FOR eban-matnr,
                p_txz01 FOR eban-txz01.
SELECTION-SCREEN SKIP 1.
PARAMETERS: p_ebakz LIKE eban-ebakz DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK block001.
SELECTION-SCREEN SKIP 1.
PARAMETERS: p_commit(1) TYPE c DEFAULT space.

*&**********************************************************************
DATA: BEGIN OF it_eban OCCURS 10,
  banfn LIKE eban-banfn,
  bnfpo LIKE eban-bnfpo,
  ebakz LIKE eban-ebakz,
END OF it_eban.

DATA: l_subrc LIKE sy-subrc.

*&**********************************************************************
PERFORM read_data CHANGING l_subrc.
IF l_subrc = 0.
  PERFORM set_delete_indicator CHANGING l_subrc.
ELSE.
  WRITE: / 'Данные для обработки отсутствуют'.
ENDIF.

*&---------------------------------------------------------------------*
*&      Form  read_data
*&---------------------------------------------------------------------*
*       Выбрать заявки по заданным критериям
*----------------------------------------------------------------------*
*  --> ...     - Параметры селекционного экрана
*  <-- IT_EBAN - Список выбранных заявок
*  <-- P_SUBRC - Код возврата 0 - записи есть, 4 - данные не считаны
*----------------------------------------------------------------------*
FORM read_data CHANGING p_subrc.
  SELECT banfn
         bnfpo
         ebakz
   INTO CORRESPONDING FIELDS OF TABLE it_eban
   FROM eban
   WHERE banfn IN p_banfn AND
         badat IN p_badat AND
         bsart IN p_bsart AND
         loekz <> 'X' AND
         ekorg IN p_ekorg AND
         ekgrp IN p_ekgrp AND
         werks IN p_werks AND
         lgort IN p_lgort AND
         idnlf IN p_idnlf AND
         ernam IN p_ernam AND
         matkl IN p_matkl AND
         matnr IN p_matnr AND
         txz01 IN p_txz01.
  p_subrc = sy-subrc.
  IF p_ebakz = 'X'. DELETE it_eban WHERE ebakz = p_ebakz. ENDIF.
  SORT it_eban BY banfn bnfpo.
ENDFORM.                    " read_data

*&---------------------------------------------------------------------*
*&      Form  set_delete_indicator
*&---------------------------------------------------------------------*
*    Установить инидкатор удаления на выбранные позиции заявок
*----------------------------------------------------------------------*
*  --> IT_EBAN - Список выбранных позиций заявок для обработки
*  <-- P_SUBRC - Код возврата 0 - записи есть, 4 - данные не считаны
*----------------------------------------------------------------------*
FORM set_delete_indicator CHANGING p_subrc.
  DATA: lt_eban LIKE it_eban OCCURS 10 WITH HEADER LINE.

  CLEAR: lt_eban[].
  LOOP AT it_eban.
    ON CHANGE OF it_eban-banfn.
      PERFORM set_indicator TABLES lt_eban.
      CLEAR: lt_eban[].
    ENDON.
    lt_eban = it_eban.
    APPEND lt_eban.
  ENDLOOP.
  PERFORM set_indicator TABLES lt_eban.
ENDFORM.                    " set_delete_indicator

*&---------------------------------------------------------------------*
*&      Form  set_indicator
*&---------------------------------------------------------------------*
*       Обработать заявку
*----------------------------------------------------------------------*
*   --> PT_EBAN - Позиции заявки для обработки
*----------------------------------------------------------------------*
FORM set_indicator TABLES pt_eban STRUCTURE it_eban.
  DATA: lt_return LIKE bapireturn OCCURS 10 WITH HEADER LINE,
        lt_items_to_delete LIKE bapieband OCCURS 10 WITH HEADER LINE.

  READ TABLE pt_eban INDEX 1.
  IF sy-subrc <> 0. EXIT. ENDIF.

  CLEAR: lt_items_to_delete[].
  WRITE: / 'Заявка:', pt_eban-banfn.
  LOOP AT pt_eban.
    lt_items_to_delete-preq_item = pt_eban-bnfpo.
    lt_items_to_delete-delete_ind = 'X'.
    APPEND lt_items_to_delete.
    WRITE: /10 'Позиции:', pt_eban-bnfpo.
  ENDLOOP.

  IF p_commit = 'X'.
    CLEAR: lt_return[].
    CALL FUNCTION 'BAPI_REQUISITION_DELETE'
         EXPORTING
              number                      = pt_eban-banfn
         TABLES
              requisition_items_to_delete = lt_items_to_delete
              return                      = lt_return.
    LOOP AT lt_return WHERE type = 'E' OR type = 'A'.
      WRITE: / 'Код:', lt_return-code, '-', lt_return-message.
    ENDLOOP.
    IF sy-subrc = 0.
      ROLLBACK WORK.
    ELSE.
      COMMIT WORK.
      WRITE: / 'Код:', lt_return-message COLOR 5.
    ENDIF.
  ELSE.
    WRITE: / 'Код: Тестовый прогон'.
  ENDIF.
  WRITE: / sy-uline(90).
ENDFORM.                    " set_indicator