您的位置:首页 > 其它

BAPI_ACC_DOCUMENT_POST 导入外币金额全

2014-01-09 09:37 399 查看

FORM FRM_GET_DATA .

  DATA L_FILE_NAME TYPE RLGRAP-FILENAME.

  DATA L_TAB_RAW_DATA TYPE TRUXS_T_TEXT_DATA.

  L_FILE_NAME = P_PATH.

  CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'

    EXPORTING

      I_TAB_RAW_DATA       = L_TAB_RAW_DATA

      I_FILENAME           = L_FILE_NAME

    TABLES

      I_TAB_CONVERTED_DATA = IT_POST

    EXCEPTIONS

      CONVERSION_FAILED    = 1

      OTHERS               = 2.

  IF SY-SUBRC <> 0.

    MESSAGE S001(00) WITH TEXT-E01 DISPLAY LIKE 'E'.

    LEAVE LIST-PROCESSING.

  ENDIF.

  DELETE IT_POST INDEX  1."删除导入模板标题

  PERFORM FRM_GET_TBSL TABLES IT_TBSL.

ENDFORM.                    " FRM_GET_DATA
*&---------------------------------------------------------------------*
*& Form F_GET_FILEPATH
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*

FORM F_GET_FILEPATH .

  DATA: LIT_FILE TYPE FILETABLE,

        LWA_FILE LIKE LINE OF LIT_FILE.

  DATA L_FILE_COUNT TYPE I.

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_OPEN_DIALOG

    EXPORTING

      WINDOW_TITLE      = '选择导入文件'

      DEFAULT_EXTENSION = 'XLS'

    CHANGING

      FILE_TABLE        = LIT_FILE

      RC                = L_FILE_COUNT.

  IF L_FILE_COUNT <> -1.

    READ TABLE LIT_FILE INDEX 1 INTO LWA_FILE.

    P_PATH = LWA_FILE-FILENAME.

  ENDIF.

ENDFORM.                    " F_GET_FILEPATH
*&---------------------------------------------------------------------*
*& Form FRM_RUN
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*

FORM FRM_RUN .

  DATA:

       W_BELNR TYPE BAPIACHE09-OBJ_KEY,

       WA_ZEXTEN TYPE ZEXTEN,

       L_HEADER TYPE BAPIACHE09,                  "抬头信息

       L_ACCOUNTGL TYPE BAPIACGL09,               "总帐工作区

       L_RECEIVABLE TYPE BAPIACAR09,              "客户工作区

       L_PAYBLE TYPE BAPIACAP09,                  "供应商工作区

       L_RETURN TYPE BAPIRET2,                    "返回信息工作区

       L_CURRENCYAMOUNT TYPE BAPIACCR09,          "金额工作区

       L_EXTENSION TYPE BAPIACEXTC,

       L_EXTENSION2  TYPE BAPIPAREX,

       LI_ACCOUNTGL TYPE TABLE OF BAPIACGL09,      "总帐内表

       LI_RECEIVABLE TYPE TABLE OF BAPIACAR09,     "客户内表

       LI_PAYBLE TYPE TABLE OF BAPIACAP09,         "供应商内表

       LI_RETURN TYPE TABLE OF BAPIRET2,           "返回信息内表

       LI_CURRENCYAMOUNT TYPE TABLE OF BAPIACCR09, "金额内表

       LI_EXTENSION2 TYPE TABLE OF BAPIPAREX WITH HEADER LINE.

  DATA:L_DMBTR TYPE BAPIWRBTR,

       L_WRBTR TYPE BAPIWRBTR.

  DATA L_ITEM TYPE POSNR_ACC VALUE 1.

  DATA L_BUZEI TYPE TA_POST-BUZEI.

  DATA LI_POST TYPE TABLE OF TA_POST.

  DATA L_POST TYPE TA_POST.

  DATA L_MWAER TYPE T000-MWAER.

  SORT IT_POST BY BUZEI.

  LI_POST[] = IT_POST[].

  DELETE ADJACENT DUPLICATES FROM LI_POST COMPARING BUZEI.

  SELECT SINGLE MWAER INTO L_MWAER  FROM T000 WHERE MANDT = SY-MANDT.     "获取本集团货币、

  IF SY-SUBRC <> 0.

    MESSAGE E001 .

  ENDIF.

  SORT IT_POST .

  LOOP AT LI_POST INTO L_POST.

    L_ITEM = 1.

    L_HEADER-FISC_YEAR    = L_POST-BLDAT+0(4).   "会计年度

    L_HEADER-FIS_PERIOD   = L_POST-BLDAT+4(2).   "会计期间

    L_HEADER-USERNAME     = SY-UNAME.             "用户名

    L_HEADER-DOC_DATE     = L_POST-BLDAT.        "凭证日期

    L_HEADER-DOC_TYPE     = L_POST-BLART.        "凭证类型

    L_HEADER-COMP_CODE    = L_POST-BUKRS.        "公司代码

    L_HEADER-PSTNG_DATE   = L_POST-BUDAT.        "过帐日期

    L_HEADER-HEADER_TXT   = L_POST-BKTXT.        "凭证抬头文本
