SAP的F-04清账函数以及代码参考

如果需要用代码完成类似 F-04 过账并清账的操作,可以顺序调用下面的三个函数:

- POSTING_INTERFACE_START
- POSTING_INTERFACE_CLEARING
- POSTING_INTERFACE_END

首先我们对这三个函数改装封装一下

第一个函数:POSTING_INTERFACE_START

FUNCTION zfm_posting_interface_start.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_CLIENT) LIKE  SY-MANDT DEFAULT SY-MANDT
*"     VALUE(I_FUNCTION) LIKE  RFIPI-FUNCT
*"     VALUE(I_GROUP) LIKE  APQI-GROUPID DEFAULT SPACE
*"     VALUE(I_HOLDDATE) LIKE  APQI-STARTDATE DEFAULT SPACE
*"     VALUE(I_KEEP) LIKE  APQI-QERASE DEFAULT SPACE
*"     VALUE(I_MODE) LIKE  RFPDO-ALLGAZMD DEFAULT 'N'
*"     VALUE(I_UPDATE) LIKE  RFPDO-ALLGVBMD DEFAULT 'S'
*"     VALUE(I_USER) LIKE  APQI-USERID DEFAULT SPACE
*"     VALUE(I_XBDCC) LIKE  RFIPI-XBDCC DEFAULT SPACE
*"     VALUE(I_BDC_APP_AREA) TYPE  BDC_APP_AREA DEFAULT SPACE
*"  EXCEPTIONS
*"      CLIENT_INCORRECT
*"      FUNCTION_INVALID
*"      GROUP_NAME_MISSING
*"      MODE_INVALID
*"      UPDATE_INVALID
*"      USER_INVALID
*"----------------------------------------------------------------------

  GET RUN TIME FIELD runtime.
*------- Vorhergehende Mappe schließen? --------------------------------
  IF group_open = 'X'.
    PERFORM mappe_schliessen.

*   falls kein Startdatum und keine Zeit übergeben werden soll
*   erwartet der 'JOB_CLOSE' nicht initial sondern SPACE
    IF bdcstrtdt IS INITIAL.
      MOVE space TO bdcstrtdt.
    ENDIF.
    IF bdcstrttm IS INITIAL.
      MOVE space TO bdcstrttm.
    ENDIF.
    IF ( funct = 'B'  AND bdcimmed = 'X' )
    OR ( funct = 'B'  AND bdcstrtdt NE space ).
      PERFORM mappe_abspielen_im_batch.
    ENDIF.
  ENDIF.


  mandt     = i_client.
  funct     = i_function.
  group     = i_group.
  holdd     = i_holddate.
  xkeep     = i_keep.
  mode      = i_mode.
  update    = i_update.
  usnam     = i_user.
  xbdcc     = i_xbdcc.
  bdc_app_area = i_bdc_app_area.

*------- Prüfung der Schnittstellenfelder ------------------------------
  IF mandt NE sy-mandt.
    MESSAGE e001 WITH mandt sy-mandt RAISING client_incorrect.
  ENDIF.

  IF funct CN 'BCI'.
    MESSAGE e002 WITH funct RAISING function_invalid.
  ENDIF.

  CASE funct.

*------- Funktion: Batch-Input -----------------------------------------
    WHEN 'B'.
      IF group = space.
        MESSAGE e003 RAISING group_name_missing.
      ENDIF.
      PERFORM mappe_oeffnen.

*------- Funktion: Call Transaction ... Using ... ----------------------
    WHEN 'C'.
      IF mode CN 'ANE'.
        MESSAGE e004 WITH mode RAISING mode_invalid.
      ENDIF.
      IF update CN 'SAL'.
        MESSAGE e005 WITH update RAISING update_invalid.
      ENDIF.
      IF xbdcc = 'X' AND group IS INITIAL.
        MESSAGE e003 RAISING group_name_missing.
      ENDIF.

*------- Funktion: Interaktive Buchungsschnittstelle
    WHEN 'I'.

  ENDCASE.

*------- NewGL active ? ----------------------------------- Note1605537*
  IF glflex_active IS INITIAL.
    CALL FUNCTION 'FAGL_CHECK_GLFLEX_ACTIVE'
      IMPORTING
        e_glflex_active = glflex_active
      EXCEPTIONS
        error_message   = 1.
  ENDIF.
ENDFUNCTION.

第二个函数:POSTING_INTERFACE_CLEARING

