供应商自动记账

REPORT ZAUTO_DEBIT_VENDOR NO STANDARD PAGE HEADING
                                     LINE-SIZE 250
                                     LINE-COUNT 65(2)
                                     MESSAGE-ID ZSCM.
 
************************************************************************
* Program name         : ZAUTO_DEBIT_VENDOR
* Type                    : Report
* Description             : Automatic Vendor Dedit Postings
************************************************************************

*---------------------------------------------------------------------*
*                    TABLES
*---------------------------------------------------------------------*
TABLES: VBAK,
        ADR6,
        TRDYSE01CM.
 
*---------------------------------------------------------------------*
*                    INCLUDE
*---------------------------------------------------------------------*
INCLUDE ZZUTI_STD_HEADER_FOOTER. "Standard header and footer
 
*----------------------------------------------------------------------*
* TYPES DECLARATION
*----------------------------------------------------------------------*
TYPES:
  BEGIN OF T_CRMEMO,
    VBELN TYPE VBAK-VBELN,
    POSNR TYPE VBAP-POSNR,
    ERDAT TYPE VBAK-ERDAT,
    AUART TYPE VBAK-AUART,
    AUGRU TYPE VBAK-AUGRU,
    WAERK TYPE VBAK-WAERK,
    VKORG TYPE VBAK-VKORG,
    VTWEG TYPE VBAK-VTWEG,
    SPART TYPE VBAK-SPART,
    VDATU TYPE VBAK-VDATU,
    BSTNK TYPE VBAK-BSTNK,
    BSARK TYPE VBAK-BSARK,
    BSTDK TYPE VBAK-BSTDK,
    AEDAT TYPE VBAK-AEDAT,
    BUKRS_VF TYPE VBAK-BUKRS_VF,
    MATNR TYPE VBAP-MATNR,
    ZMENG TYPE VBAP-ZMENG,
    ZIEME TYPE VBAP-ZIEME,
  END OF T_CRMEMO,
 
  BEGIN OF T_CRMEMO_CHANGE,
    VBELN(90) TYPE C,
    POSNR TYPE VBAP-POSNR,
    ERDAT TYPE VBAK-ERDAT,
    AUART TYPE VBAK-AUART,
    AUGRU TYPE VBAK-AUGRU,
    WAERK TYPE VBAK-WAERK,
    VKORG TYPE VBAK-VKORG,
    VTWEG TYPE VBAK-VTWEG,
    SPART TYPE VBAK-SPART,
    VDATU TYPE VBAK-VDATU,
    BSTNK TYPE VBAK-BSTNK,
    BSARK TYPE VBAK-BSARK,
    BSTDK TYPE VBAK-BSTDK,
    AEDAT TYPE VBAK-AEDAT,
    BUKRS_VF TYPE VBAK-BUKRS_VF,
    MATNR TYPE VBAP-MATNR,
    ZMENG TYPE VBAP-ZMENG,
    ZIEME TYPE VBAP-ZIEME,
  END OF T_CRMEMO_CHANGE,
 
  BEGIN OF T_MVKE,
    MATNR  TYPE MVKE-MATNR,
    VKORG  TYPE MVKE-VKORG,
    VTWEG  TYPE MVKE-VTWEG,
    MTPOS  TYPE MVKE-MTPOS,
  END OF T_MVKE,
 
  BEGIN OF T_ORDERS,
    VBELV   TYPE VBFA-VBELV,
    POSNV   TYPE VBFA-POSNV,
    VBELN   TYPE VBFA-VBELN,
    POSNN   TYPE VBFA-POSNN,
    VBTYP_N TYPE VBFA-VBTYP_N,
  END OF T_ORDERS,
 
  BEGIN OF T_EKPO,
    EBELN   TYPE EKKO-EBELN,
    EBELP   TYPE EKPO-EBELP,
    WAERS   TYPE EKKO-WAERS,
    MENGE   TYPE EKPO-MENGE,
    MEINS   TYPE EKPO-MEINS,
    NETPR   TYPE EKPO-NETPR,
    PEINH   TYPE EKPO-PEINH,
    mwskz   TYPE EKPO-mwskz,
    TXJCD   TYPE EKPO-TXJCD,
  END OF T_EKPO,
 
  BEGIN OF T_EKBE,
    EBELN   TYPE EKBE-EBELN,
    EBELP   TYPE EKBE-EBELP,
    ZEKKN   TYPE EKBE-ZEKKN,
    VGABE   TYPE EKBE-VGABE,
    GJAHR   TYPE EKBE-GJAHR,
    BELNR   TYPE EKBE-BELNR,
    BUZEI   TYPE EKBE-BUZEI,
  END OF T_EKBE,
 
  BEGIN OF T_RBKP,
    BELNR   TYPE RBKP-BELNR,
    GJAHR   TYPE RBKP-GJAHR,
    BLDAT   TYPE RBKP-BLDAT,
    BUDAT   TYPE RBKP-BUDAT,
    XBLNR   TYPE RBKP-XBLNR,
    LIFNR   TYPE RBKP-LIFNR,
    RMWWR   TYPE RBKP-RMWWR,
    WMWST1  TYPE RBKP-WMWST1,
    XRECH   TYPE RBKP-XRECH,
    STBLG   TYPE RBKP-STBLG,
  END OF T_RBKP,
 
  BEGIN OF T_CDHDR,
    OBJECTCLAS TYPE CDHDR-OBJECTCLAS,
    OBJECTID   TYPE CDHDR-OBJECTID,
    CHANGENR   TYPE CDHDR-CHANGENR,
    UDATE      TYPE CDHDR-UDATE,
    UTIME      TYPE CDHDR-UTIME,
  END OF T_CDHDR,
 
  BEGIN OF T_CDPOS,
    OBJECTCLAS TYPE CDHDR-OBJECTCLAS,
    OBJECTID   TYPE CDHDR-OBJECTID,
    CHANGENR   TYPE CDHDR-CHANGENR,
    TABNAME    TYPE CDPOS-TABNAME,
    TABKEY     TYPE CDPOS-TABKEY,
    FNAME      TYPE CDPOS-FNAME,
    CHNGIND    TYPE CDPOS-CHNGIND,
    VALUE_NEW  TYPE CDPOS-VALUE_NEW,
    VALUE_OLD  TYPE CDPOS-VALUE_OLD,
  END OF T_CDPOS,
 
  BEGIN OF T_CHANGE_DOCS,
    OBJECTCLAS TYPE CDHDR-OBJECTCLAS,
    OBJECTID   TYPE CDHDR-OBJECTID,
    CHANGENR   TYPE CDHDR-CHANGENR,
    UDATE      TYPE CDHDR-UDATE,
    UTIME      TYPE CDHDR-UTIME,
    TABNAME    TYPE CDPOS-TABNAME,
    TABKEY     TYPE CDPOS-TABKEY,
    FNAME      TYPE CDPOS-FNAME,
    CHNGIND    TYPE CDPOS-CHNGIND,
    VALUE_NEW  TYPE CDPOS-VALUE_NEW,
    VALUE_OLD  TYPE CDPOS-VALUE_OLD,
  END OF T_CHANGE_DOCS,
 
  BEGIN OF T_SUCCESS,
    crmemo    TYPE VBAK-vbeln,
    cmemo     TYPE VBAK-vbeln,
    orders    TYPE VBAK-vbeln,
    po        TYPE VBAK-vbeln,
    miro_no   TYPE VBAK-vbeln,
    text(20)  TYPE C,
  END OF T_SUCCESS,
 
  BEGIN OF T_ERROR,
    crmemo  TYPE VBAK-vbeln,
    cmemo     TYPE VBAK-vbeln,
    orders    TYPE VBAK-vbeln,
    po        TYPE VBAK-vbeln,
    miro_no   TYPE VBAK-vbeln,
    text(100) TYPE C,
  END OF T_ERROR.
 
*----------------------------------------------------------------------*
*                       WORKAREA DECLARATION
*----------------------------------------------------------------------*
DATA:
  WA_CRMEMO  TYPE T_CRMEMO,
  WA_CRMEMO_CHANGE TYPE T_CRMEMO_CHANGE,
  WA_MVKE    TYPE T_MVKE,
  WA_ORDERS  TYPE T_ORDERS,
  WA_CMEMO   TYPE  T_ORDERS,
  WA_PO      TYPE T_ORDERS,
  WA_EKPO    TYPE T_EKPO,
  WA_EKBE    TYPE T_EKBE,
  WA_EKBE_TEMP TYPE T_EKBE,
  WA_RBKP    TYPE T_RBKP,
  WA_RBKP_TMP TYPE T_RBKP,
  WA_CDHDR   TYPE T_CDHDR,
  WA_CDPOS   TYPE T_CDPOS,
  WA_CHANGE_DOCS TYPE T_CHANGE_DOCS,
  WA_CRMEMO_MR8M  TYPE T_CRMEMO,
  WA_SUCCESS TYPE T_SUCCESS,
  WA_ERROR   TYPE T_ERROR,
  WA_SUCCESS_MR8M TYPE T_SUCCESS,
  WA_ERROR_MR8M   TYPE T_ERROR.
 
