FM:POSTING_INTERFACE_CLEARING

目的:财务分别做预收款和开 billing,需要后续做清账对冲 DZ 和 RV。

逻辑:由于只需要模拟人工 F-32 做清账,只需要根据 XBLNR 找到借贷方进行对冲即可,因此程序非常简单,核心传递的值为 it_ftclear-selfd。由于 VF01 开票中已经做了拆分增强,所以 Billing 的金额和 DZ 的金额是无法对应上的,因此无法采用标准自动清账配置,必须开发实现。

函数:POSTING_INTERFACE_CLEARING;POSTING_INTERFACE_CLEARING 并非纯函数,本质上是调用 BDC。

清账逻辑:取出RV、DZ、DG,将 XBLNR 字段相同的行组合在一起,清账。处理异常,事务代码:F-32

  • SE16 查询表 BSAD 按 BUKRS、AUGBL、GJAHR 查询,可查询到清账凭证行及原始行信息
FORM frm_create_ab.
*重点需要解决的两个问题:1. 清账函数的使用;
*                    2. 清账数据的准备(按照公司业务逻辑).
  DATA: it_blntab  TYPE TABLE OF blntab WITH HEADER LINE,
        it_ftclear TYPE TABLE OF ftclear WITH HEADER LINE,
        it_ftpost  TYPE TABLE OF ftpost WITH HEADER LINE,
        it_fttax   TYPE TABLE OF fttax WITH HEADER LINE.
  DATA: lt_bsad_clearing TYPE TABLE OF bsad WITH HEADER LINE. "客户未清项表"
  DATA: lt_kunnr TYPE TABLE OF zthy_ecc_kunnr WITH HEADER LINE.
  DATA: lv_ftclear_agbuk TYPE bukrs. "清账公司代码"
  "每次处理一个客户的清账业务."
*宏.
*SELFD = Field Name from the Document Index
*SELVON = Input Field for Search Criterion for Selecting Open Items.
  DEFINE populate_ftclear.
    it_ftclear-agkoa  = &1.       "科目类型"
    it_ftclear-agbuk  = &2.       "公司代码"
    it_ftclear-xnops  = 'X'.      "标准未清项目"
    it_ftclear-AGUMS  = 'A'.      "特别总账未清项目"
    it_ftclear-selfd  = 'XBLNR'.  "凭证索引中的字段名(使用该字段搜索用来做对冲的借贷方)"
    it_ftclear-selvon = &3.       "Input Field for Search Criterion for Selecting Open Items"
    append it_ftclear.
  END-OF-DEFINITION.
 
  DEFINE populate_ftpost.
    it_ftpost-stype = &1.   "K为header,P为item"
    it_ftpost-count = &2.   "凭证抬头或行项目的计数器(记帐界面)"
    it_ftpost-fnam  = &3.   "BDC 字段名"
    it_ftpost-fval  = &4.   "BDC 字段值"
    append it_ftpost.
  END-OF-DEFINITION.
*1.Start of call transaction: SHDB.
  CALL FUNCTION 'POSTING_INTERFACE_START'
    EXPORTING
      i_client           = sy-mandt
      i_function         = 'C' "B= BDC, C= Call Trans"
      i_mode             = 'N' "N – no screen, A – all screen, E – Error"
      i_update           = 'S' "S: 数据更新完成后执行下一个操作"
      i_keep             = 'X' "用于已处理会话的队列删除标志"
      i_user             = sy-uname
    EXCEPTIONS
      client_incorrect   = 1
      function_invalid   = 2
      group_name_missing = 3
      mode_invalid       = 4
      update_invalid     = 5
      OTHERS             = 6.
  IF sy-subrc <> 0.
* Implement suitable error handling here
  ENDIF.
*2.Fill data for SHDB.
  populate_ftclear 'D' '1000' 'SA00012090'. "调用两次,一次借方,一次贷方."
*每执行一次添加一条清账行项目.如果借贷方分录不是正好等于两条,则应使用loop追加清账条目.
  populate_ftpost: 'K' 1 'BKPF-BUKRS' '1000',
                   'K' 1 'BKPF-BLART' 'AB',
                   'K' 1 'BKPF-BLDAT' sy-datum,
                   'K' 1 'BKPF-BUDAT' sy-datum,
                   'K' 1 'BKPF-XBLNR' 'SA00012090', "清账参考号"
                   'K' 1 'BKPF-WAERS' 'CNY'.
                   