FUNCTION ZFM_POSTING_INTERFACE_CLEARING.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_AUGLV) LIKE  T041A-AUGLV
*"     VALUE(I_TCODE) LIKE  SY-TCODE
*"     VALUE(I_SGFUNCT) LIKE  RFIPI-SGFUNCT DEFAULT SPACE
*"     VALUE(I_NO_AUTH) DEFAULT SPACE
*"     REFERENCE(I_XSIMU) TYPE  CHAR1 DEFAULT SPACE
*"  EXPORTING
*"     VALUE(E_MSGID) LIKE  SY-MSGID
*"     VALUE(E_MSGNO) LIKE  SY-MSGNO
*"     VALUE(E_MSGTY) LIKE  SY-MSGTY
*"     VALUE(E_MSGV1) LIKE  SY-MSGV1
*"     VALUE(E_MSGV2) LIKE  SY-MSGV2
*"     VALUE(E_MSGV3) LIKE  SY-MSGV3
*"     VALUE(E_MSGV4) LIKE  SY-MSGV4
*"     VALUE(E_SUBRC) LIKE  SY-SUBRC
*"  TABLES
*"      T_BLNTAB STRUCTURE  BLNTAB
*"      T_FTCLEAR STRUCTURE  FTCLEAR
*"      T_FTPOST STRUCTURE  FTPOST
*"      T_FTTAX STRUCTURE  FTTAX
*"      T_BDCDATA STRUCTURE  BDCDATA
*"  EXCEPTIONS
*"      CLEARING_PROCEDURE_INVALID
*"      CLEARING_PROCEDURE_MISSING
*"      TABLE_T041A_EMPTY
*"      TRANSACTION_CODE_INVALID
*"      AMOUNT_FORMAT_ERROR
*"      TOO_MANY_LINE_ITEMS
*"      COMPANY_CODE_INVALID
*"      SCREEN_NOT_FOUND
*"      NO_AUTHORIZATION
*"----------------------------------------------------------------------
*------- Belegdaten initialisieren -------------------------------------
  tcode = i_tcode.
  auglv = i_auglv.
  sgfunct = i_sgfunct.
  xsimu   = i_xsimu.
  PERFORM init_posting.
  CLEAR:   xftclear, defsize.
  REFRESH: xftclear.
  CLEAR:   yftclear.                                      "31i

*------- Transactionscode prüfen ---------------------------------------
  IF tcode NE 'FB05' AND tcode NE 'FB05L'.                  "1527033
    MESSAGE e006 WITH tcode RAISING transaction_code_invalid.
  ENDIF.

*------- Reportname setzen  -----------------------------------------
  rep_name = rep_name_a.                        " Belegvorerfassung

*------- Tabellendaten übertragen --------------------------------------
  LOOP AT t_ftpost.
    xftpost = t_ftpost.
    APPEND xftpost.
  ENDLOOP.
  LOOP AT t_ftclear.
*------- Data without selection field to be appended after sort --------
*------- Only one such item is allowed and it must be last      --------
*------- Additionally, the all-inclusive selection must be last also --
    IF t_ftclear-selfd = space.                          "31i
      yftclear = t_ftclear.
    ELSEIF t_ftclear-selfd   = 'BELNR'         "all other o/i via lbox
        AND t_ftclear-selvon = space
        AND t_ftclear-selbis = 'ZZZZZZZZZZ'.
      yftclear = t_ftclear.
    ELSE.
      xftclear = t_ftclear.
      APPEND xftclear.
    ENDIF.
  ENDLOOP.

  SORT xftclear BY agkoa agkon agbuk xnops agums.
  IF NOT yftclear = space.                                "31i
    APPEND yftclear TO xftclear.
  ENDIF.

  PERFORM auglv_tabix_ermitteln.

  LOOP AT t_fttax.
    xfttax = t_fttax.
    APPEND xfttax.
  ENDLOOP.
  DESCRIBE TABLE xfttax LINES tfill_xfttax.

*------- Buchungsdatentabelle (XFTPOST) abarbeiten im Loop -------------
  PERFORM xftpost_loop.

*------- Letzte Belegzeile übertragen ----------------------------------
  PERFORM position_uebertragen.

*------- Ausgleichsdaten (XFTCLEAR) abarbeiten -------------------------
  CLEAR dynnr.
  LOOP AT xftclear.
    AT NEW agkoa.
      PERFORM fcode_f06_f07.
    ENDAT.

    AT NEW agkon.
      PERFORM fcode_f06_f07.
    ENDAT.

    AT NEW agbuk.
      PERFORM fcode_f06_f07.
    ENDAT.

    AT NEW xnops.
      PERFORM fcode_f06_f07.
    ENDAT.

    AT NEW agums.
      PERFORM fcode_f06_f07.
    ENDAT.

    IF dynnr = '0710'.
      PERFORM bselk_uebergeben.
      CLEAR dynnr.
    ENDIF.

    loopc = ( loopc + 1 ) MOD 18.
    IF loopc = 0.
      loopc = 18.
    ENDIF.
    IF loopc = 1.
      PERFORM fcode_f05.
    ENDIF.
    PERFORM bselp_uebergeben.

    DESCRIBE TABLE ft LINES index.
  ENDLOOP.