* L_HEADER-REF_DOC_NO = '0'. "参考

    LOOP AT IT_POST INTO WA_POST WHERE BUZEI = L_POST-BUZEI.

      CLEAR WA_TBSL.

      PERFORM FRM_GET_SHKZG USING

                                 WA_POST

                            CHANGING

                                 WA_TBSL.

      IF  WA_POST-KOSTL IS NOT INITIAL.

        IF WA_POST-KOSTL CO ' 0123456789'.

          UNPACK WA_POST-KOSTL TO WA_POST-KOSTL.

        ENDIF.

      ENDIF.

      IF WA_POST-UMSKZ IS NOT INITIAL.

        TRANSLATE WA_POST-UMSKZ TO UPPER CASE.

      ENDIF.
*----------扩展标记------------------------------

      CLEAR WA_ZEXTEN.

      CLEAR LI_EXTENSION2.

      WA_ZEXTEN-POSNR =  L_ITEM. "行项目编号

      WA_ZEXTEN-BSCHL = WA_POST-BSCHL. "记账码

      WA_ZEXTEN-NUMPG = WA_POST-NUMPG. "凭证页数

      WA_ZEXTEN-RSTGR = WA_POST-RSTGR. "原因代码

      LI_EXTENSION2-STRUCTURE  = 'ZEXTEN'.

      LI_EXTENSION2-VALUEPART1 = WA_ZEXTEN.

      APPEND LI_EXTENSION2.
*---------货币-----------------------------------

      CLEAR L_CURRENCYAMOUNT.

      CLEAR L_DMBTR.

      CASE WA_TBSL-SHKZG.

        WHEN 'H'.                           "贷方为负

          L_DMBTR = 0 - WA_POST-DMBTR.      "金额

          L_WRBTR = 0 - WA_POST-WRBTR.

        WHEN 'S'.

          L_DMBTR =  WA_POST-DMBTR.         "金额

          L_WRBTR =  WA_POST-WRBTR.

      ENDCASE.

      L_CURRENCYAMOUNT-ITEMNO_ACC = L_ITEM. "行项目编号

      TRANSLATE WA_POST-WAERS TO UPPER CASE.

      IF WA_POST-WAERS <> L_MWAER AND WA_POST-DMBTR IS NOT INITIAL.

        L_CURRENCYAMOUNT-AMT_DOCCUR = L_DMBTR. "本位币金额

        L_CURRENCYAMOUNT-CURR_TYPE = '10'.

        L_CURRENCYAMOUNT-CURRENCY = L_MWAER.

        APPEND L_CURRENCYAMOUNT TO LI_CURRENCYAMOUNT.

        L_CURRENCYAMOUNT-AMT_DOCCUR = L_WRBTR. "外币金额

        L_CURRENCYAMOUNT-CURR_TYPE = '00'.

        L_CURRENCYAMOUNT-CURRENCY = WA_POST-WAERS.

        APPEND L_CURRENCYAMOUNT TO LI_CURRENCYAMOUNT.

      ELSE.

        L_CURRENCYAMOUNT-CURR_TYPE = '00'.

        L_CURRENCYAMOUNT-AMT_DOCCUR = L_WRBTR. "人民币原币金额

        L_CURRENCYAMOUNT-CURRENCY = WA_POST-WAERS.

        APPEND L_CURRENCYAMOUNT TO LI_CURRENCYAMOUNT.

      ENDIF.

      CASE WA_TBSL-KOART.

        WHEN 'D'.                             "D  客户

          L_RECEIVABLE-ITEMNO_ACC =  L_ITEM.

          L_RECEIVABLE-COMP_CODE  = WA_POST-BUKRS.       "公司代码

          IF WA_POST-HKONT CO '0123456789 '.

            UNPACK WA_POST-HKONT TO L_RECEIVABLE-CUSTOMER.

          ELSE.

            L_RECEIVABLE-CUSTOMER   = WA_POST-HKONT.       "客户编号

          ENDIF.

          L_RECEIVABLE-ITEM_TEXT  = WA_POST-SGTXT.       "文本

          L_RECEIVABLE-SP_GL_IND   = WA_POST-UMSKZ.      "特殊总账标识

          L_RECEIVABLE-BLINE_DATE = WA_POST-ZFBDT.       "付款基准日期

          L_RECEIVABLE-REF_KEY_1 = WA_POST-XREF1.           "参考代码1

          L_RECEIVABLE-REF_KEY_2 = WA_POST-XREF2.           "参考代码2

          IF WA_POST-XREF3  IS NOT INITIAL.

            IF WA_POST-XREF3 CO '0123456789 '.

              UNPACK WA_POST-XREF3 TO  L_RECEIVABLE-REF_KEY_3.

            ELSE.

              L_RECEIVABLE-REF_KEY_3 = WA_POST-XREF3.       "参考代码3

            ENDIF.

          ENDIF.

          L_RECEIVABLE-ALLOC_NMBR = WA_POS
