ZUFI014會計憑証(VENDOR.CUSTOMER,GL)

 *&---------------------------------------------------------------------*
*& Report  ZUFI014
*&
*&---------------------------------------------------------------------*
*& Author              : CHUNG NAM INTERNATIONAL CO.,LTD. DREEXU
*& Creation Date       : 07.06.2010
*& Program Type        : Executable Programs
*& Logical DB          : [Nil]
*& Text Elements
*&   (Titles&Headers)  : [Nil]
*&   (Selection Texts) : [Nil]
*&   (Text symbols)    : [Nil]
*& GUI Status          : [Nil] OR [Standard]
*& Variants            : [Nil] OR Variant
*& Message Class       : [Nil]
*& Description         :
*&
*&---------------------------------------------------------------------*
*& Modifications       :
*& ID   Date        Programmer   Description
*&
*&---------------------------------------------------------------------*

REPORT  ZUFI014.

TABLES: TBSL,T001,SKB1,LFB1,KNB1,T052.

DATABEGIN OF IT_UPDATA  OCCURS 0.
*      --UPLOAD DATA
       DATA: INV_DATE LIKE BKPF-BLDAT.  "發票日期
       DATA: DOC_TYPE LIKE BKPF-BLART.  "憑證類型
       DATA: CCDE     LIKE BKPF-BUKRS.  "公司代碼
       DATA: PST_DATE LIKE BKPF-BUDAT.  "過賬日期
       DATA: CUR      LIKE BKPF-WAERS.  "貨幣
       DATA: REF_NO   LIKE BKPF-XBLNR.  "參照
       DATA: HD_TXT   LIKE BKPF-BKTXT.  "擡頭文本

       DATA: PK1      LIKE RF05A-NEWBS. "過賬碼1
       DATA: ACCT1    LIKE RF05A-NEWKO. "會計科目1
       DATA: SPGL      LIKE RF05A-NEWUM.  "特別總賬標記
       DATA: ZTERM    LIKE BSEG-ZTERM.  "Payment Key(付款條件)
       DATA: ZBD1T    LIKE BSEG-ZBD1T.  "Cash discount days 1(天數)
       DATA: ZFBDT    LIKE BSEG-ZFBDT.  "Baseline Date for Due Date Calculation(付款基準日期)
       DATA: TAXCODE  LIKE BSEG-MWSKZ.  "稅碼
       DATA: DUEON    LIKE BSEG-ZFBDT.  "到期日
       DATA: FCAMT1   LIKE BSEG-WRBTR.  "外幣金額1
       DATA: LCAMT1   LIKE BAPIACCR09-EXCH_RATE. "BSEG-DMBTR.  "本幣金額1(因參數問題,改為傳匯率)
       DATA: ASSGN1   LIKE BSEG-ZUONR.  "分配1
       DATA: ITEM_TXT1 LIKE  BSEG-SGTXT.  "項目文本1
       DATA: CCTR1    LIKE COBL-KOSTL.  "成本中心1
       DATA: PCTR1    LIKE COBL-PRCTR.  "利潤中心1
       DATA: BUSAR1   LIKE COBL-GSBER.  "業務範圍1

       DATA: PK2      LIKE RF05A-NEWBS. "過賬碼2
       DATA: ACCT2    LIKE RF05A-NEWKO. "會計科目2
       DATA: FCAMT2   LIKE BSEG-WRBTR.  "外幣2
       DATA: LCAMT2   LIKE BAPIACCR09-EXCH_RATE. "BSEG-DMBTR.  "本幣2(因參數問題,改為傳匯率)
       DATA: ASSGN2   LIKE BSEG-ZUONR.  "分配2
       DATA: ITEM_TXT2 LIKE  BSEG-SGTXT.  "項目文本2
       DATA: CCTR2    LIKE COBL-KOSTL.  "成本中心2
       DATA: PCTR2    LIKE COBL-PRCTR.  "利潤中心2
       DATA: BUSAR2   LIKE COBL-GSBER.  "業務範圍2

*      --OTHER MESSAGE
       DATA: AWKEY    LIKE BKPF-AWKEY.
       DATA: BELNR    LIKE BKPF-BELNR.   "Document Number(用戶可以根據這個在FB03查)
       DATA: MTYPE    LIKE BAPIRET2-TYPE.
       DATA: MESS     LIKE BAPIRET2-MESSAGE.
DATAEND OF IT_UPDATA.




DATA:  gd_documentheader    LIKE bapiache09,
       it_accountgl         LIKE TABLE OF bapiacgl09 WITH HEADER LINE,
       it_currencyamount    LIKE TABLE OF bapiaccr09 WITH HEADER LINE,
       it_accvendap         LIKE TABLE OF bapiacap09 WITH HEADER LINE,
       it_acccustar         LIKE TABLE OF bapiacar09 WITH HEADER LINE,
       it_ext2              LIKE TABLE OF bapiparex  WITH HEADER LINE,
       it_return            LIKE TABLE OF bapiret2   WITH HEADER LINE.


DATA:  l_type LIKE gd_documentheader-obj_type,
       l_key  LIKE gd_documentheader-obj_key,
       l_sys  LIKE gd_documentheader-obj_sys.

TYPE-POOLS: SLIS.
DATA:GT_LAYOUT TYPE SLIS_LAYOUT_ALV.
DATA:T_EDITPOS      TYPE TABLE OF CDRED WITH HEADER LINE.
DATA:WA_T_EDITPOS   TYPE CDRED.
DATA:ET_RETURN      TYPE TABLE OF BAPIRET2 WITH HEADER LINE.
DATA:T_FIELDCAT     TYPE SLIS_T_FIELDCAT_ALV,
     W_FILEDCAT     LIKE LINE OF T_FIELDCAT.
DATA:T_LISTHEADER   TYPE SLIS_T_LISTHEADER,
     W_LISTHEADER   LIKE LINE OF T_LISTHEADER.
DATA:T_EVENT        TYPE SLIS_T_EVENT,
     W_EVENT        LIKE LINE OF T_EVENT.
DATA:T_SORT         TYPE SLIS_T_SORTINFO_ALV.
DATA:X_SORT         LIKE LINE OF T_SORT.

*&---------------------------------------------------------------------*
*& SELECTION SCREEN
*&---------------------------------------------------------------------*
SELECTION-SCREEN BEGIN OF BLOCK SEL1_B1 WITH FRAME TITLE TEXT-T01.
   PARAMETERS:     P_UFILE TYPE C LENGTH 128 DEFAULT 'C:/ZUFI014_TEMP.XLS' OBLIGATORY.
   SELECTION-SCREEN SKIP.
    "SELECTION-SCREEN BEGIN OF LINE.
    parameters: p_storno  like rfpdo3-allgstor default ' '.    "
    "SELECTION-SCREEN COMMENT 4(28) TEXT-P04.
    parameters: st_budat  like rfpdo-allgsdat modif id D1.    "Buchungsdatum storno
    "SELECTION-SCREEN END OF LINE.
SELECTION-SCREEN END OF BLOCK SEL1_B1.
PARAMETERS:  P_TEST AS CHECKBOX DEFAULT 'X'.


AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_UFILE.
  PERFORM GET_F4_FILENAME USING P_UFILE.

*----------------------------------------------------------------------*
* INITIALIZATION
*----------------------------------------------------------------------*
INITIALIZATION.
   CALL FUNCTION 'Z_REPORT_LIST'
    EXPORTING
      P_CPROG       = SY-CPROG
      P_UNAME       = SY-UNAME
             .

*----------------------------------------------------------------------*
* AT SELECTION-SCREEN OUTPUT
*----------------------------------------------------------------------*

