货源清单BDC导入程序
来源:互联网 发布:烟台网络党校登录 编辑:程序博客网 时间:2024/04/29 04:33
*&---------------------------------------------------------------------*
*& Report ZJ_ABAP_OBJ_MM_0240
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZJ_ABAP_OBJ_MM_0240.
*************************************************************************
*DATA
*************************************************************************
DATA: BEGIN OF gdt_input OCCURS 0,
matnr LIKE eord-matnr,
werks LIKE eord-werks,
vdatu TYPE string,
bdatu TYPE string,
lifnr LIKE eord-lifnr,
ekorg LIKE eord-ekorg,
flifn LIKE eord-flifn,
autet LIKE eord-autet,
type TYPE c,
message TYPE string,
END OF gdt_input.
DATA: BEGIN OF gdt_eina OCCURS 0,
infnr LIKE eina-infnr,
matnr LIKE eina-matnr,
lifnr LIKE eina-lifnr,
werks LIKE eine-werks,
ekorg LIKE eine-ekorg,
esokz LIKE eine-esokz,
END OF gdt_eina.
DATA: BEGIN OF gdt_eord OCCURS 0,
matnr LIKE eord-matnr,
werks LIKE eord-werks,
zeord LIKE eord-zeord,
END OF gdt_eord.
DATA: BEGIN OF gdt_tab OCCURS 0,
matnr LIKE eord-matnr,
werks LIKE eord-werks,
"lifnr LIKE eord-lifnr,
type TYPE c,
message TYPE string,
END OF gdt_tab.
TYPES:BEGIN OF gts_help,
matnr TYPE eord-matnr,
werks TYPE eord-werks,
END OF gts_help.
DATA:gdt_help TYPE STANDARD TABLE OF gts_help,
gds_help TYPE gts_help.
*----------------------------------------------------------------------*
* 定义BDC数据对象
*----------------------------------------------------------------------*
DATA: BEGIN OF gdt_bdcdata OCCURS 100.
INCLUDE STRUCTURE bdcdata.
DATA: END OF gdt_bdcdata.
DATA gdt_messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE."BDC录屏返回消息
TYPES:BEGIN OF gts_message,
type TYPE c, "消息类型
message(200) TYPE c, "消息信息
END OF gts_message.
DATA gdt_message TYPE STANDARD TABLE OF gts_message WITH HEADER LINE.
*----------------------------------------------------------------------*
* 定义alv数据对象
*----------------------------------------------------------------------*
DATA: gdt_fieldcat TYPE slis_t_fieldcat_alv,
gds_fieldcat TYPE slis_fieldcat_alv,
gds_layout TYPE slis_layout_alv.
DATA: gdf_flifn TYPE i.
DATA: gdf_erro TYPE c.
*----------------------------------------------------------------------*
* 定义选择界面
*----------------------------------------------------------------------*
*SELECTION-SCREEN BEGIN OF BLOCK b4 WITH FRAME TITLE text-011.
*PARAMETERS: r_1 RADIOBUTTON GROUP g2 DEFAULT 'X' ,
* r_2 RADIOBUTTON GROUP g2.
*SELECTION-SCREEN END OF BLOCK b4.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-011.
PARAMETERS: p_infile TYPE rlgrap-filename MEMORY ID m01.
PARAMETERS: p_test AS CHECKBOX ."DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK b1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_infile.
PERFORM frm_get_path."获取文件路径
START-OF-SELECTION.
" IF r_1 = 'X'.
PERFORM frm_upload_data."数据上载
PERFORM frm_check_data."数据校验
PERFORM frm_update_sourcelist."货源清单上传
PERFORM frm_alv_display."结果显示
* ELSE.
* "submit AQZZZ_ME11======Z_ME11======== .
* CALL TRANSACTION 'ZKMM004'.
* ENDIF.
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form FRM_GET_PATH
*&---------------------------------------------------------------------*
* 获取文件上传路径
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_get_path .
CALL FUNCTION 'TB_LIMIT_WS_FILENAME_GET'
EXPORTING
* DEF_FILENAME = ' '
* DEF_PATH = ' '
mask = 'Excel Files,*.xlsx,*.*. '
* MODE = ' '
* TITLE = ' '
IMPORTING
filename = p_infile
* PATH =
* FILE =
EXCEPTIONS
selection_cancel = 1
selection_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
* MESSAGE '获取文件路径失败!' TYPE 'E'.
ENDIF.
ENDFORM. " FRM_GET_PATH
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
* 上载数据
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_upload_data .
DATA: ldt_raw_data TYPE truxs_t_text_data.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
* I_FIELD_SEPERATOR =
i_line_header = 'X'
i_tab_raw_data = ldt_raw_data
i_filename = p_infile
TABLES
i_tab_converted_data = gdt_input
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
LOOP AT gdt_input.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
INPUT = gdt_input-matnr
IMPORTING
OUTPUT = gdt_input-matnr
EXCEPTIONS
LENGTH_ERROR = 1
OTHERS = 2
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = gdt_input-LIFNR
IMPORTING
OUTPUT = gdt_input-LIFNR
.
MODIFY gdt_input.
ENDLOOP.
ENDFORM. " FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_DATA
*&---------------------------------------------------------------------*
* 数据检查
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_check_data .
DATA:ldf_tabix TYPE sy-tabix.
DATA:ldf_message TYPE c LENGTH 100.
DATA:ldf_type TYPE c.
DATA:lds_input LIKE LINE OF gdt_input.
* LOOP AT gdt_input.
* CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
* EXPORTING
* input = gdt_input-matnr
* IMPORTING
* output = gdt_input-matnr.
* MODIFY gdt_input.
* ENDLOOP.
"判断信息记录是否存在
IF gdt_input[] IS NOT INITIAL.
SELECT eina~infnr
matnr
werks
ekorg
lifnr
esokz
INTO CORRESPONDING FIELDS OF TABLE gdt_eina
FROM eina
JOIN eine
ON eina~infnr = eine~infnr
FOR ALL ENTRIES IN gdt_input
WHERE matnr = gdt_input-matnr
AND werks = gdt_input-werks
AND ekorg = gdt_input-ekorg
AND lifnr = gdt_input-lifnr.
SELECT matnr
werks
zeord
INTO CORRESPONDING FIELDS OF TABLE gdt_eord
FROM eord
FOR ALL ENTRIES IN gdt_input
WHERE matnr = gdt_input-matnr
AND werks = gdt_input-werks.
ENDIF.
"sort gdt_input.
REFRESH gdt_help.
LOOP AT gdt_input.
ldf_tabix = sy-tabix.
"判断信息记录是否存在
CLEAR ldf_message.
CLEAR ldf_type.
READ TABLE gdt_eina WITH KEY matnr = gdt_input-matnr werks = gdt_input-werks lifnr = gdt_input-lifnr ekorg = gdt_input-ekorg.
IF sy-subrc <> 0.
CLEAR:gds_help.
gds_help-matnr = gdt_input-matnr.
gds_help-werks = gdt_input-werks.
APPEND gds_help TO gdt_help.
gdt_input-type = 'E'.
ldf_type = 'E'.
gdt_input-message = text-001.
ldf_message = gdt_input-message .
gdf_erro = 'X'.
ENDIF.
"一个物料工厂只有一个固定货源
AT NEW werks.
CLEAR gdf_flifn.
READ TABLE gdt_input INDEX ldf_tabix.
ENDAT.
gdt_input-type = ldf_type.
gdt_input-message = ldf_message.
IF gdt_input-flifn = 'X'.
gdf_flifn = gdf_flifn + 1.
IF gdf_flifn > 1.
CLEAR:gds_help.
gds_help-matnr = gdt_input-matnr.
gds_help-werks = gdt_input-werks.
APPEND gds_help TO gdt_help.
gdt_input-type = 'E'.
gdt_input-message = text-002.
gdf_erro = 'X'.
ENDIF.
ENDIF.
"对比两个工作区域
IF gdt_input = lds_input.
CLEAR:gds_help.
gds_help-matnr = gdt_input-matnr.
gds_help-werks = gdt_input-werks.
APPEND gds_help TO gdt_help.
gdt_input-type = 'E'.
gdt_input-message = '该行数据和前一行一样'.
gdf_erro = 'X'.
ENDIF.
MOVE-CORRESPONDING gdt_input TO lds_input.
CLEAR:lds_input-type,lds_input-message.
MODIFY gdt_input.
ENDLOOP.
ENDFORM. " FRM_CHECK_DATA
*&---------------------------------------------------------------------*
*& Form FRM_UPDATE_SOURCELIST
*&---------------------------------------------------------------------*
* 更新货源清单
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_update_sourcelist .
DATA: ldf_line(2) TYPE n.
DATA: ldf_field TYPE string.
DATA: ldf_tabix LIKE sy-tabix.
sort gdt_help by matnr werks.
IF p_test = '' .
LOOP AT gdt_input.
ldf_tabix = sy-tabix.
"校验是否有错误
READ TABLE gdt_help INTO gds_help with key matnr = gdt_input-matnr werks = gdt_input-werks.
if sy-subrc eq 0.
gdt_input-type = 'E'.
MODIFY gdt_input INDEX ldf_tabix.
CONTINUE.
endif.
AT NEW werks.
READ TABLE gdt_input INDEX sy-tabix.
CLEAR ldf_line.
READ TABLE gdt_eord WITH KEY matnr = gdt_input-matnr werks = gdt_input-werks.
IF sy-subrc = 0."修改
PERFORM bdc_dynpro USING 'SAPLMEOR' '0200'.
PERFORM bdc_field USING 'BDC_CURSOR'
'EORD-MATNR'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_field USING 'EORD-MATNR'
gdt_input-matnr.
PERFORM bdc_field USING 'EORD-WERKS'
gdt_input-werks.
PERFORM bdc_dynpro USING 'SAPLMEOR' '0205'.
PERFORM bdc_field USING 'BDC_CURSOR'
'EORD-EBELP(01)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=SA'.
PERFORM bdc_dynpro USING 'SAPLMEOR' '0205'.
PERFORM bdc_field USING 'BDC_CURSOR'
'EORD-EBELP(01)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=LOES'.
PERFORM bdc_dynpro USING 'SAPLSPO1' '0200'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=YES'.
PERFORM bdc_dynpro USING 'SAPLMEOR' '0205'.
PERFORM bdc_field USING 'BDC_CURSOR'
'EORD-EKORG(02)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=BU'.
ELSE."创建
PERFORM bdc_dynpro USING 'SAPLMEOR' '0200'.
PERFORM bdc_field USING 'BDC_CURSOR'
'EORD-MATNR'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_field USING 'EORD-MATNR'
gdt_input-matnr.
PERFORM bdc_field USING 'EORD-WERKS'
gdt_input-werks.
PERFORM bdc_dynpro USING 'SAPLMEOR' '0205'.
PERFORM bdc_field USING 'BDC_CURSOR'
'EORD-AUTET(02)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=BU'.
ENDIF.
ENDAT.
ldf_line = ldf_line + 1.
CONCATENATE 'EORD-VDATU(' ldf_line ')' INTO ldf_field.
PERFORM bdc_field USING ldf_field
gdt_input-vdatu.
CONCATENATE 'EORD-BDATU(' ldf_line ')' INTO ldf_field.
PERFORM bdc_field USING ldf_field
gdt_input-bdatu.
CONCATENATE 'EORD-LIFNR(' ldf_line ')' INTO ldf_field.
PERFORM bdc_field USING ldf_field
gdt_input-lifnr.
CONCATENATE 'EORD-EKORG(' ldf_line ')' INTO ldf_field.
PERFORM bdc_field USING ldf_field
gdt_input-ekorg.
CONCATENATE 'RM06W-FESKZ(' ldf_line ')' INTO ldf_field.
PERFORM bdc_field USING ldf_field
gdt_input-flifn.
CONCATENATE 'EORD-AUTET(' ldf_line ')' INTO ldf_field.
PERFORM bdc_field USING ldf_field
gdt_input-autet.
AT END OF werks.
READ TABLE gdt_input INDEX ldf_tabix.
CALL TRANSACTION 'ME01' USING gdt_bdcdata
MODE 'N'
UPDATE 'S'
MESSAGES INTO gdt_messtab.
"wait UP TO '0.5' SECONDS.
LOOP AT gdt_messtab.
CLEAR gdt_message.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = gdt_messtab-msgid
msgnr = gdt_messtab-msgnr
msgv1 = gdt_messtab-msgv1
msgv2 = gdt_messtab-msgv2
msgv3 = gdt_messtab-msgv3
msgv4 = gdt_messtab-msgv4
IMPORTING
message_text_output = gdt_message-message.
gdt_message-type = gdt_messtab-msgtyp.
APPEND gdt_message.
CLEAR gdt_message.
ENDLOOP.
gdt_tab-matnr = gdt_input-matnr.
gdt_tab-werks = gdt_input-werks.
"gdt_tab-lifnr = gdt_input-lifnr.
LOOP AT gdt_message.
IF gdt_message-type = 'E'.
gdt_tab-type = 'E'.
gdt_tab-message = gdt_message-message.
ENDIF.
IF gdt_message-type = 'S'.
gdt_tab-type = 'S'.
gdt_tab-message = gdt_message-message.
ENDIF.
ENDLOOP.
APPEND gdt_tab.
CLEAR gdt_tab.
CLEAR gdt_bdcdata.
REFRESH gdt_bdcdata.
CLEAR gdt_messtab.
REFRESH gdt_messtab.
CLEAR gdt_message.
REFRESH gdt_message.
ENDAT.
ENDLOOP.
LOOP AT gdt_input.
READ TABLE gdt_tab WITH KEY matnr = gdt_input-matnr werks = gdt_input-werks ."lifnr = gdt_input-lifnr.
IF sy-subrc = 0.
gdt_input-type = gdt_tab-type.
gdt_input-message = gdt_tab-message.
MODIFY gdt_input.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM. " FRM_UPDATE_SOURCELIST
*&---------------------------------------------------------------------*
*& Form BDC_DYNPRO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro .
CLEAR gdt_bdcdata.
gdt_bdcdata-program = program.
gdt_bdcdata-dynpro = dynpro.
gdt_bdcdata-dynbegin = 'X'.
APPEND gdt_bdcdata.
ENDFORM. " BDC_DYNPRO
*&---------------------------------------------------------------------*
*& Form BDC_FIELD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_0254 text
* -->P_0255 text
*----------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
CLEAR gdt_bdcdata.
gdt_bdcdata-fnam = fnam.
gdt_bdcdata-fval = fval.
APPEND gdt_bdcdata.
ENDFORM. " BDC_FIELD
*&---------------------------------------------------------------------*
*& Form FRM_ALV_DISPLAY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_alv_display .
CLEAR gdt_fieldcat.
REFRESH gdt_fieldcat.
PERFORM frm_filldf_fieldcat.
PERFORM frm_alv_layout.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER = ' '
i_buffer_active = 'X'
i_callback_program = sy-repid
* i_callback_pf_status_set = 'PF_STATUS'
* i_callback_user_command = 'USER_COMMAND'
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
is_layout = gds_layout
it_fieldcat = gdt_fieldcat
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* I_SAVE = ' '
* IS_VARIANT =
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP = 0
* I_HTML_HEIGHT_END = 0
* IT_ALV_GRAPHICS =
* IT_HYPERLINK =
* IT_ADD_FIELDCAT =
* IT_EXCEPT_QINFO =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = gdt_input
* EXCEPTIONS
* PROGRAM_ERROR = 1
* OTHERS = 2
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. " FRM_ALV_DISPLAY
*&---------------------------------------------------------------------*
*& Form FRM_FILldf_fieldCAT
*&---------------------------------------------------------------------*
* 填充ALV显示字段
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_filldf_fieldcat .
CLEAR gds_fieldcat.
gds_fieldcat-fieldname = 'MATNR'.
gds_fieldcat-seltext_m = '品目コード'.
gds_fieldcat-no_zero = 'X'.
APPEND gds_fieldcat TO gdt_fieldcat.
CLEAR gds_fieldcat.
gds_fieldcat-fieldname = 'WERKS'.
gds_fieldcat-seltext_m = 'プラント'.
APPEND gds_fieldcat TO gdt_fieldcat.
CLEAR gds_fieldcat.
gds_fieldcat-fieldname = 'VDATU'.
gds_fieldcat-seltext_m = '有効開始日'.
APPEND gds_fieldcat TO gdt_fieldcat.
CLEAR gds_fieldcat.
gds_fieldcat-fieldname = 'BDATU'.
gds_fieldcat-seltext_m = ' 有効終了日'.
APPEND gds_fieldcat TO gdt_fieldcat.
CLEAR gds_fieldcat.
gds_fieldcat-fieldname = 'LIFNR'.
gds_fieldcat-seltext_m = '仕入先コード'.
APPEND gds_fieldcat TO gdt_fieldcat.
CLEAR gds_fieldcat.
gds_fieldcat-fieldname = 'EKORG'.
gds_fieldcat-seltext_m = '購買組織'.
APPEND gds_fieldcat TO gdt_fieldcat.
CLEAR gds_fieldcat.
gds_fieldcat-fieldname = 'FLIFN'.
gds_fieldcat-seltext_m = '固定'.
APPEND gds_fieldcat TO gdt_fieldcat.
CLEAR gds_fieldcat.
gds_fieldcat-fieldname = 'AUTET'.
gds_fieldcat-seltext_m = ' MRPで使用 '.
APPEND gds_fieldcat TO gdt_fieldcat.
CLEAR gds_fieldcat.
gds_fieldcat-fieldname = 'TYPE'.
gds_fieldcat-seltext_m = 'メッセージタイプ'.
APPEND gds_fieldcat TO gdt_fieldcat.
CLEAR gds_fieldcat.
gds_fieldcat-fieldname = 'MESSAGE'.
gds_fieldcat-seltext_m = 'メッセージ'.
APPEND gds_fieldcat TO gdt_fieldcat.
ENDFORM. " FRM_FILldf_fieldCAT
*&---------------------------------------------------------------------*
*& Form FRM_ALV_LAYOUT
*&---------------------------------------------------------------------*
* 设置ALV显示格式
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_alv_layout .
gds_layout-colwidth_optimize = 'X'.
ENDFORM. " FRM_ALV_LAYOUT
*& Report ZJ_ABAP_OBJ_MM_0240
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*
REPORT ZJ_ABAP_OBJ_MM_0240.
*************************************************************************
*DATA
*************************************************************************
DATA: BEGIN OF gdt_input OCCURS 0,
matnr LIKE eord-matnr,
werks LIKE eord-werks,
vdatu TYPE string,
bdatu TYPE string,
lifnr LIKE eord-lifnr,
ekorg LIKE eord-ekorg,
flifn LIKE eord-flifn,
autet LIKE eord-autet,
type TYPE c,
message TYPE string,
END OF gdt_input.
DATA: BEGIN OF gdt_eina OCCURS 0,
infnr LIKE eina-infnr,
matnr LIKE eina-matnr,
lifnr LIKE eina-lifnr,
werks LIKE eine-werks,
ekorg LIKE eine-ekorg,
esokz LIKE eine-esokz,
END OF gdt_eina.
DATA: BEGIN OF gdt_eord OCCURS 0,
matnr LIKE eord-matnr,
werks LIKE eord-werks,
zeord LIKE eord-zeord,
END OF gdt_eord.
DATA: BEGIN OF gdt_tab OCCURS 0,
matnr LIKE eord-matnr,
werks LIKE eord-werks,
"lifnr LIKE eord-lifnr,
type TYPE c,
message TYPE string,
END OF gdt_tab.
TYPES:BEGIN OF gts_help,
matnr TYPE eord-matnr,
werks TYPE eord-werks,
END OF gts_help.
DATA:gdt_help TYPE STANDARD TABLE OF gts_help,
gds_help TYPE gts_help.
*----------------------------------------------------------------------*
* 定义BDC数据对象
*----------------------------------------------------------------------*
DATA: BEGIN OF gdt_bdcdata OCCURS 100.
INCLUDE STRUCTURE bdcdata.
DATA: END OF gdt_bdcdata.
DATA gdt_messtab LIKE bdcmsgcoll OCCURS 0 WITH HEADER LINE."BDC录屏返回消息
TYPES:BEGIN OF gts_message,
type TYPE c, "消息类型
message(200) TYPE c, "消息信息
END OF gts_message.
DATA gdt_message TYPE STANDARD TABLE OF gts_message WITH HEADER LINE.
*----------------------------------------------------------------------*
* 定义alv数据对象
*----------------------------------------------------------------------*
DATA: gdt_fieldcat TYPE slis_t_fieldcat_alv,
gds_fieldcat TYPE slis_fieldcat_alv,
gds_layout TYPE slis_layout_alv.
DATA: gdf_flifn TYPE i.
DATA: gdf_erro TYPE c.
*----------------------------------------------------------------------*
* 定义选择界面
*----------------------------------------------------------------------*
*SELECTION-SCREEN BEGIN OF BLOCK b4 WITH FRAME TITLE text-011.
*PARAMETERS: r_1 RADIOBUTTON GROUP g2 DEFAULT 'X' ,
* r_2 RADIOBUTTON GROUP g2.
*SELECTION-SCREEN END OF BLOCK b4.
SELECTION-SCREEN BEGIN OF BLOCK b1 WITH FRAME TITLE text-011.
PARAMETERS: p_infile TYPE rlgrap-filename MEMORY ID m01.
PARAMETERS: p_test AS CHECKBOX ."DEFAULT 'X'.
SELECTION-SCREEN END OF BLOCK b1.
AT SELECTION-SCREEN ON VALUE-REQUEST FOR p_infile.
PERFORM frm_get_path."获取文件路径
START-OF-SELECTION.
" IF r_1 = 'X'.
PERFORM frm_upload_data."数据上载
PERFORM frm_check_data."数据校验
PERFORM frm_update_sourcelist."货源清单上传
PERFORM frm_alv_display."结果显示
* ELSE.
* "submit AQZZZ_ME11======Z_ME11======== .
* CALL TRANSACTION 'ZKMM004'.
* ENDIF.
END-OF-SELECTION.
*&---------------------------------------------------------------------*
*& Form FRM_GET_PATH
*&---------------------------------------------------------------------*
* 获取文件上传路径
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_get_path .
CALL FUNCTION 'TB_LIMIT_WS_FILENAME_GET'
EXPORTING
* DEF_FILENAME = ' '
* DEF_PATH = ' '
mask = 'Excel Files,*.xlsx,*.*. '
* MODE = ' '
* TITLE = ' '
IMPORTING
filename = p_infile
* PATH =
* FILE =
EXCEPTIONS
selection_cancel = 1
selection_error = 2
OTHERS = 3.
IF sy-subrc <> 0.
* MESSAGE '获取文件路径失败!' TYPE 'E'.
ENDIF.
ENDFORM. " FRM_GET_PATH
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
* 上载数据
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_upload_data .
DATA: ldt_raw_data TYPE truxs_t_text_data.
CALL FUNCTION 'TEXT_CONVERT_XLS_TO_SAP'
EXPORTING
* I_FIELD_SEPERATOR =
i_line_header = 'X'
i_tab_raw_data = ldt_raw_data
i_filename = p_infile
TABLES
i_tab_converted_data = gdt_input
EXCEPTIONS
conversion_failed = 1
OTHERS = 2.
IF sy-subrc <> 0.
MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
ENDIF.
LOOP AT gdt_input.
CALL FUNCTION 'CONVERSION_EXIT_MATN1_INPUT'
EXPORTING
INPUT = gdt_input-matnr
IMPORTING
OUTPUT = gdt_input-matnr
EXCEPTIONS
LENGTH_ERROR = 1
OTHERS = 2
.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = gdt_input-LIFNR
IMPORTING
OUTPUT = gdt_input-LIFNR
.
MODIFY gdt_input.
ENDLOOP.
ENDFORM. " FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_DATA
*&---------------------------------------------------------------------*
* 数据检查
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_check_data .
DATA:ldf_tabix TYPE sy-tabix.
DATA:ldf_message TYPE c LENGTH 100.
DATA:ldf_type TYPE c.
DATA:lds_input LIKE LINE OF gdt_input.
* LOOP AT gdt_input.
* CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
* EXPORTING
* input = gdt_input-matnr
* IMPORTING
* output = gdt_input-matnr.
* MODIFY gdt_input.
* ENDLOOP.
"判断信息记录是否存在
IF gdt_input[] IS NOT INITIAL.
SELECT eina~infnr
matnr
werks
ekorg
lifnr
esokz
INTO CORRESPONDING FIELDS OF TABLE gdt_eina
FROM eina
JOIN eine
ON eina~infnr = eine~infnr
FOR ALL ENTRIES IN gdt_input
WHERE matnr = gdt_input-matnr
AND werks = gdt_input-werks
AND ekorg = gdt_input-ekorg
AND lifnr = gdt_input-lifnr.
SELECT matnr
werks
zeord
INTO CORRESPONDING FIELDS OF TABLE gdt_eord
FROM eord
FOR ALL ENTRIES IN gdt_input
WHERE matnr = gdt_input-matnr
AND werks = gdt_input-werks.
ENDIF.
"sort gdt_input.
REFRESH gdt_help.
LOOP AT gdt_input.
ldf_tabix = sy-tabix.
"判断信息记录是否存在
CLEAR ldf_message.
CLEAR ldf_type.
READ TABLE gdt_eina WITH KEY matnr = gdt_input-matnr werks = gdt_input-werks lifnr = gdt_input-lifnr ekorg = gdt_input-ekorg.
IF sy-subrc <> 0.
CLEAR:gds_help.
gds_help-matnr = gdt_input-matnr.
gds_help-werks = gdt_input-werks.
APPEND gds_help TO gdt_help.
gdt_input-type = 'E'.
ldf_type = 'E'.
gdt_input-message = text-001.
ldf_message = gdt_input-message .
gdf_erro = 'X'.
ENDIF.
"一个物料工厂只有一个固定货源
AT NEW werks.
CLEAR gdf_flifn.
READ TABLE gdt_input INDEX ldf_tabix.
ENDAT.
gdt_input-type = ldf_type.
gdt_input-message = ldf_message.
IF gdt_input-flifn = 'X'.
gdf_flifn = gdf_flifn + 1.
IF gdf_flifn > 1.
CLEAR:gds_help.
gds_help-matnr = gdt_input-matnr.
gds_help-werks = gdt_input-werks.
APPEND gds_help TO gdt_help.
gdt_input-type = 'E'.
gdt_input-message = text-002.
gdf_erro = 'X'.
ENDIF.
ENDIF.
"对比两个工作区域
IF gdt_input = lds_input.
CLEAR:gds_help.
gds_help-matnr = gdt_input-matnr.
gds_help-werks = gdt_input-werks.
APPEND gds_help TO gdt_help.
gdt_input-type = 'E'.
gdt_input-message = '该行数据和前一行一样'.
gdf_erro = 'X'.
ENDIF.
MOVE-CORRESPONDING gdt_input TO lds_input.
CLEAR:lds_input-type,lds_input-message.
MODIFY gdt_input.
ENDLOOP.
ENDFORM. " FRM_CHECK_DATA
*&---------------------------------------------------------------------*
*& Form FRM_UPDATE_SOURCELIST
*&---------------------------------------------------------------------*
* 更新货源清单
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_update_sourcelist .
DATA: ldf_line(2) TYPE n.
DATA: ldf_field TYPE string.
DATA: ldf_tabix LIKE sy-tabix.
sort gdt_help by matnr werks.
IF p_test = '' .
LOOP AT gdt_input.
ldf_tabix = sy-tabix.
"校验是否有错误
READ TABLE gdt_help INTO gds_help with key matnr = gdt_input-matnr werks = gdt_input-werks.
if sy-subrc eq 0.
gdt_input-type = 'E'.
MODIFY gdt_input INDEX ldf_tabix.
CONTINUE.
endif.
AT NEW werks.
READ TABLE gdt_input INDEX sy-tabix.
CLEAR ldf_line.
READ TABLE gdt_eord WITH KEY matnr = gdt_input-matnr werks = gdt_input-werks.
IF sy-subrc = 0."修改
PERFORM bdc_dynpro USING 'SAPLMEOR' '0200'.
PERFORM bdc_field USING 'BDC_CURSOR'
'EORD-MATNR'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_field USING 'EORD-MATNR'
gdt_input-matnr.
PERFORM bdc_field USING 'EORD-WERKS'
gdt_input-werks.
PERFORM bdc_dynpro USING 'SAPLMEOR' '0205'.
PERFORM bdc_field USING 'BDC_CURSOR'
'EORD-EBELP(01)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=SA'.
PERFORM bdc_dynpro USING 'SAPLMEOR' '0205'.
PERFORM bdc_field USING 'BDC_CURSOR'
'EORD-EBELP(01)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=LOES'.
PERFORM bdc_dynpro USING 'SAPLSPO1' '0200'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=YES'.
PERFORM bdc_dynpro USING 'SAPLMEOR' '0205'.
PERFORM bdc_field USING 'BDC_CURSOR'
'EORD-EKORG(02)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=BU'.
ELSE."创建
PERFORM bdc_dynpro USING 'SAPLMEOR' '0200'.
PERFORM bdc_field USING 'BDC_CURSOR'
'EORD-MATNR'.
PERFORM bdc_field USING 'BDC_OKCODE'
'/00'.
PERFORM bdc_field USING 'EORD-MATNR'
gdt_input-matnr.
PERFORM bdc_field USING 'EORD-WERKS'
gdt_input-werks.
PERFORM bdc_dynpro USING 'SAPLMEOR' '0205'.
PERFORM bdc_field USING 'BDC_CURSOR'
'EORD-AUTET(02)'.
PERFORM bdc_field USING 'BDC_OKCODE'
'=BU'.
ENDIF.
ENDAT.
ldf_line = ldf_line + 1.
CONCATENATE 'EORD-VDATU(' ldf_line ')' INTO ldf_field.
PERFORM bdc_field USING ldf_field
gdt_input-vdatu.
CONCATENATE 'EORD-BDATU(' ldf_line ')' INTO ldf_field.
PERFORM bdc_field USING ldf_field
gdt_input-bdatu.
CONCATENATE 'EORD-LIFNR(' ldf_line ')' INTO ldf_field.
PERFORM bdc_field USING ldf_field
gdt_input-lifnr.
CONCATENATE 'EORD-EKORG(' ldf_line ')' INTO ldf_field.
PERFORM bdc_field USING ldf_field
gdt_input-ekorg.
CONCATENATE 'RM06W-FESKZ(' ldf_line ')' INTO ldf_field.
PERFORM bdc_field USING ldf_field
gdt_input-flifn.
CONCATENATE 'EORD-AUTET(' ldf_line ')' INTO ldf_field.
PERFORM bdc_field USING ldf_field
gdt_input-autet.
AT END OF werks.
READ TABLE gdt_input INDEX ldf_tabix.
CALL TRANSACTION 'ME01' USING gdt_bdcdata
MODE 'N'
UPDATE 'S'
MESSAGES INTO gdt_messtab.
"wait UP TO '0.5' SECONDS.
LOOP AT gdt_messtab.
CLEAR gdt_message.
CALL FUNCTION 'MESSAGE_TEXT_BUILD'
EXPORTING
msgid = gdt_messtab-msgid
msgnr = gdt_messtab-msgnr
msgv1 = gdt_messtab-msgv1
msgv2 = gdt_messtab-msgv2
msgv3 = gdt_messtab-msgv3
msgv4 = gdt_messtab-msgv4
IMPORTING
message_text_output = gdt_message-message.
gdt_message-type = gdt_messtab-msgtyp.
APPEND gdt_message.
CLEAR gdt_message.
ENDLOOP.
gdt_tab-matnr = gdt_input-matnr.
gdt_tab-werks = gdt_input-werks.
"gdt_tab-lifnr = gdt_input-lifnr.
LOOP AT gdt_message.
IF gdt_message-type = 'E'.
gdt_tab-type = 'E'.
gdt_tab-message = gdt_message-message.
ENDIF.
IF gdt_message-type = 'S'.
gdt_tab-type = 'S'.
gdt_tab-message = gdt_message-message.
ENDIF.
ENDLOOP.
APPEND gdt_tab.
CLEAR gdt_tab.
CLEAR gdt_bdcdata.
REFRESH gdt_bdcdata.
CLEAR gdt_messtab.
REFRESH gdt_messtab.
CLEAR gdt_message.
REFRESH gdt_message.
ENDAT.
ENDLOOP.
LOOP AT gdt_input.
READ TABLE gdt_tab WITH KEY matnr = gdt_input-matnr werks = gdt_input-werks ."lifnr = gdt_input-lifnr.
IF sy-subrc = 0.
gdt_input-type = gdt_tab-type.
gdt_input-message = gdt_tab-message.
MODIFY gdt_input.
ENDIF.
ENDLOOP.
ENDIF.
ENDFORM. " FRM_UPDATE_SOURCELIST
*&---------------------------------------------------------------------*
*& Form BDC_DYNPRO
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
FORM bdc_dynpro USING program dynpro .
CLEAR gdt_bdcdata.
gdt_bdcdata-program = program.
gdt_bdcdata-dynpro = dynpro.
gdt_bdcdata-dynbegin = 'X'.
APPEND gdt_bdcdata.
ENDFORM. " BDC_DYNPRO
*&---------------------------------------------------------------------*
*& Form BDC_FIELD
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_0254 text
* -->P_0255 text
*----------------------------------------------------------------------*
FORM bdc_field USING fnam fval.
CLEAR gdt_bdcdata.
gdt_bdcdata-fnam = fnam.
gdt_bdcdata-fval = fval.
APPEND gdt_bdcdata.
ENDFORM. " BDC_FIELD
*&---------------------------------------------------------------------*
*& Form FRM_ALV_DISPLAY
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_alv_display .
CLEAR gdt_fieldcat.
REFRESH gdt_fieldcat.
PERFORM frm_filldf_fieldcat.
PERFORM frm_alv_layout.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY'
EXPORTING
* I_INTERFACE_CHECK = ' '
* I_BYPASSING_BUFFER = ' '
i_buffer_active = 'X'
i_callback_program = sy-repid
* i_callback_pf_status_set = 'PF_STATUS'
* i_callback_user_command = 'USER_COMMAND'
* I_CALLBACK_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_TOP_OF_PAGE = ' '
* I_CALLBACK_HTML_END_OF_LIST = ' '
* I_STRUCTURE_NAME =
* I_BACKGROUND_ID = ' '
* I_GRID_TITLE =
* I_GRID_SETTINGS =
is_layout = gds_layout
it_fieldcat = gdt_fieldcat
* IT_EXCLUDING =
* IT_SPECIAL_GROUPS =
* IT_SORT =
* IT_FILTER =
* IS_SEL_HIDE =
* I_DEFAULT = 'X'
* I_SAVE = ' '
* IS_VARIANT =
* IT_EVENTS =
* IT_EVENT_EXIT =
* IS_PRINT =
* IS_REPREP_ID =
* I_SCREEN_START_COLUMN = 0
* I_SCREEN_START_LINE = 0
* I_SCREEN_END_COLUMN = 0
* I_SCREEN_END_LINE = 0
* I_HTML_HEIGHT_TOP = 0
* I_HTML_HEIGHT_END = 0
* IT_ALV_GRAPHICS =
* IT_HYPERLINK =
* IT_ADD_FIELDCAT =
* IT_EXCEPT_QINFO =
* IR_SALV_FULLSCREEN_ADAPTER =
* IMPORTING
* E_EXIT_CAUSED_BY_CALLER =
* ES_EXIT_CAUSED_BY_USER =
TABLES
t_outtab = gdt_input
* EXCEPTIONS
* PROGRAM_ERROR = 1
* OTHERS = 2
.
IF sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
ENDFORM. " FRM_ALV_DISPLAY
*&---------------------------------------------------------------------*
*& Form FRM_FILldf_fieldCAT
*&---------------------------------------------------------------------*
* 填充ALV显示字段
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_filldf_fieldcat .
CLEAR gds_fieldcat.
gds_fieldcat-fieldname = 'MATNR'.
gds_fieldcat-seltext_m = '品目コード'.
gds_fieldcat-no_zero = 'X'.
APPEND gds_fieldcat TO gdt_fieldcat.
CLEAR gds_fieldcat.
gds_fieldcat-fieldname = 'WERKS'.
gds_fieldcat-seltext_m = 'プラント'.
APPEND gds_fieldcat TO gdt_fieldcat.
CLEAR gds_fieldcat.
gds_fieldcat-fieldname = 'VDATU'.
gds_fieldcat-seltext_m = '有効開始日'.
APPEND gds_fieldcat TO gdt_fieldcat.
CLEAR gds_fieldcat.
gds_fieldcat-fieldname = 'BDATU'.
gds_fieldcat-seltext_m = ' 有効終了日'.
APPEND gds_fieldcat TO gdt_fieldcat.
CLEAR gds_fieldcat.
gds_fieldcat-fieldname = 'LIFNR'.
gds_fieldcat-seltext_m = '仕入先コード'.
APPEND gds_fieldcat TO gdt_fieldcat.
CLEAR gds_fieldcat.
gds_fieldcat-fieldname = 'EKORG'.
gds_fieldcat-seltext_m = '購買組織'.
APPEND gds_fieldcat TO gdt_fieldcat.
CLEAR gds_fieldcat.
gds_fieldcat-fieldname = 'FLIFN'.
gds_fieldcat-seltext_m = '固定'.
APPEND gds_fieldcat TO gdt_fieldcat.
CLEAR gds_fieldcat.
gds_fieldcat-fieldname = 'AUTET'.
gds_fieldcat-seltext_m = ' MRPで使用 '.
APPEND gds_fieldcat TO gdt_fieldcat.
CLEAR gds_fieldcat.
gds_fieldcat-fieldname = 'TYPE'.
gds_fieldcat-seltext_m = 'メッセージタイプ'.
APPEND gds_fieldcat TO gdt_fieldcat.
CLEAR gds_fieldcat.
gds_fieldcat-fieldname = 'MESSAGE'.
gds_fieldcat-seltext_m = 'メッセージ'.
APPEND gds_fieldcat TO gdt_fieldcat.
ENDFORM. " FRM_FILldf_fieldCAT
*&---------------------------------------------------------------------*
*& Form FRM_ALV_LAYOUT
*&---------------------------------------------------------------------*
* 设置ALV显示格式
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM frm_alv_layout .
gds_layout-colwidth_optimize = 'X'.
ENDFORM. " FRM_ALV_LAYOUT
0 0
- 货源清单BDC导入程序
- 配额与货源清单
- 浅谈货源清单
- ME01创建货源清单函数、BAPI
- 利用函数ME_UPDATE_SOURCES_OF_SUPPLY更改货源清单
- BDC的批量导入
- SAP BDC 数据导入
- SAP物料清单导入(生成程序后可直接使用)
- 用户锁定程序(BDC方式)
- BDC
- BDC
- BDC
- BDC
- BDC
- BDC
- BDC
- BDC
- BDC
- ios button长按事件
- OpenCV 中CV_IMAGE_ELEM 的使用
- 用C#实现AES加密算法
- malloc realloc and new
- 黑马程序员--java高新技术----动态代理及AOP
- 货源清单BDC导入程序
- asp.net学习笔记
- 精通安卓性能优化-第五章(三)
- Nginx + Keepalived 实例(测试可行)
- SQLSEVER 中的那些键和约束
- ASP.NET MVC 入门5、View与ViewData
- Fudan University Local Contest 2012 题解(划分树)
- PDF转换器汉化版
- ORACLE身份管理11g