cd1a
T-ZUONR.

          APPEND L_RECEIVABLE TO LI_RECEIVABLE.

          CLEAR L_RECEIVABLE.

        WHEN 'K'.                             "K  供应商

          L_PAYBLE-ITEMNO_ACC     = L_ITEM.

          IF WA_POST-HKONT CO '0123456789 '.

            UNPACK WA_POST-HKONT TO  L_PAYBLE-VENDOR_NO.

          ELSE.

            L_PAYBLE-VENDOR_NO = WA_POST-HKONT.           "供应商号

          ENDIF.

          L_PAYBLE-ITEM_TEXT      = WA_POST-SGTXT.       "文本

          L_PAYBLE-BLINE_DATE     = WA_POST-ZFBDT.      "付款基准日期

          L_PAYBLE-REF_KEY_1 = WA_POST-XREF1.               "参考代码1

          L_PAYBLE-REF_KEY_2 = WA_POST-XREF2.               "参考代码2

          IF WA_POST-XREF3 IS NOT INITIAL.

            IF WA_POST-XREF3 CO '0123456789 '.

              UNPACK  WA_POST-XREF3 TO  L_PAYBLE-REF_KEY_3.

            ELSE.

              L_PAYBLE-REF_KEY_3    = WA_POST-XREF3.

            ENDIF.

          ENDIF.

          L_PAYBLE-ALLOC_NMBR = WA_POST-ZUONR.

          L_PAYBLE-SP_GL_IND   = WA_POST-UMSKZ.      "特殊总账标识

          APPEND L_PAYBLE TO LI_PAYBLE.

          CLEAR L_PAYBLE.

        WHEN 'S'.                             "S  总分类帐科目

          L_ACCOUNTGL-ITEMNO_ACC  = L_ITEM.    "行项目编号

          IF WA_POST-HKONT CO '0123456789 '.

            UNPACK WA_POST-HKONT TO L_ACCOUNTGL-GL_ACCOUNT.

          ELSE.

            L_ACCOUNTGL-GL_ACCOUNT  = WA_POST-HKONT.      "总分类帐帐目

          ENDIF.

          IF WA_POST-AUFNR IS NOT INITIAL.

            IF WA_POST-AUFNR CO'0123456789 '.

              UNPACK WA_POST-AUFNR TO L_ACCOUNTGL-ORDERID.

            ELSE.

              L_ACCOUNTGL-ORDERID = WA_POST-AUFNR.

            ENDIF.

          ENDIF.

          IF WA_POST-KOSTL IS NOT INITIAL.

            L_ACCOUNTGL-COSTCENTER = WA_POST-KOSTL.

          ELSE.

            CLEAR L_ACCOUNTGL-COSTCENTER.

          ENDIF.

          L_ACCOUNTGL-COMP_CODE   = WA_POST-BUKRS.      "公司代码

          L_ACCOUNTGL-ALLOC_NMBR   = WA_POST-ZUONR.     "分配号

          L_ACCOUNTGL-ITEM_TEXT   = WA_POST-SGTXT.      "文本

          L_ACCOUNTGL-PSTNG_DATE    = WA_POST-BUDAT.     "凭证中的过账日期

          IF  WA_POST-PRCTR IS NOT INITIAL.

            IF WA_POST-PRCTR CO '0123456789 '.

              UNPACK WA_POST-PRCTR TO  L_ACCOUNTGL-PROFIT_CTR.

            ELSE.

              L_ACCOUNTGL-PROFIT_CTR  = WA_POST-PRCTR.      "利润中心

            ENDIF.