*--Work area for all the internal tables used for Sending Mail
DATA :
  WA_OBJPACK TYPE SOPCKLSTI1,
  WA_OBJHEAD TYPE SOLISTI1,
  WA_OBJBIN TYPE SOLISTI1,
  WA_OBJTXT TYPE SOLISTI1,
  WA_RECLIST TYPE SOMLRECI1 .
 
DATA:
*-- Structure to hold Invoice Header Data
  x_docheader LIKE bapi_incinv_create_header,
*-- Structure to hold Reversal Posting Data
  x_rev_post LIKE BAPI_INCINV_FLD.
 
*----------------------------------------------------------------------*
*                  INTERNAL TAABLE DECLARATION
*----------------------------------------------------------------------*
DATA:
  IT_CRMEMO      TYPE STANDARD TABLE OF T_CRMEMO   WITH HEADER LINE,
  IT_CRMEMO_CHANGE TYPE STANDARD TABLE OF T_CRMEMO_CHANGE WITH HEADER LINE,
  IT_MVKE        TYPE STANDARD TABLE OF T_MVKE     WITH HEADER LINE,
  IT_CRMEMO_MIRO TYPE STANDARD TABLE OF T_CRMEMO   WITH HEADER LINE,
  IT_CRMEMO_MR8M TYPE STANDARD TABLE OF T_CRMEMO   WITH HEADER LINE,
  IT_ORDERS      TYPE STANDARD TABLE OF T_ORDERS   WITH HEADER LINE,
  IT_CMEMO       TYPE STANDARD TABLE OF T_ORDERS   WITH HEADER LINE,
  IT_PO          TYPE STANDARD TABLE OF T_ORDERS   WITH HEADER LINE,
  IT_EKPO        TYPE STANDARD TABLE OF T_EKPO     WITH HEADER LINE,
  IT_EKBE        TYPE STANDARD TABLE OF T_EKBE     WITH HEADER LINE,
  IT_EKBE_TEMP    TYPE STANDARD TABLE OF T_EKBE    WITH HEADER LINE,
  IT_RBKP        TYPE STANDARD TABLE OF T_RBKP     WITH HEADER LINE,
  IT_CDHDR       TYPE STANDARD TABLE OF T_CDHDR    WITH HEADER LINE,
  IT_CDPOS       TYPE STANDARD TABLE OF T_CDPOS    WITH HEADER LINE,
  IT_CHANGE_DOCS TYPE STANDARD TABLE OF T_CHANGE_DOCS WITH HEADER LINE,
  IT_SUCCESS     TYPE STANDARD TABLE OF T_SUCCESS  WITH HEADER LINE,
  IT_ERROR       TYPE STANDARD TABLE OF T_ERROR    WITH HEADER LINE,
  IT_SUCCESS_MR8M TYPE STANDARD TABLE OF T_SUCCESS WITH HEADER LINE,
  IT_ERROR_MR8M  TYPE STANDARD TABLE OF T_ERROR    WITH HEADER LINE.
 
 
*-- Internal table to hold Invoice Item Data
DATA:BEGIN OF it_itemdata OCCURS 0.
       INCLUDE STRUCTURE bapi_incinv_create_item.
DATA:END OF it_itemdata.
 
*-- Internal table to hold Invoice Acct Assignment Data
DATA:BEGIN OF it_ACCOUNTingdata OCCURS 0.
       INCLUDE STRUCTURE BAPI_INCINV_CREATE_ACCOUNT.
DATA:END OF it_accountingdata.
 
*-- Internal table to hold BAPI return data
DATA: BEGIN OF it_return OCCURS 0.
        INCLUDE STRUCTURE bapiret2.  "Return Parameter.
DATA: END OF it_return.
 
*-- Internal table to hold BAPI return data
DATA: BEGIN OF it_return_mr8m OCCURS 0.
        INCLUDE STRUCTURE bapiret2.  "Return Parameter.
DATA: END OF it_return_mr8m.
 
*--MAIL related Internal tables
DATA: X_DOC_CHNG TYPE SODOCCHGI1,                      " document attributes
      IT_OBJPACK TYPE STANDARD TABLE OF SOPCKLSTI1,    " attachment table
      IT_OBJHEAD TYPE STANDARD TABLE OF SOLISTI1,      " object header table
      IT_OBJBIN TYPE STANDARD TABLE OF SOLISTI1,       " binary table
      IT_OBJTXT TYPE STANDARD TABLE OF SOLISTI1,       " object text
      IT_RECLIST TYPE STANDARD TABLE OF SOMLRECI1,     " mail recipients
      it_compressed_list TYPE STANDARD TABLE OF SOLI,
      it_pdf_list TYPE STANDARD TABLE OF TLINE,
      it_pdf  TYPE tline OCCURS 10 WITH HEADER LINE,
      it_html  TYPE solisti1   OCCURS 10  WITH HEADER LINE,
*-- Internal table for MIME data (in CHAR format)
      it_temp   TYPE bapiqcmime OCCURS 10 WITH HEADER LINE,
*-- Internal table for storing data
      it_mime(255) TYPE c OCCURS 10 WITH HEADER LINE.
 
*----------------------------------------------------------------------*
* GLOBAL VARIABLES                                                     *
*----------------------------------------------------------------------*
DATA: V_PGM_ID      TYPE SY-REPID,                    " Program id
      v_zterm       TYPE lfb1-zterm,                  " Payment Terms
      v_text(75)    TYPE c,                           " To store error or success text
      v_itemno(6)   TYPE n,                           " To Increment Item No. for BAPI
      v_docnr       LIKE bapi_incinv_fld-inv_doc_no,  " For MIRO document number
      v_year1       LIKE bapi_incinv_fld-fisc_year,   " For MIRO Fiscal year
      v_spono       type TSP01-RQIDENT,               " For Spool No.
      v_type        type SOODK-OBJTP,                 " For Spool Type
      V_CRMEMO_QTY  TYPE VBAP-ZMENG,                  " For CR Memo Qty.
      V_LINE_AMOUNT TYPE EKPO-NETPR,                  " For CR Memo Item Qty.
      V_GROSSAMT    TYPE EKPO-NETPR,                  " For CR Memo Grand Qty.
      v_tax_per(3)  type n,                           " For CR Memo Tax amount %
      v_tax_amt     TYPE EKPO-NETPR,                  " For CR Memo Tax amount
      v_flag(1)     type c,                           " Flag to process fruther
      v_tot_s_mr8m  TYPE i,                           " For MR8M Success Records
      v_tot_e_mr8m  TYPE i,                           " For MR8M Error Records
      V_DATE        TYPE SY-DATUM,                    " For Sel. Screen Date
      V_DATE2(10)   TYPE C,                           " For EMail Date
      V_TIME(10)    TYPE C,                           " For EMail Time
      V_TIME2(10)   TYPE C,                           " For EMail Time
      V_INFO(100)   TYPE C,                           " For EMail Body Text
      V_TABLE_LINES TYPE SY-TABIX,                    " To Increment Email Count
      V_TEXT2       TYPE STRING   ,                   " For EMail Id text
      v_lines       TYPE i,                           " To Store PDF Lines
      v_temp(500)   TYPE c,                           " To Convert to 255 char format
      v_offset      TYPE p,                           " To Convert to 255 char format
      v_lineslen    TYPE i,                           " To Convert to 255 char format
      v_mimelen     TYPE i,                           " To Convert to 255 char format
      v_tabix       type sy-tabix.                    " To Convert to 255 char format
 
*----------------------------------------------------------------------*
* CONSTANTS                                                            *
*----------------------------------------------------------------------*
CONSTANTS:
  C_X(1)            TYPE C          VALUE 'X',       " Constant X or Flag
  C_E(1)            TYPE C          VALUE 'E',       " For Error check
  c_v(1)            TYPE C          VALUE 'V',       " For PO Docs
  c_o(1)            TYPE C          VALUE 'O',       " For Order Docs
  c_c(1)            TYPE C          VALUE 'C',       " For Credit Memo Docs
  c_k(1)            TYPE C          VALUE 'K',       " For CR Memo Docs
  c_u(1)            TYPE C          VALUE 'U',       " For Change tables Update
  c_ali(3)          TYPE C          VALUE 'ALI',     " For ALI Format
  c_vbak(4)         TYPE C          VALUE 'VBAK',    " For Change docs table
  C_01(2)           TYPE C          VALUE '01',      " For Serial No. & Reversal Reason
  C_02(2)           TYPE C          VALUE '02',      " For Reversal Reason
  c_blart           TYPE bkpf-blart VALUE 'RE',      " Document type
  C_MTPOS           TYPE MVKE-MTPOS VALUE 'BANS',    " Item Category group
  C_AUGRU(5)        TYPE C          VALUE 'AUGRU',   " Reason Code
  C_0000500205(10)  TYPE C          VALUE '0000500205', " GL Account #
  C_VERKBELEG(9)    TYPE C          VALUE 'VERKBELEG'.  " For Object Class
 
*-- Horizontal tab & line feed constants
CLASS CL_ABAP_CHAR_UTILITIES DEFINITION LOAD.
CONSTANTS:
  C_TAB  TYPE C VALUE CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB,
  C_CR_LF TYPE C VALUE CL_ABAP_CHAR_UTILITIES=>CR_LF .
 
