ZFM_RFC_FIDOC-创建财务凭证-BAPI_ACC_DOCUMENT_CHECK/BAPI_ACC_DOCUMENT_POST/POSTING_INTERFACE_DOCUMENT

&---------------------------------------------------------------------
*& 包含 创建财务凭证使用
&---------------------------------------------------------------------
DATA:BEGIN OF gt_act OCCURS 0,

抬头
bukrs TYPE bkpf-bukrs, “公司代码
blart TYPE bkpf-blart, “凭证类型
budats(8) ,” 过账日期
budat(8) ,” 凭证日期
monat TYPE bkpf-monat, "过账期间
gjahr TYPE bkpf-gjahr, "会计年度
waers TYPE bkpf-waers, "货币码
wwert TYPE bkpf-wwert, "汇率换算日期
kursf TYPE bkpf-kursf, "汇率
bktxt TYPE bkpf-bktxt, "凭证抬头文本
"用户名
xblnr TYPE bkpf-xblnr, "参考


bschl TYPE bseg-bschl, "记帐代码
lifnr TYPE bseg-lifnr, "供应商编码
kunnr TYPE bseg-kunnr, "客户编码
anln1 TYPE bseg-anln1, "资产编码
umskz TYPE bseg-umskz, "特别总账标识
umsks TYPE bseg-umsks, "特定总帐事务类型
hkont TYPE bseg-hkont, "会计科目编码
hkontk TYPE bseg-hkont, "备选统御科目
xnegp, "反记账
wrbtr TYPE bseg-wrbtr, "凭证货币金额
pswsl TYPE bseg-pswsl, "凭证货币
dmbtr(16) , "本币金额

  • h_waers   TYPE  bseg-h_waers,"本位币货币
     prctr     TYPE  bseg-prctr, "利润中心
     kostl     TYPE  bseg-kostl, "成本中心
     aufnr     TYPE  bseg-aufnr, "订单
     sgtxt     TYPE  bseg-sgtxt, "文本
     zuonr     TYPE  bseg-zuonr, "分配
     zfbdt(8),                   "起算日期
     zterm(4),                   "付款条件
     matnr     TYPE  bseg-matnr, "物料号
     anbwa     TYPE  bseg-anbwa, "资产交易类型
     zlsch     TYPE  bseg-zlsch, "付款方式
     rstgr     TYPE  bseg-rstgr, "原因代码
     vbund     TYPE  bseg-vbund, "贸易伙伴
     xref3     TYPE  bseg-xref3, "销售办事处
     mwskz     TYPE  bseg-mwskz, "税码
     fkber     TYPE  bseg-fkber, "功能范围
     bewar     TYPE  bseg-bewar, "事物类型
    
  • ZZ001 "银行账号
    kndnr(10), "获利能力段客户
    prodh(18), "获利能力段产品层次

  •   newum(1),"特殊总账 需要大写
     projk(20),"工作分解结构元素 (WBS 元素)
     flag,"需要大写 客户/供应商
     xmwst     TYPE  bkpf-xmwst, "自动计算税额
    

    END OF gt_act.

DATA: wa_zexten LIKE zexten_cwgx. "ZEXTEN就是刚才SE11创建的那个结构

DATA: it_extension2 LIKE bapiparex OCCURS 0 WITH HEADER LINE.
DATA: g_n TYPE i.
DATA: g_index TYPE i.
DATA: BEGIN OF gw_tax,
bukrs TYPE bkpf-bukrs,
waers TYPE bkpf-waers , "货币码
mwskz TYPE bseg-mwskz, "税码
xmwst TYPE bkpf-xmwst, "计算税额
dmbtr TYPE bseg-wrbtr , "金额
buzei TYPE bseg-buzei , "行项目
sgtxt TYPE bseg-sgtxt , "行项目文本
zuonr TYPE bseg-zuonr , "行项目文本
END OF gw_tax.

DATA: gd_documentheader LIKE bapiache09,
gd_customercpd LIKE bapiacpa09,
gd_fica_hd LIKE bapiaccahd,
it_accountreceivable LIKE TABLE OF bapiacar09 WITH HEADER LINE, "客户
it_accountgl LIKE TABLE OF bapiacgl09 WITH HEADER LINE, "总账科目
it_accounttax LIKE TABLE OF bapiactx09 WITH HEADER LINE,
it_criteria LIKE TABLE OF bapiackec9 WITH HEADER LINE,
it_valuefield LIKE TABLE OF bapiackev9 WITH HEADER LINE,
it_currencyamount LIKE TABLE OF bapiaccr09 WITH HEADER LINE,
it_return LIKE TABLE OF bapiret2 WITH HEADER LINE,
it_receivers LIKE TABLE OF bdi_logsys WITH HEADER LINE,
it_fica_it LIKE TABLE OF bapiaccait WITH HEADER LINE,
it_accountpayable LIKE TABLE OF bapiacap09 WITH HEADER LINE, "供应商
it_paymentcard LIKE TABLE OF bapiacpc09 WITH HEADER LINE,
it_ext LIKE TABLE OF bapiacextc WITH HEADER LINE,
it_re LIKE TABLE OF bapiacre09 WITH HEADER LINE,
it_ext2 LIKE TABLE OF bapiparex WITH HEADER LINE,
it_extension LIKE TABLE OF bapiacextc WITH HEADER LINE.

DATA:gv_chcek TYPE c.

"BDC数据
DATA: it_blntab TYPE STANDARD TABLE OF blntab,
it_ftpost TYPE STANDARD TABLE OF ftpost,
it_fttax TYPE STANDARD TABLE OF fttax.
DATA:wa_blntab TYPE blntab,
wa_ftpost TYPE ftpost,
wa_fttax TYPE fttax.
DATA:g_prctr LIKE gt_act-prctr.
DATA:gw_act LIKE gt_act.

"返回参数使用
DATA:gv_pzbh TYPE char10, " 凭证编号
gv_qqid TYPE char16, " 请求id
gv_jkzt TYPE char1, " 接口状态
gv_jkxx TYPE char100. " 接口信息

"BDC数据
DATA:bdcdata LIKE bdcdata OCCURS 0 WITH HEADER LINE.
DATA:messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE.
DATA:bdcmode TYPE c VALUE ‘N’,
bdcupdate TYPE c VALUE ‘L’.

TYPES:BEGIN OF ty_items,
buzei TYPE string,
bschl TYPE string,
lifnr TYPE string,
bpname TYPE string,
kunnr TYPE string,
anln1 TYPE string,
umskz TYPE string,
umsks TYPE string,
hkont TYPE string,
hkontk TYPE string,
xnegp TYPE string,
wrbtr TYPE string,
pswsl TYPE string,
dmbtr TYPE string,
h_waers TYPE string,
prctr TYPE string,
kostl TYPE string,
aufnr TYPE string,
sgtxt TYPE string,
zuonr TYPE string,
zfbdt TYPE string,
zterm TYPE string,
matnr TYPE string,
anbwa TYPE string,
zlsch TYPE string,
rstgr TYPE string,
vbund TYPE string,
xref3 TYPE string,
mwskz TYPE string,
fkber TYPE string,
bewar TYPE string,
zz001 TYPE string,
kndnr TYPE string,
prodh TYPE string,
flag TYPE string,
END OF ty_items.

DATA:gs_items TYPE ty_items,
gt_items TYPE STANDARD TABLE OF ty_items.

TYPES: BEGIN OF ty_fidoc,
bukrs TYPE string,
blart TYPE string,
budat TYPE string,
bldat TYPE string,
monat TYPE string,
gjahr TYPE string,
waers TYPE string,
wwert TYPE string,
kursf TYPE string,
bktxt TYPE string,
usnam TYPE string,
zbelnr TYPE string,
xblnr TYPE string,
zaction TYPE string,
items LIKE gt_items,
END OF ty_fidoc.

DATA:gs_fidoc TYPE ty_fidoc,
gt_fidoc TYPE STANDARD TABLE OF ty_fidoc.

TYPES:BEGIN OF ty_fidoc_e,
zbelnr TYPE string,
status TYPE string,
msg TYPE string,
belnr TYPE string,
bukrs TYPE string,
gjahr TYPE string,
END OF ty_fidoc_e.

DATA:gs_fidoc_e TYPE ty_fidoc_e,
gt_fidoc_e TYPE STANDARD TABLE OF ty_fidoc_e.
FUNCTION zfm_rfc_fidoc.

*“----------------------------------------------------------------------
"“本地接口:
*” IMPORTING
*” VALUE(IV_DATA) TYPE STRING
*" EXPORTING
*" VALUE(EV_MESSAGE) TYPE STRING
*"----------------------------------------------------------------------
*(修改日志)--------------------------------------------------------
*

  • 日志号 修改人 修改时间 修改说明 传输号码

  • 001 李中原 20220601 创建 ED1K913650
  • 002 李中原 20220601 新增校验逻辑 ED1K913978