*----------------------------------------------------------------------*
* TOP-OF-PAGE
*----------------------------------------------------------------------*
TOP-OF-PAGE.

END-OF-PAGE.
*----------------------------------------------------------------------*
* START-OF-SELECTION
*----------------------------------------------------------------------*
START-OF-SELECTION.
    IF p_storno = 'X' AND st_budat IS INITIAL.
           MESSAGE TEXT-E03 TYPE 'S' DISPLAY LIKE 'E'.
           STOP.
    ENDIF.
    IF p_storno = 'X' AND st_budat+4(2) = '01'.
           MESSAGE TEXT-E04 TYPE 'S' DISPLAY LIKE 'E'.
           STOP.
    ENDIF.
    PERFORM CONTROL_FILENAME USING P_UFILE.   "控制文件類型及存在與否(XLS)
    PERFORM UPLOAD_DATA.                      "上載數據到內表
    PERFORM AUTO_UPLOAD.                       "記帳/沖銷記錄
    PERFORM SUB_CALL_ALV_FUNCTION.                 "ALV SHOW
END-OF-SELECTION.

******************************************************************************
*   FORM: GET_F4_FILENAME
*   DESC: 控制讀取文件類型
******************************************************************************
FORM GET_F4_FILENAME USING P_FILE_PATH.

   CALL FUNCTION 'WS_FILENAME_GET'
     EXPORTING
       DEF_FILENAME         = ''
       DEF_PATH             = 'C:/'
       MASK                 = ',XLS(*.XLS),*.XLS.'
       MODE                 = 'O'
*      TITLE                = ''
   IMPORTING
       FILENAME             = P_FILE_PATH
*      RC                   =
   EXCEPTIONS
      INV_WINSYS            = 1
      NO_BATCH              = 2
      SELECTION_CANCEL      = 3
      SELECTION_ERROR       = 4
      OTHERS                = 5.

ENDFORM.        "--GET_F4_FILENAME

******************************************************************************
*   FORM: CONTROL_FILENAME
*   DESC: 控制文件類型及存在與否(XLS)
******************************************************************************
FORM CONTROL_FILENAME USING P_FILE_PATH.

   DATA: L_FILE  TYPE C LENGTH 128,
         L_TYPE  TYPE C LENGTH 4,
         L_EXIST TYPE C LENGTH 1,
         L_LEN   TYPE I.
      CLEAR: L_FILE, L_TYPE, L_EXIST, L_LEN.
*     控制文件類型(XLS)
      L_FILE = P_FILE_PATH.
      TRANSLATE L_FILE TO UPPER CASE.
      CONDENSE L_FILE.
      "--P_FILE_PATH = L_FILE.
      L_LEN = STRLEN( L_FILE ).
      L_LEN = L_LEN - 4.
      L_TYPE = L_FILE+L_LEN(4).
      IF L_TYPE <> '.XLS'.
          MESSAGE TEXT-M01 TYPE 'S' DISPLAY LIKE 'E'.   "Please choose the correct upload filename !
          STOP.
      ENDIF.
*     控制文件存在與否
      CALL FUNCTION 'TMP_GUI_GET_FILE_EXIST'
         EXPORTING
              FNAME          = P_FILE_PATH
         IMPORTING
              EXIST          = L_EXIST     " X 表示存在
         EXCEPTIONS
              FILEINFO_ERROR = 1
              OTHERS         = 2.
      IF L_EXIST <> 'X'.
          MESSAGE TEXT-M02 TYPE 'S' DISPLAY LIKE 'E'.
          STOP.
      ENDIF.
*     提示數據正在處理中
      CALL FUNCTION 'SAPGUI_PROGRESS_INDICATOR'
         EXPORTING
            PERCENTAGE = 100
            TEXT       = TEXT-S01.

ENDFORM.      "--CONTROL_FILENAME

******************************************************************************
*   FORM: UPLOAD_DATA
*   DESC: 上載數據到內表
******************************************************************************
   FORM ADD_PRE_ZERO USING PF_PRETEXT.
        CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
           EXPORTING
             INPUT  = PF_PRETEXT
           IMPORTING
             OUTPUT = PF_PRETEXT.
   ENDFORM.
   FORM DATA_CONVERT USING PF_VALUE PF_DATE.
      CLEAR: PF_DATE.
      CALL FUNCTION 'CONVERT_DATE_INPUT'
         EXPORTING
              INPUT                     = PF_VALUE
              PLAUSIBILITY_CHECK        = 'X'
         IMPORTING
              OUTPUT                    = PF_DATE
         EXCEPTIONS
              PLAUSIBILITY_CHECK_FAILED = 1
              WRONG_FORMAT_IN_INPUT     = 2
              OTHERS                    = 3.
   ENDFORM.   "--DATA_CONVERT
FORM UPLOAD_DATA.
  DATA: LT_LOAD LIKE ALSMEX_TABLINE OCCURS 0 WITH HEADER LINE.
*   讀EXCEL到內表
    CLEAR: LT_LOAD, LT_LOAD[].
    CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE'
      EXPORTING
        FILENAME                = P_UFILE
        I_BEGIN_COL             = '1'
        I_END_COL               = '31'
        I_BEGIN_ROW             = '2'
        I_END_ROW               = '6000'
      TABLES
        INTERN                  = LT_LOAD
      EXCEPTIONS
        INCONSISTENT_PARAMETERS = 1
        UPLOAD_OLE              = 2
        OTHERS                  = 3.
    IF SY-SUBRC NE 0.
      MESSAGE TEXT-M03 TYPE 'S' DISPLAY LIKE 'E'.  "Upload Excel files was faild!
      STOP.
    ENDIF.