* ELSE.
* IF WA_POST-KOSTL IS NOT INITIAL.
* SELECT SINGLE PRCTR INTO L_ACCOUNTGL-PROFIT_CTR
* FROM CSKS WHERE KOSTL = WA_POST-KOSTL
* AND DATBI = '99991231'.
* ENDIF.

          ENDIF.

          L_ACCOUNTGL-VALUE_DATE  = WA_POST-BLDAT.     "凭证日期

          APPEND L_ACCOUNTGL TO LI_ACCOUNTGL.

          CLEAR  L_ACCOUNTGL.

      ENDCASE.

      L_ITEM = L_ITEM + 1.

    ENDLOOP.

    CALL FUNCTION WA_FUNNAME

      EXPORTING

        DOCUMENTHEADER    = L_HEADER

      IMPORTING

        OBJ_KEY           = W_BELNR

      TABLES

        ACCOUNTGL         = LI_ACCOUNTGL      "总帐

        ACCOUNTRECEIVABLE = LI_RECEIVABLE     "客户

        ACCOUNTPAYABLE    = LI_PAYBLE         "供应商

        CURRENCYAMOUNT    = LI_CURRENCYAMOUNT

        EXTENSION2        = LI_EXTENSION2

        RETURN            = LI_RETURN.
*------------------------------

    IF P_CHECK <> 'X'.

      CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'.

      L_POST-BELNR = W_BELNR+0(10).

      IF STRLEN( L_POST-BELNR ) > 5.

        L_POST-PASS = '成功'.

      ELSE.

        L_POST-PASS = '失败'.

      ENDIF.

    ELSE.

      READ TABLE LI_RETURN INTO  L_RETURN WITH KEY TYPE = 'E'.

      IF SY-SUBRC = 0.

        L_POST-PASS = '失败'.

      ELSE.

        L_POST-PASS = '成功'.

      ENDIF.

    ENDIF.

    LOOP AT  LI_RETURN INTO  L_RETURN.

      CONCATENATE L_POST-ERRTXT L_RETURN-TYPE L_RETURN-MESSAGE ';' INTO L_POST-ERRTXT.

      CLEAR L_RETURN.

    ENDLOOP.

    CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'    "添加前导零

     EXPORTING

       INPUT  = L_POST-BUZEI

    IMPORTING

      OUTPUT = L_POST-BUZEI.

    MODIFY LI_POST FROM L_POST.

    CLEAR L_HEADER.

    CLEAR W_BELNR.

    CLEAR LI_ACCOUNTGL.

    CLEAR LI_RECEIVABLE .

    CLEAR LI_PAYBLE .

    CLEAR LI_CURRENCYAMOUNT.

    CLEAR LI_EXTENSION2.

    CLEAR LI_RETURN.

    CLEAR L_POST.

    CLEAR L_ITEM.

  ENDLOOP.

  IT_POST[] = LI_POST[].

ENDFORM.                    " FRM_RUN
*&---------------------------------------------------------------------*
*& Form FRM_ALV
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*

FORM FRM_ALV .

  IT_OUT[] = IT_POST[].

  SORT IT_OUT BY PASS BUZEI.

  PERFORM FRM_ADD_FIELDCAT USING '1' 'BUZEI' '行项目ID'  '10'.

  PERFORM FRM_ADD_FIELDCAT USING '2' 'PASS' '导入状态'  '10'.

  PERFORM FRM_ADD_FIELDCAT USING '3' 'BELNR' '凭证号'    '10'.

  PERFORM FRM_ADD_FIELDCAT USING '4' 'ERRTXT' '信息文本'    '200'.

  PERFORM FRM_ALV_DISPLAY TABLES IT_OUT.