*----------------------------------------------------------------------*
* SELECTION SCREEN
*----------------------------------------------------------------------*
*-- Select Optons
SELECTION-SCREEN: BEGIN OF BLOCK B01 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS: S_AUART FOR VBAK-AUART OBLIGATORY NO INTERVALS,
                                                     " Sales Document Type
                  S_AUGRU FOR VBAK-AUGRU OBLIGATORY NO INTERVALS,
                                                     " Order reason
                  S_ERDAT FOR VBAK-ERDAT OBLIGATORY.
                                    " Date on which the record was created
SELECTION-SCREEN: END OF BLOCK B01.
 
*-- Mail Sending Options
SELECTION-SCREEN BEGIN OF BLOCK B2 WITH FRAME TITLE TEXT-004.
  PARAMETERS:P_EMAIL AS CHECKBOX DEFAULT SPACE USER-COMMAND V_COM .
  PARAMETERS : P_MODE TYPE SO_ESCAPE   default 'U' MODIF ID US1.
  SELECT-OPTIONS: S_EMAIL FOR ADR6-SMTP_ADDR
                                      NO INTERVALS MODIF ID US2.
*  SELECT-OPTIONS: S_EMAIL FOR TRDYSE01CM-USERNAME
*                                      NO INTERVALS MODIF ID US2.
 
  SELECTION-SCREEN: BEGIN OF LINE.
    SELECTION-SCREEN: COMMENT 55(40) TEXT-019 MODIF ID US2.
  SELECTION-SCREEN: END OF LINE.
 
SELECTION-SCREEN END OF BLOCK B2.
 
*----------------------------------------------------------------------*
*            WORK AREA for SELECT-OPTIONS
*----------------------------------------------------------------------*
DATA :  X_EMAIL LIKE S_EMAIL.   "Work area for EMAIL select-options
 
*----------------------------------------------------------------------*
*  INITIALIZATION
*----------------------------------------------------------------------*
INITIALIZATION.
*-- Default values for Sales Document Type
  CLEAR S_AUART[].
  S_AUART-SIGN = 'I'.
  S_AUART-OPTION = 'EQ'.
  S_AUART-LOW = 'CR'.
  APPEND S_AUART.
  CLEAR S_AUART.
 
*-- Default values for Date on which the record was created
  V_DATE = ( SY-DATUM - 1 ).
  CLEAR S_ERDAT[].
  S_ERDAT-SIGN = 'I'.
  S_ERDAT-OPTION = 'EQ'.
  S_ERDAT-LOW =  SY-DATUM.
  S_ERDAT-HIGH =  SY-DATUM.
  APPEND S_ERDAT.
  CLEAR S_ERDAT.
 
*----------------------------------------------------------------------*
*                    TOP OF PAGE                                       *
*----------------------------------------------------------------------*
TOP-OF-PAGE.
*-- Displaying standard header.
  PERFORM std_top_of_page USING sy-title.
 
*----------------------------------------------------------------------*
* A T  S E L E C T I O N   S C R E E N  O U T P U T
*----------------------------------------------------------------------*
*-- For modifying the selection screen layout
AT SELECTION-SCREEN OUTPUT.
  PERFORM F_MODIFY_SCREEN.
 
*----------------------------------------------------------------------*
*                    AT SELECTION SCREEN.                              *
*----------------------------------------------------------------------*
AT SELECTION-SCREEN.
*-- Subroutine to Validate selection screen fields
  PERFORM f_validate.
 
*----------------------------------------------------------------------*
*  START-OF-SELECTION                                                  *
*----------------------------------------------------------------------*
START-OF-SELECTION.
*-- Fetch the Credit Memo Requests documents
  PERFORM F_GET_CREDIT_MEMO_REQUEST.
 
  IF NOT IT_CRMEMO[] IS INITIAL.
*-- Fetch Item Category Group
    PERFORM F_GET_MVKE_DOCS.
 
*-- Fetch Sales Order documents, PO Documents and Credit Memos
    PERFORM F_GET_SO_PO_DOCS.
  ENDIF.
 
*-- If Credit memo request internal table have an change records then
*    fetch the change documents from CDHDR and CDPOS
  IF NOT IT_CRMEMO_CHANGE[] IS INITIAL.
*-- Fetch Change Documents for CR Memos from CDHDR and CDPOS tables
    PERFORM F_GET_CHANGED_DOCS.
  ENDIF.
 
*-- Fetch Purchasing Document Item Details
  IF NOT IT_PO[] IS INITIAL.
    PERFORM F_GET_EKPO.
  ENDIF.
 
*-- Fetch MIRO Vendor based on the PO Details
  IF NOT IT_EKPO[] IS INITIAL.
    PERFORM F_GET_VENDOR.
  ENDIF.
 
*----------------------------------------------------------------------*
*  END-OF-SELECTION                                                    *
*----------------------------------------------------------------------*
  if v_flag is initial.
*-- Process Vendor Debit Postings
    PERFORM F_PROCESS_MIRO.
 
*-- Process Reversal Postings of Vendor Automatic Debits using TCODE MR8M
    PERFORM F_PROCESS_MR8M.
 
*-- Send mail,if user enters Email id's and Email Mode is not initial
    IF P_EMAIL = C_X AND P_MODE IS NOT INITIAL AND S_EMAIL[] IS NOT INITIAL.
 
*-- Get spool id
      perform f_spool_id.
 
*-- EMail Logic
      PERFORM F_MAIL_LOGIC.
    ENDIF.
 
*-- display the EMail RSCONN01 and Sussess and Error records of MIRO and MR8M
    perform f_display_report.
 
  else.
*-- Else exit the process
    exit.
  endif.
 
*&---------------------------------------------------------------------*
*&      Form  F_MODIFY_SCREEN
*&---------------------------------------------------------------------*
*       A Form routine to modify the screen
*----------------------------------------------------------------------*
FORM F_MODIFY_SCREEN .
 
*-- To Modify Mail Sending Options
  LOOP AT SCREEN.
    IF P_EMAIL = C_X.
      IF SCREEN-GROUP1 = 'US1' .
        SCREEN-INVISIBLE = 0.
        SCREEN-ACTIVE = 1.
        SCREEN-INPUT = 0.
        MODIFY SCREEN.
      ENDIF.
      IF SCREEN-GROUP2 = 'US2' .
        SCREEN-INVISIBLE = 0.
        SCREEN-ACTIVE = 1.
        MODIFY SCREEN.
      ENDIF.
    ELSEIF P_EMAIL = SPACE.
      IF SCREEN-GROUP1 = 'US1' .
        SCREEN-INVISIBLE = 1.
        SCREEN-ACTIVE = 0.
        MODIFY SCREEN.
      ENDIF.
      IF SCREEN-GROUP1 = 'US2' .
        SCREEN-INVISIBLE = 1.
        SCREEN-ACTIVE = 0.
        MODIFY SCREEN.
      ENDIF.
    ENDIF.
  ENDLOOP.
 
ENDFORM.                    " F_MODIFY_SCREEN
 
*&---------------------------------------------------------------------*
*&      Form  f_validate
*&---------------------------------------------------------------------*
*       Validation of Selection-Screen Inputs
*----------------------------------------------------------------------*
FORM f_validate .
 
*-- Validate Sales Document Type
  if not s_AUART[] is initial.
    select  AUART
      into s_AUART-low
      from TVAK up to 1 rows
      where AUART in s_AUART.
    endselect.
    if sy-subrc <> 0.
      message E000 with 'Invalid Sales Document Type'(e01) .
    endif.
  ENDIF.
 
*-- Validate Order reason (reason for the business transaction)
  if not s_AUGRU[] is initial.
    select  AUGRU
      into s_AUGRU-low
      from TVAU up to 1 rows
      where AUGRU in s_AUGRU.
    endselect.
    if sy-subrc <> 0.
      message E000 with 'Invalid Order reason'(e02) .
    endif.
  endif.
ENDFORM.                    " f_validate
 
*&---------------------------------------------------------------------*
*&      Form  F_GET_CREDIT_MEMO_REQUEST
*&---------------------------------------------------------------------*
*       Fetch Credit memo requests from VBAK & VBAP
*----------------------------------------------------------------------*
FORM F_GET_CREDIT_MEMO_REQUEST .
 
  SELECT A~VBELN
         B~POSNR
         A~ERDAT
         A~AUART
         A~AUGRU
         A~WAERK
         A~VKORG
         A~VTWEG
         A~SPART
         A~VDATU
         A~BSTNK
         A~BSARK
         A~BSTDK
         A~AEDAT
         A~BUKRS_VF
         B~MATNR
         B~ZMENG
         B~ZIEME
    INTO TABLE IT_CRMEMO
    FROM ( VBAK AS A
    INNER JOIN VBAP AS B ON A~VBELN = B~VBELN )
    WHERE ( A~ERDAT IN S_ERDAT
      OR  A~AEDAT IN S_ERDAT )
      AND A~AUART IN S_AUART.
  IF SY-SUBRC = 0.
    SORT IT_CRMEMO BY VBELN POSNR.
  ELSE.
    MESSAGE I000 WITH 'No Credit Memo Request selected'(002).
    v_flag = C_X.
    stop.
  ENDIF.
 