*   處理讀到內表LT_LOADDATA的數據
    CLEAR: IT_UPDATA, IT_UPDATA[].
    SORT LT_LOAD BY ROW COL.
    LOOP AT LT_LOAD.
      CASE LT_LOAD-COL.
        WHEN '0001'PERFORM DATA_CONVERT USING LT_LOAD-VALUE IT_UPDATA-INV_DATE. "IT_UPDATA-INV_DATE  = LT_LOAD-VALUE.
        WHEN '0002'. IT_UPDATA-DOC_TYPE  = LT_LOAD-VALUE.
        WHEN '0003'. IT_UPDATA-CCDE      = LT_LOAD-VALUE.
        WHEN '0004'PERFORM DATA_CONVERT USING LT_LOAD-VALUE IT_UPDATA-PST_DATE. "IT_UPDATA-PST_DATE  = LT_LOAD-VALUE.
        WHEN '0005'. IT_UPDATA-CUR       = LT_LOAD-VALUE.
                     TRANSLATE IT_UPDATA-CUR TO UPPER CASE.
        WHEN '0006'. IT_UPDATA-REF_NO    = LT_LOAD-VALUE.
        WHEN '0007'. IT_UPDATA-HD_TXT    = LT_LOAD-VALUE.
        WHEN '0008'. IT_UPDATA-PK1       = LT_LOAD-VALUE.
        WHEN '0009'. IT_UPDATA-ACCT1     = LT_LOAD-VALUE.
        WHEN '0010'. IT_UPDATA-SPGL      = LT_LOAD-VALUE.
        WHEN '0011'. IT_UPDATA-ZTERM     = LT_LOAD-VALUE.
        WHEN '0012'. IT_UPDATA-ZBD1T     = LT_LOAD-VALUE.
        WHEN '0013'PERFORM DATA_CONVERT USING LT_LOAD-VALUE IT_UPDATA-ZFBDT.
        WHEN '0014'. IT_UPDATA-TAXCODE   = LT_LOAD-VALUE.
        WHEN '0015'PERFORM DATA_CONVERT USING LT_LOAD-VALUE IT_UPDATA-DUEON. "IT_UPDATA-DUEON     = LT_LOAD-VALUE.
        WHEN '0016'. IT_UPDATA-FCAMT1    = LT_LOAD-VALUE.
        WHEN '0017'. IT_UPDATA-LCAMT1    = LT_LOAD-VALUE.
        WHEN '0018'. IT_UPDATA-ASSGN1    = LT_LOAD-VALUE.
        WHEN '0019'. IT_UPDATA-ITEM_TXT1 = LT_LOAD-VALUE.
        WHEN '0020'. IT_UPDATA-CCTR1     = LT_LOAD-VALUE.
                     PERFORM ADD_PRE_ZERO USING IT_UPDATA-CCTR1.
        WHEN '0021'. IT_UPDATA-PCTR1     = LT_LOAD-VALUE.
                     PERFORM ADD_PRE_ZERO USING IT_UPDATA-PCTR1.
        WHEN '0022'. IT_UPDATA-BUSAR1    = LT_LOAD-VALUE.
        WHEN '0023'. IT_UPDATA-PK2       = LT_LOAD-VALUE.
        WHEN '0024'. IT_UPDATA-ACCT2     = LT_LOAD-VALUE.
        WHEN '0025'. IT_UPDATA-FCAMT2    = LT_LOAD-VALUE.
        WHEN '0026'. IT_UPDATA-LCAMT2    = LT_LOAD-VALUE.
        WHEN '0027'. IT_UPDATA-ASSGN2    = LT_LOAD-VALUE.
        WHEN '0028'. IT_UPDATA-ITEM_TXT2 = LT_LOAD-VALUE.
        WHEN '0029'. IT_UPDATA-CCTR2     = LT_LOAD-VALUE.
                     PERFORM ADD_PRE_ZERO USING IT_UPDATA-CCTR2.
        WHEN '0030'. IT_UPDATA-PCTR2     = LT_LOAD-VALUE.
                     PERFORM ADD_PRE_ZERO USING IT_UPDATA-PCTR2.
        WHEN '0031'. IT_UPDATA-BUSAR2    = LT_LOAD-VALUE.
        WHEN OTHERS.
      ENDCASE.
      AT END OF ROW.
         APPEND IT_UPDATA.
         CLEAR  IT_UPDATA.
      ENDAT.
    ENDLOOP.
    IF IT_UPDATA[] IS INITIAL.
      MESSAGE TEXT-M01 TYPE 'S' DISPLAY LIKE 'E'.    "No Upload data!
      STOP.
    ENDIF.
ENDFORM.    "--UPLOAD_DATA

******************************************************************************
*   FORM: CONVERT_CURRENCY
*   DESC: 求本位幣值
******************************************************************************
FORM CONVERT_CURRENCY USING F_MONEY
                            F_FORCUR
                            F_LOCCUR
                            F_RATE.

   DATA: LA LIKE BSEG-WRBTR,
         LC LIKE T001-WAERS,
         FA LIKE BSEG-WRBTR,
         FC LIKE T001-WAERS,
         FR LIKE BAPIACCR09-EXCH_RATE,
         TY LIKE TCURR-KURST.

   FA = F_MONEY.
   FC = F_FORCUR.
   LC = F_LOCCUR.
   TY = 'M'.

   IF F_FORCUR <> F_LOCCUR.
      CALL FUNCTION 'CONVERT_TO_LOCAL_CURRENCY'
          EXPORTING
            DATE              = SY-DATUM
            FOREIGN_AMOUNT    = FA
            FOREIGN_CURRENCY  = FC
            LOCAL_CURRENCY    = LC
            TYPE_OF_RATE      = TY
          IMPORTING
***            LOCAL_AMOUNT      = LA
            EXCHANGE_RATE     = FR
          EXCEPTIONS
            NO_RATE_FOUND     = 1
            OTHERS            = 2.
      IF SY-SUBRC = 0.
***         F_MONEY = LA.
          F_RATE = FR.
      ENDIF.
   ENDIF.
ENDFORM.

******************************************************************************
*   FORM: FILL_IN_TABLES
*   DESC: BAPI參數填充
******************************************************************************
FORM FILL_IN_TABLES USING PF_AUTOMESS.
data: WA_ZEXTEN LIKE ZEXTEN014.

   PF_AUTOMESS = ''.
*  ---初始化參數
   CLEAR: gd_documentheader, it_accountgl, it_currencyamount, it_accvendap, it_acccustar, it_ext2, it_return.
   CLEAR: it_accountgl[], it_currencyamount[], it_accvendap[], it_acccustar[], it_ext2[], it_return[].
   SELECT SINGLE * FROM T001 WHERE BUKRS = IT_UPDATA-CCDE.  "求取公司的本位幣
*  ----gd_documentheader
   gd_documentheader-USERNAME    = SY-UNAME.
   gd_documentheader-DOC_DATE     = IT_UPDATA-INV_DATE.
   gd_documentheader-DOC_TYPE     = IT_UPDATA-DOC_TYPE.
   gd_documentheader-COMP_CODE   = IT_UPDATA-CCDE.
   gd_documentheader-PSTNG_DATE   = IT_UPDATA-PST_DATE.
   gd_documentheader-REF_DOC_NO   = IT_UPDATA-REF_NO.
   gd_documentheader-HEADER_TXT   = IT_UPDATA-HD_TXT.
   gd_documentheader-bus_act    = 'RFBU'.
*  --根據IT_UPDATA-PK1&IT_UPDATA-PK2按借貸分別求參數
*  >>>>IT_UPDATA-PK1>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>BEGIN
   SELECT SINGLE * FROM TBSL WHERE BSCHL = IT_UPDATA-PK1.  "求取post key的借or貸
   IF TBSL-SHKZG = 'S'.
       IT_UPDATA-FCAMT1 = ABS( IT_UPDATA-FCAMT1 ).
       "IT_UPDATA-LCAMT1 = ABS( IT_UPDATA-LCAMT1 ).
   ELSEIF TBSL-SHKZG = 'H'.
       IT_UPDATA-FCAMT1 = ABS( IT_UPDATA-FCAMT1 ) * -1.
       "IT_UPDATA-LCAMT1 = ABS( IT_UPDATA-LCAMT1 ) * -1.
   ENDIF.
*  >>----it_currencyamount(10)
   it_currencyamount-ITEMNO_ACC = 10.
   it_currencyamount-CURRENCY   = IT_UPDATA-CUR.
   it_currencyamount-AMT_DOCCUR = IT_UPDATA-FCAMT1.
   IF T001-WAERS <> IT_UPDATA-CUR.   "--不是本位幣時,求匯率(因參數問題,改為傳匯率)
       IF IT_UPDATA-LCAMT1 IS NOT INITIAL.
           it_currencyamount-EXCH_RATE = IT_UPDATA-LCAMT1.
       ELSE.   "如果用戶沒有錄入本位值,則取系統最近的匯率
           PERFORM CONVERT_CURRENCY USING IT_UPDATA-FCAMT1 IT_UPDATA-CUR T001-WAERS it_currencyamount-EXCH_RATE.
       ENDIF.
*       IF IT_UPDATA-FCAMT1 <> 0 AND IT_UPDATA-LCAMT1 IS NOT INITIAL.
*           it_currencyamount-EXCH_RATE = IT_UPDATA-LCAMT1 / IT_UPDATA-FCAMT1.
*       ELSE.   "如果用戶沒有錄入本位值,則取系統最近的匯率
*           PERFORM CONVERT_CURRENCY USING IT_UPDATA-FCAMT1 IT_UPDATA-CUR T001-WAERS it_currencyamount-EXCH_RATE.
*       ENDIF.
   ENDIF.
   APPEND it_currencyamount.
   CLEAR  it_currencyamount.