DATA:lv_zjxsl TYPE ztsmsl-zjxsl. "税率
DATA:ls_ztcwgxpz_log TYPE ztcwgxpz_log.

REFRESH gt_fidoc_e.

"记录日志使用
DATA: ls_log_tab TYPE zcat_log_info.
DATA: lv_nr_range_nr TYPE inri-nrrangenr,
lv_object TYPE inri-object.

IF iv_data IS INITIAL.
gv_jkzt = ‘E’.
gv_jkxx = ‘导入空值’.

gs_fidoc_e-status = 'E'.
gs_fidoc_e-msg = '导入空值'.
APPEND gs_fidoc_e TO gt_fidoc_e.

ELSE.

  • 解析异常捕捉
    TRY.
    CALL METHOD /ui2/cl_json=>deserialize
    EXPORTING
    json = iv_data
    CHANGING
    data = gt_fidoc.

    CATCH cx_sy_move_cast_error.

     gs_fidoc_e-status = 'E'.
     gs_fidoc_e-msg = '解析失败'.
     APPEND gs_fidoc_e TO gt_fidoc_e.
    

    ENDTRY.

ENDIF.

**必填字段检查

  • PERFORM frm_check_data TABLES it_zsfidoc_oa_t

  •                      USING ls_zsfidoc_oa
    
  •                            gv_jkxx.
    
  • IF gv_jkxx IS INITIAL.

*写入日志信息。
lv_object = ‘ZCANR001’.
lv_nr_range_nr = ‘01’.
CALL FUNCTION ‘NUMBER_GET_NEXT’
EXPORTING
nr_range_nr = lv_nr_range_nr
object = lv_object
quantity = ‘1’
IMPORTING
number = ls_log_tab-zlogn "日志编号。
EXCEPTIONS
interval_not_found = 1
number_range_not_intern = 2
object_not_found = 3
quantity_is_0 = 4
quantity_is_not_1 = 5
interval_overflow = 6
buffer_overflow = 7
OTHERS = 8.
CALL TRANSFORMATION id
SOURCE iv_data = iv_data
RESULT XML ls_log_tab-reque .
ls_log_tab-zsyss = ‘财务共享接口’ .
ls_log_tab-funco = ‘ZFM_RFC_FIDOC’.
ls_log_tab-intern = ‘创建财务凭证’ .
ls_log_tab-ernam = sy-uname .
ls_log_tab-erdat = sy-datum .
ls_log_tab-ertim = sy-uzeit .
ls_log_tab-ftype = ‘SOAP’ .
MODIFY zcat_log_info FROM ls_log_tab .
COMMIT WORK AND WAIT .

"赋关键值
LOOP AT gt_fidoc INTO gs_fidoc.

REFRESH gt_items.
REFRESH gt_act .
CLEAR gs_items.
CLEAR:gv_pzbh,
      gv_qqid,
      gv_jkzt,
      gv_jkxx.

IF gs_fidoc-zaction = 'C'."C校验。P传输
  gv_chcek = 'X'.
ENDIF.

gt_items[] = gs_fidoc-items[].

LOOP AT gt_items INTO gs_items.

  "抬头值
  gt_act-bukrs  =  gs_fidoc-bukrs. "公司代码
  gt_act-blart  =  gs_fidoc-blart. "凭证类型
  gt_act-budat  =  sy-datum.       "凭证中的创建日期
  gt_act-budats =  gs_fidoc-budat. "凭证中的过帐日期
  gt_act-monat  =  gs_fidoc-monat. "会计期间
  gt_act-gjahr  =  gs_fidoc-gjahr. "会计年度
  gt_act-waers  =  gs_fidoc-waers. "货币码
  gt_act-wwert  =  gs_fidoc-wwert. "汇率换算日期
  gt_act-kursf  =  gs_fidoc-kursf. "汇率
  gt_act-bktxt  =  gs_fidoc-bktxt. "凭证抬头
  gt_act-xblnr  =  gs_fidoc-xblnr. "参考凭证号

  "明细值
  gt_act-bschl  =  gs_items-bschl ."记帐代码
  gt_act-lifnr  =  gs_items-lifnr ."供应商编码
  gt_act-kunnr  =  gs_items-kunnr ."客户编码
  gt_act-anln1  =  gs_items-anln1 ."资产编码
  gt_act-umskz  =  gs_items-umskz ."特殊总账 需要大写
  gt_act-umsks  =  gs_items-umsks ."特定总帐事务类型

  IF gs_items-flag = 'D'.
    gt_act-hkont  =  gs_items-kunnr ."科目
  ELSEIF gs_items-flag = 'K'.
    gt_act-hkont  =  gs_items-lifnr ."科目

    "创建员工供应商公司页签
    IF gs_items-lifnr IS NOT INITIAL.
      PERFORM frm_xk01_bdc USING gs_items-lifnr
                                 gs_items-bpname
                                 gs_fidoc-bukrs.
    ENDIF.

  ELSEIF gs_items-flag = 'A'.
    gt_act-hkont  =  gs_items-anln1 ."科目
  ELSE.
    gt_act-hkont  =  gs_items-hkont ."科目
  ENDIF.

  gt_act-hkontk =  gs_items-hkontk."备选统驭科目
  gt_act-xnegp  =  gs_items-xnegp ."反记账

  "去除金额空格
  CONDENSE gs_items-dmbtr NO-GAPS.
  CONDENSE gs_items-wrbtr NO-GAPS.
  •   " 借贷处理
    SELECT SINGLE shkzg
      INTO @DATA(lv_shkzg)
      FROM tbsl
      WHERE bschl = @gs_items-bschl.
    IF lv_shkzg = 'H'.
      gt_act-dmbtr  =  gs_items-dmbtr * -1."金额
      gt_act-wrbtr  =  gs_items-wrbtr * -1."凭证货币金额
    ELSE.
      gt_act-dmbtr  =  gs_items-dmbtr."金额
      gt_act-wrbtr  =  gs_items-wrbtr."凭证货币金额
    ENDIF.
    
    gt_act-pswsl  =  gs_items-pswsl. "凭证货币
    gt_act-prctr  =  gs_items-prctr ."利润中心
    gt_act-kostl  =  gs_items-kostl ."成本中心
    gt_act-aufnr  =  gs_items-aufnr ."订单号
    gt_act-sgtxt  =  gs_items-sgtxt ."项目文本
    gt_act-zuonr  =  gs_items-zuonr ."分配编号
    gt_act-zfbdt  =  gs_items-zfbdt ."到期日计算的基限日期
    gt_act-zterm  =  gs_items-zterm ."付款条件代码
    gt_act-matnr  =  gs_items-matnr. "物料号
    gt_act-anbwa  =  gs_items-anbwa. "资产交易类型
    gt_act-zlsch  =  gs_items-zlsch. "付款方式
    gt_act-rstgr  =  gs_items-rstgr. "凭证行项目原因代码
    gt_act-vbund  =  gs_items-vbund. "贸易伙伴
    gt_act-xref3  =  gs_items-xref3. "销售办事处
    gt_act-mwskz  =  gs_items-mwskz. "税码
    

