需考虑物料18位和40位的长度问题,MATERIAL_LONG和MATERIAL;以及256位超长描述的EXCEL字段获取问题
*&---------------------------------------------------------------------*
*& Report ZMM050
*&---------------------------------------------------------------------*
*&---------------------------------------------------------------------*
REPORT ZMM050.
TABLES:SSCRFIELDS.
TYPES: BEGIN OF TY_UPLOAD,
MATNR TYPE MARA-MATNR, "物料号
LANGU TYPE TDSPRAS, "语言
MAKTX TYPE MAKTX, "物料描述
TEXT_LINE TYPE TDLINE, "长文本
LANGU02 TYPE TDSPRAS, "语言
MAKTX02 TYPE MAKTX, "物料描述
TEXT_LINE02 TYPE TDLINE, "长文本
FLG TYPE CHAR01,
END OF TY_UPLOAD.
DATA: GS_UPLOAD TYPE TY_UPLOAD,
GT_UPLOAD TYPE TABLE OF TY_UPLOAD.
DATA:G_MATNR TYPE CHAR18.
TYPES: BEGIN OF TY_ITAB,
MATNR TYPE MATNR,
LANGU TYPE TDSPRAS, "语言
MAKTX TYPE MAKTX,
TEXT_LINE TYPE CHAR255,
LANGU02 TYPE TDSPRAS, "语言
MAKTX02 TYPE MAKTX,
TEXT_LINE02 TYPE CHAR255,
STATU TYPE BAPIRET2-TYPE,
MSG TYPE BAPIRET2-MESSAGE,
CHK_LIGHTS TYPE CHAR1, "-- 数据检查指示灯 -
FLG TYPE CHAR01,
END OF TY_ITAB.
DATA: GS_ITAB TYPE TY_ITAB,
GT_ITAB TYPE TABLE OF TY_ITAB.
FIELD-SYMBOLS: <FS_ITAB> TYPE TY_ITAB.
DATA: GV_ERROR TYPE CHAR1. "错误标识
DATA: GT_FCAT TYPE LVC_T_FCAT,
GA_FCAT TYPE LVC_S_FCAT,
GC_GRID TYPE REF TO CL_GUI_ALV_GRID.
DATA:LT_MARA TYPE TABLE OF MARA.
DEFINE ADD_FIELDS.
CLEAR GA_FCAT .
GA_FCAT-FIELDNAME = &1. "内表的字段名
GA_FCAT-SCRTEXT_L = &2. "字段描述.
GA_FCAT-REF_TABLE = &3. "输出数据的内表名
GA_FCAT-REF_FIELD = &4. "为key
GA_FCAT-COLDDICTXT = 'L'.
GA_FCAT-CHECKBOX = &5. "字段描述.
GA_FCAT-EDIT = &6. "字段描述.
GA_FCAT-F4AVAILABL = &7. "F4
GA_FCAT-OUTPUTLEN = &8. "输出长度
APPEND GA_FCAT TO GT_FCAT.
END-OF-DEFINITION.
DATA : FUNCTXT TYPE SMP_DYNTXT.
DATA : GV_TEMP TYPE WWWDATATAB-OBJID VALUE 'ZMM050'."SMW0 对象名
SELECTION-SCREEN BEGIN OF BLOCK BLC_001 WITH FRAME TITLE TEXT-001.
PARAMETERS:P_FILE TYPE RLGRAP-FILENAME."
SELECTION-SCREEN END OF BLOCK BLC_001.
SELECTION-SCREEN: FUNCTION KEY 1.
INITIALIZATION.
"下载模板按钮
FUNCTXT-ICON_ID = ICON_XLS.
FUNCTXT-ICON_TEXT = '下载模板'.
SSCRFIELDS-FUNCTXT_01 = FUNCTXT.
*---------------------------------------------------------------------*
* AT SELECTION-SCREEN *
*---------------------------------------------------------------------*
AT SELECTION-SCREEN ON VALUE-REQUEST FOR P_FILE.
"Help
CALL FUNCTION 'F4_FILENAME'
EXPORTING
FIELD_NAME = 'P_FILE'
IMPORTING
FILE_NAME = P_FILE.
AT SELECTION-SCREEN.
CASE SSCRFIELDS-UCOMM.
WHEN 'FC01' .
DATA: G_FILE TYPE SAPB-SAPPFAD.
DATA: E_ERROR TYPE CHAR255.
CLEAR E_ERROR.
PERFORM FRM_DOWNLOAD_EXCEL_FROMSERVER USING GV_TEMP G_FILE
CHANGING E_ERROR.
IF E_ERROR IS INITIAL.
MESSAGE '下载成功!' TYPE 'S'.
ELSE.
MESSAGE E_ERROR TYPE 'E'.
ENDIF.
WHEN OTHERS.
ENDCASE.
START-OF-SELECTION.
IF P_FILE IS INITIAL .
MESSAGE '请选择导入文件路径' TYPE 'S' DISPLAY LIKE 'E' .
EXIT.
ENDIF .
PERFORM FRM_UPLOAD_DATA.
PERFORM FRM_CHECK_DATA .
PERFORM FRM_DISPLAY_ALV.
FORM FRM_DOWNLOAD_EXCEL_FROMSERVER USING P_OBJID LIKE WWWDATATAB-OBJID
P_FILE LIKE SAPB-SAPPFAD
CHANGING E_ERROR TYPE CHAR255.
DATA:LO_OBJDATA LIKE WWWDATATAB,
LO_MIME LIKE W3MIME,
LS_DESTINATION LIKE RLGRAP-FILENAME,
LS_OBJNAM TYPE STRING,
LI_RC LIKE SY-SUBRC,
LS_ERRTXT TYPE STRING.
CONCATENATE P_OBJID '.XLSX' INTO LS_OBJNAM.
SELECT SINGLE RELID OBJID FROM WWWDATA
INTO CORRESPONDING FIELDS OF LO_OBJDATA
WHERE SRTF2 = 0
AND RELID = 'MI'
AND OBJID = P_OBJID.
IF SY-SUBRC NE 0 OR LO_OBJDATA-OBJID EQ SPACE.
CONCATENATE '不存在模板' LS_OBJNAM ',请检查' INTO E_ERROR.
RETURN.
ENDIF.
CALL FUNCTION 'WS_FILENAME_GET'
EXPORTING
DEF_FILENAME = 'ZMM050批导模板.xlsx'
MODE = 'S'
IMPORTING
FILENAME = P_FILE
EXCEPTIONS
INV_WINSYS = 1
NO_BATCH = 2
SELECTION_CANCEL = 3
SELECTION_ERROR = 4
OTHERS = 5.
LS_DESTINATION = P_FILE.
CALL FUNCTION 'DOWNLOAD_WEB_OBJECT'
EXPORTING
KEY = LO_OBJDATA
DESTINATION = LS_DESTINATION
IMPORTING
RC = LI_RC.
IF LI_RC NE 0.
CONCATENATE '下载模板' LS_OBJNAM '失败,请检查!' INTO E_ERROR.
ENDIF.
ENDFORM. "sub_download_excel_fromserver
*&---------------------------------------------------------------------*
*& Form FRM_UPLOAD_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_UPLOAD_DATA .
* DATA: LT_DATA TYPE ALSMEX_TABLINE OCCURS 0 WITH HEADER LINE.
* CALL FUNCTION 'ALSM_EXCEL_TO_INTERNAL_TABLE' "读取excel文件中的内容
* EXPORTING
* FILENAME = P_FILE
* I_BEGIN_COL = '1'
* I_BEGIN_ROW = '2'
* I_END_COL = '59'
* I_END_ROW = '9999'
* TABLES
* INTERN = LT_DATA
* EXCEPTIONS
* INCONSISTENT_PARAMETERS = 1
* UPLOAD_OLE = 2
* OTHERS = 3.
* IF SY-SUBRC <> 0.
* MESSAGE S000(OO) WITH 'EXCEL导入失败' DISPLAY LIKE 'E'.
* STOP.
* ENDIF.
*
* SORT LT_DATA BY ROW COL VALUE.
*
* DATA: LV_INDEX LIKE SY-INDEX.
* FIELD-SYMBOLS: <FS_EXCEL> TYPE ANY.
* LOOP AT LT_DATA.
* CLEAR LV_INDEX.
* LV_INDEX = LT_DATA-COL+2(2).
* ASSIGN COMPONENT LV_INDEX OF STRUCTURE GS_UPLOAD TO <FS_EXCEL>.
* IF SY-SUBRC EQ 0.
* CONDENSE LT_DATA-VALUE NO-GAPS.
* <FS_EXCEL> = LT_DATA-VALUE.
* ENDIF.
*
* AT END OF ROW.
* IF GS_UPLOAD-FLG = ''.
* CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
* EXPORTING
* INPUT = GS_UPLOAD-MATNR
* IMPORTING
* OUTPUT = G_MATNR.
* GS_UPLOAD-MATNR = G_MATNR.
* ENDIF.
* APPEND GS_UPLOAD TO GT_UPLOAD.
* CLEAR GS_UPLOAD.
* ENDAT.
* ENDLOOP.
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_FILE
TABLES
I_TAB_CONVERTED_DATA = GT_UPLOAD
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 GT_UPLOAD ASSIGNING FIELD-SYMBOL(<FS_01>).
IF <FS_01>-FLG = ''.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
INPUT = <FS_01>-MATNR
IMPORTING
OUTPUT = G_MATNR.
<FS_01>-MATNR = G_MATNR.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_CHECK_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_CHECK_DATA .
IF GT_UPLOAD[] IS INITIAL.
MESSAGE S000(OO) WITH '没有上传数据' DISPLAY LIKE 'E'.
STOP.
ENDIF.
SELECT *
FROM MARA
INTO TABLE LT_MARA
FOR ALL ENTRIES IN GT_UPLOAD
WHERE MATNR = GT_UPLOAD-MATNR.
LOOP AT GT_UPLOAD INTO GS_UPLOAD.
CLEAR GS_ITAB.
MOVE-CORRESPONDING GS_UPLOAD TO GS_ITAB.
READ TABLE LT_MARA INTO DATA(LS_MARA) WITH KEY MATNR = GS_ITAB-MATNR.
IF SY-SUBRC IS INITIAL.
GS_ITAB-CHK_LIGHTS = 3. "代表正确 1代表出错,2代表警告
ELSE.
GS_ITAB-CHK_LIGHTS = 1. "代表正确 1代表出错,2代表警告
ENDIF.
APPEND GS_ITAB TO GT_ITAB.
CLEAR GS_UPLOAD.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY_ALV .
DATA: LS_LAYOUT TYPE LVC_S_LAYO,
LS_REPID TYPE SY-REPID.
CLEAR:LS_LAYOUT.
LS_LAYOUT-ZEBRA = 'X'.
LS_LAYOUT-SEL_MODE = 'A'.
LS_LAYOUT-EXCP_FNAME = 'CHK_LIGHTS'.
LS_LAYOUT-CWIDTH_OPT = 'X'.
* ls_layout-box_fieldname = 'SEL'."不用做选中,直接点前面的行号就代表选中
* ls_repid = sy-repid.
PERFORM FRM_GET_FIELDCAT.
SORT GT_ITAB BY MATNR.
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'
EXPORTING
I_CALLBACK_PROGRAM = SY-REPID
* i_grid_title = lv_grid_title
* I_BUFFER_ACTIVE = 'X'
I_DEFAULT = 'X'
I_SAVE = 'X'
I_CALLBACK_USER_COMMAND = 'USER_COMMAND'
I_CALLBACK_PF_STATUS_SET = 'SET_PF_STATUS'
IT_FIELDCAT_LVC = GT_FCAT[]
IS_LAYOUT_LVC = LS_LAYOUT
* it_events = lt_event
TABLES
T_OUTTAB = GT_ITAB
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
ENDFORM.
FORM FRM_GET_FIELDCAT .
ADD_FIELDS 'STATU' '状态' '' '' '' '' '' ''.
ADD_FIELDS 'MSG' '消息' '' '' '' '' '' ''.
ADD_FIELDS 'MATNR' '物料号' 'MARA' 'MATNR' '' '' '' '40'.
ADD_FIELDS 'LANGU' '语言' '' '' '' '' '' ''.
ADD_FIELDS 'MAKTX' '物料描述' 'MAKT' 'MAKTX' '' '' '' '40'.
ADD_FIELDS 'TEXT_LINE' '长文本' '' '' '' '' '' '255'.
ADD_FIELDS 'LANGU02' '语言' '' '' '' '' '' ''.
ADD_FIELDS 'MAKTX02' '物料描述' 'MAKT' 'MAKTX' '' '' '' '40'.
ADD_FIELDS 'TEXT_LINE02' '长文本' '' '' '' '' '' '255'.
ENDFORM.
FORM SET_PF_STATUS USING RT_EXTAB TYPE SLIS_T_EXTAB."调用SAP标准功能的工具栏图标,例排序、筛选、小计等功能
SET PF-STATUS 'ZSD023'. "双击单引号里面的,新建一个同名的状态,也可以去在别的reportcopy一个标准的
" "再加上自己定义的按钮。比如program name : RM07MLBS
ENDFORM.
FORM USER_COMMAND USING R_UCOMM LIKE SY-UCOMM
RS_SELFIELD TYPE SLIS_SELFIELD.
DATA: LT_ROW_INDEX TYPE LVC_T_ROW,
LT_ROW_NO TYPE LVC_T_ROID,
LS_ROW_NO TYPE LVC_S_ROID,
LV_LINES TYPE I.
DATA:LT_ITAB TYPE TABLE OF TY_ITAB.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
E_GRID = GC_GRID.
CALL METHOD GC_GRID->CHECK_CHANGED_DATA.
RS_SELFIELD-REFRESH = 'X'.
CALL METHOD GC_GRID->GET_SELECTED_ROWS
IMPORTING
* ET_INDEX_ROWS = LT_ROW_INDEX
ET_ROW_NO = LT_ROW_NO.
DESCRIBE TABLE LT_ROW_NO LINES LV_LINES.
IF LV_LINES EQ 0.
MESSAGE '请选择需要导入的条目' TYPE 'E'.
EXIT.
ENDIF.
LOOP AT LT_ROW_NO INTO LS_ROW_NO.
READ TABLE GT_ITAB INTO GS_ITAB INDEX LS_ROW_NO-ROW_ID.
IF SY-SUBRC = 0.
IF GS_ITAB-CHK_LIGHTS = 1.
MESSAGE '存在错误数据请纠正后再导入' TYPE 'E'.
ENDIF.
APPEND GS_ITAB TO LT_ITAB.
ENDIF.
ENDLOOP.
CASE R_UCOMM.
WHEN 'UPLOAD'.
DATA:GW_HEAD TYPE BAPIMATHEAD,
GW_MAKT TYPE BAPI_MAKT,
GT_MAKT TYPE TABLE OF BAPI_MAKT,
GW_MLTX TYPE BAPI_MLTX,
GT_MLTX TYPE TABLE OF BAPI_MLTX,
GW_RETURN TYPE BAPIRET2.
LOOP AT LT_ITAB INTO GS_ITAB.
CLEAR:GW_HEAD,GW_MAKT,GW_MLTX,GT_MLTX[],GT_MAKT[].
"视图选择
GW_HEAD-MATERIAL = GS_ITAB-MATNR. "物料编码
GW_HEAD-MATERIAL_LONG = GS_ITAB-MATNR. "物料编码
READ TABLE LT_MARA INTO DATA(LS_MARA) WITH KEY MATNR = GS_ITAB-MATNR.
IF SY-SUBRC IS INITIAL.
GW_HEAD-IND_SECTOR = LS_MARA-MBRSH. "行业领域
GW_HEAD-MATL_TYPE = LS_MARA-MTART. "物料类型
ENDIF.
GW_HEAD-BASIC_VIEW = 'X'. "基本数据视图
GW_HEAD-SALES_VIEW = 'X'. "销售视图
GW_HEAD-PURCHASE_VIEW = 'X'. "采购视图
GW_HEAD-MRP_VIEW = 'X'. "MRP视图
GW_HEAD-WORK_SCHED_VIEW = 'X'. "工作计划视图
GW_HEAD-QUALITY_VIEW = 'X'. "质量管理视图
GW_HEAD-ACCOUNT_VIEW = 'X'. "会计视图
GW_HEAD-COST_VIEW = 'X'. "成本视图
GW_HEAD-WAREHOUSE_VIEW = 'X'. "仓库管理视图
"物料描述
IF GS_ITAB-MAKTX IS NOT INITIAL.
GW_MAKT-LANGU = GS_ITAB-LANGU.
GW_MAKT-MATL_DESC = GS_ITAB-MAKTX.
APPEND GW_MAKT TO GT_MAKT.
ENDIF.
IF GS_ITAB-MAKTX02 IS NOT INITIAL.
GW_MAKT-LANGU = GS_ITAB-LANGU02.
GW_MAKT-MATL_DESC = GS_ITAB-MAKTX02.
APPEND GW_MAKT TO GT_MAKT.
ENDIF.
"维护基本数据文本(中文)
GW_MLTX-APPLOBJECT = 'MATERIAL'.
GW_MLTX-TEXT_NAME = GS_ITAB-MATNR.
GW_MLTX-TEXT_ID = 'GRUN'.
GW_MLTX-LANGU = GS_ITAB-LANGU. "中文
GW_MLTX-FORMAT_COL = 1.
GW_MLTX-TEXT_LINE = GS_ITAB-TEXT_LINE+0(132).
APPEND GW_MLTX TO GT_MLTX.
CLEAR: GW_MLTX.
GW_MLTX-APPLOBJECT = 'MATERIAL'.
GW_MLTX-TEXT_NAME = GS_ITAB-MATNR.
GW_MLTX-TEXT_ID = 'GRUN'.
GW_MLTX-LANGU = GS_ITAB-LANGU. "中文
GW_MLTX-FORMAT_COL = 2.
GW_MLTX-TEXT_LINE = GS_ITAB-TEXT_LINE+132(123).
APPEND GW_MLTX TO GT_MLTX.
CLEAR: GW_MLTX.
"维护基本数据文本(中文)
GW_MLTX-APPLOBJECT = 'MATERIAL'.
GW_MLTX-TEXT_NAME = GS_ITAB-MATNR.
GW_MLTX-TEXT_ID = 'GRUN'.
GW_MLTX-LANGU = GS_ITAB-LANGU02. "中文
GW_MLTX-FORMAT_COL = 1.
GW_MLTX-TEXT_LINE = GS_ITAB-TEXT_LINE02+0(132).
APPEND GW_MLTX TO GT_MLTX.
CLEAR: GW_MLTX.
GW_MLTX-APPLOBJECT = 'MATERIAL'.
GW_MLTX-TEXT_NAME = GS_ITAB-MATNR.
GW_MLTX-TEXT_ID = 'GRUN'.
GW_MLTX-LANGU = GS_ITAB-LANGU02. "中文
GW_MLTX-FORMAT_COL = 2.
GW_MLTX-TEXT_LINE = GS_ITAB-TEXT_LINE02+132(123).
APPEND GW_MLTX TO GT_MLTX.
CLEAR: GW_MLTX.
CALL FUNCTION 'BAPI_MATERIAL_SAVEDATA'
EXPORTING
HEADDATA = GW_HEAD
IMPORTING
RETURN = GW_RETURN
TABLES
MATERIALDESCRIPTION = GT_MAKT
MATERIALLONGTEXT = GT_MLTX.
IF GW_RETURN-TYPE = 'E' OR GW_RETURN-TYPE = 'A'.
ROLLBACK WORK.
CONCATENATE '物料' GS_ITAB-MATNR '文本变更失败:' GW_RETURN-MESSAGE INTO GS_ITAB-MSG.
GS_ITAB-STATU = 'E'.
ELSE.
GS_ITAB-STATU = 'S'.
CONCATENATE '物料' GS_ITAB-MATNR '文本维护成功' GW_RETURN-MESSAGE INTO GS_ITAB-MSG.
COMMIT WORK AND WAIT.
ENDIF.
READ TABLE GT_ITAB ASSIGNING FIELD-SYMBOL(<FS>) WITH KEY MATNR = GS_ITAB-MATNR.
IF SY-SUBRC IS INITIAL.
<FS>-STATU = GS_ITAB-STATU.
<FS>-MSG = GS_ITAB-MSG.
ENDIF.
ENDLOOP.
SORT GT_ITAB BY MATNR.
ENDCASE.
ENDFORM.