*  >>----it_ext2(10)
   CLEAR: WA_ZEXTEN.
   WA_ZEXTEN-POSNR    = 10"憑證行項目
   WA_ZEXTEN-BSCHL    = IT_UPDATA-PK1.   "post key1
   IF TBSL-XSONU = 'X'.
   WA_ZEXTEN-UMSKZ    = IT_UPDATA-SPGL.  "Special G/L Indicator
   ENDIF.
   it_ext2-STRUCTURE  = 'ZEXTEN014'.
   it_ext2-VALUEPART1 = WA_ZEXTEN.
   APPEND it_ext2.
   CLEAR  it_ext2.
*CASE1
   CASE TBSL-KOART.
     WHEN 'K'.   "VENDOR
*      >>----it_accvendap(10)
       it_accvendap-ITEMNO_ACC  = 10.
       it_accvendap-COMP_CODE   = IT_UPDATA-CCDE.
       it_accvendap-VENDOR_NO   = IT_UPDATA-ACCT1.
       PERFORM ADD_PRE_ZERO USING it_accvendap-VENDOR_NO.  "前導加0
       "-it_accvendap-GL_ACCOUNT  = IT_UPDATA-ACCT1.   "-'1310111010'
       it_accvendap-SP_GL_IND   = IT_UPDATA-SPGL.
       it_accvendap-TAX_CODE    = IT_UPDATA-TAXCODE.
       IF TBSL-SHKZG = 'S'.
       it_accvendap-BLINE_DATE  = IT_UPDATA-DUEON.
       ENDIF.
       it_accvendap-ALLOC_NMBR  = IT_UPDATA-ASSGN1.
       it_accvendap-ITEM_TEXT   = IT_UPDATA-ITEM_TXT1.
       it_accvendap-BUS_AREA    = IT_UPDATA-BUSAR1.
*      ---LFB1
       select single * from LFB1 where lifnr = it_accvendap-VENDOR_NO and
                                       bukrs = IT_UPDATA-CCDE.
       IF IT_UPDATA-ZTERM IS NOT INITIAL.
       it_accvendap-PMNTTRMS    = IT_UPDATA-ZTERM.   "Payment Key
       ELSE.
       it_accvendap-PMNTTRMS    = LFB1-ZTERM.
       ENDIF.
       select single * from T052 where zterm = LFB1-ZTERM.
       IF IT_UPDATA-ZBD1T IS NOT INITIAL.
       it_accvendap-DSCT_DAYS1  = IT_UPDATA-ZBD1T.   "Cash discount days 1
       ELSE.
       it_accvendap-DSCT_DAYS1  = T052-ZTAG1.
       ENDIF.
       IF IT_UPDATA-ZFBDT IS NOT INITIAL.
       it_accvendap-BLINE_DATE  = IT_UPDATA-ZFBDT.   "Baseline Date for Due Date Calculation
       ELSE.
       it_accvendap-BLINE_DATE  = IT_UPDATA-INV_DATE. "--SY-DATUM.
       ENDIF.
*      --- end
       APPEND it_accvendap.
       CLEAR  it_accvendap.
     WHEN 'D'.   "CUSTOMER
*      >>----it_acccustar(10)
       it_acccustar-ITEMNO_ACC  = 10.
       it_acccustar-COMP_CODE   = IT_UPDATA-CCDE.
       it_acccustar-CUSTOMER    = IT_UPDATA-ACCT1.
       PERFORM ADD_PRE_ZERO USING it_acccustar-CUSTOMER.  "前導加0
       "-it_acccustar-GL_ACCOUNT  = IT_UPDATA-ACCT1.
       it_acccustar-SP_GL_IND   = IT_UPDATA-SPGL.
       it_acccustar-TAX_CODE    = IT_UPDATA-TAXCODE.
       IF TBSL-SHKZG = 'S'.
       it_acccustar-BLINE_DATE  = IT_UPDATA-DUEON.
       ENDIF.
       it_acccustar-ALLOC_NMBR  = IT_UPDATA-ASSGN1.
       it_acccustar-ITEM_TEXT   = IT_UPDATA-ITEM_TXT1.
       it_acccustar-BUS_AREA    = IT_UPDATA-BUSAR1.
*      --KNB1
       select single * from KNB1 where kunnr = it_acccustar-CUSTOMER and
                                       bukrs = IT_UPDATA-CCDE.
       IF IT_UPDATA-ZTERM IS NOT INITIAL.
       it_acccustar-PMNTTRMS    = IT_UPDATA-ZTERM.   "Payment Key
       ELSE.
       it_acccustar-PMNTTRMS    = KNB1-ZTERM.
       ENDIF.
       select single * from T052 where zterm = KNB1-ZTERM.
       IF IT_UPDATA-ZBD1T IS NOT INITIAL.
       it_acccustar-DSCT_DAYS1  = IT_UPDATA-ZBD1T.   "Cash discount days 1
       ELSE.
       it_acccustar-DSCT_DAYS1  = T052-ZTAG1.
       ENDIF.
       IF IT_UPDATA-ZFBDT IS NOT INITIAL.
       it_acccustar-BLINE_DATE  = IT_UPDATA-ZFBDT.   "Baseline Date for Due Date Calculation
       ELSE.
       it_acccustar-BLINE_DATE  = IT_UPDATA-INV_DATE. "--SY-DATUM.
       ENDIF.
*      -- end
       APPEND it_acccustar.
       CLEAR  it_acccustar.
     WHEN OTHERS.  "STANDARD(40/50)
       SELECT SINGLE * FROM SKB1 WHERE BUKRS = IT_UPDATA-CCDE AND
                                       SAKNR = IT_UPDATA-ACCT1.
*      >>----it_accountgl(10)
       it_accountgl-ITEMNO_ACC  = 10.
       it_accountgl-GL_ACCOUNT  = IT_UPDATA-ACCT1.
       it_accountgl-ALLOC_NMBR  = IT_UPDATA-ASSGN1.
       it_accountgl-ITEM_TEXT   = IT_UPDATA-ITEM_TXT1.
       it_accountgl-COSTCENTER  = IT_UPDATA-CCTR1.
       it_accountgl-PROFIT_CTR  = IT_UPDATA-PCTR1.
       it_accountgl-BUS_AREA    = IT_UPDATA-BUSAR1.
       IF SKB1-MWSKZ IS NOT INITIAL.   "會計科目需不需要Tax code
           it_accountgl-TAX_CODE    = IT_UPDATA-TAXCODE.
       ENDIF.
       IF SKB1-XINTB = 'X'.
           CONCATENATE '[' IT_UPDATA-ACCT1 ']' TEXT-E02 INTO PF_AUTOMESS.
       ENDIF.
       APPEND it_accountgl.
       CLEAR  it_accountgl.
   ENDCASE.
*ENDCASE1
*  >>>>IT_UPDATA-PK1>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>END
*  = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =
*  >>>>IT_UPDATA-PK2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>BEGIN
   SELECT SINGLE * FROM TBSL WHERE BSCHL = IT_UPDATA-PK2.  "求取post key的借or貸
   IF TBSL-SHKZG = 'S'.
       IT_UPDATA-FCAMT2 = ABS( IT_UPDATA-FCAMT2 ).
       "IT_UPDATA-LCAMT2 = ABS( IT_UPDATA-LCAMT2 ).
   ELSEIF TBSL-SHKZG = 'H'.
       IT_UPDATA-FCAMT2 = ABS( IT_UPDATA-FCAMT2 ) * -1.
       "IT_UPDATA-LCAMT2 = ABS( IT_UPDATA-LCAMT2 ) * -1.
   ENDIF.