**税码处理"税率转税码处理

  •  CLEAR lv_zjxsl.
    
  •  IF gs_items-mwskz IS NOT INITIAL.
    
  •    DATA:lv_sl TYPE ty_items-mwskz.
    
  •    CLEAR:lv_sl.
    
  •    lv_sl = gs_items-mwskz.
    
  •    REPLACE '%' WITH '' INTO lv_sl.
    
  •    CONDENSE lv_sl NO-GAPS.
    
  •    lv_zjxsl = lv_sl / 100.
    
  •    CONDENSE lv_zjxsl NO-GAPS.
    
  •    SELECT SINGLE mwsk1 INTO gt_act-mwskz
    
  •      FROM ztsmsl
    
  •      WHERE zjxsl = lv_zjxsl
    
  •        AND mwsk1 LIKE 'J%'.
    
  •  ENDIF.
    
    gt_act-fkber  =  gs_items-fkber. "功能范围
    gt_act-bewar  =  gs_items-bewar. "事物类型
    gt_act-kndnr  =  gs_items-kndnr. "获利能力段的客户
    gt_act-prodh  =  gs_items-prodh. "获利能力段的产品层次
    
  •    gt_act-projk  =  gs_items-projk."工作分解结构元素 (WBS 元素)
    gt_act-flag   =  gs_items-flag . "需要大写 客户/供应商
    
  •    gt_act-xmwst  =  gs_items-xmwst."计算税额
    
    APPEND gt_act.
    

    ENDLOOP.

    IF gt_act[] IS INITIAL.
    gv_jkzt = ‘E’.
    gv_jkxx = ‘明细行必填!’.
    ELSE.

    IF gv_jkxx IS INITIAL.
    
      SELECT SINGLE
      *
      INTO ls_ztcwgxpz_log
      FROM ztcwgxpz_log
      WHERE zbelnr = gs_fidoc-zbelnr.
      IF sy-subrc = 0.
    
        gs_fidoc-zbelnr = ls_ztcwgxpz_log-zbelnr.
        gv_jkxx         = '创建成功'.
        gv_jkzt         = 'S'.
        gs_fidoc-bukrs  = ls_ztcwgxpz_log-bukrs.
        gv_pzbh         = ls_ztcwgxpz_log-belnr.
        gs_fidoc-gjahr  = ls_ztcwgxpz_log-gjahr.
    
      ELSE.
    
        "OA接口调用标识.只有OA接口调用才强制修改科目
        "财务共享一样的逻辑
        sy-ucomm = 'ZFM_OA_FIDOC'.
    
        "BAPI创建财务凭证
        PERFORM get_act_data.
    
      ENDIF.
    
    ENDIF.
    

    ENDIF.
    gs_fidoc_e-zbelnr = gs_fidoc-zbelnr.
    gs_fidoc_e-msg = gv_jkxx.
    gs_fidoc_e-status = gv_jkzt.

    IF gv_pzbh IS NOT INITIAL.
    gs_fidoc_e-bukrs = gs_fidoc-bukrs.
    gs_fidoc_e-belnr = gv_pzbh.
    gs_fidoc_e-gjahr = gs_fidoc-gjahr.

    "记录财务共享单据号和SAP财务凭证关系表
    MOVE-CORRESPONDING gs_fidoc_e TO ls_ztcwgxpz_log.
    MODIFY ztcwgxpz_log FROM ls_ztcwgxpz_log.
    COMMIT WORK AND WAIT.
    

    ENDIF.

    APPEND gs_fidoc_e TO gt_fidoc_e.

    ENDLOOP.

    CALL METHOD cl_fdt_json=>data_to_json
    EXPORTING
    ia_data = gt_fidoc_e
    RECEIVING
    rv_json = ev_message.

*调用日志
CALL TRANSFORMATION id
SOURCE
ev_message = ev_message
gt_fidoc_e = gt_fidoc_e[]
gt_act = gt_act[]
gt_fidoc = gt_fidoc[]
gt_items = gt_items[]
RESULT XML ls_log_tab-respo .
REPLACE FIRST OCCURRENCE OF ‘/’ IN ls_log_tab-innid WITH space .
CONDENSE ls_log_tab-innid .

UPDATE zcat_log_info
SET respo = ls_log_tab-respo
innid = ls_log_tab-innid
ifmsg = gv_jkzt
WHERE zlogn = ls_log_tab-zlogn.
IF sy-subrc = 0 .
COMMIT WORK AND WAIT .
ENDIF .

ENDFUNCTION.

----------------------------------------------------------------------
***INCLUDE LZFG_FOR_CWGXF02.
----------------------------------------------------------------------
*财务凭证创建专用—参照ZFI011
----------------------------------------------------------------------
&---------------------------------------------------------------------
*& Form GET_ACT_DATA
&---------------------------------------------------------------------

  •   财务凭证创建
    

----------------------------------------------------------------------
FORM get_act_data .

DATA:l_newum LIKE gt_act-umskz.
DATA:l_tabix TYPE sy-tabix.
DATA: wa_zfiextn TYPE zexten1 .

LOOP AT gt_act.

CLEAR it_extension2.
CLEAR wa_zexten.

l_tabix = sy-tabix.

"转大写
TRANSLATE gt_act-blart TO UPPER CASE.
TRANSLATE gt_act-waers TO UPPER CASE.
TRANSLATE gt_act-umskz TO UPPER CASE.
TRANSLATE gt_act-flag  TO UPPER CASE.
TRANSLATE gt_act-xnegp TO UPPER CASE.
TRANSLATE gt_act-mwskz TO UPPER CASE."税码ADDED BY CYJ 20160225
TRANSLATE gt_act-xmwst TO UPPER CASE."计算税额ADDED BY CYJ 20160225

"补零
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  EXPORTING
    input  = gt_act-hkont
  IMPORTING
    output = gt_act-hkont.

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  EXPORTING
    input  = gt_act-kostl
  IMPORTING
    output = gt_act-kostl.

CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
  EXPORTING
    input  = gt_act-zuonr
  IMPORTING
    output = gt_act-zuonr.

"行项目
g_n = g_n + 1.

*—"ADDED BY CYJ 20160127 W特殊总账只能用BDC
IF gt_act-umskz = ‘W’.
l_newum = gt_act-umskz."存储特殊总账标志
ENDIF.
*—"END OF ADDED BY CYJ 20160127

IF gt_act-budat <> ''.

*—"ADDED BY CYJ 20160226 自动计算税
CLEAR gw_tax.
gw_tax-bukrs = gt_act-bukrs.
gw_tax-waers = gt_act-waers . "货币码
*—"END OF ADDED BY CYJ 20160226
PERFORM fill_header.
ENDIF.

CASE gt_act-flag.
  WHEN 'K'."供应商
    PERFORM fill_accountpayable.
  WHEN 'D'."客户
    PERFORM fill_accountreceivable.
  WHEN 'A'."资产
    PERFORM fill_accountgl_zc.
  WHEN ''.
    PERFORM fill_accountgl.
ENDCASE.
  • CLEAR it_extension2.
  • WA_ZFIEXTN-POSNR = g_n.
  •  IF gt_act-dmbtr > 0.
    
  •    WA_ZFIEXTN-BSCHL = '29'."记账代码 增强字段
    
  •  ELSE.
    
  •    WA_ZFIEXTN-BSCHL = '39'."记账代码 增强字段
    
  •  ENDIF.
    
  • it_extension2-STRUCTURE = ‘ZEXTEN1’.
  • it_extension2-VALUEPART1 = WA_ZFIEXTN.
  • APPEND it_extension2.
wa_zexten-posnr = g_n. "凭证行项目
wa_zexten-bschl = gt_act-bschl. "记帐代码
wa_zexten-anbwa = gt_act-anbwa. "资产交易类型
it_extension2-structure  = 'ZEXTEN_CWGX'.
it_extension2-valuepart1 = wa_zexten.
APPEND it_extension2.

"货币项目
PERFORM fill_currencyamount.

*—"ADDED BY CYJ 20160127 W特殊总账只能用BDC
IF gt_act-budat <> ‘’.
PERFORM fill_header_bdc.
ENDIF.

PERFORM frm_item_bdc."行项目数据
gw_act = gt_act."存储上次行项目

IF gt_act-mwskz IS NOT INITIAL.
  gw_tax-mwskz     =  gt_act-mwskz. "税码
ENDIF.

IF gt_act-xmwst IS NOT INITIAL.
  gw_tax-xmwst     =  gt_act-xmwst. "计算税额
  gw_tax-dmbtr     =  gt_act-dmbtr.
  gw_tax-buzei     =  g_n.
ENDIF.

IF gt_act-sgtxt IS NOT INITIAL.
  gw_tax-sgtxt     =  gt_act-sgtxt. "
ENDIF.

IF gt_act-zuonr IS NOT INITIAL.
  gw_tax-zuonr     =  gt_act-zuonr. "
ENDIF.

*—"END OF ADDED BY CYJ 20160127

AT LAST.

  IF l_newum <> 'W'."ADDED BY CYJ 20160127 W特殊总账只能用BDC
    PERFORM frm_cal_tax ."自动计算税额
    PERFORM post. "调用BAPI创建财务凭证

*—"ADDED BY CYJ 20160127 W特殊总账只能用BDC
ELSE.
READ TABLE gt_act INDEX l_tabix.
PERFORM post_bdc."BDC创建凭证
ENDIF.

  "清除相关变量
  CLEAR g_n.
  REFRESH:
  it_return,
  it_ftpost,
  it_blntab,
  it_fttax.

  CLEAR:
  it_return,
  wa_ftpost,
  it_blntab,
  it_fttax.

*—"ADDED BY CYJ 20160127

  REFRESH:
  it_accountreceivable,
  it_accountgl,
  it_currencyamount,
  it_accounttax,
  it_return,
  it_accountpayable,
  it_ext2,
  it_extension2,
  it_criteria.

  CLEAR:
  it_accountreceivable,
  it_accountgl,
  it_currencyamount,
  it_accounttax,
  it_return,
  it_accountpayable,
  it_ext2,
  it_extension2,
  it_criteria.

ENDAT.

ENDLOOP.

ENDFORM.
&---------------------------------------------------------------------
*& Form FRM_CAL_TAX
&---------------------------------------------------------------------

  •   自动计算税额
    

----------------------------------------------------------------------
FORM frm_cal_tax .

