SAP FI 清账函数

前面几篇博客文章介绍 BAPI_ACC_DOCUMENT_POST 的使用,如果需要用代码完成类似 F-04 过账并清账的操作,可以顺序调用下面的三个函数:

- POSTING_INTERFACE_START
- POSTING_INTERFACE_CLEARING
- POSTING_INTERFACE_END

这三个函数在内部也是调用 BDC,但对于开发者来说,只需要给定参数,简化了编码的工作。

为了便于理解,假定我们需要对下面的会计凭证进行清账:


应付账款是未清项目,现在要对应付账款进行清账。先给出完整的代码,后面再对要点进行解释:

REPORT  z_post_clearing.

DEFINE populate_ftpost.
  clear ls_ftpost.
  ls_ftpost-stype = &1.
  ls_ftpost-count = &2.
  ls_ftpost-fnam  = &3.
  ls_ftpost-fval  = &4.
  append ls_ftpost to lt_ftpost.
END-OF-DEFINITION.

START-OF-SELECTION.
  PERFORM frm_post_clearing.

FORM frm_post_clearing.
  " ftclear 是清账的数据的表参数
  DATA:
      lt_ftclear TYPE STANDARD TABLE OF ftclear,
      ls_ftclear LIKE LINE OF lt_ftclear.


  " ftpost 是过账的抬头和行项目的表参数
  DATA:
      lt_ftpost TYPE STANDARD TABLE OF ftpost,
      ls_ftpost LIKE LINE OF lt_ftpost.

  DATA:
      lt_blntab  LIKE TABLE OF blntab  WITH HEADER LINE,
      lt_fttax   LIKE TABLE OF fttax   WITH HEADER LINE.

  " populate ftclear table parameter
  CLEAR ls_ftclear.
  ls_ftclear-agkoa = 'K'.  " k for vendor
  ls_ftclear-agbuk = 'Z900'.
  ls_ftclear-selfd = 'BELNR'.
  ls_ftclear-xnops = 'X'.
  ls_ftclear-selvon = '1900000001'.
  APPEND ls_ftclear TO lt_ftclear.

  " populate ftpost table paramter
  " 分为header和line item,line item按行填充
  " 首先填写header (K)
  populate_ftpost 'K' 1 'BKPF-BUKRS' 'Z900'. " company code
  populate_ftpost 'K' 1 'BKPF-BLART' 'KA'.   " document type
  populate_ftpost 'K' 1 'BKPF-BLDAT' sy-datum. " posting date
  populate_ftpost 'K' 1 'BKPF-BUDAT' sy-datum.
  populate_ftpost 'K' 1 'BKPF-WAERS' 'CNY'.    " currency
  populate_ftpost 'K' 1 'BKPF-BKTXT' 'Clearing 1900000001'. " header text

  " 按行填写行项目的字段 (P)
  populate_ftpost 'P' 1 'RF05A-NEWBS' '50'.         " posting key
  populate_ftpost 'P' 1 'BSEG-HKONT' '10010100'.  " G/L account
  populate_ftpost 'P' 1 'BSEG-SGTXT' 'Clearing vendor invoice'.
  populate_ftpost 'P' 1 'BSEG-WRBTR' '1700'.        " amount

  CALL FUNCTION 'POSTING_INTERFACE_START'
    EXPORTING
      i_client   = sy-mandt
      i_function = 'C'
      i_mode     = 'N'
      i_keep     = 'X'
      i_update   = 'S'
      i_user     = sy-uname.

  IF sy-subrc <> 0.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  CALL FUNCTION 'POSTING_INTERFACE_CLEARING'
    EXPORTING
      i_auglv                    = 'AUSGZAHL'
      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
    TABLES
      t_blntab                   = lt_blntab
      t_ftclear                  = lt_ftclear
      t_ftpost                   = lt_ftpost
      t_fttax                    = lt_fttax
    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.
    MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
            WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
  ENDIF.

  " keep track of document number
  READ TABLE lt_blntab INDEX 1.

  CALL FUNCTION 'POSTING_INTERFACE_END'
    EXCEPTIONS
      session_not_processable = 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.


  WRITE: lt_blntab-bukrs, lt_blntab-belnr, lt_blntab-gjahr, ' was posted successfully'.

ENDFORM.  

POSTING_INTERFACE_START 函数

CALL FUNCTION 'POSTING_INTERFACE_START'
EXPORTING
    i_client   = sy-mandt
    i_function = 'C'
    i_mode     = 'N'
    i_keep     = 'X'
    i_update   = 'S'
    i_user     = sy-uname.

这个函数主要给出 client, user id 以及后续 BDC 的一些参数。注意参数中 i_mode 参数,这个参数的含义与 BDC 模式的含义相同:

  • N 后台处理,没有界面和错误
  • E 提示错误,建议程在发布之前通过 E 模式调试错误,运行的时候可以跳转到前台调试,方便看出错误的原因
  • A 显示前台每一步操作,也可用于调试

