
1. 正确的科目类型判断方法
要判断总账科目的类型,应该使用SKB1表中的MITKZ(科目类型)字段:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
" 获取科目主数据 SELECT SINGLE saknr mitkz FROM skb1 WHERE saknr = @lv_gl_account AND bukrs = @lv_company_code INTO @data(ls_skb1). IF sy-subrc <> 0. " 科目不存在 RETURN. ENDIF. " 根据科目类型判断 CASE ls_skb1-mitkz. WHEN 'D'. " 客户统驭科目 " 使用accountreceivable参数 WHEN 'K'. " 供应商统驭科目 " 使用accountpayable参数 WHEN 'A'. " 资产科目 " 使用accountasset参数 WHEN 'M'. " 物料科目 " 使用material参数 WHEN OTHERS. " 普通总账科目 " 使用accountgl参数 ENDCASE. |
2. 完整的判断逻辑示例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
FORM post_document USING iv_gl_account TYPE saknr iv_partner TYPE lifnr iv_amount TYPE bapiaccr09-amt_doccur iv_doc_type TYPE bapiache09-doc_type iv_company TYPE bukrs. DATA: ls_documentheader TYPE bapiache09, lt_accountgl TYPE TABLE OF bapiacgl09, lt_accountreceivable TYPE TABLE OF bapiacar09, lt_accountpayable TYPE TABLE OF bapiacap09, lt_currencyamount TYPE TABLE OF bapiaccr09, lt_return TYPE TABLE OF bapiret2. " 获取科目主数据 SELECT SINGLE * FROM skb1 WHERE saknr = @iv_gl_account AND bukrs = @iv_company INTO @data(ls_skb1). IF sy-subrc <> 0. MESSAGE e001(00) WITH '科目不存在' RAISING error. RETURN. ENDIF. " 凭证头 ls_documentheader-doc_type = iv_doc_type. ls_documentheader-doc_date = sy-datum. ls_documentheader-pstng_date = sy-datum. ls_documentheader-comp_code = iv_company. " 根据科目类型处理 CASE ls_skb1-mitkz. WHEN 'D'. " 客户统驭科目 " 验证客户是否存在 SELECT SINGLE kunnr FROM kna1 WHERE kunnr = @iv_partner INTO @data(lv_customer). IF sy-subrc <> 0. MESSAGE e001(00) WITH '客户不存在' RAISING error. RETURN. ENDIF. " 客户行项目 APPEND INITIAL LINE TO lt_accountreceivable ASSIGNING FIELD-SYMBOL(<fs_ar>). <fs_ar>-itemno_acc = '1'. <fs_ar>-customer = iv_partner. <fs_ar>-gl_account = iv_gl_account. WHEN 'K'. " 供应商统驭科目 " 验证供应商是否存在 SELECT SINGLE lifnr FROM lfa1 WHERE lifnr = @iv_partner INTO @data(lv_vendor). IF sy-subrc <> 0. MESSAGE e001(00) WITH '供应商不存在' RAISING error. RETURN. ENDIF. " 供应商行项目 APPEND INITIAL LINE TO lt_accountpayable ASSIGNING FIELD-SYMBOL(<fs_ap>). <fs_ap>-itemno_acc = '1'. <fs_ap>-vendor = iv_partner. <fs_ap>-gl_account = iv_gl_account. WHEN OTHERS. " 普通总账科目 " 获取科目描述 SELECT SINGLE txt50 FROM skat WHERE saknr = @iv_gl_account AND spras = @sy-langu INTO @data(lv_account_desc). " 总账科目行项目 APPEND INITIAL LINE TO lt_accountgl ASSIGNING FIELD-SYMBOL(<fs_gl>). <fs_gl>-itemno_acc = '1'. <fs_gl>-gl_account = iv_gl_account. <fs_gl>-item_text = lv_account_desc. ENDCASE. " 金额 APPEND INITIAL LINE TO lt_currencyamount ASSIGNING FIELD-SYMBOL(<fs_curr>). <fs_curr>-itemno_acc = '1'. <fs_curr>-currency = 'CNY'. <fs_curr>-amt_doccur = iv_amount. " 调用BAPI CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST' EXPORTING documentheader = ls_documentheader TABLES accountgl = lt_accountgl accountreceivable = lt_accountreceivable accountpayable = lt_accountpayable currencyamount = lt_currencyamount return = lt_return. " 错误处理 READ TABLE lt_return WITH KEY type = 'E' TRANSPORTING NO FIELDS. IF sy-subrc = 0. CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'. " 显示错误消息 LOOP AT lt_return INTO DATA(ls_return) WHERE type = 'E'. MESSAGE ls_return-message TYPE 'E'. ENDLOOP. ELSE. CALL FUNCTION 'BAPI_TRANSACTION_COMMIT' EXPORTING wait = 'X'. ENDIF. ENDFORM. |
3. SKB1表中MITKZ字段的可能值
- ‘D’:客户统驭科目(应收)
- ‘K’:供应商统驭科目(应付)
- ‘A’:资产科目
- ‘M’:物料科目
- ‘S’:普通总账科目
- 空值:普通总账科目
4. 辅助判断方法
|
1 2 3 4 5 6 |
" 可以通过以下方法获取科目类型的文本描述 SELECT SINGLE ltext FROM t074s WHERE mitkz = @ls_skb1-mitkz AND spras = @sy-langu INTO @data(lv_account_type_text). |
5. 最佳实践建议
- 科目验证:
- 检查科目是否存在(SKB1)
- 验证科目类型(MITKZ)
- 检查科目状态(是否冻结等)
- 业务伙伴验证:
- 客户主数据检查(KNA1)
- 供应商主数据检查(LFA1)
- 公司代码视图检查(KNB1/LFB1)
- 错误处理:
- 完整的验证机制
- 详细的错误消息
- 事务回滚处理
- 数据一致性:
- 借贷平衡检查
- 日期有效性验证
- 货币代码验证