*------- Transaktion abschließen ---------------------------------------

  PERFORM fcode_f11.
  IF xsimu = 'X'.
    PERFORM document_simulation.
  ENDIF.

*------- chang clear dmbtr add bdc---------------------------------------
  APPEND LINES OF t_bdcdata[] TO ft.

  PERFORM transaktion_beenden USING i_no_auth.

*------- Exportparameter zurückgeben (bei Call Transaction .. Using ..)-
  IF funct   = 'C'
  OR sgfunct = 'C'.
    e_subrc = subrc.
    e_msgty = msgty.
    e_msgid = msgid.
    e_msgno = msgno.
    e_msgv1 = msgv1.
    e_msgv2 = msgv2.
    e_msgv3 = msgv3.
    e_msgv4 = msgv4.
    LOOP AT xbltab.
      t_blntab = xbltab.
      APPEND t_blntab.
    ENDLOOP.
  ENDIF.
ENDFUNCTION.

第三个函数:POSTING_INTERFACE_END

FUNCTION ZFM_POSTING_INTERFACE_END.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  IMPORTING
*"     VALUE(I_BDCIMMED) LIKE  RFIPI-BDCIMMED DEFAULT SPACE
*"     VALUE(I_BDCSTRTDT) LIKE  TBTCJOB-SDLSTRTDT DEFAULT NO_DATE
*"     VALUE(I_BDCSTRTTM) LIKE  TBTCJOB-SDLSTRTTM DEFAULT NO_TIME
*"  EXCEPTIONS
*"      SESSION_NOT_PROCESSABLE
*"----------------------------------------------------------------------
  BDCIMMED  = I_BDCIMMED.
  BDCSTRTDT = I_BDCSTRTDT.
  BDCSTRTTM = I_BDCSTRTTM.

* falls kein Startdatum und keine Zeit übergeben werden soll
* erwartet der 'JOB_CLOSE' nicht initial sondern SPACE
  IF BDCSTRTDT IS INITIAL.
     MOVE SPACE TO BDCSTRTDT.
  ENDIF.
  IF BDCSTRTTM IS INITIAL.
     MOVE SPACE TO BDCSTRTTM.
  ENDIF.


  IF GROUP_OPEN = 'X'.
    CALL FUNCTION 'BDC_CLOSE_GROUP'.
    CLEAR GROUP_OPEN.
    IF ( FUNCT = 'B'  AND BDCIMMED = 'X' )
    OR ( FUNCT = 'B'  AND BDCSTRTDT NE SPACE ).
* fuer die IDOC-Verarbeitung soll sichergestellt werden, dass
* die Mappe existiert.
      COMMIT WORK.
      PERFORM MAPPE_ABSPIELEN_IM_BATCH.
    ENDIF.
  ENDIF.

  CLEAR:  BDCIMMED.
  BDCSTRTDT = SPACE.
  BDCSTRTTM = SPACE.

ENDFUNCTION.