ENDFORM.                    " F_GET_CREDIT_MEMO_REQUEST
 
*&---------------------------------------------------------------------*
*&      Form  F_GET_MVKE_DOCS
*&---------------------------------------------------------------------*
*       Fetch Sales Data for Material
*----------------------------------------------------------------------*
FORM F_GET_MVKE_DOCS .
 
  DATA: LV_TABIX TYPE SY-TABIX.
 
*-- Fetch Sales Data for Material
  SELECT MATNR      " Material Number
         VKORG      " Sales Organization
         VTWEG      " Distribution Channel
         MTPOS      " Item category group from material master
    FROM MVKE       " Sales Data for Material
    INTO TABLE IT_MVKE
    FOR ALL ENTRIES IN IT_CRMEMO
    WHERE MATNR = IT_CRMEMO-MATNR
      AND VKORG = IT_CRMEMO-VKORG
      AND VTWEG = IT_CRMEMO-VTWEG.
  IF SY-SUBRC = 0.
    SORT IT_MVKE BY MATNR VKORG VTWEG MTPOS.
  ENDIF.
 
*-- Validate Item category group if MVKE-MTOPS <> 'BANS' then ignore CM Request line item
  LOOP AT IT_CRMEMO INTO WA_CRMEMO.
    LV_TABIX = SY-TABIX.
    READ TABLE IT_MVKE INTO WA_MVKE WITH KEY MATNR = WA_CRMEMO-MATNR
                                             VKORG = WA_CRMEMO-VKORG
                                             VTWEG = WA_CRMEMO-VTWEG
                                             MTPOS = C_MTPOS
                                             BINARY SEARCH.
    IF SY-SUBRC <> 0.
      DELETE IT_CRMEMO INDEX LV_TABIX.    " Delete CR memo records
    ELSE.
*-- Else check for credit memo request change date is not initial, and
*   append those records to IT_CRMEMO_CHANGE internal table to retrive
*   change documents
      IF NOT WA_CRMEMO-AEDAT IS INITIAL.
        WA_CRMEMO_CHANGE-VBELN = WA_CRMEMO-VBELN.
        WA_CRMEMO_CHANGE-POSNR = WA_CRMEMO-POSNR.
        WA_CRMEMO_CHANGE-ERDAT = WA_CRMEMO-ERDAT.
        WA_CRMEMO_CHANGE-AUART = WA_CRMEMO-AUART.
        WA_CRMEMO_CHANGE-AUGRU = WA_CRMEMO-AUGRU.
        WA_CRMEMO_CHANGE-WAERK = WA_CRMEMO-WAERK.
        WA_CRMEMO_CHANGE-VKORG = WA_CRMEMO-VKORG.
        WA_CRMEMO_CHANGE-VTWEG = WA_CRMEMO-VTWEG.
        WA_CRMEMO_CHANGE-SPART = WA_CRMEMO-SPART.
        WA_CRMEMO_CHANGE-VDATU = WA_CRMEMO-VDATU.
        WA_CRMEMO_CHANGE-BSTNK = WA_CRMEMO-BSTNK.
        WA_CRMEMO_CHANGE-BSARK = WA_CRMEMO-BSARK.
        WA_CRMEMO_CHANGE-BSTDK = WA_CRMEMO-BSTDK.
        WA_CRMEMO_CHANGE-AEDAT = WA_CRMEMO-AEDAT.
        WA_CRMEMO_CHANGE-BUKRS_VF = WA_CRMEMO-BUKRS_VF.
        WA_CRMEMO_CHANGE-MATNR = WA_CRMEMO-MATNR.
        WA_CRMEMO_CHANGE-ZMENG = WA_CRMEMO-ZMENG.
        WA_CRMEMO_CHANGE-ZIEME = WA_CRMEMO-ZIEME.
        APPEND WA_CRMEMO_CHANGE TO IT_CRMEMO_CHANGE.
        CLEAR WA_CRMEMO_CHANGE.
      ENDIF.
    ENDIF.
  ENDLOOP.
 
ENDFORM.                    " F_GET_MVKE_DOCS
 
*&---------------------------------------------------------------------*
*&      Form  F_GET_SO_PO_DOCS
*&---------------------------------------------------------------------*
*       Fetch the Sales Order documents, PO documents, & Credit Memo
*----------------------------------------------------------------------*
FORM F_GET_SO_PO_DOCS.
 
*-- Fetch Preceding sales orders based on the credit memo request
  SELECT VBELV
         POSNV
         VBELN
         POSNN
         VBTYP_N
    FROM VBFA
    INTO TABLE IT_ORDERS
    FOR ALL ENTRIES IN IT_CRMEMO
    WHERE VBELN = IT_CRMEMO-VBELN
      AND POSNN = IT_CRMEMO-POSNR
      AND VBTYP_N = C_K
      AND VBTYP_V = C_C.
  IF SY-SUBRC = 0.
    SORT IT_ORDERS BY VBELV POSNV.
 
*-- Fetch Subsequent PO documents & Credit Memo based on the sales orders
    SELECT VBELV
           POSNV
           VBELN
           POSNN
           VBTYP_N
      FROM VBFA
      INTO TABLE IT_PO
      FOR ALL ENTRIES IN IT_ORDERS
      WHERE VBELV = IT_ORDERS-VBELV
        AND POSNV = IT_ORDERS-POSNV
        AND VBTYP_N IN (C_V,C_O)
        AND VBTYP_V = C_C.
    IF SY-SUBRC = 0.
      SORT IT_PO BY VBTYP_N.
 
*-- Copy the IT_PO internal table contents to IT_CMEMO internal table
      IT_CMEMO[] = IT_PO[].
 
*-- Delete PO documents from IT_CMEMO internal table
      DELETE IT_CMEMO WHERE VBTYP_N = C_V.
      SORT IT_CMEMO BY VBELN POSNN.
      IF IT_CMEMO[] IS INITIAL.
        MESSAGE I000 WITH 'No Credit Memo are available for CM Request'(003).
*        v_flag = c_x.
*        stop.
      ENDIF.
 
*-- Delete Credit Memo documents from IT_PO internal table
      DELETE IT_PO WHERE VBTYP_N = C_O.
      SORT IT_PO BY VBELN POSNN.
 
    ENDIF.
  ENDIF.
 
ENDFORM.                    " F_GET_SO_PO_DOCS
 
*&---------------------------------------------------------------------*
*&      Form  F_GET_CHANGED_DOCS
*&---------------------------------------------------------------------*
*       Fetch Change Documents for CR Memos from CDHDR and CDPOS tables
*----------------------------------------------------------------------*
FORM F_GET_CHANGED_DOCS .
 
*-- Fetch Change Documents for CR Memos from CDHDR
  SELECT OBJECTCLAS
         OBJECTID
         CHANGENR
         UDATE
         UTIME
  FROM CDHDR
  INTO TABLE IT_CDHDR
  FOR ALL ENTRIES IN IT_CRMEMO_CHANGE
  WHERE OBJECTCLAS = C_VERKBELEG
    AND OBJECTID   = IT_CRMEMO_CHANGE-VBELN
*    AND UDATE      = IT_CRMEMO_CHANGE-AEDAT
    .
  IF SY-SUBRC = 0.
    SORT IT_CDHDR BY OBJECTCLAS OBJECTID CHANGENR.
 
*-- Fetch Change Documents for CR Memos from CDPOS
    SELECT OBJECTCLAS
           OBJECTID
           CHANGENR
           TABNAME
           TABKEY
           FNAME
           CHNGIND
           VALUE_NEW
           VALUE_OLD
      FROM CDPOS
      INTO TABLE IT_CDPOS
      FOR ALL ENTRIES IN IT_CDHDR
      WHERE OBJECTCLAS = C_VERKBELEG
        AND OBJECTID   = IT_CDHDR-OBJECTID
        AND CHANGENR   = IT_CDHDR-CHANGENR
        AND TABNAME    = C_VBAK
        AND FNAME      = C_AUGRU
        AND CHNGIND    = C_U.
    IF SY-SUBRC = 0.
      SORT IT_CDPOS BY OBJECTCLAS OBJECTID CHANGENR.
    ENDIF.
  ENDIF.
 
ENDFORM.                    " F_GET_CHANGED_DOCS
 
*&---------------------------------------------------------------------*
*&      Form  F_GET_EKPO
*&---------------------------------------------------------------------*
*       Fetch Purchasing Document Item Details
*----------------------------------------------------------------------*
FORM F_GET_EKPO .
 
*-- Fetch Purchasing Document Item Details
  SELECT A~EBELN
         B~EBELP
         A~WAERS
         B~MENGE
         B~MEINS
         B~NETPR
         B~PEINH
         B~mwskz
         B~TXJCD
  INTO TABLE IT_EKPO
  FROM ( EKKO AS A
  INNER JOIN EKPO AS B ON A~EBELN = B~EBELN )
  FOR ALL ENTRIES IN IT_PO
  WHERE A~EBELN = IT_PO-VBELN
    AND B~EBELP = IT_PO-POSNN+1(5).
  IF SY-SUBRC = 0.
    SORT IT_EKPO BY EBELN EBELP.
  ENDIF.
 