ENDFORM.                    " FRM_ALV
*&---------------------------------------------------------------------*
*& Form FRM_GET_TBSL
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_IT_TBSL text
*----------------------------------------------------------------------*

FORM FRM_GET_TBSL  TABLES   P_IT_TBSL STRUCTURE TBSL.

  SELECT * INTO CORRESPONDING FIELDS OF TABLE P_IT_TBSL

    FROM TBSL.

  IF SY-SUBRC <> 0 .

    MESSAGE E000 .

  ENDIF.

ENDFORM.                    " FRM_GET_TBSL
*&---------------------------------------------------------------------*
*& Form FRM_SET_FUNNAME
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_P_CHECK text
*----------------------------------------------------------------------*

FORM FRM_SET_FUNNAME  USING    P_P_CHECK.

  IF P_P_CHECK = 'X'.

    WA_FUNNAME =   'BAPI_ACC_DOCUMENT_CHECK'.

  ELSE.

    WA_FUNNAME =   'BAPI_ACC_DOCUMENT_POST'.

  ENDIF.

ENDFORM.                    " FRM_SET_FUNNAME
*&---------------------------------------------------------------------*
*& Form FRM_GET_SHKZG
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_WA_POST text
* <--P_WA_TBSL text
*----------------------------------------------------------------------*

FORM FRM_GET_SHKZG  USING    P_WA_POST TYPE TA_POST

                    CHANGING P_WA_TBSL  STRUCTURE TBSL.

  READ TABLE IT_TBSL INTO P_WA_TBSL WITH KEY BSCHL = P_WA_POST-BSCHL.

ENDFORM.                    " FRM_GET_SHKZG
*&---------------------------------------------------------------------*
*& Form FRM_GET_TEMPLATE
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*

FORM FRM_GET_TEMPLATE .

  DATA:  LV_FILENAME  TYPE STRING,

         LV_FULLPATH  TYPE STRING,

         LV_PATH      TYPE  STRING,

         LV_DESTINATION LIKE RLGRAP-FILENAME,

         LV_KEY TYPE WWWDATATAB,

         LV_RC TYPE SY-SUBRC.

  CONSTANTS: LC_OBJID TYPE WWWDATA-OBJID VALUE 'ZPZDR.XLS'.

  CALL METHOD CL_GUI_FRONTEND_SERVICES=>FILE_SAVE_DIALOG

    EXPORTING

      DEFAULT_EXTENSION    = 'XLS'

      DEFAULT_FILE_NAME    = '凭证导入原始模板(带例子).XLS'

      FILE_FILTER          = 'XLS'

      INITIAL_DIRECTORY    = 'C:\'

    CHANGING

      FILENAME             = LV_FILENAME

      PATH                 = LV_PATH

      FULLPATH             = LV_FULLPATH

    EXCEPTIONS

      CNTL_ERROR           = 1

      ERROR_NO_GUI         = 2

      NOT_SUPPORTED_BY_GUI = 3

      OTHERS               = 4.

  IF SY-SUBRC <> 0.

    MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO

               WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.

  ENDIF.

  IF LV_FULLPATH IS NOT INITIAL.

    LV_DESTINATION = LV_FULLPATH.

    SELECT SINGLE RELID OBJID FROM WWWDATA

      INTO CORRESPONDING FIELDS OF LV_KEY

    WHERE RELID = 'MI'

      AND OBJID = LC_OBJID

      AND SRTF2 = 0.

    IF SY-SUBRC = 0.

      CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'

        EXPORTING

          KEY         = LV_KEY

          DESTINATION = LV_DESTINATION

        IMPORTING

          RC          = LV_RC.

      IF LV_RC <> 0.

        MESSAGE '模版,下载失败' TYPE 'S' DISPLAY LIKE 'E'.

      ENDIF.

    ELSE.

      MESSAGE '无数据下载' TYPE 'S' DISPLAY LIKE 'E'.

    ENDIF.

  ENDIF.

ENDFORM.                    " FRM_GET_TEMPLATE
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  工作 sap abap fico