*    ----it_currencyamount(20)
   it_currencyamount-ITEMNO_ACC = 20.
   it_currencyamount-CURRENCY   = IT_UPDATA-CUR.
   it_currencyamount-AMT_DOCCUR = IT_UPDATA-FCAMT2.
*----
   IF T001-WAERS <> IT_UPDATA-CUR.   "--不是本位幣時,求匯率(因參數問題,改為傳匯率)
       IF IT_UPDATA-LCAMT2 IS NOT INITIAL.
            it_currencyamount-EXCH_RATE = IT_UPDATA-LCAMT2.
       ELSE.   "如果用戶沒有錄入本位值,則取系統最近的匯率
            PERFORM CONVERT_CURRENCY USING IT_UPDATA-FCAMT2 IT_UPDATA-CUR T001-WAERS it_currencyamount-EXCH_RATE.
       ENDIF.
*       IF IT_UPDATA-FCAMT2 <> 0 AND IT_UPDATA-LCAMT2 IS NOT INITIAL.
*            it_currencyamount-EXCH_RATE = IT_UPDATA-LCAMT2 / IT_UPDATA-FCAMT2.
*       ELSE.   "如果用戶沒有錄入本位值,則取系統最近的匯率
*            PERFORM CONVERT_CURRENCY USING IT_UPDATA-FCAMT2 IT_UPDATA-CUR T001-WAERS it_currencyamount-EXCH_RATE.
*       ENDIF.
   ENDIF.
*----
   APPEND it_currencyamount.
   CLEAR  it_currencyamount.
*  >>----it_ext2(20)
   CLEAR: WA_ZEXTEN.
   WA_ZEXTEN-POSNR    = 20"憑證行項目
   WA_ZEXTEN-BSCHL    = IT_UPDATA-PK2.   "post key2
   IF TBSL-XSONU = 'X'.
   WA_ZEXTEN-UMSKZ    = IT_UPDATA-SPGL.  "Special G/L Indicator
   ENDIF.
   "--WA_ZEXTEN-DMBTR = IT_UPDATA-LCAMT2.   "---07/05
   it_ext2-STRUCTURE  = 'ZEXTEN014'.
   it_ext2-VALUEPART1 = WA_ZEXTEN.
   APPEND it_ext2.
   CLEAR  it_ext2.
*CASE2
   CASE TBSL-KOART.
     WHEN 'K'.   "VENDOR
*      >>----it_accvendap(20)
       it_accvendap-ITEMNO_ACC  = 20.
       it_accvendap-COMP_CODE   = IT_UPDATA-CCDE.
       it_accvendap-VENDOR_NO   = IT_UPDATA-ACCT2.
       PERFORM ADD_PRE_ZERO USING it_accvendap-VENDOR_NO.  "前導加0
       "-it_accvendap-GL_ACCOUNT  = IT_UPDATA-ACCT2.
       it_accvendap-SP_GL_IND   = IT_UPDATA-SPGL.
       it_accvendap-TAX_CODE    = IT_UPDATA-TAXCODE.
       IF TBSL-SHKZG = 'S'.
       it_accvendap-BLINE_DATE  = IT_UPDATA-DUEON.
       ENDIF.
       it_accvendap-ALLOC_NMBR  = IT_UPDATA-ASSGN2.
       it_accvendap-ITEM_TEXT   = IT_UPDATA-ITEM_TXT2.
       it_accvendap-BUS_AREA    = IT_UPDATA-BUSAR2.
*      ---LFB1
       select single * from LFB1 where lifnr = it_accvendap-VENDOR_NO and
                                       bukrs = IT_UPDATA-CCDE.
       IF IT_UPDATA-ZTERM IS NOT INITIAL.
       it_accvendap-PMNTTRMS    = IT_UPDATA-ZTERM.   "Payment Key
       ELSE.
       it_accvendap-PMNTTRMS    = LFB1-ZTERM.
       ENDIF.
       select single * from T052 where zterm = LFB1-ZTERM.
       IF IT_UPDATA-ZBD1T IS NOT INITIAL.
       it_accvendap-DSCT_DAYS1  = IT_UPDATA-ZBD1T.   "Cash discount days 1
       ELSE.
       it_accvendap-DSCT_DAYS1  = T052-ZTAG1.
       ENDIF.
       IF IT_UPDATA-ZFBDT IS NOT INITIAL.
       it_accvendap-BLINE_DATE  = IT_UPDATA-ZFBDT.   "Baseline Date for Due Date Calculation
       ELSE.
       it_accvendap-BLINE_DATE  = IT_UPDATA-INV_DATE. "--SY-DATUM.
       ENDIF.
*      --- end
       APPEND it_accvendap.
       CLEAR  it_accvendap.
     WHEN 'D'.  "CUSTOMER
*      >>----it_acccustar(20)
       it_acccustar-ITEMNO_ACC  = 20.
       it_acccustar-COMP_CODE   = IT_UPDATA-CCDE.
       it_acccustar-CUSTOMER    = IT_UPDATA-ACCT2.
       PERFORM ADD_PRE_ZERO USING it_acccustar-CUSTOMER.  "前導加0
       "-it_acccustar-GL_ACCOUNT  = IT_UPDATA-ACCT2.
       it_acccustar-SP_GL_IND   = IT_UPDATA-SPGL.
       it_acccustar-TAX_CODE    = IT_UPDATA-TAXCODE.
       IF TBSL-SHKZG = 'S'.
       it_acccustar-BLINE_DATE  = IT_UPDATA-DUEON.
       ENDIF.
       it_acccustar-ALLOC_NMBR  = IT_UPDATA-ASSGN2.
       it_acccustar-ITEM_TEXT   = IT_UPDATA-ITEM_TXT2.
       it_acccustar-BUS_AREA    = IT_UPDATA-BUSAR2.
*      --KNB1
       select single * from KNB1 where kunnr = it_acccustar-CUSTOMER and
                                       bukrs = IT_UPDATA-CCDE.
       IF IT_UPDATA-ZTERM IS NOT INITIAL.
       it_acccustar-PMNTTRMS    = IT_UPDATA-ZTERM.   "Payment Key
       ELSE.
       it_acccustar-PMNTTRMS    = KNB1-ZTERM.
       ENDIF.
       select single * from T052 where zterm = KNB1-ZTERM.
       IF IT_UPDATA-ZBD1T IS NOT INITIAL.
       it_acccustar-DSCT_DAYS1  = IT_UPDATA-ZBD1T.   "Cash discount days 1
       ELSE.
       it_acccustar-DSCT_DAYS1  = T052-ZTAG1.
       ENDIF.
       IF IT_UPDATA-ZFBDT IS NOT INITIAL.
       it_acccustar-BLINE_DATE  = IT_UPDATA-ZFBDT.   "Baseline Date for Due Date Calculation
       ELSE.
       it_acccustar-BLINE_DATE  = IT_UPDATA-INV_DATE.  "--SY-DATUM.
       ENDIF.
*      -- end
       APPEND it_acccustar.
       CLEAR  it_acccustar.
     WHEN OTHERS.   "STANDARD(40/50)
       SELECT SINGLE * FROM SKB1 WHERE BUKRS = IT_UPDATA-CCDE AND
                                       SAKNR = IT_UPDATA-ACCT2.