CHECK gw_tax-xmwst IS NOT INITIAL.
DATA t_tax_info TYPE STANDARD TABLE OF rtax1u15 WITH HEADER LINE.
DATA:l_index TYPE sy-tabix.
DATA:l_dmbtr LIKE gw_tax-dmbtr.

  • GW_TAX-DMBTR = 0 - GW_TAX-DMBTR.
    CALL FUNCTION ‘CALCULATE_TAX_FROM_GROSSAMOUNT’
    EXPORTING
    i_bukrs = gw_tax-bukrs "公司代码
    i_mwskz = gw_tax-mwskz "税码
    i_waers = gw_tax-waers "币种
    i_wrbtr = gw_tax-dmbtr "金额
    TABLES
    t_mwdat = t_tax_info.
    DATA ls_currencyamount LIKE LINE OF it_currencyamount.
    DATA ls_accounttax LIKE LINE OF it_accounttax.
  • Now I loop the t_tax_info table in order to fill the ACCOUNTTAX and CURRENCYAMOUNT tables:LOOP AT t_tax_info.
    DESCRIBE TABLE it_currencyamount LINES l_index.
    LOOP AT t_tax_info.
    g_n = g_n + 1.
    "向税额表中填充数据
    CLEAR ls_accounttax.
    ls_accounttax-itemno_acc = g_n.
    ls_accounttax-tax_code = gw_tax-mwskz.
    ls_accounttax-acct_key = t_tax_info-ktosl.
    ls_accounttax-cond_key = t_tax_info-kschl.
    ls_accounttax-taxjurcode = t_tax_info-txjcd.
    ls_accounttax-taxjurcode_deep = t_tax_info-txjcd_deep.
    ls_accounttax-taxjurcode_level = t_tax_info-txjlv.
    APPEND ls_accounttax TO it_accounttax.
    "向金额表中填入响应的税额
    CLEAR ls_currencyamount.
    ls_currencyamount-itemno_acc = ls_accounttax-itemno_acc.
    ls_currencyamount-currency = gw_tax-waers.
    ls_currencyamount-amt_doccur = t_tax_info-wmwst.
    ls_currencyamount-amt_base = t_tax_info-kawrt.
    APPEND ls_currencyamount TO it_currencyamount.
    l_dmbtr = l_dmbtr + t_tax_info-kawrt.
    ENDLOOP.
    "修正自动计算税额行的金额(由于实际计算出的不含税金额与系统计算会出现误差,故不手工计算不含税金额)
    READ TABLE it_currencyamount INTO ls_currencyamount WITH KEY itemno_acc = gw_tax-buzei.
    IF sy-subrc = 0.
    ls_currencyamount-amt_doccur = l_dmbtr.
    MODIFY it_currencyamount FROM ls_currencyamount INDEX sy-tabix.
    ENDIF.

ENDFORM.
&---------------------------------------------------------------------
*& Form POST
&---------------------------------------------------------------------

  •   BAPI创建财务凭证
    

----------------------------------------------------------------------
FORM post .
DATA:lv_key TYPE bapiache09-obj_key.

CALL FUNCTION ‘BAPI_ACC_DOCUMENT_CHECK’
EXPORTING
documentheader = gd_documentheader
customercpd = gd_customercpd
contractheader = gd_fica_hd
TABLES
accountgl = it_accountgl
accountreceivable = it_accountreceivable
accountpayable = it_accountpayable
accounttax = it_accounttax
currencyamount = it_currencyamount
criteria = it_criteria
valuefield = it_valuefield

  • EXTENSION1        = IT_EXTENSION
    extension2        = it_extension2
    return            = it_return
    paymentcard       = it_paymentcard
    contractitem      = it_fica_it
    realestate        = it_re.
    

    READ TABLE it_return INTO DATA(ls_return) WITH KEY type = ‘S’.
    IF sy-subrc = 0.

    IF gv_chcek = ‘X’.

  •  gv_pzbh = lv_key+0(10).
    gv_jkzt = 'S'.
    gv_jkxx = '测试成功'.
    

    ELSE.
    REFRESH: it_return.

    CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
      EXPORTING
        documentheader    = gd_documentheader
        customercpd       = gd_customercpd
        contractheader    = gd_fica_hd
      IMPORTING
        obj_key           = lv_key
      TABLES
        accountgl         = it_accountgl
        accountreceivable = it_accountreceivable
        accountpayable    = it_accountpayable
        accounttax        = it_accounttax
        currencyamount    = it_currencyamount
        criteria          = it_criteria
        valuefield        = it_valuefield
    
  •     EXTENSION1        = IT_EXTENSION
        extension2        = it_extension2
        return            = it_return
        paymentcard       = it_paymentcard
        contractitem      = it_fica_it
        realestate        = it_re.
    
    READ TABLE it_return INTO ls_return WITH KEY type = 'S'.
    IF sy-subrc = 0.
      COMMIT WORK AND WAIT .
    
      gv_pzbh = lv_key+0(10).
      gv_jkzt = 'S'.
      gv_jkxx = '创建成功'.
    
    ELSE.
      ROLLBACK WORK.
    
      CLEAR gv_jkxx.
      LOOP AT it_return INTO ls_return WHERE type = 'E'.
    
        IF gv_jkxx NS ls_return-message.
          gv_jkxx  = gv_jkxx && ls_return-message.
        ENDIF.
    
      ENDLOOP.
    
      gv_jkzt = 'E'.
    
    ENDIF.
    

    ENDIF.

    ELSE.

    CLEAR gv_jkxx.
    LOOP AT it_return INTO ls_return WHERE type = ‘E’.

    IF gv_jkxx NS ls_return-message.
      gv_jkxx  = gv_jkxx && ls_return-message.
    ENDIF.
    

    ENDLOOP.

    gv_jkzt = ‘E’.

    ENDIF.

ENDFORM.
&---------------------------------------------------------------------
*& Form FILL_HEADER
&---------------------------------------------------------------------

  •   财务凭证表头
    

----------------------------------------------------------------------
FORM fill_header .

gd_documentheader-comp_code = gt_act-bukrs.
gd_documentheader-doc_type = gt_act-blart.
gd_documentheader-doc_date = gt_act-budat.
gd_documentheader-pstng_date = gt_act-budats.
gd_documentheader-fis_period = gt_act-monat.
gd_documentheader-fisc_year = gt_act-gjahr.
gd_documentheader-trans_date = gt_act-wwert.
gd_documentheader-header_txt = gt_act-bktxt. "#EC NOTEXT
gd_documentheader-username = sy-uname.
gd_documentheader-bus_act = ‘RFBU’.
gd_documentheader-ref_doc_no = gt_act-xblnr.

ENDFORM.
&---------------------------------------------------------------------
*& Form FILL_ACCOUNTPAYABLE
&---------------------------------------------------------------------

  •   供应商项目
    

----------------------------------------------------------------------
FORM fill_accountpayable .

CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_INPUT’
EXPORTING
input = gt_act-hkont
IMPORTING
output = gt_act-hkont.

CLEAR it_accountpayable.

it_accountpayable-itemno_acc = g_n.
IF gt_act-hkontk IS NOT INITIAL.
it_accountpayable-gl_account = gt_act-hkontk.
ENDIF.

it_accountpayable-vendor_no = gt_act-hkont.
it_accountpayable-sp_gl_ind = gt_act-umskz.
it_accountpayable-pmnttrms = gt_act-zterm.
it_accountpayable-bline_date = gt_act-zfbdt.
it_accountpayable-alloc_nmbr = gt_act-zuonr.
it_accountpayable-item_text = gt_act-sgtxt.
APPEND it_accountpayable.

ENDFORM.

&---------------------------------------------------------------------
*& Form FILL_ACCOUNTRECEIVABLE
&---------------------------------------------------------------------

  •    客户项目
    

----------------------------------------------------------------------
FORM fill_accountreceivable .
CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_INPUT’
EXPORTING
input = gt_act-hkont
IMPORTING
output = gt_act-hkont.

CLEAR it_accountreceivable.

it_accountreceivable-itemno_acc = g_n.

it_accountreceivable-customer = gt_act-hkont.
it_accountreceivable-gl_account = gt_act-hkontk.
it_accountreceivable-sp_gl_ind = gt_act-umskz.
it_accountreceivable-pmnttrms = gt_act-zterm.
it_accountreceivable-bline_date = gt_act-zfbdt.
it_accountreceivable-alloc_nmbr = gt_act-zuonr.
it_accountreceivable-item_text = gt_act-sgtxt.
APPEND it_accountreceivable.

ENDFORM. " FILL_ACCOUNTRECEIVABLE
&---------------------------------------------------------------------
*& Form FILL_ACCOUNTGL
&---------------------------------------------------------------------

  •   总帐科目项
    

----------------------------------------------------------------------
FORM fill_accountgl .