ENDFORM.                    " F_GET_EKPO
 
*&---------------------------------------------------------------------*
*&      Form  F_GET_VENDOR
*&---------------------------------------------------------------------*
*       Fetch MIRO Vendor details based on the PO Details
*----------------------------------------------------------------------*
FORM F_GET_VENDOR .
 
DATA: LV_TABIX TYPE SY-TABIX.
 
*-- Fetch History per Purchasing Document records for all the PO records
  SELECT EBELN
         EBELP
         ZEKKN
         VGABE
         GJAHR
         BELNR
         BUZEI
  FROM EKBE
  INTO TABLE IT_EKBE
  FOR ALL ENTRIES IN IT_EKPO
  WHERE EBELN = IT_EKPO-EBELN
    AND EBELP = IT_EKPO-EBELP
    AND VGABE = '2'.
*    and STBLG = space.
  IF SY-SUBRC = 0.
    SORT IT_EKBE BY BELNR GJAHR.
 
*-- Fetch the vendor details based on table IT_EKBE internal table
    SELECT BELNR
           GJAHR
           BLDAT
           BUDAT
           XBLNR
           LIFNR
           RMWWR
           WMWST1
           XRECH
           STBLG
    FROM RBKP
    INTO TABLE IT_RBKP
    FOR ALL ENTRIES IN IT_EKBE
    WHERE BELNR = IT_EKBE-BELNR
      AND GJAHR = IT_EKBE-GJAHR.
    IF SY-SUBRC = 0.
      SORT IT_RBKP BY BELNR GJAHR.
    ENDIF.
  ENDIF.
 
*-- Sort PO History documents based on PO # and PO Item
  SORT IT_EKBE BY EBELN EBELP.
 
*-- Copy the PO History documents into IT_EKBE_TEMP internal table
  IT_EKBE_TEMP[] = IT_EKBE[].
 
*-- Delete PO History documents from IT_EKBE_TEMP internal table
*   comparing with IT_RBKP where (STBLG) Reversal document number
*   is initial
  LOOP AT IT_EKBE_TEMP INTO WA_EKBE_TEMP.
    LV_TABIX = SY-TABIX.
    READ TABLE IT_RBKP INTO WA_RBKP WITH KEY BELNR = WA_EKBE_TEMP-BELNR
                                             GJAHR = WA_EKBE_TEMP-GJAHR
*                                             XRECH = SPACE
                                             STBLG = SPACE.
    IF SY-SUBRC <> 0.
      DELETE IT_EKBE_TEMP INDEX LV_TABIX.
    ENDIF.
    CLEAR: WA_EKBE_TEMP, WA_RBKP.
  ENDLOOP.
 
ENDFORM.                    " F_GET_VENDOR
 
*&---------------------------------------------------------------------*
*&      Form  F_PROCESS_MIRO
*&---------------------------------------------------------------------*
*       Process MIRO
*----------------------------------------------------------------------*
FORM F_PROCESS_MIRO .
  DATA:
    lv_itemno         TYPE i,
    lv_tabix          type sy-index,
    lc_check(1)       TYPE c VALUE 'X',
    V_FILL_ITEM,
    lv_rbkp_bldat type sy-datum.
 
 
  clear : it_itemdata, it_accountingdata, IT_CRMEMO_MIRO, IT_CRMEMO_MR8M.
  refresh : it_itemdata, it_accountingdata, IT_CRMEMO_MIRO, IT_CRMEMO_MR8M.
 
*-- Copy all the CR Memo Docs and delete order reason not in S_AUGRU
  IT_CRMEMO_MR8M[] = IT_CRMEMO[].
 
*-- Delete Reversal postings which are not in S_AUGRU
  DELETE IT_CRMEMO_MR8M WHERE AUGRU IN S_AUGRU.
 
*-- Delete Reversal postings where AEDAT is initial
  DELETE IT_CRMEMO_MR8M where aedat is initial.
 
*-- Delete order reason which are not in S_AUGRU
  DELETE IT_CRMEMO WHERE AUGRU NOT IN S_AUGRU.
 
*-- Loop through the credit memo request records
  LOOP AT IT_CRMEMO INTO WA_CRMEMO.
    lv_tabix = sy-tabix.
 
*-- If credit memo request change date is not initial then
*   send change date (AEDAT) to lv_rbkp_bldat
    if not WA_CRMEMO-aedat is initial.
      lv_rbkp_bldat =  WA_CRMEMO-aedat.
    else.
*-- If credit memo request change date is initial then
*   send create date (ERDAT) to lv_rbkp_bldat
      lv_rbkp_bldat =  WA_CRMEMO-erdat.
    endif.
 
    READ TABLE IT_ORDERS INTO WA_ORDERS WITH KEY VBELN = WA_CRMEMO-VBELN
                                                 POSNN = WA_CRMEMO-POSNR.
    IF SY-SUBRC = 0.
      READ TABLE IT_PO INTO WA_PO WITH KEY VBELV = WA_ORDERS-VBELV
                                           POSNV = WA_ORDERS-POSNV.
      IF SY-SUBRC = 0.
        READ TABLE IT_EKPO INTO WA_EKPO WITH KEY EBELN = WA_PO-VBELN
                                                 EBELP = WA_PO-POSNN.
        IF SY-SUBRC = 0.
*-- Read IT_EKBE_TEMP internal table which contains records which are not reversed
          READ TABLE IT_EKBE_TEMP INTO WA_EKBE_TEMP WITH KEY EBELN = WA_EKPO-EBELN
                                                             EBELP = WA_EKPO-EBELP.
          IF SY-SUBRC = 0.
*-- Read IT_RBKP internal table with XRECH (Indicator: post invoice) = 'X' ,
*   check for invoice records for the correspnding CR Memo records
            READ TABLE IT_RBKP INTO WA_RBKP WITH KEY BELNR = WA_EKBE_TEMP-BELNR
                                                     GJAHR = WA_EKBE_TEMP-GJAHR
                                                     XRECH = C_X.
            IF SY-SUBRC = 0.
*-- Read IT_RBKP internal table with XRECH (Indicator: post invoice) = SPACE,
*   and document date = CR Memo creation date
*   and reference document number = PO number
              READ TABLE IT_RBKP INTO WA_RBKP_TMP WITH KEY BELNR = WA_EKBE_TEMP-BELNR
                                                           GJAHR = WA_EKBE_TEMP-GJAHR
                                                           BLDAT = WA_CRMEMO-ERDAT
                                                           XRECH = ' '
                                                           XBLNR+0(10) = WA_EKBE_TEMP-ebeln.
*                                                           STBLG = SPACE.
              IF SY-SUBRC = 0.
                CONTINUE.
              ELSE.
*-- Quantity Conversion (Get the Credit Memo Quantity by passing CMR unit per one PO unit)
                perform f_quantity_conv.
 
*-- Filling the Line items data
 
*-- Incrementing the item no
                lv_itemno = lv_itemno + 1.
                v_itemno  = lv_itemno.
 
                it_itemdata-invoice_doc_item  = v_itemno.
                it_itemdata-po_number         = WA_ekPO-ebeln.
                it_itemdata-po_item           = WA_EKPO-EBELP.
                it_itemdata-tax_code          = WA_ekpo-mwskz.
                it_itemdata-TAXJURCODE        = WA_ekpo-TXJCD.
 
*-- Converting SAP amount to BAPI format by passing line item amount and currency
                PERFORM f_currency_amount_sap_to_bapi USING    WA_EKPO-waers
                                                               V_LINE_AMOUNT
                                                      CHANGING it_itemdata-item_amount .
 
                it_itemdata-quantity          = ( WA_CRMEMO-ZMENG * V_CRMEMO_QTY ).
                it_itemdata-po_unit           = WA_EKPO-MEINS.
                APPEND it_itemdata.
 
*-- Populate Account Assignment data
                IT_ACCOUNTINGDATA-INVOICE_DOC_ITEM = v_itemno.
                IT_ACCOUNTINGDATA-XUNPL       = space.
                IT_ACCOUNTINGDATA-SERIAL_NO   = C_01.
                IT_ACCOUNTINGDATA-TAX_CODE    = it_itemdata-tax_code.
                IT_ACCOUNTINGDATA-TAXJURCODE  = it_itemdata-TAXJURCODE.
                IT_ACCOUNTINGDATA-ITEM_AMOUNT = it_itemdata-item_amount.
                IT_ACCOUNTINGDATA-QUANTITY    = it_itemdata-quantity.
                IT_ACCOUNTINGDATA-PO_UNIT     = it_itemdata-po_unit.
                IT_ACCOUNTINGDATA-GL_ACCOUNT  = C_0000500205.
                append IT_ACCOUNTINGDATA.
                clear IT_ACCOUNTINGDATA.
 
                CLEAR it_itemdata.
              endif.
            endif.
          ENDIF.
        ENDIF.
      ENDIF.
    ENDIF.
*-- At end of each credit memo request fill the header details of BAPI FM and
*-- post the BAPI
    AT END OF VBELN.
      read table it_crmemo into wa_crmemo index lv_tabix.
 
