使用到的BAPI: RFC_CVI_EI_INBOUND_MAIN
这个BAPI 可以用来创建/修改 供应商和客户。
本篇文章只写了导入供应商的部分,客户也可以通过这个bapi导入的,但是请自行更改使用。
这个bapi比 cmd_ei_api =>maintain_bapi和VMD_EI_API好用一些。
你也可以SE37看到这个bapi里面涉及到很多表。你想导入数据的字段,就可以在这些表里面寻找。一定要根据要导入的数据来设计这个导入程序。
源代码:
TABLES:sscrfields.
TYPE-POOLS:truxs,icon,slis.
*INCLUDE BDCRECX1_S.
************************************************************************
* GLOBAL STRUCTURES
************************************************************************
TYPES: BEGIN OF ty_out,
bu_group(4), "BP01
partner(10), "供应商代码-自动创建
name_org1(40), "名称1
name_org2(40), "名称2(联系人)
bu_sort1(20), "检索项:测试客户-wtx
street(60), "地址:街道名称-客户测试
post_code1(10), "邮政编码:311107
city1(40), "城市:杭州
land1(3), "国家:CN 中国
regio(3), "地区
langu(2), "语言:ZH 中文
* name_co(40), "联系人
tel_number(30), "电话:0571-86397805
tel_extens(10), "电话-分机
mob_number(30), "移动电话:159581640000
fax_number(30), "传真
fax_extens(10), "传真-分机
smtp_addr(241), "E-mail:494066891@qq.com
taxnum(20), "业务伙伴税号
bukrs(4), "公司代码
akont(10), "统驭科目:
zuawa(3), "排序码(3):
zterm(4), "付款条件:
reprf(1), "双重发票校验
bank_land(3), "银行国家
bank_id(15), "银行代码
bank_no(40), "银行账号:
BUTOBK_BKREF(40), "参考明细
* bkont TYPE bu_bkont, "银行控制码
bank_name(60), "银行名称
koinh(60), "账户持有人:
ekorg(4), "采购组织:1020 单泵
waers(5), "币种:CNY 中国人民币;
zterm2(4), "默认付款条件
webre(1),"基于收货的发票校验
dzwels(10), "付款方式
kalsk(2), "方案组
titleletter(50), "问候
statu1 TYPE iconname, "基本数据的状态
statu2 TYPE iconname, "公司代码的状态
statu3 TYPE iconname, "银行数据的状态
statu4 TYPE iconname, "采购数据的状态
message1(100),"基本数据的消息
ZCUOWU TYPE C, "错误
message2(100),"公司代码的消息
message3(100),"银行数据的消息
message4(100),"采购数据的消息
SEL TYPE C,
END OF ty_out.
************************************************************************
* INTERNAL TABLES
************************************************************************
*----------数据存储表----------
DATA: gt_out TYPE TABLE OF ty_out,
gs_out TYPE ty_out.
*"------------ALV-----------------
DATA: gt_fieldcat TYPE lvc_t_fcat, "字段目录
gs_fieldcat LIKE LINE OF gt_fieldcat,
gs_layout TYPE lvc_s_layo.
*---------------信用段数据-----------------------------------*
DATA: return TYPE ukm_t_monitor_return.
SELECTION-SCREEN BEGIN OF BLOCK b3 WITH FRAME TITLE TEXT-001.
PARAMETERS: cb_up RADIOBUTTON GROUP grp3 DEFAULT 'X' USER-COMMAND com1 .
PARAMETERS: cb_down RADIOBUTTON GROUP grp3 .
SELECTION-SCREEN END OF BLOCK b3.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE TEXT-002.
PARAMETERS: p_file TYPE rlgrap-filename MODIF ID mg1 MEMORY ID me2 . " 导入文件下载模板
SELECTION-SCREEN END OF BLOCK b1.
SELECTION-SCREEN: FUNCTION KEY 1 .
*&---------------------------------------------------------------------*
*& INITIALIZATION/选择屏幕前初始化 *
*&---------------------------------------------------------------------*
INITIALIZATION.
AT SELECTION-SCREEN OUTPUT.
*&---控制选择条件显示设置M1
LOOP AT SCREEN.
IF screen-group1 = 'MG1' .
*&---下载模板隐藏
IF cb_down = abap_true.
screen-active = 0.
ENDIF.
*&---上传文件显示
IF cb_up = abap_true .
screen-active = 1.
ENDIF.
MODIFY SCREEN.
ENDIF.
MODIFY SCREEN.
ENDLOOP.
*&---文件路径搜索帮助
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_file.
PERFORM frm_get_filename.
*&---------------------------------------------------------------------*
*& FORM FRM_GET_FILENAME
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& --> CB_CENTR TEXT
*& <-- CB_BANK TEXT
*&---------------------------------------------------------------------*
FORM frm_get_filename .
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
def_filename = p_file
mask = '*.*,*.*,*.XLS,*.XLS,*.XLSX,*.XLSX.' "DEF_PATH = 'C:\'
* MASK = '*.TXT,*.TXT.' "DEF_PATH = 'C:\'
mode = 'O'
IMPORTING
filename = p_file
EXCEPTIONS
inv_winsys = 1
no_batch = 2
selection_cancel = 3
selection_error = 4
OTHERS = 5.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form EXCEL_CREATE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM excel_create .
*&---------------------------------------------------------------------*
*& FORM FRM_DOWN_LOAD
*&---------------------------------------------------------------------*
*& TEXT
*&---------------------------------------------------------------------*
*& --> CB_CENTR TEXT
*& <-- CB_BANK TEXT
*&---------------------------------------------------------------------*
*FORM frm_down_load .
*&---变量定义
DATA: lv_text TYPE string, "MESSAGE
lv_filename TYPE string, "DOWNLOAD FILE NAME
lv_path TYPE string, "DOWNLOAD FILE PATH
ls_functxt TYPE smp_dyntxt, "MENU NAME
lv_filepath TYPE rlgrap-filename VALUE 'C', "FILE PATCH
lv_mod(20) TYPE c VALUE 'ZMB_MMB023', "MODEL
lv_fullpath TYPE string, "FULL PATH
ls_object TYPE wwwdatatab, "OBJECT NAME
lv_rc TYPE sy-subrc, "RETURN CODE
lv_title TYPE string VALUE '保存', "TITLE
lv_title_name TYPE string VALUE '供应商主数据导入模板'. "TITLE NAME
*&---调用OS 操作系统对话框
CALL METHOD cl_gui_frontend_services=>file_save_dialog
EXPORTING
window_title = lv_title
default_extension = 'XLSX'
default_file_name = lv_title_name
" WITH_ENCODING =
file_filter = 'EXCEL文件(*.XLS)|*.XLS|全部文件 (*.*)|*.*|'
initial_directory = 'D:\'
prompt_on_overwrite = 'X'
CHANGING
filename = lv_filename "默认文件名称
path = lv_path "文件路径
fullpath = lv_fullpath "文件路径
" USER_ACTION =
" FILE_ENCODING =
EXCEPTIONS
cntl_error = 1
error_no_gui = 2
not_supported_by_gui = 3
invalid_default_file_name = 4
OTHERS = 5.
IF sy-subrc <> 0.
* IMPLEMENT SUITABLE ERROR HANDLING HERE
ENDIF.
*&---操作系统文件路径
CONCATENATE lv_path
lv_filename
'.XLSX'
INTO lv_filepath.
*&---OS长度控制/*&---下载模板
IF strlen( lv_filepath ) <> 5.
*&---查询模板.
SELECT SINGLE
relid objid
FROM wwwdata
INTO CORRESPONDING FIELDS OF ls_object
WHERE srtf2 = '0'
AND objid = lv_mod. "SMW0里对象名称
IF sy-subrc <> 0 OR ls_object-objid = space .
CONCATENATE '模板文件'"'模板文件:'
lv_mod
'不存在,请用smw0进行加载'"'不存在,请用SMW0进行加载.'
INTO lv_text.
MESSAGE lv_text TYPE 'E'.
STOP.
ENDIF.
*&---下载模板
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
key = ls_object
destination = lv_filepath
IMPORTING
rc = lv_rc.
IF lv_rc <> 0.
CONCATENATE TEXT-911"''模板文件:'
lv_mod
'下载失败,请与开发人员联系'"''下载失败,请与开发人员联系.'
INTO lv_text.
MESSAGE lv_text TYPE 'E'.
STOP.
ENDIF.
*&---'已下载'
MESSAGE '已下载' TYPE 'S'.
ELSE.
*&---'已取消下载'
MESSAGE '已取消下载' TYPE 'S'.
ENDIF.
ENDFORM.
*************************************************************************
**EVENT START-OF-SELECTION.
*************************************************************************
START-OF-SELECTION.
IF cb_down EQ 'X'.
PERFORM excel_create. "下载模板
LEAVE LIST-PROCESSING.
ENDIF.
" PERFORM check_file . "检查上传文件的格式
PERFORM upload_document . "进行文档上传
*************************************************************************
**EVENT END-OF-SELECTION
*************************************************************************
END-OF-SELECTION.
PERFORM frm_output. "导入消息输出
*************************************************************************
**EVENT END-OF PAGE
*************************************************************************
END-OF-PAGE.
*&---------------------------------------------------------------------*
*& Form FRM_OUTPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_output ."输出
PERFORM form_fieldcat."列格式
PERFORM form_layout. "布局设置
PERFORM form_showdata.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FORM_FIELDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM form_fieldcat ."列格式 传的参数参
PERFORM frm_get_fieldcat USING:
'STATU1' '处理数据状态' '' '' ,
'MESSAGE1' '导入数据消息' '' '' ,
'BU_GROUP' '分组' '' '' ,
'PARTNER' '供应商编号' '' '' ,
'NAME_ORG1' '名称1' '' '' ,
'NAME_ORG2' '联系人' '' '' ,
'BU_SORT1' '检索项' '' '' ,
'STREET' '地址街道' '' '' ,
'POST_CODE1' '邮政编码' '' '' ,
'CITY1' '城市' '' '' ,
'LAND1' '国家' '' '' ,
'REGIO' '地区' '' '' ,
'LANGU' '语言' '' '' ,
'TEL_NUMBER' '电话' '' '' ,
'TEL_EXTENS' '电话-分机' '' '' ,
'MOB_NUMBER' '移动电话' '' '' ,
'FAX_NUMBER' '传真' '' '' ,
'FAX_EXTENS' '传真-分机' '' '' ,
'SMTP_ADDR' 'E-mail' '' '' ,
'TAXNUM' '税号' '' '' ,
"'TITLELETTER' '问候' '' '' ,
"'STATU2' '公司状态' '' '' ,
'BUKRS' '公司代码' '' '' ,
'AKONT' '统驭科目' '' '' ,
'ZUAWA' '排序码' '' '' ,
'ZTERM' '付款条件' '' '' ,
* 'DZWELS' '付款方式'
'REPRF' '双重发票校验' '' '' ,
* 'MESSAGE2' '公司消息' '' '' ,
" 'STATU3' '银行状态' '' '' ,
'BANK_LAND' '银行国家' '' '' ,
'BANK_ID' '银行代码' '' '' ,
'BANK_NO' '银行账号' '' '' ,
'BUTOBK_BKREF' '参考明细' '' '' ,
'BANK_NAME' '银行名称' '' '' ,
'KOINH' '账户持有人' '' '' ,
* 'MESSAGE3' '银行消息' '' '' ,
" 'STATU4' '采购状态' '' '' ,
'EKORG' '采购组织' '' '' ,
'WAERS' '货币码' '' '' ,
'ZTERM2' '采购付款条件' '' '' ,
'WEBRE' '发票校验' '' '' .
* 'MESSAGE4' '采购消息' '' '' .
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_FIELDCAT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->pv_fieldname text
* -->pv_coltext text
* -->pv_ref_table text
* -->pv_ref_table text
*----------------------------------------------------------------------*
FORM frm_get_fieldcat USING "列格式 传参形式
pv_fieldname TYPE any
pv_coltext TYPE any
pv_ref_table TYPE any
pv_ref_field TYPE any.
CLEAR gs_fieldcat.
gs_fieldcat-fieldname = pv_fieldname.
gs_fieldcat-coltext = pv_coltext.
gs_fieldcat-scrtext_l = pv_coltext.
gs_fieldcat-ref_table = pv_ref_table.
gs_fieldcat-ref_field = pv_ref_field.
APPEND gs_fieldcat TO gt_fieldcat.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FORM_LAYOUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM form_layout ."布局设置
gs_layout-cwidth_opt = 'X'.
gs_layout-zebra = 'X'.
gs_layout-box_fname = 'SEL'.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form OPEN_DIALOG
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM open_dialog .
DATA:lt_file_table TYPE filetable.
DATA:ls_file_table TYPE file_table.
DATA:l_rc TYPE i.
DATA: lv_filter TYPE string.
lv_filter = 'ALL FILES (*.*)|*.*|EXCEL FILES (*.XLS)|*.XLS|WORD FILES(*.DOC)|*.DOC'.
CALL METHOD cl_gui_frontend_services=>file_open_dialog
EXPORTING
window_title = '选择文件'
default_filename = '*.XLSX' "默认excel文件"
initial_directory = 'D:\ ' "默认打开D盘,也可以默认空"
multiselection = '' "文件单选"
CHANGING
file_table = lt_file_table
rc = l_rc
EXCEPTIONS
file_open_dialog_failed = 1
cntl_error = 2
error_no_gui = 3
not_supported_by_gui = 4
OTHERS = 5.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
EXIT.
ELSE.
"选择文件框的赋值 将选择的文件地址写入到地址栏"
READ TABLE lt_file_table INTO ls_file_table INDEX 1.
IF sy-subrc = 0.
p_file = ls_file_table-filename.
REFRESH : lt_file_table.
CLEAR:ls_file_table.
ENDIF.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CHECK_FILE
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM check_file .
DATA: lv_s1 TYPE string,
lv_s2 TYPE string.
IF p_file IS NOT INITIAL.
SPLIT p_file AT '.' INTO lv_s1 lv_s2.
TRANSLATE lv_s2 TO UPPER CASE.
IF lv_s2 <> 'XLS' AND lv_s2 <> 'XLSX' AND lv_s2 <> 'TXT'.
MESSAGE '文件格式不对!' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
ELSE.
MESSAGE '文件名不能为空!' TYPE 'S' DISPLAY LIKE 'E'.
LEAVE LIST-PROCESSING.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form UPLOAD_DOCUMENT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM upload_document .
"定义表格结构内表。"
DATA: lt_excel TYPE TABLE OF zalsmex_tabline, "表格结构。"
ls_excel TYPE zalsmex_tabline.
"ALSMEX_TABLINE是具有Excel数据的表行,有三个组件,row col value 。"
DATA:get_file TYPE rlgrap-filename."这里参照系统中的结构字段。"
MOVE p_file TO get_file."将地址栏的值赋值给GET_FILE"
"调用此函数,将Excel中的内容以类似坐标的形式存储到LT_EXCEL内表中。"
"使用ALSM_EXCEL_TO_INTERNAL_TABLE函数导入数据,一个excel文件最大行数只可为9999,如果超出是无法全部读入内表中的,会丢失其余行。
“这个函数可以用:ALSM_EXCEL_TO_INTERNAL_TABLE 替代
call function 'ZALSM_EXCEL_TO_INTERNAL_TABLE'
EXPORTING
filename = get_file
i_begin_col = 1
i_begin_row = 3
i_end_col = 75
i_end_row = 65535
TABLES
intern = lt_excel
EXCEPTIONS
inconsistent_parameters = 1
upload_ole = 2
OTHERS = 3.
DELETE lt_excel WHERE row = 1."删除第一行抬头。如果excel文件中不存在抬头的话,可不写此句。"
IF lt_excel IS INITIAL.
CALL FUNCTION 'POPUP_TO_CONFIRM_WITH_MESSAGE'
EXPORTING
* DEFAULTOPTION = 'Y'
diagnosetext1 = '数据错误'
* DIAGNOSETEXT2 = ' '
* DIAGNOSETEXT3 = ' '
textline1 = 'Excel表格中没有内容!'
titel = '提示'.
RETURN.
ENDIF.
CLEAR:gt_out.
FIELD-SYMBOLS:<fs>.
SORT lt_excel BY row col.
DATA:num_col TYPE i.
"将转换后的EXCEL内表中数据按照导入模板顺序依次放入内表,
"故应将EXCEL模板顺序和内表顺序保持一致
LOOP AT lt_excel INTO ls_excel.
num_col = ls_excel-col.
ASSIGN COMPONENT num_col OF STRUCTURE gs_out TO <fs>.
<fs> = ls_excel-value.
AT END OF row.
APPEND gs_out TO gt_out.
CLEAR:gs_out.
ENDAT.
CLEAR:ls_excel.
ENDLOOP.
*付款条件
SELECT
SPRAS,
zterm
INTO TABLE @DATA(gt_fktj) " 付款条件
FROM t052u
WHERE spras = '1'.
SELECT
PARTNER,
taxnum,
taxnumXL
INTO TABLE @DATA(GT_SHUIH)
FROM DFKKBPTAXNUM
WHERE TAXTYPE = 'CN5' OR TAXTYPE = 'CN0' .
LOOP AT gt_out INTO gs_out .
*是否要给号
IF gs_out-bu_group = 'C009' OR gs_out-bu_group = 'C010' . "这个分组各个公司都不一样
IF gs_out-partner = ''.
gs_out-zcuowu = 'X'.
gs_out-message1 = '此分组需要给定供应商编号'.
ENDIF.
ENDIF.
*税号是否存在
IF gs_out-taxnum NE ''.
READ TABLE GT_SHUIH INTO DATA(GS_SHUIH) WITH KEY taxnumXL = gs_out-taxnum.
IF sy-subrc EQ 0.
gs_out-message1 = gs_out-message1 && '相同税号已经存在,只能修改。'.
" gs_out-zcuowu = 'X'.
gs_out-partner = GS_SHUIH-partner.
ENDIF.
CLEAR GS_SHUIH.
READ TABLE GT_SHUIH INTO DATA(GS_SHUIH2) WITH KEY taxnum = gs_out-taxnum.
IF sy-subrc EQ 0.
gs_out-message1 = gs_out-message1 && '相同税号已经存在,只能修改。'.
" gs_out-zcuowu = 'X'.
gs_out-partner = GS_SHUIH2-partner.
ENDIF.
CLEAR GS_SHUIH2.
ELSE.
gs_out-message1 = gs_out-message1 && '税号不能为空!'.
gs_out-zcuowu = 'X'.
ENDIF.
"付款条款的检查
IF gs_out-zterm NE '' .
READ TABLE gt_fktj INTO DATA(gs_fktj) WITH KEY zterm = gs_out-zterm.
IF sy-subrc <> 0.
gs_out-message1 = gs_out-message1 && '付款条款不存在!'.
gs_out-zcuowu = 'X'.
ENDIF.
CLEAR :gs_fktj.
ENDIF.
IF gs_out-zterm2 NE '' .
READ TABLE gt_fktj INTO DATA(gs_fktj2) WITH KEY zterm = gs_out-zterm2.
IF sy-subrc <> 0.
gs_out-message1 = gs_out-message1 && '付款条款不存在!'.
gs_out-zcuowu = 'X'.
ENDIF.
CLEAR :gs_fktj2.
ENDIF.
* 分组检查-----
IF gs_out-bu_group = 'C001' ."分组有需要调整哟
ELSE.
gs_out-message1 = gs_out-message1 && '分组不存在!'.
gs_out-zcuowu = 'X'.
ENDIF.
MODIFY gt_out FROM gs_out.
CLEAR gs_out .
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FORM_SHOWDATA
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM form_showdata .
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
i_callback_program = sy-repid
is_layout_lvc = gs_layout
i_save = 'A'
it_fieldcat_lvc = gt_fieldcat[]
i_callback_pf_status_set = 'FRM_SET_STATUS'
i_callback_user_command = 'USER_COMMAND'
TABLES
t_outtab = gt_out
EXCEPTIONS
program_error = 1
OTHERS = 2.
ENDFORM.
*&---------------------------------------------------------------------*
*& FORM FRM_SET_STATUS
*&---------------------------------------------------------------------*
* TEXT
*----------------------------------------------------------------------*
* -->RT_EXTAB TEXT
*----------------------------------------------------------------------*
FORM frm_set_status USING rt_extab TYPE slis_t_extab.
SET PF-STATUS 'STANDARD' .
ENDFORM. "FRM_SET_STATUS
*---------------------------------------------------------------------*
* FORM USER_COMMAND *
*---------------------------------------------------------------------*
* ........ *
*--------------------------------------------------------------------*
* --> R_UCOMM *
* --> RS_SELFIELD *
*---------------------------------------------------------------------*
FORM user_command USING r_ucomm LIKE sy-ucomm
rs_selfield TYPE slis_selfield.
DATA: lr_grid TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = lr_grid.
CALL METHOD lr_grid->check_changed_data.
rs_selfield-refresh = 'X'.
rs_selfield-col_stable = 'X'.
rs_selfield-row_stable = 'X'.
CASE r_ucomm.
WHEN '&IC1' . "双击事件
IF rs_selfield-value IS INITIAL."值不为空
r_ucomm = '&ETA'.
ENDIF.
CHECK rs_selfield-value IS NOT INITIAL.
READ TABLE gt_out INTO gs_out INDEX rs_selfield-tabindex.
CASE rs_selfield-fieldname.
WHEN 'PARTNER'. "
CHECK gS_out-partner IS NOT INITIAL.
SET PARAMETER ID 'BPA' FIELD gS_out-partner.
CALL TRANSACTION 'BP' AND SKIP FIRST SCREEN.
WHEN OTHERS.
r_ucomm = '&ETA'.
ENDCASE.
CLEAR gs_out.
WHEN 'ZIMPORT'.
PERFORM badi_daoru.
CALL METHOD lr_grid->refresh_table_display.
WHEN OTHERS.
ENDCASE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form BADI_DAORU
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM badi_daoru .
DATA:ls_cvis_bp_general TYPE cvis_bp_general,
lt_cvis_bp_general LIKE TABLE OF ls_cvis_bp_general, "一般数据
ls_cvis_bp_role TYPE cvis_bp_role,
lt_cvis_bp_role LIKE TABLE OF cvis_bp_role, "角色
ls_cvis_bp_bank_details TYPE cvis_bp_bank_details, "
lt_cvis_bp_bank_details LIKE TABLE OF cvis_bp_bank_details, "银行
ls_cvis_bp_tax_number TYPE cvis_bp_tax_number,
lt_cvis_bp_tax_number LIKE TABLE OF ls_cvis_bp_tax_number,
ls_cvis_bp_address TYPE cvis_bp_address,
lt_cvis_bp_address LIKE TABLE OF ls_cvis_bp_address,
ls_cvis_bp_address_teleno TYPE cvis_bp_address_teleno, "电话号码
lt_cvis_bp_address_teleno LIKE TABLE OF ls_cvis_bp_address_teleno,
ls_cvis_bp_address_faxno TYPE cvis_bp_address_faxno,
lt_cvis_bp_address_faxno LIKE TABLE OF ls_cvis_bp_address_faxno, "传真号码
ls_cvis_bp_address_email TYPE cvis_bp_address_email,
lt_cvis_bp_address_email LIKE TABLE OF ls_cvis_bp_address_email, "邮箱号码
ls_cvis_bp_return TYPE cvis_bp_return,
lt_cvis_bp_return LIKE TABLE OF cvis_bp_return,
ls_cvis_supplier_general TYPE cvis_supplier_general,
lt_cvis_supplier_general TYPE TABLE OF cvis_supplier_general,
ls_cvis_supplier_company TYPE cvis_supplier_company,
lt_cvis_supplier_company LIKE TABLE OF cvis_supplier_company,
ls_cvis_supplier_purchasing TYPE cvis_supplier_purchasing,
lt_cvis_supplier_purchasing LIKE TABLE OF cvis_supplier_purchasing, "采购视图
ls_cvis_supplier_purchasing2 TYPE cvis_supplier_purchasing2,
lt_cvis_supplier_purchasing2 LIKE TABLE OF cvis_supplier_purchasing2, "采购视图
ls_sup_purch_functions TYPE cvis_supplier_purch_func,
lt_sup_purch_functions LIKE TABLE OF cvis_supplier_purch_func,
is_supplier_contacts TYPE cvis_supplier_contacts,
it_supplier_contacts LIKE TABLE OF cvis_supplier_contacts,
is_sup_cont_address1 TYPE cvis_supp_cont_address1,
it_sup_cont_address1 LIKE TABLE OF cvis_supp_cont_address1,
is_sup_cont_teleno1 TYPE cvis_supp_cont_teleno1,
it_sup_cont_teleno1 LIKE TABLE OF cvis_supp_cont_teleno1,
is_sup_cont_fax1 TYPE cvis_supp_cont_fax1,
it_sup_cont_fax1 LIKE TABLE OF cvis_supp_cont_fax1,
is_sup_cont_email1 TYPE cvis_supp_cont_email1,
it_sup_cont_email1 LIKE TABLE OF cvis_supp_cont_email1,
lv_bpartner TYPE bu_partner,
ls_tb003i TYPE tb003i,
lt_tb003i LIKE TABLE OF ls_tb003i,
lv_guid TYPE but000-partner_guid,
lv_object_task TYPE bus_ei_object_task, "I为创建,U修改
lv_bkvid TYPE bu_bkvid,
lv_index TYPE sy-tabix,
lv_category TYPE bu_id_category,
lv_bezei TYPE bezei20,
lv_run_id TYPE cvi_run_id,
lv_lines TYPE i.
*长文本参数
DATA:ls_line TYPE tline,
lt_line TYPE TABLE OF tline,
ls_thead TYPE thead-tdname.
DATA:ls_strlen TYPE i,
lv_strlen TYPE i,
i_subruc TYPE i.
* CLEAR ls_header.
LOOP AT gt_out ASSIGNING FIELD-SYMBOL(<fs_partner>) WHERE sel = 'X' AND zcuowu = ''.
" PERFORM frm_partner_alpha_input CHANGING <fs_partner>-partner. "业务伙伴加零
IF <fs_partner>-partner IS NOT INITIAL.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = <fs_partner>-partner
IMPORTING
output = <fs_partner>-partner.
ENDIF.
*统驭科目:加零
IF <fs_partner>-akont IS NOT INITIAL.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = <fs_partner>-akont
IMPORTING
output = <fs_partner>-akont.
ENDIF.
*语言
IF <fs_partner>-langu IS NOT INITIAL.
CALL FUNCTION 'CONVERSION_EXIT_ISOLA_INPUT'
EXPORTING
input = <fs_partner>-langu
IMPORTING
output = <fs_partner>-langu "语言
EXCEPTIONS
unknown_language = 1
OTHERS = 2.
IF sy-subrc <> 0.
"Implement suitable error handling here
ENDIF.
ENDIF.
*查业务伙伴是否存在
CLEAR lv_guid.
SELECT SINGLE partner_guid INTO lv_guid
FROM but000 WHERE partner = <fs_partner>-partner.
*判断是修改还是新建
IF sy-subrc = 0.
lv_object_task = 'U'. "修改BP
ls_cvis_bp_general-bpartnerguid = lv_guid.
ELSE.
lv_object_task = 'I'. "创建BP
*lv_guid 是 BAPI 的 CHAR 32 格式业务伙伴地址的全局唯一标识
CALL FUNCTION 'RS_DME_MG_GENERATE_GUID'
IMPORTING
e_guid_16 = lv_guid.
* E_GUID_32 = ls_cvis_bp_general-bpartnerguid .
ENDIF.
ls_cvis_bp_general-object_task = lv_object_task.
*runid 区分用的
IF lv_run_id IS INITIAL.
lv_run_id = '2000000' .
ELSE.
lv_run_id = lv_run_id + 1.
ENDIF.
* bp_general————————一般数据赋值——————————————————————————————————————
ls_cvis_bp_general-run_id = lv_run_id.".'1000000'.
ls_cvis_bp_general-category = '2'.
*业务分组
IF <fs_partner>-bu_group NE '' .
ls_cvis_bp_general-grouping = <fs_partner>-bu_group. "业务合作伙伴组
ELSE.
ls_cvis_bp_general-grouping = '0001'. "业务合作伙伴组
ENDIF.
*伙伴编码,名称
ls_cvis_bp_general-bpartner = <fs_partner>-partner.
ls_cvis_bp_general-name1 = <fs_partner>-name_org1."名称·1
ls_cvis_bp_general-name2 = <fs_partner>-name_org2."名称2,联系人
*搜索项
ls_cvis_bp_general-searchterm1 = <fs_partner>-bu_sort1.
APPEND ls_cvis_bp_general TO lt_cvis_bp_general.
CLEAR ls_cvis_bp_general.
*
**———————————————————————以上是一般数据的赋值———————————————————————————————————————————————
*——ls_cvis_bp_address——————————————BP Address Data——— 地址数据赋值—————————————————————————————————
ls_cvis_bp_address-run_id = lv_run_id. "
ls_cvis_bp_address-guid = lv_guid. "
ls_cvis_bp_address-comm_type = 'INT'.
ls_cvis_bp_address-langu = sy-langu.
ls_cvis_bp_address-street = <fs_partner>-street."街道
IF <fs_partner>-post_code1 = ''. "为空就填写888
ls_cvis_bp_address-postl_cod1 = '888888'.
ELSE.
ls_cvis_bp_address-postl_cod1 = <fs_partner>-post_code1."邮政编码
ENDIF.
ls_cvis_bp_address-city = <fs_partner>-city1.
ls_cvis_bp_address-region = <fs_partner>-regio.
ls_cvis_bp_address-country = <fs_partner>-land1.
APPEND ls_cvis_bp_address TO lt_cvis_bp_address.
CLEAR: ls_cvis_bp_address..
*电话号码
ls_cvis_bp_address_teleno-run_id = lv_run_id. "电话号码
ls_cvis_bp_address_teleno-country = <fs_partner>-land1.
ls_cvis_bp_address_teleno-telephone = <fs_partner>-tel_number. "电话
ls_cvis_bp_address_teleno-extension = <fs_partner>-tel_extens. "电话分机号
APPEND ls_cvis_bp_address_teleno TO lt_cvis_bp_address_teleno .
CLEAR ls_cvis_bp_address_teleno.
*移动电话
IF <fs_partner>-mob_number IS NOT INITIAL.
ls_cvis_bp_address_teleno-run_id = lv_run_id. "电话号码
ls_cvis_bp_address_teleno-country = <fs_partner>-land1.
ls_cvis_bp_address_teleno-telephone = <fs_partner>-mob_number. "电话
ls_cvis_bp_address_teleno-r_3_user = '2'."是否移动电话
APPEND ls_cvis_bp_address_teleno TO lt_cvis_bp_address_teleno .
CLEAR ls_cvis_bp_address_teleno.
ENDIF.
*传真
ls_cvis_bp_address_faxno-run_id = lv_run_id.
ls_cvis_bp_address_faxno-country = <fs_partner>-land1.
ls_cvis_bp_address_faxno-fax = <fs_partner>-fax_number. "传真
ls_cvis_bp_address_faxno-extension = <fs_partner>-fax_extens. "传真分机号
APPEND ls_cvis_bp_address_faxno TO lt_cvis_bp_address_faxno. "传真号码
CLEAR ls_cvis_bp_address_faxno.
*电子邮件
ls_cvis_bp_address_email-run_id = lv_run_id.
IF <fs_partner>-smtp_addr IS INITIAL.
ls_cvis_bp_address_email-e_mail = '888888@126.COM'."<fs_PARTNER>-ad_smtpadr. "电子邮件地址
ELSE.
ls_cvis_bp_address_email-e_mail = <fs_partner>-smtp_addr. "电子邮件地址
ENDIF.
APPEND ls_cvis_bp_address_email TO lt_cvis_bp_address_email. "邮箱号码
CLEAR ls_cvis_bp_address_email.
***——————————————地址数据赋值————————————————————————————————————————————————————————————————
*——————————————————BP角色——————————————————————————————————————————————
ls_cvis_bp_role-run_id = lv_run_id. "'1000000'.
ls_cvis_bp_role-data_key = 'FLVN00'." 'FLVN00'.
APPEND ls_cvis_bp_role TO lt_cvis_bp_role.
CLEAR ls_cvis_bp_role.
ls_cvis_bp_role-run_id = lv_run_id. "'1000000'.
ls_cvis_bp_role-data_key = 'FLVN01'." 'FLVN00'.
APPEND ls_cvis_bp_role TO lt_cvis_bp_role.
CLEAR ls_cvis_bp_role.
ls_cvis_supplier_general-run_id = lv_run_id. "供应商一般数据
ls_cvis_supplier_general-object_task = lv_object_task.
IF <fs_partner>-partner NE '' .
ls_cvis_supplier_general-lifnr = <fs_partner>-partner.
ENDIF.
APPEND ls_cvis_supplier_general TO lt_cvis_supplier_general.
CLEAR ls_cvis_supplier_general.
*———————————————————BP角色—————————————————————————————————————————————
*——税号—————查重和赋值———————————————————————————————————————————————————————————————
ls_cvis_bp_tax_number-run_id = lv_run_id.
ls_cvis_bp_tax_number-taxtype = 'CN5'.
ls_cvis_bp_tax_number-taxnumber = <fs_partner>-taxnum.
" ls_cvis_bp_tax_number-taxnumxl = <fs_partner>-taxnum.
APPEND ls_cvis_bp_tax_number TO lt_cvis_bp_tax_number.
CLEAR ls_cvis_bp_tax_number.
*—————税号—————————————————————————————————————————————————————————
*————银行信息赋值————————————————————————————————————————————______________________________________
IF <fs_partner>-bank_no NE '' .
lv_bkvid = lv_bkvid + 1.
CONDENSE lv_bkvid NO-GAPS.
lv_index = strlen( lv_bkvid ).
lv_index = 4 - lv_index.
DO lv_index TIMES.
lv_bkvid = '0' && lv_bkvid.
ENDDO.
ls_cvis_bp_bank_details-run_id = lv_run_id.
ls_cvis_bp_bank_details-bank_ctry = <fs_partner>-bank_land. "银行国家
ls_cvis_bp_bank_details-data_key = lv_bkvid. "银行国家
ls_cvis_bp_bank_details-bank_key = <fs_partner>-bank_id. "银行代码
ls_cvis_bp_bank_details-bank_acct = <fs_partner>-bank_no. "银行账号
ls_cvis_bp_bank_details-bank_ref = <fs_partner>-butobk_bkref ."参考明细,账号写不下才放尾数在这
ls_cvis_bp_bank_details-accountholder = <fs_partner>-koinh."账号持有人。
APPEND ls_cvis_bp_bank_details TO lt_cvis_bp_bank_details.
CLEAR ls_cvis_bp_bank_details.
ENDIF.
*————————银行信息赋值——————————————————————————————————————————————————————————————————————————————
*——————————公司代码数据——————————————————————————————————————————————————————————————
ls_cvis_supplier_company-run_id = lv_run_id.
ls_cvis_supplier_company-bukrs = <fs_partner>-bukrs. "公司代码
ls_cvis_supplier_company-akont = <fs_partner>-akont. "统驭科目
ls_cvis_supplier_company-zuawa = <fs_partner>-zuawa."排序码
ls_cvis_supplier_company-zterm = <fs_partner>-zterm. "付款条件
ls_cvis_supplier_company-reprf = <fs_partner>-reprf ."双重发票校验
APPEND ls_cvis_supplier_company TO lt_cvis_supplier_company.
CLEAR ls_cvis_supplier_company.
*————————————————————————————————————————————————————————————————————
*———————采购视图赋值—————————————————————————————————————————————————————————————
ls_cvis_supplier_purchasing-run_id = lv_run_id.
ls_cvis_supplier_purchasing-ekorg = <fs_partner>-ekorg. "采购组织
ls_cvis_supplier_purchasing-waers = <fs_partner>-waers. "币种
ls_cvis_supplier_purchasing-zterm = <fs_partner>-zterm2 ."付款条件
ls_cvis_supplier_purchasing-webre = <fs_partner>-webre ."基于收货的发票校验
APPEND ls_cvis_supplier_purchasing TO lt_cvis_supplier_purchasing.
CLEAR ls_cvis_supplier_purchasing.
*————————————————————————————————————————————————————————————————————————————————————
**_____________________________业务伙伴功能————————————————————————————————
SELECT SINGLE
LFA1~LIFNR,
LFA1~LAND1,
LFM1~EKORG,"采购组织
LFB1~BUKRS "公司代码
INTO @DATA(GS_LIFNR)
FROM LFA1
LEFT JOIN LFB1 ON LFA1~lifnr = LFB1~lifnr
LEFT JOIN LFM1 ON LFA1~lifnr = LFM1~lifnr
WHERE LFA1~lifnr = @<fs_partner>-partner
AND LFM1~ekorg = @<fs_partner>-ekorg
AND LFB1~bukrs = @<fs_partner>-bukrs.
IF GS_LIFNR-bukrs = '' AND GS_LIFNR-ekorg = '' .
ls_sup_purch_functions-run_id = lv_run_id.
" ls_sup_purch_functions-parza = 1.
ls_sup_purch_functions-ekorg = <fs_partner>-ekorg.
ls_sup_purch_functions-parvw = 'BA'."'OA'.
ls_sup_purch_functions-partner = <fs_partner>-partner.
APPEND ls_sup_purch_functions TO lt_sup_purch_functions.
CLEAR ls_sup_purch_functions.
ls_sup_purch_functions-run_id = lv_run_id.
ls_sup_purch_functions-ekorg = <fs_partner>-ekorg.
ls_sup_purch_functions-parvw = 'LF'. "'VN'.
ls_sup_purch_functions-partner = <fs_partner>-partner.
APPEND ls_sup_purch_functions TO lt_sup_purch_functions.
CLEAR ls_sup_purch_functions.
ls_sup_purch_functions-run_id = lv_run_id.
ls_sup_purch_functions-ekorg = <fs_partner>-ekorg.
ls_sup_purch_functions-parvw = 'RS'."'PI'.
ls_sup_purch_functions-partner = <fs_partner>-partner.
APPEND ls_sup_purch_functions TO lt_sup_purch_functions.
CLEAR ls_sup_purch_functions.
ENDIF.
CLEAR GS_LIFNR.
*————————————————————业务伙伴功能——————————————————————————————————————————
"调取BAPI"
CALL FUNCTION 'RFC_CVI_EI_INBOUND_MAIN'
EXPORTING
iv_docommit = 'X'
* IV_CREATE_APPLOG =
* IV_SUPPRESS_TAXJUR_CHECK =
TABLES
it_bp_general = lt_cvis_bp_general
it_bp_role = lt_cvis_bp_role
* IT_BP_INDUSTRY =
* IT_BP_IDENT_NUMBERS =
it_bp_bank_details = lt_cvis_bp_bank_details
it_bp_tax_number = lt_cvis_bp_tax_number
" IT_BP_TAX_NUMBER_COMMON =
it_bp_address = lt_cvis_bp_address
" IT_BP_ADDRESS_USAGE =
it_bp_address_teleno = lt_cvis_bp_address_teleno
"IT_BP_ADDRESS_TELENO_REMARKS =
it_bp_address_faxno = lt_cvis_bp_address_faxno
it_bp_address_email = lt_cvis_bp_address_email
it_sup_general = lt_cvis_supplier_general
it_sup_company = lt_cvis_supplier_company
it_sup_purchasing = lt_cvis_supplier_purchasing
it_sup_purch_functions = lt_sup_purch_functions
ct_return = lt_cvis_bp_return.
.
CLEAR ls_cvis_bp_return.
LOOP AT lt_cvis_bp_return INTO ls_cvis_bp_return WHERE type = 'E' OR type = 'A' .
IF sy-subrc = 0.
CONCATENATE <fs_partner>-message1 ls_cvis_bp_return-message sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4
INTO <fs_partner>-message1 SEPARATED BY '/'.
i_subruc = 1.
<fs_partner>-statu1 = '@0A@'.
ENDIF.
ENDLOOP.
LOOP AT lt_cvis_bp_return INTO ls_cvis_bp_return WHERE type = 'S'.
<fs_partner>-partner = ls_cvis_bp_return-object_key.
<fs_partner>-message1 = <fs_partner>-message1 && '修改或者导入成功'.
<fs_partner>-statu1 = '@08@'.
ENDLOOP.
*
REFRESH:
lt_cvis_bp_general,
lt_cvis_bp_role,
lt_cvis_bp_bank_details,
lt_cvis_bp_tax_number,
lt_cvis_bp_address,
lt_cvis_bp_address_teleno,
lt_cvis_bp_address_faxno,
lt_cvis_bp_address_email,
lt_cvis_supplier_general,
lt_cvis_supplier_company,
lt_cvis_supplier_purchasing,
lt_cvis_bp_return.
CLEAR:lv_category, lv_bkvid,lv_index.
ENDLOOP.
ENDFORM.
FORM frm_partner_alpha_input CHANGING cv_bpartner.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = cv_bpartner
IMPORTING
output = cv_bpartner.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form CONVERSION_EXIT_PARVW_INPUT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& <-- LS_HEADER_PARVW
*&---------------------------------------------------------------------*
FORM conversion_exit_parvw_input CHANGING cv_parvw.
CALL FUNCTION 'CONVERSION_EXIT_PARVW_INPUT'
EXPORTING
input = cv_parvw
IMPORTING
output = cv_parvw.
ENDFORM.
使用代码的注意点
1.这个程序是在excel中填写好数据,再导入系统的,导入的格式顺序请你参考源代码中的定义顺序。
2.从excel 的第一列第三行开始写具体的供应商主数据
3.里面有邮政编码和邮箱,没填写就自动填写888了。使用时候要注意。
4.这个代码既可以更新也可创建供应商主数据。
5.一定要根据实际情况去调整程序,不能一味照搬。
分享使我快乐,我是寒武青锋。
记得点赞哟。
鸣谢:彭老师提供帮助。