*      >>----it_accountgl(20)
       it_accountgl-ITEMNO_ACC  = 20.
       it_accountgl-GL_ACCOUNT  = IT_UPDATA-ACCT2.
       it_accountgl-ALLOC_NMBR  = IT_UPDATA-ASSGN2.
       it_accountgl-ITEM_TEXT   = IT_UPDATA-ITEM_TXT2.
       it_accountgl-COSTCENTER  = IT_UPDATA-CCTR2.
       it_accountgl-PROFIT_CTR  = IT_UPDATA-PCTR2.
       it_accountgl-BUS_AREA    = IT_UPDATA-BUSAR2.
       IF SKB1-MWSKZ IS NOT INITIAL.   "會計科目需不需要Tax code
           it_accountgl-TAX_CODE    = IT_UPDATA-TAXCODE.
       ENDIF.
       IF SKB1-XINTB = 'X'.
           CONCATENATE PF_AUTOMESS '[' IT_UPDATA-ACCT2 ']' TEXT-E02 INTO PF_AUTOMESS.
       ENDIF.
       APPEND it_accountgl.
       CLEAR  it_accountgl.
   ENDCASE.
*ENDCASE2
*  >>>>IT_UPDATA-PK2>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>END
ENDFORM.

******************************************************************************
*   FORM: AUTO_UPLOAD_DATA
*   DESC: 執行BAPI上載數據
******************************************************************************
FORM AUTO_UPLOAD_DATA.
data: L_AUTOMESS TYPE C LENGTH 100.
   LOOP AT IT_UPDATA.
*      ---BAPI參數填充,並且判定是否為"post automatically only"  ,如果是,則不能建立會計憑証
       PERFORM FILL_IN_TABLES USING L_AUTOMESS.
       if L_AUTOMESS <> ''.
           IT_UPDATA-MTYPE = '1'.
           IT_UPDATA-MESS  = L_AUTOMESS.
           MODIFY IT_UPDATA.
           CONTINUE.
       endif.
       IF IT_UPDATA-CCDE  <> '3999' AND
          IT_UPDATA-CCDE  <> '3360' AND
          IT_UPDATA-CCDE  <> '3361' AND
          IT_UPDATA-CCDE  <> '3250' AND
          IT_UPDATA-CCDE  <> '3180'.
           IT_UPDATA-MTYPE = '1'.
           IT_UPDATA-MESS  = '限定此程序只可上傳3999、3360、3361、3250、3180法人的會計憑證'.
           MODIFY IT_UPDATA.
           CONTINUE.
       ENDIF.
*      ---執行BAPI上載數據
       IF P_TEST <> 'X'.
           CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'   "--'BAPI_ACC_GL_POSTING_POST'
             EXPORTING
               documentheader    = gd_documentheader
             IMPORTING
               obj_type          = l_type
               obj_key           = l_key
               obj_sys           = l_sys
             TABLES
               accountgl         = it_accountgl
               currencyamount    = it_currencyamount
               accountpayable    = it_accvendap
               accountreceivable = it_acccustar
               extension2        = it_ext2
               return            = it_return.
           if sy-subrc = 0.
                 CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
                    EXPORTING
                      WAIT = 'X'.
           endif.
       ELSE.  "For testing
           CALL FUNCTION 'BAPI_ACC_DOCUMENT_CHECK'
             EXPORTING
               documentheader    = gd_documentheader
             TABLES
               accountgl         = it_accountgl
               currencyamount    = it_currencyamount
               accountpayable    = it_accvendap
               accountreceivable = it_acccustar
               extension2        = it_ext2
               return            = it_return.
       ENDIF.
*      ---取得錯誤信息
       IF IT_RETURN[] IS NOT INITIAL.
           READ TABLE IT_RETURN WITH KEY TYPE = 'E'.
           IF SY-SUBRC = 0.
               READ TABLE IT_RETURN INDEX 2.  "真正返回錯誤信息
               IT_UPDATA-MTYPE = '1'"IT_RETURN-TYPE.
               IT_UPDATA-MESS  = IT_RETURN-MESSAGE.
           ELSE.
               READ TABLE IT_RETURN WITH KEY TYPE = 'S'.
               IF SY-SUBRC = 0.
                  IT_UPDATA-MTYPE = '3'"IT_RETURN-TYPE.
                  IT_UPDATA-AWKEY = IT_RETURN-MESSAGE_V2.
                  IT_UPDATA-BELNR = IT_RETURN-MESSAGE_V2.  "Document Number{IT_RETURN-MESSAGE_V2+0(10)}
                  IT_UPDATA-MESS  = IT_RETURN-MESSAGE.
               ENDIF.
           ENDIF.
       ELSE.
           IT_UPDATA-MTYPE = '1'.
           IT_UPDATA-MESS  = TEXT-E01.  "Empty message
       ENDIF.
*      ---MODIFY
       MODIFY IT_UPDATA.
   ENDLOOP.
ENDFORM.

******************************************************************************
*   FORM: AUTO_UPLOAD
*   DESC: 記帳/沖銷記錄
******************************************************************************
FORM AUTO_UPLOAD.
   DATA: L_INDEX LIKE SY-TABIX.
   DATA: LT_REVER LIKE TABLE OF IT_UPDATA WITH HEADER LINE,
         LT_UPDATA LIKE TABLE OF IT_UPDATA WITH HEADER LINE.

   LT_REVER[] = IT_UPDATA[].    "IT_UPDATA先保存數據(沒有操作)
*  ------(1)
   PERFORM AUTO_UPLOAD_DATA.                 "--記帳 -->執行BAPI上載數據
*  ------(2)
    IF p_storno = 'X'.
       LT_UPDATA[] = IT_UPDATA[].   "IT_UPDATA先保存起來(記帳操作)
       IT_UPDATA[] = LT_REVER[].    "IT_UPDATA還原數據(沒有操作)
       LOOP AT IT_UPDATA.
           L_INDEX = SY-TABIX.
           IT_UPDATA-PST_DATE = st_budat.
           "修改記帳碼
           SELECT SINGLE * FROM TBSL WHERE BSCHL = IT_UPDATA-PK1.
           if sy-subrc = 0.
               IT_UPDATA-PK1 = TBSL-STBSL.
           else.
               IT_UPDATA-PK1 = ''.
           endif.
           SELECT SINGLE * FROM TBSL WHERE BSCHL = IT_UPDATA-PK2.
           if sy-subrc = 0.
               IT_UPDATA-PK2 = TBSL-STBSL.
           else.
               IT_UPDATA-PK2 = ''.
           endif.
           MODIFY IT_UPDATA INDEX L_INDEX.
       ENDLOOP.
       PERFORM AUTO_UPLOAD_DATA.                 "--沖銷記帳 -->執行BAPI上載數據
       LT_REVER[]  = IT_UPDATA[].
       IT_UPDATA[] = LT_UPDATA[].
       APPEND LINES OF LT_REVER TO IT_UPDATA.     "合並數據
    ENDIF.
ENDFORM.     "REVER_AUTO_UPLOAD


*-------------------------------ALV------------------------------------*
*&---------------------------------------------------------------------*
*&      Form  SUB_CALL_ALV_FUNCTION
*&---------------------------------------------------------------------*
*&      Description: Show ALV Format
*----------------------------------------------------------------------*
FORM SUB_CALL_ALV_FUNCTION.

* Set ALV parameters for the program
  PERFORM SUB_SET_PARAMETERS.
* add SORT
  PERFORM SUB_SET_SORT.
* add event
  PERFORM SUB_SET_EVENT.
** add the title
*  PERFORM SUB_SET_REPORT_TITLE.
* Call ALV list function
  PERFORM SUB_CALL_ALV_WITH_LIST TABLES IT_UPDATA.