**由于根据参考号(XBLNR)自动搜索清账的方式进行清账,因此行项目级别均不需要传值.
**               'P' 1 'RF05A-NEWBS' '17',
*                'P' 1 'RF05A-NEWBS' '18',  "通过FB05进行预收和应收对冲清账时,记账码为18(手工做F-32为17)
*                'P' 1 'RF05A-NEWUM' '',           "Special G/L indicator"
**               'P' 1 'BSEG-HKONT' '0011220001',
*                'P' 1 'BSEG-KUNNR' '0011000000',  "统驭科目"
**               'P' 1 'BSEG-WRBTR' '347.09',      "程序根据搜索条件自动搜出金额,无需指定"
*                'P' 1 'BSEG-ZFBDT' sy-datum,
*                'P' 1 'BSEG-SGTXT' '清账测试'.

  populate_ftpost: 'K' 2 'BKPF-BUKRS' '1000',
                   'K' 2 'BKPF-BLART' 'AB',
                   'K' 2 'BKPF-BLDAT' sy-datum,
                   'K' 2 'BKPF-BUDAT' sy-datum,
                   'K' 2 'BKPF-XBLNR' 'SA00012090', "清账参考号.
                   'K' 2 'BKPF-WAERS' 'CNY'.
**由于根据参考号(XBLNR)自动搜索清账的方式进行清账,因此行项目级别均不需要传值.
*                  'P' 2 'RF05A-NEWBS' '09',
*                  'P' 2 'RF05A-NEWUM' 'A',          "Special G/L indicator."
**                 'P' 2 'BSEG-HKONT' '0022030001',
*                  'P' 2 'BSEG-KUNNR' '0011000000',  "统驭科目"
**                 'P' 2 'BSEG-WRBTR' '347.09',      "程序根据搜索条件自动搜出金额,无需指定"
*                  'P' 2 'BSEG-ZFBDT' sy-datum,
*                  'P' 2 'BSEG-SGTXT' '清账测试'.
 
*3.Process BDC.
*每次只能传入一个清账分录.
*AUGLV  Purpose
*AUSGZAHL	Outgoing payment
*EINGZAHL	Incoming payment
*GUTSCHRI	Credit memo(W为承兑汇票,可能比较特殊)
*UMBUCHNG	Transfer posting with clearing
 
  CALL FUNCTION 'POSTING_INTERFACE_CLEARING' "Post with clearing (FB05) using internal posting interface
    EXPORTING
      i_auglv                    = 'AUSGZAHL'    " t041a-auglv   Clearing Transaction
      i_tcode                    = 'FB05'        " sy-tcode      Transaction code
      i_sgfunct                  = space         " rfipi-sgfunct  Different FUNCT function
    IMPORTING
      e_msgid                    = sy-msgid      " sy-msgid      Message ID 
      e_msgno                    = sy-msgno      " sy-msgno      Message number 
      e_msgty                    = sy-msgty      " sy-msgty      Message category 
      e_msgv1                    = sy-msgv1      " sy-msgv1      Message variable 1 
      e_msgv2                    = sy-msgv2      " sy-msgv2      Message variable 2 
      e_msgv3                    = sy-msgv3      " sy-msgv3      Message variable 3 
      e_msgv4                    = sy-msgv4      " sy-msgv4      Message variable 4
    TABLES
      t_blntab                   = it_blntab     " blntab        Table of the document numbers
      t_ftclear                  = it_ftclear    " ftclear       Clearing data
      t_ftpost                   = it_ftpost     " ftpost        Document header and item data
      t_fttax                    = it_fttax      " fttax         Taxes
    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 EQ 0.
    "清账成功,清账凭证信息存储在it_blntab中.
  ELSE.
    "清账失败,查看importing中的消息.
  ENDIF.
*4.After bdc processing.
  CALL FUNCTION 'POSTING_INTERFACE_END'
    EXPORTING
      i_bdcimmed              = 'X'
    EXCEPTIONS
      session_not_processable = 1
      OTHERS                  = 2.
*5.log record.
ENDFORM.