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

tech2023-09-30  108

如果需要用代码完成类似 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.

最新回复(0)