POSTING_INTERFACE_CLEARING 函数

这个函数式程序处理的主体,调用代码如下:

CALL FUNCTION 'POSTING_INTERFACE_CLEARING'
    EXPORTING
        i_auglv                    = 'AUSGZAHL'
        i_tcode                    = 'FB05'
        i_sgfunct                  = 'C'    
    TABLES
        t_blntab                   = lt_blntab
        t_ftclear                  = lt_ftclear
        t_ftpost                   = lt_ftpost
        t_fttax                    = lt_fttax .

auglv 参数

auglv 参数表示清账过程,数据来自 T041A 表,比如上面的 AUSGZAHL 表示付款。

FTCLEAR 表参数

FTCLEAR 表参数是要要被清账的数据。对于本篇的会计凭证来说,我们要对应付账款(供应商)进行清账,所以需要填写 FTCLEAR 表参数如下:

  " ftclear 是清账的数据的表参数
  DATA:
      lt_ftclear TYPE STANDARD TABLE OF ftclear,
      ls_ftclear LIKE LINE OF lt_ftclear.

  " populate ftclear table parameter
  CLEAR ls_ftclear.
  ls_ftclear-agkoa = 'K'.  " k for vendor
  ls_ftclear-agbuk = 'Z900'.
  ls_ftclear-selfd = 'BELNR'.
  ls_ftclear-xnops = 'X'.  " No Special G/L items
  ls_ftclear-selvon = '1900000001'.
  APPEND ls_ftclear TO lt_ftclear.

可以看到,清账以会计凭证号码 1900000001 为基础,这是清账的一种方法而已。

FTPOST 表参数

FTPOST 表参数表示要过账的数据,包括 document header 和 line items。对于本次的过账凭证来说,最后生成的会计凭证为:

DR: 应付账款  1700
CR: 现金  (10010100)1700

贷方现金这一行就是过账数据,我们需要将 document header 和现金这一行填写到 PTPOST 参数中,为减少代码量,先定义一个宏。

DEFINE populate_ftpost.
  clear ls_ftpost.
  ls_ftpost-stype = &1.
  ls_ftpost-count = &2.
  ls_ftpost-fnam  = &3.
  ls_ftpost-fval  = &4.
  append ls_ftpost to lt_ftpost.
END-OF-DEFINITION.

  " ftpost 是过账的抬头和行项目的表参数
  DATA:
      lt_ftpost TYPE STANDARD TABLE OF ftpost,
      ls_ftpost LIKE LINE OF lt_ftpost.

  " populate ftpost table paramter
  " 分为header和line item,line item按行填充
  " 首先填写header (K)
  populate_ftpost 'K' 1 'BKPF-BUKRS' 'Z900'. " company code
  populate_ftpost 'K' 1 'BKPF-BLART' 'KA'.   " document type
  populate_ftpost 'K' 1 'BKPF-BLDAT' sy-datum. " posting date
  populate_ftpost 'K' 1 'BKPF-BUDAT' sy-datum.
  populate_ftpost 'K' 1 'BKPF-WAERS' 'CNY'.    " currency
  populate_ftpost 'K' 1 'BKPF-BKTXT' 'Clearing 1900000001'. " header text

  " 按行填写行项目的字段 (P)
  populate_ftpost 'P' 1 'RF05A-NEWBS' '50'.         " posting key
  populate_ftpost 'P' 1 'BSEG-HKONT' '10010100'.  " G/L account
  populate_ftpost 'P' 1 'BSEG-SGTXT' 'Clearing vendor invoice'.
  populate_ftpost 'P' 1 'BSEG-WRBTR' '1700'.        " amount

在填充参数的时候,ftpost-stype 为 K 表示 document header, P 表示 行项目。另外,我们可以看到,在一张凭证中 ftpost-count 用于关联 document header 和 line item。

blntab 表参数

blntab 表参数用于记录生成的会计凭证号码信息:

DATA:   lt_blntab  LIKE TABLE OF blntab  WITH HEADER LINE.

" keep track of document number
READ TABLE lt_blntab INDEX 1.

WRITE: lt_blntab-bukrs, lt_blntab-belnr, lt_blntab-gjahr, ' was posted successfully'.

POSTING_INTERFACE_END

如果 clearing 函数成功,调用函数 POSTING_INTERFACE_END

call function 'POSTING_INTERFACE_END'
  exporting
    i_bdcimmed              = 'X'
  exceptions
    session_not_processable = 1
    others                  = 2.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,192评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,858评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,517评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,148评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,162评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,905评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,537评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,439评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,956评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,083评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,218评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,899评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,565评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,093评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,201评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,539评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,215评论 2 358

推荐阅读更多精彩内容