zoukankan      html  css  js  c++  java
  • 供应商自动记账

    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
  • 相关阅读:
    POJ1182
    poj3225 线段树区间操作 (见鬼)
    斜率优化dp(POJ1180 Uva1451)
    POJ2528 线段树的区间操作
    POI2001 Gold mine(二叉排序树 黑书经典)
    POJ3921
    博弈论之威佐夫博弈(转载)
    poj3468(线段树 边覆盖)
    hdu 1166(树状数组 或 线段树)
    压缩软件的改进--- (续先前霍夫曼编码)
  • 原文地址:https://www.cnblogs.com/JackeyLove/p/14201723.html
Copyright © 2011-2022 走看看