情境/背景:供应商三包索赔款项源起QMS质量系统,联动金税系统完成发票开具,最终在SAP系统中创建完成财务凭证。该流程为手工操作,费时费力且效率低下容易出错。
目标/任务:把QMS供应商三包索赔业务搬上线,同SAP FI顾问梳理功能说明书,担当SAP中开发落地任务。
总结:SAP作为企业信息化核心系统,可以承载很多的业务流程,我们也具备自己开发功能的能力。
*&---------------------------------------------------------------------*
*& Report ZTEST61
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZTEST61.
TABLES: ZFIQM_COLLECT,sscrfields.
TYPES:
BEGIN OF ty_excel,
BILLNO TYPE ZFIQM_COLLECT-BILLNO ,
LIFNR TYPE ZFIQM_COLLECT-LIFNR ,
VAT_NET TYPE ZFIQM_COLLECT-VAT_NET,
VAT_TAX TYPE ZFIQM_COLLECT-VAT_TAX,
VAT_CRDAT TYPE ZFIQM_COLLECT-VAT_CRDAT,
VAT_TYP TYPE ZFIQM_COLLECT-VAT_TYP,
STCEG TYPE ZFIQM_COLLECT-STCEG ,
VAT_CODE TYPE ZFIQM_COLLECT-VAT_CODE,
ICON_LIGHT(4) TYPE C,
STATUS TYPE C,
message(100) TYPE C,
END OF ty_excel.
DATA gt_excel TYPE TABLE OF ty_excel.
DATA GT_ZFIJS001 LIKE TABLE OF ZFIJS001.
DATA GS_ZFIJS001 LIKE ZFIJS001.
DATA gt_ZFIQM_COLLECT LIKE TABLE OF ZFIQM_COLLECT.
DATA gs_ZFIQM_COLLECT LIKE ZFIQM_COLLECT.
DATA:gs_functxt TYPE smp_dyntxt.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-001 .
PARAMETERS: p_putin RADIOBUTTON GROUP rg1 DEFAULT 'X' USER-COMMAND uc01,
p_cx RADIOBUTTON GROUP rg1.
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN BEGIN OF BLOCK b2 WITH FRAME TITLE TEXT-002.
PARAMETER P_PATH1 LIKE RLGRAP-FILENAME MODIF ID M02.
SELECTION-SCREEN END OF BLOCK b2.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-003.
SELECT-OPTIONS:s_VAT_CO FOR ZFIQM_COLLECT-VAT_CODE MODIF ID M03,
s_LIFNR FOR ZFIQM_COLLECT-LIFNR MODIF ID M03, "供应商
s_BILLNO FOR ZFIQM_COLLECT-BILLNO MODIF ID M03.
SELECTION-SCREEN END OF BLOCK b3.
SELECTION-SCREEN: FUNCTION KEY 1.
INITIALIZATION.
CLEAR gs_functxt.
gs_functxt-text = '供应商索赔汇总(金税数据)导入模板'.
gs_functxt-icon_id = icon_export.
gs_functxt-icon_text = '供应商索赔汇总(金税数据)导入模板'.
gs_functxt-quickinfo = '供应商索赔汇总(金税数据)导入模板'.
sscrfields-functxt_01 = gs_functxt.
AT SELECTION-SCREEN OUTPUT.
PERFORM frm_select_screen.
AT SELECTION-SCREEN.
CASE sscrfields-ucomm.
WHEN 'FC01'.
PERFORM frm_download_template_a1.
ENDCASE.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_path1.
PERFORM frm_sel_file CHANGING p_path1.
START-OF-SELECTION.
IF p_putin = 'X'. "导入
PERFORM frm_excel_import.
PERFORM frm_table_save.
ELSEIF p_cx = 'X'. "查询、并产生FI凭证
PERFORM frm_display_cx.
ENDIF.
"===========导入子函数如下===========
FORM FRM_EXCEL_IMPORT .
DATA CL_EX TYPE REF TO CX_ROOT.
CHECK P_PATH1 IS NOT INITIAL.
TRY .
CALL FUNCTION 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
FILENAME = P_PATH1
I_BEGIN_COL = 1
I_BEGIN_ROW = 3
I_END_COL = 8
I_END_ROW = 5000
* SHEET_NAME =
TABLES
INTERN = gt_excel
EXCEPTIONS
INCONSISTENT_PARAMETERS = 1
UPLOAD_OLE = 2
OTHERS = 3.
CATCH CX_ROOT INTO CL_EX.
MESSAGE CL_EX->GET_TEXT( ) TYPE 'E'.
ENDTRY.
ENDFORM.
FORM FRM_TABLE_SAVE .
"DATA ls_ZFIMQ type ZFIQM.
"DATA lt_ZFIMQ TYPE TABLE OF ZFIQM.
LOOP AT GT_excel ASSIGNING FIELD-SYMBOL(<gs180>).
IF <gs180>-BILLNO is INITIAL.
<gs180>-STATUS = 'E'.
<gs180>-MESSAGE = '金税发票号不能为空!'.
<gs180>-ICON_LIGHT = icon_red_light.
ENDIF.
ENDLOOP.
DATA: LT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
LS_FIELDCAT TYPE SLIS_FIELDCAT_ALV,
WS_FIELDGROUPS_TAB TYPE SLIS_T_SP_GROUP_ALV,
WS_LAYOUT TYPE SLIS_LAYOUT_ALV,
WS_SORTFIELDS_TAB TYPE SLIS_T_SORTINFO_ALV WITH HEADER LINE,
WS_EVENTS TYPE SLIS_T_EVENT.
DATA: lv_pos TYPE I VALUE 0.
DATA: TITLE TYPE LVC_TITLE.
DATA: COLOR TYPE SLIS_T_SPECIALCOL_ALV WITH HEADER LINE.
DEFINE macro_fieldcat.
lv_pos = lv_pos + 1.
ls_fieldcat-col_pos = lv_pos.
ls_fieldcat-tabname = 'GT_excel'.
ls_fieldcat-fieldname = &1.
ls_fieldcat-seltext_l = &2.
ls_fieldcat-inttype = &3.
ls_fieldcat-intlen = &4.
append ls_fieldcat to lt_fieldcat .
clear ls_fieldcat.
END-OF-DEFINITION.
macro_fieldcat:
'BILLNO' '金税发票号' '' '',
'LIFNR' '供应商编码' '' '',
'VAT_NET' '不含税金额' '' '',
'VAT_TAX' '税额' '' '',
'VAT_CRDAT' '开票日期' '' '',
'VAT_TYP' '发票性质' '' '',
'STCEG' '客户增值税号' '' '',
'VAT_CODE' '发票代码' '' '',
'ICON_LIGHT' '图标' '' '',
'STATUS' '状态' '' '',
'message' '消息描述' '' ''.
WS_LAYOUT-ZEBRA = 'X'.
WS_LAYOUT-GET_SELINFOS = 'X'.
WS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
WS_LAYOUT-DETAIL_POPUP = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
I_CALLBACK_PF_STATUS_SET = 'ALV_STATUS_SET'
I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND'
IS_LAYOUT = WS_LAYOUT
IT_FIELDCAT = LT_FIELDCAT
IT_SPECIAL_GROUPS = WS_FIELDGROUPS_TAB[]
IT_SORT = WS_SORTFIELDS_TAB[]
IT_EVENTS = WS_EVENTS[]
I_GRID_TITLE = TITLE
I_DEFAULT = 'X'
I_SAVE = 'A'
TABLES
T_OUTTAB = GT_excel
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
ENDFORM.
FORM ALV_STATUS_SET USING PT_EXTAB TYPE SLIS_T_EXTAB.
CLEAR: PT_EXTAB[].
SET PF-STATUS 'ZS100'.
ENDFORM.
FORM FRM_USER_COMMAND USING R_UCOMM LIKE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD.
CASE R_UCOMM.
WHEN '&GO'.
PERFORM FRM_PROCESS.
rs_selfield-refresh = 'X'.
WHEN OTHERS.
ENDCASE.
ENDFORM.
"----------汇总数据保存---------------
FORM FRM_PROCESS .
LOOP AT GT_excel ASSIGNING FIELD-SYMBOL(<gs300>) WHERE STATUS <> 'E'.
"这里用了select,因为金税号可能重复(用户误导数据),第一条创建到数据库后,如果第二天又是这个号,需要马上读数据库。
SELECT SINGLE * FROM ZFIQM_COLLECT WHERE BILLNO = @<gs300>-BILLNO INTO @DATA(tmp).
IF sy-subrc = 0. "原来有ID,就修改
UPDATE ZFIQM_COLLECT
SET
LIFNR = <gs300>-LIFNR
VAT_NET = <gs300>-VAT_NET
VAT_TAX = <gs300>-VAT_TAX
VAT_CRDAT = <gs300>-VAT_CRDAT
VAT_TYP = <gs300>-VAT_TYP
STCEG = <gs300>-STCEG
VAT_CODE = <gs300>-VAT_CODE
ZAENAME = SY-UNAME
ZAEDATE = SY-DATUM
ZAETIME = SY-UZEIT
WHERE BILLNO = <gs300>-BILLNO.
COMMIT WORK AND WAIT.
<gs300>-STATUS = 'S'.
<gs300>-ICON_LIGHT = icon_green_light.
<gs300>-MESSAGE = '数据修改成功'.
"这里可以用代码把修改前的数据放到历史表
ELSE. "没有ID,直接保存
MOVE-CORRESPONDING <gs300> to gs_ZFIQM_COLLECT.
gs_ZFIQM_COLLECT-Z_REC_NO = cl_uuid_factory=>create_system_uuid( )->create_uuid_c32( ).
gs_ZFIQM_COLLECT-ZAENAME = SY-UNAME.
gs_ZFIQM_COLLECT-ZAEDATE = SY-DATUM.
gs_ZFIQM_COLLECT-ZAETIME = SY-UZEIT.
INSERT ZFIQM_COLLECT FROM gs_ZFIQM_COLLECT.
COMMIT WORK AND WAIT.
<gs300>-STATUS = 'S'.
<gs300>-ICON_LIGHT = icon_green_light .
<gs300>-MESSAGE = '新建数据完成' .
ENDIF.
ENDLOOP.
ENDFORM.
"-----------------------------------
"-----------------------------------
"-----------------------------------
"-----查询、产生SAP财务凭证-----------
FORM FRM_DISPLAY_CX .
"取明细表
DATA DB_ZFIQM TYPE SORTED TABLE OF ZFIQM WITH NON-UNIQUE KEY BILLNO.
SELECT * INTO TABLE DB_ZFIQM FROM ZFIQM.
"这里需要看到 COLLECT 表和 JSFI 两张表
DATA DB_ZFIJS001 TYPE SORTED TABLE OF ZFIJS001 WITH NON-UNIQUE KEY BILLNO.
SELECT * INTO TABLE DB_ZFIJS001 FROM ZFIJS001.
SELECT *
FROM ZFIQM_COLLECT
WHERE VAT_CODE IN @s_VAT_CO
AND LIFNR IN @s_LIFNR
AND BILLNO IN @s_BILLNO
INTO TABLE @gt_ZFIQM_COLLECT.
LOOP AT gt_ZFIQM_COLLECT INTO gs_ZFIQM_COLLECT.
MOVE-CORRESPONDING gs_ZFIQM_COLLECT TO gs_ZFIJS001.
"SAP中创建FI凭证的前提:1、金税号必须在明细表中
READ TABLE DB_ZFIQM WITH KEY BILLNO = gs_ZFIJS001-BILLNO INTO DATA(dbgs_zfiqm).
IF sy-subrc <> 0.
gs_ZFIJS001-STATUS = 'E'.
gs_ZFIJS001-ICON_LIGHT = icon_red_light.
gs_ZFIJS001-MESSAGE = '索赔明细表中没有金税号,不能产生FI凭证'.
ENDIF.
"SAP中创建FI凭证的前提:2、金税号没有产生过SAP的财务凭证,这里把FI凭证读出来,后面判断
READ TABLE DB_ZFIJS001 WITH KEY BILLNO = gs_ZFIJS001-BILLNO INTO DATA(gs_line).
IF sy-subrc = 0.
gs_ZFIJS001-belnr = gs_line-belnr.
gs_ZFIJS001-FINAME = gs_line-FINAME.
gs_ZFIJS001-FIDATE = gs_line-FIDATE.
gs_ZFIJS001-FITIME = gs_line-FITIME.
gs_ZFIJS001-STATUS = 'E'.
gs_ZFIJS001-ICON_LIGHT = icon_yellow_light.
gs_ZFIJS001-MESSAGE = 'FI凭证已经产生'.
ENDIF.
APPEND gs_ZFIJS001 TO gt_ZFIJS001.
CLEAR gs_ZFIJS001.
ENDLOOP.
DATA: LT_FIELDCAT TYPE SLIS_T_FIELDCAT_ALV,
LS_FIELDCAT TYPE SLIS_FIELDCAT_ALV,
WS_FIELDGROUPS_TAB TYPE SLIS_T_SP_GROUP_ALV,
WS_LAYOUT TYPE SLIS_LAYOUT_ALV,
WS_SORTFIELDS_TAB TYPE SLIS_T_SORTINFO_ALV WITH HEADER LINE,
WS_EVENTS TYPE SLIS_T_EVENT.
DATA: lv_pos TYPE I VALUE 0.
DATA: TITLE TYPE LVC_TITLE.
DATA: COLOR TYPE SLIS_T_SPECIALCOL_ALV WITH HEADER LINE.
DEFINE macro_fieldcat.
lv_pos = lv_pos + 1.
ls_fieldcat-col_pos = lv_pos.
ls_fieldcat-tabname = 'gt_ZFIJS001'.
ls_fieldcat-fieldname = &1.
ls_fieldcat-seltext_l = &2.
ls_fieldcat-inttype = &3.
ls_fieldcat-intlen = &4.
append ls_fieldcat to lt_fieldcat .
clear ls_fieldcat.
END-OF-DEFINITION.
macro_fieldcat:
'LIFNR' '供应商' '' '',
'BILLNO' '金税发票' '' '',
'VAT_NET' '不含税金额' '' '',
'VAT_TAX' '税额' '' '',
'VAT_CRDAT' '开票日期' '' '',
'VAT_TYP' '发票性质' '' '',
'STCEG' '客户增值税号' '' '',
'VAT_CODE' '发票代码' '' '',
'ZAENAME' '更新人' '' '',
'ZAEDATE' '更新日期' '' '',
'ZAETIME' '更新时间' '' '',
'ICON_LIGHT' '灯' '' '',
'STATUS' '状态' '' '',
'MESSAGE' '消息' '' '',
'BELNR' 'SAP会计凭证' '' '',
'FINAME' 'SAP更新人' '' '',
'FIDATE' 'SAP更新日期' '' '',
'FITIME' 'SAP更新时间' '' '',
'FIICON_LIGHT' '灯' '' '',
'FISTATUS' 'SAP状态' '' '',
'FIMESSAGE' 'SAP消息' '' ''.
WS_LAYOUT-BOX_FIELDNAME = 'SEL'.
WS_LAYOUT-ZEBRA = 'X'.
WS_LAYOUT-GET_SELINFOS = 'X'.
WS_LAYOUT-COLWIDTH_OPTIMIZE = 'X'.
WS_LAYOUT-DETAIL_POPUP = 'X'.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
I_CALLBACK_PF_STATUS_SET = 'ALV_STATUS_SET_Z200'
I_CALLBACK_USER_COMMAND = 'FRM_USER_COMMAND_Z200'
IS_LAYOUT = WS_LAYOUT
IT_FIELDCAT = LT_FIELDCAT
IT_SPECIAL_GROUPS = WS_FIELDGROUPS_TAB[]
IT_SORT = WS_SORTFIELDS_TAB[]
IT_EVENTS = WS_EVENTS[]
I_GRID_TITLE = TITLE
I_DEFAULT = 'X'
I_SAVE = 'A'
TABLES
T_OUTTAB = gt_ZFIJS001
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
ENDFORM.
FORM ALV_STATUS_SET_Z200 USING PT_EXTAB TYPE SLIS_T_EXTAB.
CLEAR: PT_EXTAB[].
SET PF-STATUS 'Z200'.
ENDFORM.
FORM FRM_USER_COMMAND_Z200 USING R_UCOMM LIKE SY-UCOMM RS_SELFIELD TYPE SLIS_SELFIELD.
CASE R_UCOMM.
WHEN '&GO200'.
PERFORM FRM_PROCESS_Z200.
rs_selfield-refresh = 'X'.
WHEN OTHERS.
ENDCASE.
ENDFORM.
FORM FRM_PROCESS_Z200 .
LOOP AT gt_ZFIJS001 ASSIGNING FIELD-SYMBOL(<gs500>) WHERE STATUS <> 'E' AND SEL = 'X' AND BELNR IS INITIAL.
"创建FI凭证,CALL BAPI
DATA: ls_header TYPE bapiache09, " header
ls_gl_account TYPE bapiacgl09,
ls_receivable TYPE bapiacar09,
ls_currency TYPE bapiaccr09,
ls_extension TYPE bapiparex,
ls_cust_extension TYPE zsfiex006_extension,
ls_return TYPE bapiret2,
ls_ap TYPE BAPIACAP09.
DATA:lt_gl_account TYPE STANDARD TABLE OF bapiacgl09,
lt_receivable TYPE STANDARD TABLE OF bapiacar09,
lt_currency TYPE STANDARD TABLE OF bapiaccr09,
lt_extension TYPE STANDARD TABLE OF bapiparex, " Extension
lt_cust_extension TYPE STANDARD TABLE OF zsfiex006_extension, " Coding Block Fields
lt_return TYPE STANDARD TABLE OF bapiret2,
lt_ap TYPE STANDARD TABLE OF BAPIACAP09.
DATA:ls_document TYPE bapiache09.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = <gs500>-LIFNR
IMPORTING
output = <gs500>-LIFNR.
"-----凭证头------------
ls_header-doc_type = 'SA'.
ls_header-username = sy-uname .
ls_header-comp_code = 1000.
ls_header-doc_date = <gs500>-VAT_CRDAT.
ls_header-pstng_date = <gs500>-VAT_CRDAT.
ls_header-fisc_year = <gs500>-VAT_CRDAT+0(4).
ls_header-fis_period = <gs500>-VAT_CRDAT+4(2).
ls_header-HEADER_TXT = '供应商索赔入账'.
"----------供应商应付---------------
ls_ap-ITEMNO_ACC = '1'.
ls_ap-VENDOR_NO = <gs500>-LIFNR.
ls_ap-PROFIT_CTR = '0000001000'. "利润中心
ls_ap-BUS_AREA = '0001'."业务范围
APPEND ls_ap TO lt_ap.
"----------总账---------------------
ls_gl_account-ITEMNO_ACC = '2'.
ls_gl_account-ACCT_TYPE = 'S'.
ls_gl_account-GL_ACCOUNT = '6051080000'.
ls_gl_account-PROFIT_CTR = '0000001000'. "利润中心
ls_gl_account-BUS_AREA = '0001'."业务范围
ls_gl_account-pstng_date = <gs500>-VAT_CRDAT.
APPEND ls_gl_account TO lt_gl_account. "总账
clear ls_gl_account.
ls_gl_account-ITEMNO_ACC = '3'.
ls_gl_account-ACCT_TYPE = 'S'.
ls_gl_account-GL_ACCOUNT = '2221010503'.
ls_gl_account-PROFIT_CTR = '0000001000'. "利润中心
ls_gl_account-BUS_AREA = '0001'."业务范围
ls_gl_account-pstng_date = <gs500>-VAT_CRDAT.
APPEND ls_gl_account TO lt_gl_account. "总账
clear ls_gl_account.
ls_gl_account-ITEMNO_ACC = '4'.
ls_gl_account-ACCT_TYPE = 'S'.
ls_gl_account-GL_ACCOUNT = '6402080000'.
ls_gl_account-PROFIT_CTR = '0000001000'. "利润中心
ls_gl_account-BUS_AREA = '0001'."业务范围
ls_gl_account-pstng_date = <gs500>-VAT_CRDAT.
APPEND ls_gl_account TO lt_gl_account. "总账
clear ls_gl_account.
ls_gl_account-ITEMNO_ACC = '5'.
ls_gl_account-ACCT_TYPE = 'S'.
ls_gl_account-GL_ACCOUNT = '6609120100'.
ls_gl_account-PROFIT_CTR = '0000001000'. "利润中心
ls_gl_account-BUS_AREA = '0001'."业务范围
ls_gl_account-pstng_date = <gs500>-VAT_CRDAT.
ls_gl_account-COSTCENTER = '1000S01001'.
APPEND ls_gl_account TO lt_gl_account. "总账
clear ls_gl_account.
"----------金额----------------------
ls_currency-ITEMNO_ACC = '1'.
ls_currency-CURRENCY = 'CNY'.
ls_currency-AMT_DOCCUR = <gs500>-VAT_NET + <gs500>-VAT_TAX. "含税金额
" IF <gs500>-VAT_TYP EQ '红'. ls_currency-AMT_DOCCUR = -1 * ls_currency-AMT_DOCCUR. ENDIF.
APPEND ls_currency TO lt_currency.
clear ls_currency.
ls_currency-ITEMNO_ACC = '2'.
ls_currency-CURRENCY = 'CNY'.
ls_currency-AMT_DOCCUR = -1 * <gs500>-VAT_NET. "不含税金额
" IF <gs500>-VAT_TYP EQ '蓝'. ls_currency-AMT_DOCCUR = -1 * ls_currency-AMT_DOCCUR. ENDIF.
APPEND ls_currency TO lt_currency.
clear ls_currency.
ls_currency-ITEMNO_ACC = '3'.
ls_currency-CURRENCY = 'CNY'.
ls_currency-AMT_DOCCUR = -1 * <gs500>-VAT_TAX. "税额
" IF <gs500>-VAT_TYP EQ '蓝'. ls_currency-AMT_DOCCUR = -1 * ls_currency-AMT_DOCCUR. ENDIF.
APPEND ls_currency TO lt_currency.
clear ls_currency.
ls_currency-ITEMNO_ACC = '4'.
ls_currency-CURRENCY = 'CNY'.
ls_currency-AMT_DOCCUR = <gs500>-VAT_NET. "不含税金额
" IF <gs500>-VAT_TYP EQ '红'. ls_currency-AMT_DOCCUR = -1 * ls_currency-AMT_DOCCUR. ENDIF.
APPEND ls_currency TO lt_currency.
clear ls_currency.
ls_currency-ITEMNO_ACC = '5'.
ls_currency-CURRENCY = 'CNY'.
ls_currency-AMT_DOCCUR = -1 * <gs500>-VAT_NET. "不含税金额
" IF <gs500>-VAT_TYP EQ '蓝'. ls_currency-AMT_DOCCUR = -1 * ls_currency-AMT_DOCCUR. ENDIF.
APPEND ls_currency TO lt_currency.
clear ls_currency.
"----------记账码-----------------
ls_cust_extension-posnr = '1'.
IF <gs500>-VAT_TYP EQ '蓝'. ls_cust_extension-BSCHL = '21'. ENDIF.
IF <gs500>-VAT_TYP EQ '红'. ls_cust_extension-BSCHL = '31'. ENDIF.
ls_extension-structure = 'ZSFIEX006_EXTENSION'.
ls_extension-valuepart1 = ls_cust_extension. clear ls_cust_extension.
APPEND ls_extension TO lt_extension.
clear ls_extension.
ls_cust_extension-posnr = '2'.
IF <gs500>-VAT_TYP EQ '蓝'. ls_cust_extension-BSCHL = '50'. ENDIF.
IF <gs500>-VAT_TYP EQ '红'. ls_cust_extension-BSCHL = '40'. ENDIF.
ls_cust_extension-ZZ_KUNNR = <gs500>-LIFNR.
ls_extension-structure = 'ZSFIEX006_EXTENSION'.
ls_extension-valuepart1 = ls_cust_extension. clear ls_cust_extension.
APPEND ls_extension TO lt_extension.
clear ls_extension.
ls_cust_extension-posnr = '3'.
IF <gs500>-VAT_TYP EQ '蓝'. ls_cust_extension-BSCHL = '50'. ENDIF.
IF <gs500>-VAT_TYP EQ '红'. ls_cust_extension-BSCHL = '40'. ENDIF.
ls_extension-structure = 'ZSFIEX006_EXTENSION'.
ls_extension-valuepart1 = ls_cust_extension. clear ls_cust_extension.
APPEND ls_extension TO lt_extension.
clear ls_extension.
ls_cust_extension-posnr = '4'.
IF <gs500>-VAT_TYP EQ '蓝'. ls_cust_extension-BSCHL = '40'. ENDIF.
IF <gs500>-VAT_TYP EQ '红'. ls_cust_extension-BSCHL = '50'. ENDIF.
ls_cust_extension-ZZ_KUNNR = <gs500>-LIFNR.
ls_extension-structure = 'ZSFIEX006_EXTENSION'.
ls_extension-valuepart1 = ls_cust_extension. clear ls_cust_extension.
APPEND ls_extension TO lt_extension.
clear ls_extension.
ls_cust_extension-posnr = '5'.
IF <gs500>-VAT_TYP EQ '蓝'. ls_cust_extension-BSCHL = '50'. ENDIF.
IF <gs500>-VAT_TYP EQ '红'. ls_cust_extension-BSCHL = '40'. ENDIF.
ls_extension-structure = 'ZSFIEX006_EXTENSION'.
ls_extension-valuepart1 = ls_cust_extension. clear ls_cust_extension.
APPEND ls_extension TO lt_extension.
clear ls_extension.
CALL FUNCTION 'BAPI_ACC_DOCUMENT_POST'
EXPORTING
documentheader = ls_header
IMPORTING
OBJ_KEY = ls_document-obj_key
tables
ACCOUNTGL = lt_gl_account
ACCOUNTRECEIVABLE = lt_receivable
ACCOUNTPAYABLE = lt_ap
currencyamount = lt_currency
return = lt_return
EXTENSION2 = lt_extension .
READ TABLE lt_return INTO ls_return WITH KEY type = 'E'.
IF sy-subrc NE 0 .
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'.
<gs500>-Z_REC_NO = cl_uuid_factory=>create_system_uuid( )->create_uuid_c32( ).
<gs500>-BELNR = ls_document-obj_key+0(10).
<gs500>-FINAME = SY-UNAME.
<gs500>-FIDATE = SY-DATUM.
<gs500>-FITIME = SY-UZEIT.
INSERT ZFIJS001 FROM <gs500>.
COMMIT WORK AND WAIT.
<gs500>-FISTATUS = 'S'.
<gs500>-FIICON_LIGHT = icon_green_light .
<gs500>-FIMESSAGE = 'FI凭证创建成功!'.
ELSE.
DATA s_msg(250) TYPE c .
LOOP AT lt_return INTO ls_return WHERE type = 'E'.
CONCATENATE ls_return-message s_msg INTO s_msg.
ENDLOOP.
<gs500>-FISTATUS = 'E'.
<gs500>-FIICON_LIGHT = icon_red_light .
<gs500>-FIMESSAGE = s_msg.
ENDIF.
ENDLOOP.
ENDFORM.
"选择屏幕切换4个功能的函数
FORM frm_select_screen .
CASE 'X'.
WHEN p_putin.
LOOP AT SCREEN.
IF screen-group1 = 'M02'. screen-active = 1. MODIFY SCREEN. ENDIF.
IF screen-group1 = 'M03'. screen-active = 0. MODIFY SCREEN. ENDIF.
ENDLOOP.
WHEN p_cx.
LOOP AT SCREEN.
IF screen-group1 = 'M02'. screen-active = 0. MODIFY SCREEN. ENDIF.
IF screen-group1 = 'M03'. screen-active = 1. MODIFY SCREEN. ENDIF.
ENDLOOP.
ENDCASE.
ENDFORM.
FORM frm_download_template_a1 .
DATA: lv_objname TYPE text40, "object
lv_def_filename TYPE string,
lv_filename TYPE string,
lv_fullpath TYPE string,
lv_path TYPE string,
lv_len TYPE i,
lv_rc TYPE char01,
lv_msg TYPE string.
CLEAR:lv_def_filename,lv_objname.
lv_objname = 'ZFIR0061'.
lv_def_filename = '供应商索赔汇总(金税数据)导入模板.xlsx'.
CLEAR:lv_filename,lv_path,lv_fullpath.
lv_rc = '1'.
PERFORM frm_open_save_dialog USING lv_def_filename
CHANGING lv_filename
lv_path
lv_fullpath
lv_rc.
IF lv_rc = '0'.
lv_len = 0.
CALL METHOD cl_abap_list_utilities=>dynamic_output_length
EXPORTING
field = lv_fullpath
RECEIVING
len = lv_len.
IF lv_len = 0.
MESSAGE '文件路径长度为0!' TYPE 'S' DISPLAY LIKE 'E'.
ELSEIF lv_len > 128.
MESSAGE '文件路径长度过长!' TYPE 'S' DISPLAY LIKE 'E'.
ELSE.
"get file from smw0 and download it to local
lv_rc = 'X'.
CLEAR lv_msg.
PERFORM frm_down_template USING lv_objname
lv_fullpath
CHANGING lv_rc
lv_msg.
IF lv_rc EQ ''.
MESSAGE '模板下载完成!' TYPE 'S'.
ELSE.
IF lv_msg IS NOT INITIAL.
MESSAGE lv_msg TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ENDIF.
ENDIF.
ELSEIF lv_rc = '1'.
MESSAGE '下载模板出错.' TYPE 'S' DISPLAY LIKE 'E'.
ELSEIF lv_rc = '9'.
MESSAGE '用户取消操作.' TYPE 'S' DISPLAY LIKE 'E'.
ENDIF.
ENDFORM.
FORM frm_open_save_dialog USING uv_def_filename TYPE string
CHANGING cv_filename TYPE string
cv_path TYPE string
cv_fullpath TYPE string
cv_rc TYPE c.
DATA: lv_filter TYPE string,
lv_filename TYPE string,
lv_path TYPE string,
lv_fullpath TYPE string,
lv_user_action TYPE i.
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = 'Save as'
default_extension = 'XLSX' "Set detault to XLS when opening a dialog
default_file_name = uv_def_filename
file_filter = cl_gui_frontend_services=>filetype_excel
CHANGING
filename = lv_filename
path = lv_path
fullpath = lv_fullpath
user_action = lv_user_action
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
OTHERS = 4.
IF sy-subrc <> 0.
cv_rc = '1'.
ELSE.
IF lv_user_action = cl_gui_frontend_services=>action_ok.
cv_filename = lv_filename.
cv_path = lv_path.
cv_fullpath = lv_fullpath.
cv_rc = '0'.
ELSEIF lv_user_action = cl_gui_frontend_services=>action_cancel.
cv_rc = '9'.
ENDIF.
ENDIF.
ENDFORM. " FRM_OPEN_SAVE_DIALOG
FORM frm_down_template USING uv_objname TYPE text40
uv_fullpath TYPE string
CHANGING cv_rc TYPE char01
cv_msg TYPE string.
DATA: lv_objname TYPE w3objid, "WWWDATATAB-OBJID, "object
lv_dest TYPE localfile,
ls_objdata TYPE wwwdatatab,
lv_strmsg TYPE string,
lv_rc LIKE sy-subrc.
CLEAR: lv_dest.
IF uv_fullpath IS INITIAL.
cv_msg = 'The path length is 0'.
cv_rc = 'X'.
EXIT.
ELSE.
lv_dest = uv_fullpath.
ENDIF.
CLEAR: lv_objname.
IF uv_objname IS INITIAL.
cv_msg = 'Object name is empty'.
cv_rc = 'X'.
EXIT.
ELSE.
lv_objname = uv_objname.
ENDIF.
CLEAR: ls_objdata.
SELECT SINGLE relid objid
FROM wwwdata
INTO CORRESPONDING FIELDS OF ls_objdata
WHERE srtf2 = 0
AND relid = 'MI'
AND objid = lv_objname.
IF sy-subrc = 0 AND ls_objdata-objid <> space.
CONDENSE lv_dest.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = ls_objdata
destination = lv_dest
IMPORTING
rc = lv_rc.
IF lv_rc <> 0.
CLEAR lv_strmsg.
CONCATENATE 'Failed to download the Object:' lv_objname
INTO lv_strmsg.
cv_msg = lv_strmsg.
cv_rc = 'X'.
ELSE.
"success
cv_rc = ''.
cv_msg = ''.
ENDIF.
ELSE.
CLEAR lv_strmsg.
CONCATENATE 'The Object:' lv_objname 'is not exist.'
INTO lv_strmsg.
cv_msg = lv_strmsg.
cv_rc = 'X'.
ENDIF.
ENDFORM. " FRM_DOWN_TEMPLATE
*&---------------------------------------------------------------------*
*& Form FRM_SEL_FILE
*&---------------------------------------------------------------------*
* text 选择文件
*----------------------------------------------------------------------*
FORM frm_sel_file CHANGING po_path.
DATA:
lt_filetable TYPE filetable,
ls_filetable TYPE file_table,
lv_rc TYPE sy-subrc,
lv_filename TYPE string,
lv_initial_path TYPE string VALUE 'C:\'.
CLEAR lv_filename.
lv_filename = po_path.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
default_filename = lv_filename
initial_directory = lv_initial_path
CHANGING
file_table = lt_filetable
rc = lv_rc
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4.
IF sy-subrc NE 0 OR lv_rc LT 0.
MESSAGE '上传文件选择失败' TYPE 'E' ."上传文件选择失败
ELSE.
IF lv_rc = 1.
READ TABLE lt_filetable INTO ls_filetable INDEX 1.
po_path = ls_filetable-filename.
ELSE.
EXIT.
ENDIF.
ENDIF.
ENDFORM.