CLEAR it_accountgl.
it_accountgl-itemno_acc = g_n.
it_accountgl-gl_account = gt_act-hkont.

CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_INPUT’
EXPORTING
input = gt_act-prctr
IMPORTING
output = gt_act-prctr.

it_accountgl-costcenter = gt_act-kostl.
"ADDED BY CYJ 20160226 自动计算税额
IF gt_act-mwskz IS NOT INITIAL.
it_accountgl-tax_code = gt_act-mwskz.
ENDIF.
"END OF ADDED BY CYJ 20160226
it_accountgl-alloc_nmbr = gt_act-zuonr.
it_accountgl-item_text = gt_act-sgtxt. "#EC NOTEXT

CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_INPUT’
EXPORTING
input = gt_act-aufnr
IMPORTING
output = gt_act-aufnr.

it_accountgl-orderid = gt_act-aufnr.
IF gt_act-projk <> ‘’.
it_accountgl-wbs_element = gt_act-projk.
ENDIF.
IF gt_act-prctr <> ‘’.
it_accountgl-profit_ctr = gt_act-prctr.
ENDIF.
APPEND it_accountgl.

IF gt_act-rstgr <> ‘’ OR gt_act-xnegp <> ‘’ .
*& EXTENSION2 扩展字段增强部分
wa_zexten-posnr = g_n. "凭证行项目
wa_zexten-rstgr = gt_act-rstgr. "凭证行项目原因代码
wa_zexten-xnegp = gt_act-xnegp. "反记帐
it_extension2-structure = ‘ZEXTEN_CWGX’.
it_extension2-valuepart1 = wa_zexten.
APPEND it_extension2.
ENDIF.

IF gt_act-kndnr <> ‘’ OR gt_act-prodh <> ‘’ .
it_criteria-itemno_acc = g_n."凭证行项目
it_criteria-fieldname = ‘KNDNR’."获利能力段的客户
it_criteria-character = gt_act-kndnr.
APPEND it_criteria.
CLEAR it_criteria.

it_criteria-itemno_acc = g_n.
it_criteria-fieldname	= 'PRODH'."获利能力段的产品层次
it_criteria-character	= gt_act-prodh.
APPEND it_criteria.
CLEAR it_criteria.

ENDIF.

ENDFORM.
&---------------------------------------------------------------------
*& Form FILL_CURRENCYAMOUNT
&---------------------------------------------------------------------

  •   货币项目
    

----------------------------------------------------------------------
FORM fill_currencyamount .

CLEAR it_currencyamount.
it_currencyamount-itemno_acc = g_n.
it_currencyamount-currency = gt_act-waers.

  • it_currencyamount-amt_doccur = gt_act-dmbtr.
    it_currencyamount-amt_doccur = gt_act-wrbtr.
    it_currencyamount-exch_rate = gt_act-kursf.
    APPEND it_currencyamount.

  • it_currencyamount-itemno_acc = g_n.

  • it_currencyamount-amt_doccur = gt_act-wrbtr. "外币金额

  • it_currencyamount-curr_type = ‘00’.

  • it_currencyamount-currency = gt_act-pswsl.

  • APPEND it_currencyamount.

ENDFORM.
&---------------------------------------------------------------------
*& Form FILL_HEADER_BDC
&---------------------------------------------------------------------

  •   特殊总账W抬头
    

----------------------------------------------------------------------
FORM fill_header_bdc .

IF it_ftpost[] IS INITIAL.
"赋值FTPOST
PERFORM frm_set_ftpost USING:
‘K’ ‘001’ ‘BKPF-BUKRS’ gt_act-bukrs,
‘K’ ‘001’ ‘BKPF-BLDAT’ gt_act-budat,
‘K’ ‘001’ ‘BKPF-BUDAT’ gt_act-budats,
‘K’ ‘001’ ‘BKPF-MONAT’ gt_act-monat,
‘K’ ‘001’ ‘BKPF-BLART’ gt_act-blart,
‘K’ ‘001’ ‘BKPF-WAERS’ gt_act-waers,
‘K’ ‘001’ ‘BKPF-XBLNR’ gt_act-xblnr,
‘K’ ‘001’ ‘BKPF-BKTXT’ gt_act-bktxt.

IF gt_act-wwert <> '00000000'.
  PERFORM frm_set_ftpost USING:
        'K' '001' 'BKPF-WWERT' gt_act-wwert.
ENDIF.

ENDIF.

ENDFORM.
&---------------------------------------------------------------------
*& Form FRM_SET_FTPOST
&---------------------------------------------------------------------

  •   赋值FTPOST
    

----------------------------------------------------------------------

  •  -->P_0862   text
    
  •  -->P_0863   text
    
  •  -->P_0864   text
    
  •  -->P_GT_ACT_BUKRS  text
    

----------------------------------------------------------------------
FORM frm_set_ftpost USING p_l_stype
p_l_count
p_l_fnam
p_l_fval.
wa_ftpost-stype = p_l_stype.
wa_ftpost-count = p_l_count.
wa_ftpost-fnam = p_l_fnam.
wa_ftpost-fval = p_l_fval.
IF p_l_fnam = ‘BSEG-WRBTR’.
CONDENSE wa_ftpost-fval.
ENDIF.
APPEND wa_ftpost TO it_ftpost.
ENDFORM. " FRM_SET_FTPOST
&---------------------------------------------------------------------
*& Form FRM_ITEM_BDC
&---------------------------------------------------------------------

  •   特殊总账W行项目
    

----------------------------------------------------------------------
FORM frm_item_bdc .

DATA:l_string TYPE string.
DATA:l_bschl TYPE bschl.

g_index = g_index + 1.
l_bschl = gt_act-bschl.
gt_act-wrbtr = abs( gt_act-wrbtr ).
l_string = gt_act-wrbtr.

CONDENSE l_string.

IF gt_act-umskz = ‘W’.

*-----汇票类型
"第一个非总账行项目,取其利润中心到银行科目行中
IF g_index = 1.
g_prctr = gt_act-prctr."利润中心
ENDIF.

PERFORM frm_set_ftpost USING:
      'P' g_index 'RF05A-NEWBS' l_bschl,"记帐代码
      'P' g_index 'RF05A-NEWKO' gt_act-hkont,"会计科目编码
      'P' g_index 'RF05A-NEWUM' gt_act-umskz."特别总账标识

PERFORM frm_set_ftpost USING:
      'P' g_index 'BSEG-WRBTR' l_string,"货币金额
      'P' g_index 'BSEG-ZUONR' gt_act-zuonr,"分配
      'P' g_index 'BSEG-SGTXT' gt_act-sgtxt."文本

IF gt_act-rstgr IS NOT INITIAL.
  PERFORM frm_set_ftpost USING:
        'P' g_index 'BSEG-RSTGR' gt_act-rstgr."原因代码
ENDIF.
IF gt_act-zfbdt IS NOT INITIAL.
  PERFORM frm_set_ftpost USING:
         'P' g_index 'BSEG-ZFBDT' gt_act-zfbdt."起算日期
ENDIF.

ELSE.

IF gt_act-flag = 'K'.

*------供应商
"第一个非总账行项目,取其利润中心到银行科目行中
IF g_index = 1.
g_prctr = gt_act-prctr.“利润中心
ENDIF.
PERFORM frm_set_ftpost USING:
‘P’ g_index ‘RF05A-NEWBS’ l_bschl,“记帐代码
‘P’ g_index ‘RF05A-NEWKO’ gt_act-hkont,”
‘P’ g_index ‘RF05A-NEWUM’ gt_act-umskz.”

  PERFORM frm_set_ftpost USING:
        'P' g_index 'BSEG-WRBTR' l_string,"
        'P' g_index 'BSEG-ZUONR' gt_act-zuonr,"
        'P' g_index 'BSEG-SGTXT' gt_act-sgtxt."

  IF gt_act-rstgr IS NOT INITIAL.
    PERFORM frm_set_ftpost USING:
           'P' g_index 'BSEG-RSTGR' gt_act-rstgr."
  ENDIF.

  IF gt_act-zfbdt IS NOT INITIAL.
    PERFORM frm_set_ftpost USING:
           'P' g_index 'BSEG-ZFBDT' gt_act-zfbdt."
  ENDIF.

  "利润中心?