*-- Populate the document Header
*-- Getting the header data for invoice
      x_docheader-invoice_ind  = space.
      x_docheader-doc_type     = c_blart.
      x_docheader-doc_date     = lv_rbkp_bldat.
      x_docheader-pstng_date   = lv_rbkp_bldat.
      x_docheader-ref_doc_no   = WA_RBKP-XBLNR.
      x_docheader-comp_code    = WA_CRMEMO-BUKRS_VF.
      x_docheader-CURRENCY     = WA_CRMEMO-WAERK.
      x_docheader-calc_tax_ind = lc_check.
 
*-- Logic to find the Tax %
      v_tax_per = ( WA_RBKP-WMWST1 / ( WA_RBKP-RMWWR - WA_RBKP-WMWST1 ) ) * 100.
      v_tax_amt = ( V_GROSSAMT *  v_tax_per ) / 100.
      V_GROSSAMT =  ( V_GROSSAMT + v_tax_amt ).
      x_docheader-gross_amount = V_GROSSAMT.
 
      CLEAR:v_docnr, v_year1.
 
*-- Calling BAPI to create PO invoice document
      CHECK NOT IT_ITEMDATA[] IS INITIAL.
      CALL FUNCTION 'BAPI_INCOMINGINVOICE_CREATE'
        EXPORTING
          headerdata       = x_docheader
        IMPORTING
          invoicedocnumber = v_docnr
          fiscalyear       = v_year1
        TABLES
          itemdata         = it_itemdata[]
          ACCOUNTingDATA    = it_ACCOUNTingDATA[]
*          GLACCOUNTDATA    =
*          taxdata          =
          return           = it_return.
 
*-- Commit work
      IF NOT v_docnr IS INITIAL.
        CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
          EXPORTING
            wait = 'X'.
*-- Move the data to Success Internal Table
        wa_success-crmemo  = wa_crmemo-vbeln.
        wa_success-cmemo   = wa_cmemo-vbeln.
        wa_success-orders  = wa_orders-vbelv.
        wa_success-po      = wa_po-vbeln.
        wa_success-miro_no = v_docnr.
        wa_success-text    = 'MIRO is Posted'.
        append wa_success TO it_success.
        clear wa_success.
 
      ENDIF.
*--   Read the values in the table IT_RETURN.
      CLEAR it_return.
      READ TABLE it_return INDEX 1.
*   If message type is error then roll back the work
      IF it_return-type = C_E.
*-- Roll back
        CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
 
*-- Move the data to Error Internal Table
        wa_error-crmemo = wa_crmemo-vbeln.
        wa_error-cmemo  = wa_cmemo-vbeln.
        wa_error-orders = wa_orders-vbelv.
        wa_error-po     = wa_po-vbeln.
        wa_error-text   = it_return-MESSAGE.
        append wa_error TO it_error.
        clear wa_error.
 
      ENDIF.
 
      refresh: it_return, it_itemdata, it_accountingdata.
      clear: V_GROSSAMT, it_return, it_itemdata, wa_crmemo, wa_orders, wa_po,
             wa_ekpo, WA_EKBE_TEMP, wa_rbkp, wa_rbkp_tmp, v_docnr, v_year1, WA_SUCCESS,
             WA_ERROR, it_accountingdata, v_tax_per, v_tax_amt, V_FILL_ITEM, lv_rbkp_bldat.
    ENDAT.
  ENDLOOP.
 
ENDFORM.                    " F_PROCESS_MIRO
 
*&---------------------------------------------------------------------*
*&      Form  f_quantity_conv
*&---------------------------------------------------------------------*
*       Quantity Conversion
*----------------------------------------------------------------------*
FORM f_quantity_conv .
 
*-- Quantity Conversion (Get the Credit Memo Quantity by passing CMR unit per one PO unit)
  CLEAR: V_LINE_AMOUNT, V_CRMEMO_QTY.
 
  call function 'MC_UNIT_CONVERSION'
    EXPORTING
      MATNR                = WA_CRMEMO-MATNR
      nach_meins           = WA_EKPO-MEINS
      von_meins            = WA_CRMEMO-ZIEME
    IMPORTING
      UMREF                = V_CRMEMO_QTY
    EXCEPTIONS
      CONVERSION_NOT_FOUND = 1
      MATERIAL_NOT_FOUND   = 2
      NACH_MEINS_MISSING   = 3
      OVERFLOW             = 4
      VON_MEINS_MISSING    = 5
      OTHERS               = 6.
  if sy-subrc <> 0.
    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
      WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
  ELSE.
    V_LINE_AMOUNT = ( V_CRMEMO_QTY  * WA_CRMEMO-ZMENG * WA_EKPO-peinh * WA_EKPO-NETPR ).
    V_GROSSAMT    = V_GROSSAMT + V_LINE_AMOUNT.
  ENDIF.
 
ENDFORM.                    " f_quantity_conv
 
*&---------------------------------------------------------------------*
*&      Form  f_currency_amount_sap_to_bapi
*&---------------------------------------------------------------------*
*       SAP Amount to BAPI Amount
*----------------------------------------------------------------------*
FORM f_currency_amount_sap_to_bapi  USING    p_waers
                                             p_kbetr
                                    CHANGING p_amt_doccur.
 
  DATA : lv_waers LIKE  tcurc-waers,
         lv_sapamount LIKE bapicurr-bapicurr,
         lv_bapi_amount LIKE bapicurr-bapicurr.
 
  lv_waers = p_waers.
  lv_sapamount = p_kbetr.
 
 
  CALL FUNCTION 'CURRENCY_AMOUNT_SAP_TO_BAPI'
    EXPORTING
      currency    = lv_waers
      sap_amount  = lv_sapamount
    IMPORTING
      bapi_amount = lv_bapi_amount.
 
  p_amt_doccur = lv_bapi_amount.
 
ENDFORM.                    " f_currency_amount_sap_to_bapi
 
*&---------------------------------------------------------------------*
*&      Form  f_display_report
*&---------------------------------------------------------------------*
*       Display Report
*----------------------------------------------------------------------*
FORM f_display_report .
 
*-- Success Report
  IF NOT IT_SUCCESS[] IS INITIAL.
    ULINE AT /1(129).
    WRITE:/1 sy-vline, 'CR Memo',
           19 sy-vline, 'Credit Memo',
           39 sy-vline, 'Sales Order',
           59 sy-vline, 'Purchase Order',
           79 sy-vline, 'MIRO Number',
           99 sy-vline, 'Text',
           129 sy-vline.
    ULINE AT /1(129).
 
    LOOP AT it_success into wa_success.
      WRITE:/1 sy-vline, wa_success-crmemo,
             19 sy-vline, wa_success-cmemo,
             39 sy-vline, wa_success-orders,
             59 sy-vline, wa_success-po,
             79 sy-vline, wa_success-miro_no,
             99 sy-vline, wa_success-text,
             129 sy-vline.
 
    ENDLOOP.
    ULINE AT /1(129).
    SKIP 2.
 
  ENDIF.
 
*-- Error Report
  IF NOT IT_ERROR[] IS INITIAL.
 
    ULINE AT /1(179).
    WRITE:/1 sy-vline,  'CR Memo',
           19 sy-vline, 'Credit Memo',
           39 sy-vline, 'Sales Order',
           59 sy-vline, 'Purchase Order',
           79 sy-vline, 'Error Text',
           179 sy-vline.
    ULINE AT /1(179).
 
    LOOP AT IT_ERROR into WA_ERROR.
      WRITE:/1 sy-vline, WA_ERROR-crmemo,
             19 sy-vline, WA_ERROR-cmemo,
             39 sy-vline, WA_ERROR-orders,
             59 sy-vline, WA_ERROR-po,
             79 sy-vline, WA_ERROR-text,
             179 sy-vline.
    ENDLOOP.
    ULINE AT /1(179).
 
  ENDIF.
 
 
  IF NOT IT_SUCCESS_MR8M[] IS INITIAL.
    ULINE AT /1(129).
    WRITE:/1 sy-vline, 'CR Memo',
           19 sy-vline, 'Credit Memo',
           39 sy-vline, 'Sales Order',
           59 sy-vline, 'Purchase Order',
           79 sy-vline, 'Reversal Posting No.',
           99 sy-vline, 'Text',
           129 sy-vline.
    ULINE AT /1(129).
 
    LOOP AT it_success_mr8m into wa_success_mr8m.
      WRITE:/1 sy-vline, wa_success_mr8m-crmemo,
             19 sy-vline, wa_success_mr8m-cmemo,
             39 sy-vline, wa_success_mr8m-orders,
             59 sy-vline, wa_success_mr8m-po,
             79 sy-vline, wa_success_mr8m-miro_no,
             99 sy-vline, wa_success_mr8m-text,
             129 sy-vline.
 
    ENDLOOP.
    ULINE AT /1(129).
    SKIP 2.
 
  ENDIF.
 