ENDFORM.                    "SUB_CALL_ALV_FUNCTION

*&--------------------------------------------------------------------*
*&      Form:       SUB_SET_PARAMETERS                                *
*&--------------------------------------------------------------------*
*&      Description:Set ALV parameters                                *
*&--------------------------------------------------------------------*
FORM SUB_SET_PARAMETERS.

* Set the fields which will be displayed into T_ FIELDCAT
    PERFORM SUB_FIELD_DES USING 'INV_DATE'   'IT_UPDATA' '' ''  '' TEXT-H01.  "發票日期
    PERFORM SUB_FIELD_DES USING 'DOC_TYPE'   'IT_UPDATA' '' ''  '' TEXT-H02.  "憑證類型
    PERFORM SUB_FIELD_DES USING 'CCDE'       'IT_UPDATA' '' ''  '' TEXT-H03.  "公司代碼
    PERFORM SUB_FIELD_DES USING 'PST_DATE'   'IT_UPDATA' '' ''  '' TEXT-H04.  "過賬日期
    PERFORM SUB_FIELD_DES USING 'CUR'        'IT_UPDATA' '' ''  '' TEXT-H05.  "貨幣
    PERFORM SUB_FIELD_DES USING 'REF_NO'     'IT_UPDATA' '' ''  '' TEXT-H06.  "參照
    PERFORM SUB_FIELD_DES USING 'HD_TXT'     'IT_UPDATA' '' ''  '' TEXT-H07.  "擡頭文本
    PERFORM SUB_FIELD_DES USING 'PK1'        'IT_UPDATA' '' ''  '' TEXT-H08.  "過賬碼1
    PERFORM SUB_FIELD_DES USING 'ACCT1'      'IT_UPDATA' '' ''  '' TEXT-H09.  "會計科目1
    PERFORM SUB_FIELD_DES USING 'SPGL'       'IT_UPDATA' '' ''  '' TEXT-H10.  "特別總賬標記

    PERFORM SUB_FIELD_DES USING 'ZTERM'      'IT_UPDATA' '' ''  '' TEXT-H29.  "Payment Key(付款條件)
    PERFORM SUB_FIELD_DES USING 'ZBD1T'      'IT_UPDATA' '' ''  '' TEXT-H30.  "Cash discount days 1(天數)
    PERFORM SUB_FIELD_DES USING 'ZFBDT'      'IT_UPDATA' '' ''  '' TEXT-H31.  "Baseline Date for Due Date Calculation(付款基準日期)

    PERFORM SUB_FIELD_DES USING 'TAXCODE'    'IT_UPDATA' '' ''  '' TEXT-H25.  "稅碼
    PERFORM SUB_FIELD_DES USING 'DUEON'      'IT_UPDATA' '' ''  '' TEXT-H26.  "到期日

    PERFORM SUB_FIELD_DES USING 'FCAMT1'     'IT_UPDATA' '' ''  '' TEXT-H11.  "外幣金額1
    PERFORM SUB_FIELD_DES USING 'LCAMT1'     'IT_UPDATA' '' ''  '' TEXT-H12.  "本幣金額1(匯率1)
    PERFORM SUB_FIELD_DES USING 'ASSGN1'     'IT_UPDATA' '' ''  '' TEXT-H13.  "分配1
    PERFORM SUB_FIELD_DES USING 'ITEM_TXT1'  'IT_UPDATA' '' ''  '' TEXT-H14.  "項目文本1
    PERFORM SUB_FIELD_DES USING 'CCTR1'      'IT_UPDATA' '' ''  '' TEXT-H15.  "成本中心1
    PERFORM SUB_FIELD_DES USING 'PCTR1'      'IT_UPDATA' '' ''  '' TEXT-H16.  "利潤中心1
    PERFORM SUB_FIELD_DES USING 'BUSAR1'     'IT_UPDATA' '' ''  '' TEXT-H27.  "業務範圍1
    PERFORM SUB_FIELD_DES USING 'PK2'        'IT_UPDATA' '' ''  '' TEXT-H17.  "過賬碼2
    PERFORM SUB_FIELD_DES USING 'ACCT2'      'IT_UPDATA' '' ''  '' TEXT-H18.  "會計科目2
    PERFORM SUB_FIELD_DES USING 'FCAMT2'     'IT_UPDATA' '' ''  '' TEXT-H19.  "外幣2
    PERFORM SUB_FIELD_DES USING 'LCAMT2'     'IT_UPDATA' '' ''  '' TEXT-H20.  "本幣2(匯率2)
    PERFORM SUB_FIELD_DES USING 'ASSGN2'     'IT_UPDATA' '' ''  '' TEXT-H21.  "分配2
    PERFORM SUB_FIELD_DES USING 'ITEM_TXT2'  'IT_UPDATA' '' ''  '' TEXT-H22.  "項目文本2
    PERFORM SUB_FIELD_DES USING 'CCTR2'      'IT_UPDATA' '' ''  '' TEXT-H23.  "成本中心2
    PERFORM SUB_FIELD_DES USING 'PCTR2'      'IT_UPDATA' '' ''  '' TEXT-H24.  "利潤中心2
    PERFORM SUB_FIELD_DES USING 'BUSAR2'     'IT_UPDATA' '' ''  '' TEXT-H28.  "業務範圍2
*      --OTHER MESSAGE
    PERFORM SUB_FIELD_DES USING 'BELNR'      'IT_UPDATA' '' ''  '' TEXT-H97.  "Document Number(FB03)
    PERFORM SUB_FIELD_DES USING 'MTYPE'      'IT_UPDATA' '' ''  '' TEXT-H98.
    PERFORM SUB_FIELD_DES USING 'MESS'       'IT_UPDATA' '' ''  '' TEXT-H99.

ENDFORM.                    "SUB_SET_PARAMETERS

*&---------------------------------------------------------------------*
*&      Form  SUB_SET_SORT
*&---------------------------------------------------------------------*
FORM SUB_SET_SORT .

***  X_SORT-spos = '1'.
***  X_SORT-fieldname = 'FKTYP'.
**** X_SORT-UP = 'X'.
***  X_SORT-down = 'X'.
***  APPEND X_SORT TO T_SORT.
***
***  X_SORT-spos = '2'.
***  X_SORT-fieldname = 'VKORG'.
**** X_SORT-UP = 'X'.
***  X_SORT-down = 'X'.
***  APPEND X_SORT TO T_SORT.

ENDFORM.                        "SUB_SET_SORT

*&---------------------------------------------------------------------*
*&      Form  SUB_SET_EVENT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*  -->  p1        text
*  <--  p2        text
*----------------------------------------------------------------------*
FORM SUB_SET_EVENT .
*  DATA: C_FORMNAME_END_OF_PAGE TYPE SLIS_FORMNAME
*                               VALUE 'SUB_TOP_OF_PAGE' .
*  CALL FUNCTION 'REUSE_ALV_EVENTS_GET'
*    EXPORTING
*      I_LIST_TYPE = 0
*    IMPORTING
*      ET_EVENTS   = T_EVENT.
*  READ TABLE T_EVENT WITH KEY NAME = SLIS_EV_TOP_OF_PAGE
*  INTO W_EVENT .
*  IF SY-SUBRC = 0 .
*    W_EVENT-FORM = C_FORMNAME_END_OF_PAGE .
*    APPEND W_EVENT TO T_EVENT . "add form 'TOP_OF_PAGE' to the events,
*  ENDIF.                        "perform the FORM 'to_of_page' .
ENDFORM.                        "SUB_SET_EVENT