ELSEIF gt_act-flag = 'D'."客户

  "第一个非总账行项目,取其利润中心到银行科目行中
  IF g_index = 1.
    g_prctr = gt_act-prctr."利润中心
  •      L_VBUND = GT_ACT-VBUND."贸易伙伴
    ENDIF.
    
    PERFORM frm_set_ftpost USING:
          'P' g_index 'RF05A-NEWBS' l_bschl,"记帐代码
          'P' g_index 'RF05A-NEWKO' gt_act-hkont,"
          'P' g_index 'RF05A-NEWUM' gt_act-umskz."
    
    PERFORM frm_set_ftpost USING:
          'P' g_index 'BSEG-WRBTR' l_string,"
          'P' g_index 'BSEG-ZUONR' gt_act-zuonr,"
          'P' g_index 'BSEG-SGTXT' gt_act-sgtxt."
    IF gt_act-rstgr IS NOT INITIAL.
      PERFORM frm_set_ftpost USING:
            'P' g_index 'BSEG-RSTGR' gt_act-rstgr."
    ENDIF.
    IF gt_act-zfbdt IS NOT INITIAL.
      PERFORM frm_set_ftpost USING:
            'P' g_index 'BSEG-ZFBDT' gt_act-zfbdt."
    ENDIF.
    

    ELSE."总账
    "第一个非总账行项目,取相关数据到银行科目行中
    IF g_index = 1.

  •      L_VBUND = GT_ACT-VBUND."贸易伙伴
    ENDIF.
    PERFORM frm_set_ftpost USING:
          'P' g_index 'RF05A-NEWBS' l_bschl,"记帐代码
          'P' g_index 'RF05A-NEWKO' gt_act-hkont."
    
    PERFORM frm_set_ftpost USING:
          'P' g_index 'BSEG-WRBTR' l_string,"
          'P' g_index 'BSEG-ZUONR' gt_act-zuonr,"
          'P' g_index 'BSEG-SGTXT' gt_act-sgtxt,"
    
  •                                  'P' G_INDEX 'COBL-KOSTL' GT_ACT-KOSTL,
    
  •                                    'P' G_INDEX 'COBL-AUFNR' GT_ACT-AUFNR,
          'P' g_index 'COBL-PRCTR' gt_act-prctr."
    IF gt_act-rstgr IS NOT INITIAL.
      PERFORM frm_set_ftpost USING:
             'P' g_index 'BSEG-RSTGR' gt_act-rstgr."
    ENDIF.
    
    "银行项目,需要输入资金预算项目、原因代码、业务类型
    
  •    IF GT_ACT-ZFKKM BETWEEN '1000000000' AND '1099999999'.
    
  •      PERFORM FRM_SET_FTPOST USING: 'P' G_INDEX 'COBL-ZZ001' WA_ZTCMCMM002-ZS001,"收方资金预算项目
    
  •                                    'P' G_INDEX 'BSEG-RSTGR' WA_ZTCMCMM002-ZSTGR,"收方原因代码
    
  •                                    'P' G_INDEX 'BSEG-XREF3' WA_ZTCMCMM002-ZYWLX."业务类型
    
  •    ENDIF.
    

    ENDIF.
    ENDIF.
    IF gt_act-mwskz IS NOT INITIAL.
    PERFORM frm_set_ftpost USING:
    ‘P’ g_index ‘BSEG-MWSKZ’ gt_act-mwskz."
    ENDIF.

    IF gt_act-xmwst IS NOT INITIAL.
    PERFORM frm_set_ftpost USING:
    ‘K’ ‘001’ ‘BKPF-XMWST’ gt_act-xmwst."计算税码ADDED BY CYJ 20160225
    ENDIF.

ENDFORM.
&---------------------------------------------------------------------
*& Form POST_BDC
&---------------------------------------------------------------------

  •   特殊总账W过账
    

----------------------------------------------------------------------
FORM post_bdc .

DATA: e_msgid TYPE sy-msgid,
e_msgno TYPE sy-msgno,
e_msgty TYPE sy-msgty,
e_msgv1 TYPE sy-msgv1,
e_msgv2 TYPE sy-msgv2,
e_msgv3 TYPE sy-msgv3,
e_msgv4 TYPE sy-msgv4,
e_subrc TYPE sy-subrc.

DATA: l_hkont TYPE hkont,
l_belnr TYPE belnr_d.

DATA: l_string TYPE string.

REFRESH:it_return.

IF gv_chcek = ‘X’.

  •  gv_pzbh = lv_key+0(10).
    

    gv_jkzt = ‘S’.
    gv_jkxx = ‘特殊总账W过账,不能测试’.

    ELSE.

*–开始
DATA:l_mode TYPE rfpdo-allgazmd VALUE ‘N’.
CALL FUNCTION ‘POSTING_INTERFACE_START’
EXPORTING

  •   I_CLIENT           = SY-MANDT
      i_function         = 'C'
    
  •   I_GROUP            = ' '
    
  •   I_HOLDDATE         = ' '
    
  •   I_KEEP             = ' '
      i_mode             = l_mode
    
  •   I_UPDATE           = 'S'
      i_user             = sy-uname
    
  •   I_XBDCC            = ' '
    EXCEPTIONS
      client_incorrect   = 1
      function_invalid   = 2
      group_name_missing = 3
      mode_invalid       = 4
      update_invalid     = 5
      OTHERS             = 6.
    

    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_DOCUMENT’
EXPORTING
i_tcode = ‘FB01’

  •   I_SGFUNCT                = ' '
    
  •   I_NO_AUTH                = ' '
    IMPORTING
      e_msgid                  = e_msgid
      e_msgno                  = e_msgno
      e_msgty                  = e_msgty
      e_msgv1                  = e_msgv1
      e_msgv2                  = e_msgv2
      e_msgv3                  = e_msgv3
      e_msgv4                  = e_msgv4
      e_subrc                  = e_subrc
    TABLES
      t_blntab                 = it_blntab
      t_ftpost                 = it_ftpost
      t_fttax                  = it_fttax
    EXCEPTIONS
      account_missing          = 1
      company_code_missing     = 2
      posting_key_invalid      = 3
      posting_key_missing      = 4
      record_type_invalid      = 5
      transaction_code_invalid = 6
      amount_format_error      = 7
      too_many_line_items      = 8
      company_code_invalid     = 9
      screen_not_found         = 10
      no_authorization         = 11
      OTHERS                   = 12.
    

    IF sy-subrc <> 0.

    gv_jkzt = 'E'.
    MESSAGE ID  sy-msgid TYPE sy-msgty NUMBER sy-msgno
    WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO gv_jkxx.
    

    ELSE.
    CLEAR it_return.
    "生成消息
    CALL FUNCTION ‘BALW_BAPIRETURN_GET2’
    EXPORTING
    type = e_msgty
    cl = e_msgid
    number = e_msgno
    par1 = e_msgv1
    par2 = e_msgv2
    par3 = e_msgv3
    par4 = e_msgv4
    IMPORTING
    return = it_return.
    IF e_msgty = ‘S’"增加返回凭证号的操作,当返回的类型为S时,有可能产生凭证成功,返回凭证号
    AND ( e_msgno = ‘312’ OR e_msgno = ‘323’ ).
    "转换格式
    gv_pzbh = e_msgv1+0(10).
    gv_jkzt = ‘S’.
    gv_jkxx = ‘创建成功’.

    ELSE.
    
      gv_jkzt = 'E'.
      MESSAGE ID  sy-msgid TYPE sy-msgty NUMBER sy-msgno
      WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4 INTO gv_jkxx.
    
    ENDIF.
    

    ENDIF.
    *–结束
    CALL FUNCTION ‘POSTING_INTERFACE_END’
    EXPORTING
    i_bdcimmed = ‘X’

  •   I_BDCSTRTDT             = NO_DATE
    
  •   I_BDCSTRTTM             = NO_TIME
    EXCEPTIONS
      session_not_processable = 1
      OTHERS                  = 2.
    

    IF sy-subrc <> 0.

  • Implement suitable error handling here
    ENDIF.

    ENDIF.

ENDFORM.
&---------------------------------------------------------------------
*& Form FRM_CHECK_DATA
&---------------------------------------------------------------------

  •   必填字段检查
    

----------------------------------------------------------------------

  •  -->P_IT_ZSFIDOC_OA_T  text
    
  •  -->P_LS_ZSFIDOC_OA  text
    
  •  -->P_EV_JKXX  text
    

----------------------------------------------------------------------
FORM frm_check_data TABLES pt_zsfidoc_oa_t STRUCTURE zsfidoc_oa_t
USING ps_zsfidoc_oa TYPE zsfidoc_oa
pv_jkxx TYPE char100.

DATA: gv_txx TYPE char100,
gv_hxx TYPE char100.

“抬头必输字段检查
IF ps_zsfidoc_oa-pzrq IS INITIAL.” 凭证中的创建日期
gv_txx = ‘凭证中的创建日期 /’ && gv_txx…
ENDIF.

IF ps_zsfidoc_oa-pzgz IS INITIAL." 凭证中的过账日期
gv_txx = ‘凭证中的过账日期 /’ && gv_txx.
ENDIF.

IF ps_zsfidoc_oa-pzlx IS INITIAL." 凭证类型
gv_txx = ‘凭证类型 /’ && gv_txx.
ENDIF.

