物料描述&物料长文本批导

需考虑物料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.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值