*-- Error Report
  IF NOT IT_ERROR_MR8M[] IS INITIAL.
 
    ULINE AT /1(179).
    WRITE:/1 sy-vline,  'CR Memo',
           19 sy-vline, 'Credit Memo',
           39 sy-vline, 'Sales Order',
           59 sy-vline, 'Purchase Order',
           79 sy-vline, 'Error Text',
           179 sy-vline.
    ULINE AT /1(179).
 
    LOOP AT IT_ERROR_MR8M into WA_ERROR_MR8M.
      WRITE:/1 sy-vline, WA_ERROR_MR8M-crmemo,
             19 sy-vline, WA_ERROR_MR8M-cmemo,
             39 sy-vline, WA_ERROR_MR8M-orders,
             59 sy-vline, WA_ERROR_MR8M-po,
             79 sy-vline, WA_ERROR_MR8M-text,
             179 sy-vline.
    ENDLOOP.
    ULINE AT /1(179).
 
  ENDIF.
 
ENDFORM.                    " f_display_report
 
*&---------------------------------------------------------------------*
*&      Form  F_PROCESS_MR8M
*&---------------------------------------------------------------------*
*       Process Reversal postings
*----------------------------------------------------------------------*
FORM F_PROCESS_MR8M .
 
  clear: wa_CRMEMO_MR8M.
 
  LOOP AT IT_CRMEMO_MR8M into WA_CRMEMO_MR8M.
   read table it_cdpos into wa_cdpos with key OBJECTID = WA_CRMEMO_MR8M-VBELN.
   if sy-subrc <> 0.
     CONTINUE.
   ELSE.
   if wa_cdpos-value_old in s_augru.
    READ TABLE IT_ORDERS INTO WA_ORDERS WITH KEY VBELN = wa_CRMEMO_MR8M-VBELN
                                                 POSNN = wa_CRMEMO_MR8M-POSNR.
    IF SY-SUBRC = 0.
*      READ TABLE IT_CMEMO INTO WA_CMEMO WITH KEY VBELV = WA_ORDERS-VBELV
*                                                 POSNV = WA_ORDERS-POSNV.
*      IF SY-SUBRC = 0.
        READ TABLE IT_PO INTO WA_PO WITH KEY VBELV = WA_ORDERS-VBELV
                                             POSNV = WA_ORDERS-POSNV.
        IF SY-SUBRC = 0.
          READ TABLE IT_EKPO INTO WA_EKPO WITH KEY EBELN = WA_PO-VBELN
                                                   EBELP = WA_PO-POSNN.
          IF SY-SUBRC = 0.
*          READ TABLE IT_EKBE INTO WA_EKBE WITH KEY EBELN = WA_EKPO-EBELN
*                                                   EBELP = WA_EKPO-EBELP.
*          IF SY-SUBRC = 0.
            LOOP AT IT_EKBE into WA_EKBE WHERE EBELN = WA_EKPO-EBELN
                                         AND   EBELP = WA_EKPO-EBELP.
              READ TABLE IT_RBKP INTO WA_RBKP WITH KEY BELNR = WA_EKBE-BELNR
                                                       GJAHR = WA_EKBE-GJAHR
*                                                     BLDAT = WA_CRMEMO_MR8M-AEDAT
                                                       XBLNR+0(10) = WA_EKBE-EBELN
                                                       XRECH = SPACE
                                                       STBLG = SPACE.
 
              IF SY-SUBRC = 0.
                move: WA_RBKP-BELNR   TO X_REV_POST-INV_DOC_NO,
                      WA_RBKP-GJAHR   TO X_REV_POST-FISC_YEAR,
                      WA_RBKP-BUDAT   TO X_REV_POST-PSTNG_DATE.
                IF WA_RBKP-BUDAT+4(2) = SY-DATUM+4(2).
                  X_REV_POST-REASON_REV = C_01.
                ELSE.
                  X_REV_POST-REASON_REV = C_02.
                ENDIF.
              ENDIF.
            ENDLOOP.
*-- Call the FM for MIRO reversal
              CALL FUNCTION 'BAPI_INCOMINGINVOICE_CANCEL'
              EXPORTING
                INVOICEDOCNUMBER          = X_REV_POST-INV_DOC_NO
                FISCALYEAR                = X_REV_POST-FISC_YEAR
                REASONREVERSAL            = X_REV_POST-REASON_REV
                POSTINGDATE               = X_REV_POST-PSTNG_DATE
              IMPORTING
                INVOICEDOCNUMBER_REVERSAL = X_REV_POST-INV_DOC_NO
                FISCALYEAR_REVERSAL       = X_REV_POST-FISC_YEAR
              TABLES
                RETURN                    = it_return_mr8m.
*-- Commit work
            IF NOT X_REV_POST-INV_DOC_NO IS INITIAL.
              CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
                EXPORTING
                  wait = 'X'.
*-- Move the data to Success Internal Table
              wa_success_mr8m-crmemo  = wa_crmemo-vbeln.
              wa_success_mr8m-cmemo   = wa_cmemo-vbeln.
              wa_success_mr8m-orders  = wa_orders-vbelv.
              wa_success_mr8m-po      = wa_po-vbeln.
              wa_success_mr8m-text    = 'MR8M Done'.
              append wa_success_mr8m TO it_success_mr8m.
              clear wa_success_mr8m.
            ENDIF.
*-- Read the values in the table IT_RETURN.
            CLEAR it_return_mr8m.
            READ TABLE it_return_mr8m INDEX 1.
*-- If message type is error then roll back the work
            IF it_return_mr8m-type = 'E' .
*-- Roll back
              CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'.
*-- Move the data to Error Internal Table
              wa_error_mr8m-crmemo = wa_crmemo-vbeln.
              wa_error_mr8m-cmemo  = wa_cmemo-vbeln.
              wa_error_mr8m-orders = wa_orders-vbelv.
              wa_error_mr8m-po     = wa_po-vbeln.
              wa_error_mr8m-text   = it_return_mr8m-MESSAGE.
              append wa_error_mr8m TO it_error_mr8m.
              clear wa_error_mr8m.
 
            ENDIF.
*            ENDIF.
*          ENDIF.
          ENDIF.
        ENDIF.
*      ENDIF.
    ENDIF.
    ENDIF.
    ENDIF.
    CLEAR: wa_error_mr8m, wa_SUCCESS_mr8m, X_REV_POST, wa_CRMEMO_MR8M,
           wa_orders, wa_po, wa_ekpo, wa_ekbe, wa_rbkp, wa_cmemo.
    REFRESH: IT_RETURN_MR8M.
 
  endloop.
 
ENDFORM.                    " F_PROCESS_MR8M
 
*&---------------------------------------------------------------------*
*&      Form  F_spool_id
*&---------------------------------------------------------------------*
*       Create a new spool ID
*----------------------------------------------------------------------*
FORM F_spool_id .
 
*-- Create a new spool from the data in data_tab
*--  new-page line-size sy-linsz print on
  new-page line-size 255 print on
  destination 'LOCL'(p19) "<<== my printer
*-- receiver 'TJOSVOB'
  cover text 'Spool title'(p20) " <<== Title or Spool req. name
  list name 'List name'(p21)
  list dataset 'List Dataset'(p22)
  immediately ' '                  " X means print now
  keep in spool c_x                " X means keep spool
  new list identification c_x
  no dialog .
 
*-- Writing Report
*-- In this  perform you will write the code for displaying the list
  perform f_display_report.
 
*--  new-page print off
  new-page print off.
 
ENDFORM.                    " F_spool_id
 
*&---------------------------------------------------------------------*
*&      Form  F_MAIL_LOGIC
*&---------------------------------------------------------------------*
*       Logic to send a mail for the given Email ID's
*----------------------------------------------------------------------*
FORM F_MAIL_LOGIC .
 
  data : wa_tsp01sys type tsp01sys.
  clear v_spono.
 
  v_spono = sy-spono.
*  v_attach_desc = sy-title.
*-- Convert the Spool ID into PDF format
  perform f_pdf_conversion tables it_compressed_list
                                  it_pdf_list
                                  using  v_spono.
 
*-- Send the Mail in PDF Format
  perform f_send_mail.
 
ENDFORM.                    " F_MAIL_LOGIC
 
*&---------------------------------------------------------------------*
*&      Form  f_pdf_conversion
*&---------------------------------------------------------------------*
*       Read the spool and convert into PDF format
*----------------------------------------------------------------------*
*      -->P_ITAB_COMPRESSED_LIST  text
*      -->P_ITAB_PDF_LIST  text
*      -->P_V_SPONO  text
*----------------------------------------------------------------------*
FORM f_pdf_conversion  TABLES   it_compressed_list structure soli
                                it_pdf_list structure tline
                       using    lv_spooln type tsp01-rqident.
 
clear: it_compressed_list, it_pdf_list.
refresh: it_compressed_list, it_pdf_list.
 
*-- Call the FM "RSPO_RETURN_SPOOLJOB" to read the spool by passing the spool number
  call function 'RSPO_RETURN_SPOOLJOB'
       exporting
            rqident              = lv_spooln
            desired_type         = v_type
       importing
            real_type            = v_type
       tables
            buffer               = it_compressed_list
            buffer_pdf           = it_pdf_list
       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.
    message I000 with 'Error in spool reading'(017).
  endif.
 