IF ps_zsfidoc_oa-gsdm IS INITIAL." 公司代码
gv_txx = ‘公司代码 /’ && gv_txx.
ENDIF.

IF ps_zsfidoc_oa-bz IS INITIAL." 货币码
gv_txx = ‘货币码 /’ && gv_txx.
ENDIF.

IF ps_zsfidoc_oa-gysmc IS INITIAL." 凭证抬头文本
gv_txx = ‘凭证抬头文本 /’ && gv_txx.
ENDIF.

IF ps_zsfidoc_oa-hl IS INITIAL." 汇率
gv_txx = ‘汇率 /’ && gv_txx.
ENDIF.

IF gv_txx IS NOT INITIAL.
gv_txx = ‘抬头错误:’ && gv_txx && ‘不可为空,’.
ENDIF.

"明细必输检查
LOOP AT pt_zsfidoc_oa_t INTO DATA(ps_zsfidoc_oa_t).

*费用科目必输检查
IF ps_zsfidoc_oa_t-kjkm+0(1) = ‘9’
OR ps_zsfidoc_oa_t-kjkm+0(1) = ‘8’.

  •  IF ps_zsfidoc_oa_t-gdz IS INITIAL."过账码
    
  •    IF gv_hxx NS '过账码 /'.
    
  •      gv_hxx = '过账码 /' && gv_hxx.
    
  •    ENDIF.
    
  •  ENDIF.
    
    IF ps_zsfidoc_oa_t-kjkm IS INITIAL."科目
      IF gv_hxx NS '科目 /'.
        gv_hxx = '科目 /' && gv_hxx.
      ENDIF.
    ENDIF.
    
  •  IF ps_zsfidoc_oa_t-cbzx IS INITIAL."成本中心
    
  •    IF gv_hxx NS '成本中心 /'.
    
  •      gv_hxx = '成本中心 /' && gv_hxx.
    
  •    ENDIF.
    
  •  ENDIF.
    
    IF ps_zsfidoc_oa_t-bxnr IS INITIAL."行项目文本
      IF gv_hxx NS '行项目文本 /'.
        gv_hxx = '行项目文本 /' && gv_hxx.
      ENDIF.
    ENDIF.
    
    IF ps_zsfidoc_oa_t-bxzje IS INITIAL."按本位币计的金额
      IF gv_hxx NS '按本位币计的金额 /'.
        gv_hxx = '按本位币计的金额 /' && gv_hxx.
      ENDIF.
    ENDIF.
    
    IF ps_zsfidoc_oa_t-jdbs IS INITIAL."借贷标识
      IF gv_hxx NS '借贷标识 /'.
        gv_hxx = '借贷标识 /' && gv_hxx.
      ENDIF.
    ENDIF.
    

    ENDIF.

*税科目必输检查
IF ps_zsfidoc_oa_t-kjkm = ‘2221000000’.

  •  IF ps_zsfidoc_oa_t-gdz IS INITIAL."过账码
    
  •    IF gv_hxx NS '过账码 /'.
    
  •      gv_hxx = '过账码 /' && gv_hxx.
    
  •    ENDIF.
    
  •  ENDIF.
    
    IF ps_zsfidoc_oa_t-kjkm IS INITIAL."科目
      IF gv_hxx NS '科目 /'.
        gv_hxx = '科目 /' && gv_hxx.
      ENDIF.
    ENDIF.
    
    IF ps_zsfidoc_oa_t-sl IS INITIAL."税码
      IF gv_hxx NS '税码 /'.
        gv_hxx = '税码 /' && gv_hxx.
      ENDIF.
    ENDIF.
    
    IF ps_zsfidoc_oa_t-bxnr IS INITIAL."行项目文本
      IF gv_hxx NS '行项目文本 /'.
        gv_hxx = '行项目文本 /' && gv_hxx.
      ENDIF.
    ENDIF.
    
    IF ps_zsfidoc_oa_t-bxzje IS INITIAL."按本位币计的金额
      IF gv_hxx NS '按本位币计的金额 /'.
        gv_hxx = '按本位币计的金额 /' && gv_hxx.
      ENDIF.
    ENDIF.
    

    ENDIF.

*供应商科目必输检查
IF ps_zsfidoc_oa_t-flag IS NOT INITIAL.

  •  IF ps_zsfidoc_oa_t-gdz IS INITIAL."过账码
    
  •    IF gv_hxx NS '过账码 /'.
    
  •      gv_hxx = '过账码 /' && gv_hxx.
    
  •    ENDIF.
    
  •  ENDIF.
    
    IF ps_zsfidoc_oa_t-kjkm IS INITIAL."科目
      IF gv_hxx NS '科目 /'.
        gv_hxx = '科目 /' && gv_hxx.
      ENDIF.
    ENDIF.
    
    IF ps_zsfidoc_oa_t-bxnr IS INITIAL."行项目文本
      IF gv_hxx NS '行项目文本 /'.
        gv_hxx = '行项目文本 /' && gv_hxx.
      ENDIF.
    ENDIF.
    
  •  IF  ps_zsfidoc_oa_t-kjkm+0(1) <> 'Y'.
    
  •    IF ps_zsfidoc_oa_t-tbzzbs IS INITIAL."特殊总帐标识
    
  •      IF gv_hxx NS '特殊总帐标识 /'.
    
  •        gv_hxx = '特殊总帐标识 /' && gv_hxx.
    
  •      ENDIF.
    
  •    ENDIF.
    
  •  ENDIF.
    
    IF ps_zsfidoc_oa_t-bxzje IS INITIAL."按本位币计的金额
      IF gv_hxx NS '按本位币计的金额 /'.
        gv_hxx = '按本位币计的金额 /' && gv_hxx.
      ENDIF.
    ENDIF.
    
    IF ps_zsfidoc_oa_t-fpbh IS INITIAL."分配编号
      IF gv_hxx NS '分配编号 /'.
        gv_hxx = '分配编号 /' && gv_hxx.
      ENDIF.
    ENDIF.
    

    ENDIF.

    ENDLOOP.

    IF gv_hxx IS NOT INITIAL.
    gv_hxx = ‘明细错误:’ && gv_hxx && ‘不可为空,’.
    ENDIF.

    IF gv_txx IS NOT INITIAL OR gv_hxx IS NOT INITIAL.
    pv_jkxx = gv_txx && gv_hxx.
    ENDIF.

ENDFORM.
----------------------------------------------------------------------

  •    Start new screen                                              *
    

----------------------------------------------------------------------
FORM bdc_dynpro USING program dynpro.
CLEAR bdcdata.
bdcdata-program = program.
bdcdata-dynpro = dynpro.
bdcdata-dynbegin = ‘X’.
APPEND bdcdata.
ENDFORM.

----------------------------------------------------------------------

  •    Insert field                                                  *
    

----------------------------------------------------------------------
FORM bdc_field USING fnam fval.
IF fval <> space.
CLEAR bdcdata.
bdcdata-fnam = fnam.
bdcdata-fval = fval.
APPEND bdcdata.
ENDIF.
ENDFORM.
&---------------------------------------------------------------------
*& Form FILL_ACCOUNTGL_ZC
&---------------------------------------------------------------------

  •   总帐科目项-资产
    

----------------------------------------------------------------------
FORM fill_accountgl_zc .

"主资产号补零
CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_INPUT’
EXPORTING
input = gt_act-anln1
IMPORTING
output = gt_act-anln1.

CLEAR it_accountgl.
it_accountgl-itemno_acc = g_n.

SELECT SINGLE anla~ktogr
INTO @DATA(lv_ktogr)
FROM anla
WHERE anla~anln2 = ‘0000’ AND
anla~bukrs = @gt_act-bukrs AND
anla~anln1 = @gt_act-anln1.

SELECT SINGLE t095~ktansw
INTO @it_accountgl-gl_account
FROM t095
WHERE t095~ktopl = ‘YD00’ AND
t095~afabe = ‘01’ AND
t095~ktogr = @lv_ktogr.

it_accountgl-asset_no = gt_act-anln1. "主资产号
it_accountgl-sub_number = ‘0000’. "资产次级编号
it_accountgl-acct_type = ‘A’. "科目类型
it_accountgl-costcenter = gt_act-kostl.

"ADDED BY CYJ 20160226 自动计算税额
IF gt_act-mwskz IS NOT INITIAL.
it_accountgl-tax_code = gt_act-mwskz.
ENDIF.
"END OF ADDED BY CYJ 20160226

it_accountgl-alloc_nmbr = gt_act-zuonr.
it_accountgl-item_text = gt_act-sgtxt. "#EC NOTEXT

CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_INPUT’
EXPORTING
input = gt_act-aufnr
IMPORTING
output = gt_act-aufnr.

it_accountgl-orderid = gt_act-aufnr.