FORM USER_COMMAND USING UCOMM LIKE SY-UCOMM SELFIELD TYPE SLIS_SELFIELD.
  READ TABLE IT_UPDATA INDEX SELFIELD-TABINDEX.
  CHECK SY-SUBRC = 0.
  CASE UCOMM.
    WHEN '&IC1'.
       CASE SELFIELD-SEL_TAB_FIELD.
          WHEN  'IT_UPDATA-BELNR'.
            IF STRLEN( IT_UPDATA-BELNR ) >= 10.
                SET PARAMETER ID 'BLN' FIELD IT_UPDATA-BELNR.
                SET PARAMETER ID 'BUK' FIELD IT_UPDATA-AWKEY+10(4).  "-010900002436112010
                SET PARAMETER ID 'GJR' FIELD IT_UPDATA-AWKEY+14(4).
                CALL TRANSACTION 'FB03' AND SKIP FIRST SCREEN.
            ENDIF.
       ENDCASE.
  ENDCASE.
ENDFORM.
*&--------------------------------------------------------------------*
*&      Form:       SUB_CALL_ALV_WITH_LIST                            *
*&--------------------------------------------------------------------*
*&      Description:call ALV list function                            *
*&--------------------------------------------------------------------*
FORM SUB_CALL_ALV_WITH_LIST TABLES T_RESULT.

  IF T_RESULT[] IS INITIAL."no data
*   Display message 'no data
    MESSAGE S000(ZBA) WITH 'NO Data!'.
  ELSE.
*    SORT IT_RESULT BY PRUEFLOS MATNR.
*  You can call ALV list or ALV Grid list(one of the two functions)
*  CALL FUNCTION 'REUSE_ALV_LIST_DISPLAY'
*  EXPORTING
**   I_INTERFACE_CHECK              = ' '
**   I_BYPASSING_BUFFER             =
**   I_BUFFER_ACTIVE                = ' '
*    I_CALLBACK_PROGRAM             = SY-REPID
**   I_CALLBACK_PF_STATUS_SET       = ' '
**   I_CALLBACK_USER_COMMAND        = ' '
**   I_STRUCTURE_NAME               =
**   IS_LAYOUT                      =
*    IT_FIELDCAT                    = T_FIELDCAT
**   IT_EXCLUDING                   =
**   IT_SPECIAL_GROUPS              =
*    IT_SORT                        = T_SORT
**   IT_FILTER                      =
**   IS_SEL_HIDE                    =
**   I_DEFAULT                      = 'X'
*    I_SAVE                         = 'A'
**   IS_VARIANT                     =
**   IT_EVENTS                      = T_EVENT
**   IT_EVENT_EXIT                  =
**   IS_PRINT                       =
**   IS_REPREP_ID                   =
**   I_SCREEN_START_COLUMN          = 0
**   I_SCREEN_START_LINE            = 0
**   I_SCREEN_END_COLUMN            = 0
**   I_SCREEN_END_LINE              = 0
** IMPORTING
**   E_EXIT_CAUSED_BY_CALLER        =
**   ES_EXIT_CAUSED_BY_USER         =
*    TABLES
*      T_OUTTAB                     = T_RESULT
*   EXCEPTIONS
*     PROGRAM_ERROR                 = 1
*     OTHERS                        = 2  .
*  IF SY-SUBRC NE 0.
*  ENDIF.
*------------------------------------------------
*   The report will call ALV GRID list to display data
    GT_LAYOUT-ZEBRA = 'X'.
    GT_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
    GT_LAYOUT-LIGHTS_FIELDNAME = 'MTYPE'.
    CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
    EXPORTING
*     I_INTERFACE_CHECK                 = ' '
*     I_BYPASSING_BUFFER                = ' '
*     I_BUFFER_ACTIVE                   = ' '
        I_CALLBACK_PROGRAM                = SY-REPID  "--SY-CPROG
*     I_CALLBACK_PF_STATUS_SET          = ' '
     I_CALLBACK_USER_COMMAND           = 'USER_COMMAND'
*     I_CALLBACK_TOP_OF_PAGE            = ' '
*     I_CALLBACK_HTML_TOP_OF_PAGE       = ' '
*     I_CALLBACK_HTML_END_OF_LIST       = ' '
*     I_STRUCTURE_NAME                  =
*     I_BACKGROUND_ID                   = ' '
*     I_GRID_TITLE                      =
*     I_GRID_SETTINGS                   =
        IS_LAYOUT                         = GT_LAYOUT
        IT_FIELDCAT                       = T_FIELDCAT
*     IT_EXCLUDING                      =
*     IT_SPECIAL_GROUPS                 =
        IT_SORT                           = T_SORT
*     IT_FILTER                         =
*     IS_SEL_HIDE                       =
*     I_DEFAULT                         = 'X'
        I_SAVE                            = 'A'
*     IS_VARIANT                        =
        IT_EVENTS                         = T_EVENT
*     IT_EVENT_EXIT                     =
*     IS_PRINT                          =
*     IS_REPREP_ID                      =
*     I_SCREEN_START_COLUMN             = 0
*     I_SCREEN_START_LINE               = 0
*     I_SCREEN_END_COLUMN               = 0
*     I_SCREEN_END_LINE                 = 0
*     IT_ALV_GRAPHICS                   =
*     IT_HYPERLINK                      =
*     IT_ADD_FIELDCAT                   =
*     IT_EXCEPT_QINFO                   =
*     I_HTML_HEIGHT_TOP                 =
*     I_HTML_HEIGHT_END                 =
*   IMPORTING
*     E_EXIT_CAUSED_BY_CALLER           =
*     ES_EXIT_CAUSED_BY_USER            =
      TABLES
        T_OUTTAB                          = T_RESULT
     EXCEPTIONS
       PROGRAM_ERROR                      = 1
       OTHERS                             = 2.
    IF SY-SUBRC <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
*         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
    ENDIF.
  ENDIF.
ENDFORM.            "SUB_CALL_ALV_WITH_LIST

*&--------------------------------------------------------------------*
*&      Form:         SUB_FIELD_DES                                   *
*&--------------------------------------------------------------------*
*&      Description:  Set the fields which will be displayed          *
*&--------------------------------------------------------------------*
*&      L_FIELDNAME---must upper case                                 *
*&      L_TABNAME  ---internal table name                             *
*&      L_KEY      ---column with key-color AND frozen                *
*&      L_CHECKBOX ---the column is checkbox                          *
*&      L_INPUT    ---the column can be edited in ALV list            *
*&      L_SELTEX_L ---column Long description of title                *
*&--------------------------------------------------------------------*
FORM SUB_FIELD_DES USING L_FIELDNAME TYPE C
                         L_TABNAME TYPE C
                         L_KEY TYPE C
                         L_CHECKBOX TYPE C
                         L_INPUT TYPE C
                         L_SELTEX_L TYPE C.  "L_OUTPUTLEN TYPE I
  CLEAR W_FILEDCAT.
  W_FILEDCAT-FIELDNAME = L_FIELDNAME."must upper case
  W_FILEDCAT-TABNAME   = L_TABNAME.  "internal table name
  W_FILEDCAT-KEY       = L_KEY.      "column with key-color AND frozen
  W_FILEDCAT-CHECKBOX  = L_CHECKBOX. "the column is checkbox
  W_FILEDCAT-INPUT     = L_INPUT.    "the column can be edited in ALV
  W_FILEDCAT-SELTEXT_L = L_SELTEX_L. "column Long title
  W_FILEDCAT-DDICTXT   = 'L'.        "to show long title
  APPEND W_FILEDCAT TO T_FIELDCAT.

ENDFORM.                    "SUB_FIELD_DES

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章