*-- If the List type is ALI call the FM "CONVERT_ABAPSPOOLJOB_2_PDF"
*   to convert list into PDF Format
  if  v_type = c_ali.                          " for List it is ALI
    call function 'CONVERT_ABAPSPOOLJOB_2_PDF'
         exporting
              src_spoolid              = lv_spooln
         tables
              pdf                      = it_pdf
         exceptions
              err_no_abap_spooljob     = 1
              err_no_spooljob          = 2
              err_no_permission        = 3
              err_conv_not_possible    = 4
              err_bad_destdevice       = 5
              user_cancelled           = 6
              err_spoolerror           = 7
              err_temseerror           = 8
              err_btcjob_open_failed   = 9
              err_btcjob_submit_failed = 10
              err_btcjob_close_failed  = 11
              others                   = 12.
    if sy-subrc <> 0.
      message e000
              with'Error in convertion of list into PDF format'(018).
    endif.
 
*-- Logic to convert the given format into 255 character format in IT_PDF
    describe table it_pdf lines v_lines.
    describe field it_pdf length v_lineslen  IN character MODE.
    describe field it_temp length v_mimelen IN character MODE.
    LOOP AT it_pdf.
      v_tabix = sy-tabix.
      MOVE it_pdf TO v_temp+v_offset.
      IF v_tabix = v_lines.
        v_lineslen = strlen( it_pdf ).
      ENDIF.
 
      v_offset = v_offset + v_lineslen.
      IF v_offset GE v_mimelen.
        CLEAR it_temp.
        it_temp = v_temp(v_mimelen).
        APPEND it_temp.
        SHIFT v_temp BY v_mimelen PLACES.
        v_offset = v_offset - v_mimelen.
      ENDIF.
 
      IF v_tabix = v_lines.
        IF v_offset GT 0.
          CLEAR it_temp.
          it_temp = v_temp(v_offset).
          APPEND it_temp.
        ENDIF.
      ENDIF.
    ENDLOOP.
 
 
    LOOP AT it_temp.
      it_mime(255) = it_temp-line.
      APPEND it_mime.
    ENDLOOP.
 
*-- Final Data to send to EMail
    it_html[] = it_mime[].
  endif.
 
ENDFORM.                    " f_pdf_conversion
 
*&---------------------------------------------------------------------*
*&      Form  f_send_mail
*&---------------------------------------------------------------------*
*       Send EMail Logic
*----------------------------------------------------------------------*
FORM f_send_mail .
 
data : wa_tsp01sys type tsp01sys.
 
*-- Populate Mail Id's
  WA_RECLIST-REC_TYPE = P_MODE.
  WA_RECLIST-EXPRESS  = C_X.
 
*-- Loop through the Emial select options
  LOOP AT S_EMAIL INTO X_EMAIL.
    WA_RECLIST-RECEIVER = X_EMAIL-LOW.
*-- append receiver table
    APPEND WA_RECLIST TO IT_RECLIST.
  ENDLOOP.
 
*-- If receiver table is not initial
  CHECK IT_RECLIST[] IS NOT INITIAL.
*--To check Mail ID's internal table should not be Empty.
*--populate document attributes
 
*-- Mail subject line
  CLEAR: X_DOC_CHNG.
  X_DOC_CHNG-OBJ_NAME = 'HEADING'.
  CONCATENATE 'Automatic Vendor Dedit Postings'(005)
              SY-DATUM
              INTO X_DOC_CHNG-OBJ_DESCR SEPARATED BY SPACE.
 
*-- Mail body
  CONCATENATE 'Automatic Vendor Dedit Postings'(005)
             ' is attached.'(006)
             INTO WA_OBJTXT SEPARATED BY SPACE.
  APPEND WA_OBJTXT TO IT_OBJTXT.
 
*-- Append Date and Time into Body of email.
  MOVE 'File is generated on'(007)
        TO V_INFO.
  V_TIME = SY-UZEIT.
  CONCATENATE V_TIME+0(2)
              V_TIME+2(2)
              V_TIME+4(2)
              INTO
              V_TIME2 SEPARATED BY ':'.
  CONCATENATE SY-DATUM+4(2)
              '/'
              SY-DATUM+6(2)
              '/'
              SY-DATUM+0(4)
              INTO V_DATE2.
  CONCATENATE V_INFO
              V_DATE2
              'At'
              V_TIME2
              INTO V_INFO
              SEPARATED BY SPACE.
  WA_OBJTXT = V_INFO.
  APPEND WA_OBJTXT TO IT_OBJTXT.
 
*-- Document size
  CLEAR : V_TABLE_LINES.
  DESCRIBE TABLE IT_OBJTXT LINES V_TABLE_LINES.
  READ TABLE IT_OBJTXT INTO WA_OBJTXT INDEX V_TABLE_LINES .
  X_DOC_CHNG-DOC_SIZE =
                 ( V_TABLE_LINES - 1 ) * 255 + STRLEN( WA_OBJTXT ).
 
*-- Populate packing list for body text
  WA_OBJPACK-HEAD_START = 1.
  WA_OBJPACK-HEAD_NUM = 0.
  WA_OBJPACK-BODY_START = 1.
  WA_OBJPACK-BODY_NUM = V_TABLE_LINES.
  WA_OBJPACK-DOC_TYPE = 'RAW'.
  APPEND WA_OBJPACK TO IT_OBJPACK.
  CLEAR WA_OBJPACK.
 
  if v_type = c_ali.
    loop at it_html.
      wa_objbin-line = it_html-line.
    APPEND WA_OBJBIN TO IT_OBJBIN.
    CLEAR  WA_OBJBIN.
    endloop.
    v_type = 'PDF'.
  endif.
 
*-- Get total no.of lines of Object table(attachment)
  CLEAR : V_TABLE_LINES.
  DESCRIBE TABLE IT_OBJBIN LINES V_TABLE_LINES.
 
*-- Populate object header(attachment name)
  WA_OBJHEAD = 'Automatic Vendor Dedit Postings log'(014).
  APPEND WA_OBJHEAD TO IT_OBJHEAD.
  CLEAR  WA_OBJHEAD.
 
*-- Packing list for attachment
  WA_OBJPACK-TRANSF_BIN = C_X.
  WA_OBJPACK-HEAD_START = 1.
  WA_OBJPACK-HEAD_NUM = 1.
  WA_OBJPACK-BODY_START = 1.
  WA_OBJPACK-BODY_NUM = V_TABLE_LINES .
  WA_OBJPACK-DOC_TYPE = v_type .
 
  WA_OBJPACK-OBJ_NAME = 'Auto_Debit'.
  WA_OBJPACK-OBJ_DESCR = 'attachment'.
  WA_OBJPACK-DOC_SIZE = V_TABLE_LINES * 255.
  APPEND WA_OBJPACK TO IT_OBJPACK.
  CLEAR  WA_OBJPACK.
 
*-- Sending the EMail document in given format
  CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'
    EXPORTING
      DOCUMENT_DATA              = X_DOC_CHNG
      PUT_IN_OUTBOX              = C_X
      COMMIT_WORK                = C_X
    TABLES
      PACKING_LIST               = IT_OBJPACK
      OBJECT_HEADER              = IT_OBJHEAD
      CONTENTS_BIN               = IT_OBJBIN
      CONTENTS_TXT               = IT_OBJTXT
      RECEIVERS                  = IT_RECLIST
    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.
    MESSAGE E000 WITH 'Error occurred in sending mail'(015).
  ELSE.
*-- Wait upto 2 secounds
    wait up to 2 seconds.
 
*-- Call the RSCONN01 (SAPconnect: Start Send Process)
    SUBMIT RSCONN01 WITH MODE = 'INT'
*     WITH output = 'X'
    AND RETURN.
 
    PERFORM F_DISPLAY_SENT_MAIL_STATUS.
  ENDIF.
 
* To delete the spool request
  wa_tsp01sys-rqident = sy-spono.
  call function 'RSPO_IDELETE_SPOOLREQ'
       exporting
            spoolreq = wa_tsp01sys.
  if sy-subrc <> 0.
  endif.
 
ENDFORM.                    " f_send_mail
 
*&---------------------------------------------------------------------*
*&      Form  F_DISPLAY_SENT_MAIL_STATUS
*&---------------------------------------------------------------------*
*       Display Mail Sent status to the user
*----------------------------------------------------------------------*
FORM F_DISPLAY_SENT_MAIL_STATUS .
 
  ULINE AT /1(60).
  WRITE :/ SY-VLINE,
          'Mail sent Successfully to'(016)
           COLOR 5 INTENSIFIED ON,
           60 SY-VLINE.
 
  LOOP AT S_EMAIL INTO X_EMAIL.
    V_TABLE_LINES = STRLEN( X_EMAIL-LOW ).
    MOVE X_EMAIL-LOW+0(V_TABLE_LINES) TO V_TEXT2.
 
    WRITE :/ SY-VLINE,
             2 SY-TABIX LEFT-JUSTIFIED,
             5 ')',
               V_TEXT2,
             60 SY-VLINE.
  ENDLOOP.
 
    ULINE AT /1(60).
 
ENDFORM.                    " F_DISPLAY_SENT_MAIL_STATUS
原文地址:https://www.cnblogs.com/JackeyLove/p/14201723.html