IF gt_act-projk <> ‘’.
it_accountgl-wbs_element = gt_act-projk.
ENDIF.

IF gt_act-prctr <> ‘’.
it_accountgl-profit_ctr = gt_act-prctr.
ENDIF.
APPEND it_accountgl.

  • IF gt_act-anbwa <> ‘’ .
    **& EXTENSION2 扩展字段增强部分

  • wa_zexten-posnr = g_n. "凭证行项目

  • wa_zexten-bschl = gt_act-bschl. "记帐代码

  • wa_zexten-anbwa = gt_act-anbwa. "资产交易类型

  • it_extension2-structure = ‘ZEXTEN’.

  • it_extension2-valuepart1 = wa_zexten.

  • APPEND it_extension2.

  • ENDIF.

  • IF gt_act-rstgr <> ‘’ OR gt_act-xnegp <> ‘’ .
    **& EXTENSION2 扩展字段增强部分

  • wa_zexten-posnr = g_n. "凭证行项目

  • wa_zexten-rstgr = gt_act-rstgr. "凭证行项目原因代码

  • wa_zexten-xnegp = gt_act-xnegp. "反记帐

  • it_extension2-structure = ‘ZEXTEN’.

  • it_extension2-valuepart1 = wa_zexten.

  • APPEND it_extension2.

  • ENDIF.

IF gt_act-kndnr <> ‘’ OR gt_act-prodh <> ‘’ .
it_criteria-itemno_acc = g_n."凭证行项目
it_criteria-fieldname = ‘KNDNR’."获利能力段的客户
it_criteria-character = gt_act-kndnr.
APPEND it_criteria.
CLEAR it_criteria.

it_criteria-itemno_acc = g_n.
it_criteria-fieldname	= 'PRODH'."获利能力段的产品层次
it_criteria-character	= gt_act-prodh.
APPEND it_criteria.
CLEAR it_criteria.

ENDIF.

ENDFORM.

----------------------------------------------------------------------
***INCLUDE LZFG_FOR_CWGXF04.
----------------------------------------------------------------------
&---------------------------------------------------------------------
*& Form FRM_XD01_BDC
&---------------------------------------------------------------------

  •   创建员工供应商公司页签
    

----------------------------------------------------------------------

  •  -->PV_LIFNR  text
    

----------------------------------------------------------------------
FORM frm_xk01_bdc USING pv_lifnr TYPE string
pv_bpname TYPE string
pv_bukrs TYPE string.

DATA:lv_lifnr TYPE lifnr.
DATA:lv_bukrs TYPE bukrs.
DATA:lv_name1 TYPE ad_name1.
DATA:lv_message TYPE string.
DATA lv_mode TYPE c VALUE ‘N’.

CONDENSE pv_lifnr NO-GAPS.
CONDENSE pv_bukrs NO-GAPS.
lv_lifnr = pv_lifnr.
lv_bukrs = pv_bukrs.
lv_name1 = pv_bpname.

REFRESH:bdcdata,
messtab.

CLEAR:bdcdata,
messtab.

"补零
CALL FUNCTION ‘CONVERSION_EXIT_ALPHA_INPUT’
EXPORTING
input = lv_lifnr
IMPORTING
output = lv_lifnr.

SELECT SINGLE
lifnr
INTO @DATA(lvv_lifnr)
FROM lfa1
WHERE lifnr = @lv_lifnr.
IF sy-subrc <> 0.

PERFORM bdc_dynpro      USING 'SAPMF02K' '0100'.
PERFORM bdc_field       USING 'BDC_CURSOR'
      'RF02K-KTOKK'.
PERFORM bdc_field       USING 'BDC_OKCODE'
      '/00'.
PERFORM bdc_field       USING 'RF02K-LIFNR'
        lv_lifnr.
PERFORM bdc_field       USING 'RF02K-BUKRS'
        lv_bukrs.
PERFORM bdc_field       USING 'RF02K-KTOKK'
       'Y007'.
PERFORM bdc_dynpro      USING 'SAPMF02K' '0110'.
PERFORM bdc_field       USING 'BDC_CURSOR'
      'LFA1-LAND1'.
PERFORM bdc_field       USING 'BDC_OKCODE'
      '/00'.
PERFORM bdc_field       USING 'LFA1-NAME1'
       lv_name1.
PERFORM bdc_field       USING 'LFA1-SORTL'
      lv_name1.
PERFORM bdc_field       USING 'LFA1-LAND1'
  'CN'.
PERFORM bdc_dynpro      USING 'SAPMF02K' '0120'.
PERFORM bdc_field       USING 'BDC_CURSOR'
      'LFA1-BRSCH'.
PERFORM bdc_field       USING 'BDC_OKCODE'
      '/00'.
PERFORM bdc_field       USING 'LFA1-BRSCH'
      '0006'.
PERFORM bdc_dynpro      USING 'SAPMF02K' '0130'.
PERFORM bdc_field       USING 'BDC_CURSOR'
      'LFBK-BANKS(01)'.
PERFORM bdc_field       USING 'BDC_OKCODE'
      '=ENTR'.
PERFORM bdc_dynpro      USING 'SAPMF02K' '0380'.
PERFORM bdc_field       USING 'BDC_CURSOR'
      'KNVK-NAMEV(01)'.
PERFORM bdc_field       USING 'BDC_OKCODE'
      '=ENTR'.
PERFORM bdc_dynpro      USING 'SAPMF02K' '0210'.
PERFORM bdc_field       USING 'BDC_CURSOR'
      'LFB1-AKONT'.
PERFORM bdc_field       USING 'BDC_OKCODE'
      '/00'.
PERFORM bdc_field       USING 'LFB1-AKONT'
      '2241130000'.
PERFORM bdc_dynpro      USING 'SAPMF02K' '0215'.
PERFORM bdc_field       USING 'BDC_CURSOR'
      'LFB1-GUZTE'.
PERFORM bdc_field       USING 'BDC_OKCODE'
      '/00'.
PERFORM bdc_dynpro      USING 'SAPMF02K' '0220'.
PERFORM bdc_field       USING 'BDC_CURSOR'
      'LFB5-MAHNA'.
PERFORM bdc_field       USING 'BDC_OKCODE'
      '/00'.

ELSE.

SELECT SINGLE
  lifnr
  INTO @lvv_lifnr
  FROM lfb1
  WHERE lifnr = @lv_lifnr
    AND bukrs = @lv_bukrs.
IF sy-subrc <> 0."检查供应商/公司不存在

  PERFORM bdc_dynpro      USING 'SAPMF02K' '0100'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
        'RF02K-KTOKK'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
        '/00'.
  PERFORM bdc_field       USING 'RF02K-LIFNR'
        lv_lifnr.
  PERFORM bdc_field       USING 'RF02K-BUKRS'
        lv_bukrs.
  PERFORM bdc_field       USING 'RF02K-KTOKK'
        'Y007'.
  PERFORM bdc_dynpro      USING 'SAPMF02K' '0210'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
        'LFB1-AKONT'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
        '=VW'.
  PERFORM bdc_field       USING 'LFB1-AKONT'
        '2241130000'.
  PERFORM bdc_dynpro      USING 'SAPMF02K' '0215'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
        'LFB1-ZTERM'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
        '=VW'.
  PERFORM bdc_dynpro      USING 'SAPMF02K' '0220'.
  PERFORM bdc_field       USING 'BDC_CURSOR'
        'LFB5-MAHNA'.
  PERFORM bdc_field       USING 'BDC_OKCODE'
        '=UPDA'.
ENDIF.

ENDIF.

IF bdcdata[] IS NOT INITIAL.

CALL TRANSACTION 'XK01' USING bdcdata
      MODE lv_mode
      UPDATE 'S'
      MESSAGES INTO messtab.

LOOP AT messtab INTO DATA(ls_message) WHERE msgtyp = 'E'.
  CLEAR : lv_message.
  CALL FUNCTION 'MESSAGE_TEXT_BUILD' " 显示出具体的错误讯息
    EXPORTING
      msgid               = ls_message-msgid
      msgnr               = ls_message-msgnr
      msgv1               = ls_message-msgv1
      msgv2               = ls_message-msgv2
      msgv3               = ls_message-msgv3
      msgv4               = ls_message-msgv4
    IMPORTING
      message_text_output = lv_message.

  CONDENSE lv_message NO-GAPS.

  IF gv_jkxx IS INITIAL.
    gv_jkxx = lv_message.
  ELSE.
    gv_jkxx = gv_jkxx && '/'&& lv_message.
  ENDIF.

  gv_jkzt = 'E'.

ENDLOOP.
IF sy-subrc = 0.
  ROLLBACK WORK.
ELSE.
  COMMIT WORK AND WAIT.
ENDIF.

ENDIF.

ENDFORM.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

放弃幻想_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值