调用代码

  LOOP AT lt_output ASSIGNING FIELD-SYMBOL(<fs_output>).
    CLEAR: gt_blntab ,
      gt_ftclear,
       gt_ftpost ,
       gt_fttax  ,
       gt_bdcdata.
    CALL FUNCTION 'ZFMPOSTING_INTERFACE_START'
      EXPORTING
        i_function         = 'C'
        i_keep             = 'X'
        i_mode             = lv_mode   "A for step by step,N default,for background
      EXCEPTIONS
        client_incorrect   = 1
        function_invalid   = 2
        group_name_missing = 3
        mode_invalid       = 4
        update_invalid     = 5
        OTHERS             = 6.
    "抬头
    mcr_populate_ftpost: 'K' 1 'BKPF-BUKRS' <fs_output>-bukrs, "Company code
                         'K' 1 'BKPF-BLART' 'AB',
                         'K' 1 'BKPF-BLDAT' sy-datum,
                         'K' 1 'BKPF-BUDAT' sy-datum,
                         'K' 1 'BKPF-WAERS' <fs_output>-waers,
                         'K' 1 'BKPF-XBLNR' '清帐凭证-ZFIE001D' .
    "收款凭证
    LOOP AT lt_bsid_rec ASSIGNING FIELD-SYMBOL(<fs_bsid_rec>)
                                     WHERE bukrs = <fs_output>-bukrs
                                       AND kunnr = <fs_output>-kunnr
                                       AND waers = <fs_output>-waers.
      mcr_populate_ftclear 'D'
                           <fs_bsid_rec>-bukrs
                           <fs_bsid_rec>-kunnr
                           <fs_bsid_rec>-belnr
                           <fs_bsid_rec>-gjahr
                           <fs_bsid_rec>-buzei.
    ENDLOOP.
    "发票凭证
    LOOP AT lt_output_tmp INTO gs_output WHERE bukrs = <fs_output>-bukrs
                                       AND kunnr = <fs_output>-kunnr
                                       AND waers = <fs_output>-waers.
      LOOP AT gt_so ASSIGNING FIELD-SYMBOL(<fs_so>)
                    WHERE zrelno = gs_output-zrelno.
        mcr_populate_ftclear 'D' <fs_so>-bukrs <fs_so>-kunnr <fs_so>-belnr <fs_so>-gjahr <fs_so>-buzei.
      ENDLOOP.
    ENDLOOP.
    "保存
    mcr_frm_bdc_dynpro 'SAPDF05X' '3100' 'X'.

    mcr_frm_bdc_field 'BDC_OKCODE' '=BU'.
    mcr_frm_bdc_field 'BDC_SUBSCR' 'SAPDF05X                                6104PAGE'.
    mcr_frm_bdc_field 'BDC_CURSOR' 'DF05B-PSZAH(01)'.
    mcr_frm_bdc_field 'RF05A-ABPOS' '9'.


    EXPORT line = 'X' TO MEMORY ID 'MF05AI00_D0730_OKCODE'.

    CALL FUNCTION 'ZFMPOSTING_INTERFACE_CLEARING'
      EXPORTING
        i_auglv                    = 'UMBUCHNG'
        i_tcode                    = 'FB05'
        i_sgfunct                  = 'C'
      IMPORTING
        e_msgid                    = sy-msgid
        e_msgno                    = sy-msgno
        e_msgty                    = sy-msgty
        e_msgv1                    = sy-msgv1
        e_msgv2                    = sy-msgv2
        e_msgv3                    = sy-msgv3
        e_msgv4                    = sy-msgv4
*       E_SUBRC                    = SY-SUBRC
      TABLES
        t_blntab                   = gt_blntab
        t_ftclear                  = gt_ftclear
        t_ftpost                   = gt_ftpost
        t_fttax                    = gt_fttax
        t_bdcdata                  = gt_bdcdata
      EXCEPTIONS
        clearing_procedure_invalid = 1
        clearing_procedure_missing = 2
        table_t041a_empty          = 3
        transaction_code_invalid   = 4
        amount_format_error        = 5
        too_many_line_items        = 6
        company_code_invalid       = 7
        screen_not_found           = 8
        no_authorization           = 9
        OTHERS                     = 10.

    IF sy-subrc = 0 AND gt_blntab IS NOT INITIAL.
      LOOP AT gt_output ASSIGNING FIELD-SYMBOL(<fs_output_tmp>)
                        WHERE bukrs = <fs_output>-bukrs
                          AND kunnr = <fs_output>-kunnr
                          AND waers = <fs_output>-waers.
*        <fs_output_tmp>-icon = icon_green_light.
        READ TABLE gt_blntab INTO gs_blntab INDEX 1.
*        <fs_output_tmp>-gjahr_hx = gs_blntab-gjahr.
*        <fs_output_tmp>-belnr_hx   = gs_blntab-belnr.
        IF sy-subrc EQ 0.
          UPDATE zfit001_rec SET gjahr_hx = gs_blntab-gjahr
                                 belnr_hx = gs_blntab-belnr
                                 zrkzt = '3'
                                 WHERE dtlseq = <fs_output>-dtlseq.
        ENDIF.
        DELETE gt_output.
      ENDLOOP.
      DELETE gt_so WHERE bukrs = <fs_output>-bukrs
                     AND kunnr = <fs_output>-kunnr.
    ELSE .
      LOOP AT gt_output ASSIGNING <fs_output_tmp>
                  WHERE bukrs = <fs_output>-bukrs
                    AND kunnr = <fs_output>-kunnr
                    AND waers = <fs_output>-waers.
        <fs_output_tmp>-icon = icon_red_light.

        MESSAGE ID sy-msgid TYPE 'E' NUMBER sy-msgno
           WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO <fs_output_tmp>-message.
      ENDLOOP.

    ENDIF.

    FREE MEMORY ID 'MF05AI00_D0730_OKCODE'.

    CALL FUNCTION 'ZFMPOSTING_INTERFACE_END'
      EXCEPTIONS
        session_not_processable = 1
        OTHERS                  = 2.
  ENDLOOP.

  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值