SAP-ABAP-邮件实时预警安全库存
程序亮点:
1用到了submit取MB52实时库存。
2数据构造成Excel并发送邮件
*&---------------------------------------------------------------------*
*& Report ZMM_R0016
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT ZMM_R0016.
TABLES :MARC ,MARA,MARD,SSCRFIELDS,ZMMT016." ---TODO
TYPE-POOLS:ICON.
DATA: OK_CODE LIKE SY-UCOMM.
CLASS LCL_EVENT_RECEIVER DEFINITION DEFERRED.
DATA: EVENT_RECEIVER TYPE REF TO LCL_EVENT_RECEIVER.
DATA: GT_FIELDCAT TYPE LVC_T_FCAT,
GS_LAYOUT TYPE LVC_S_LAYO,
GS_VARIANT TYPE DISVARIANT,
GT_T_F4 TYPE LVC_T_F4,
IT_TOOLBAR_EXCLUDING TYPE UI_FUNCTIONS.
DATA: STBL TYPE LVC_S_STBL. "鼠标游标位置
DATA: ET_FILTERED TYPE LVC_T_FIDX.
DATA: GV_CODE TYPE SY-TCODE .
DATA ALV_GRID TYPE REF TO CL_GUI_ALV_GRID. "后面要用到CL_GUI_ALV_GRID类中的方法
"SET_TABLE_FIRST_DISPLAY,这个方法基于实例存在,必须
"为这个类创建一个对象。在此处声明。
DATA GS_PARENT TYPE REF TO CL_GUI_CUSTOM_CONTAINER . "定义容器
DATA GT_SELECT TYPE LVC_T_CELL . "定義選中單元格方法參數
DATA GT_SELROW TYPE LVC_T_ROW . "定義選中行方法參數
*DATA: gr_table TYPE REF TO cl_salv_table.
*DATA: lr_functions TYPE REF TO cl_salv_functions.
"$. Region 此处定义改为需要用到的定义-TODO
TYPES : BEGIN OF TY_ITEM ,
MATNR TYPE MATNR,
MAKTX TYPE MAKTX,
WERKS TYPE WERKS_D,
LGORT TYPE LGORT_D,
EISBE TYPE EISBE , "安全库存数
LABST TYPE LABST , "现有库存数
GEWEI TYPE GEWEI.
TYPES END OF TY_ITEM .
DATA GT_ITEM TYPE TABLE OF TY_ITEM .
DATA GT_SUMD TYPE TABLE OF TY_ITEM . "存储数量合计数据
DATA GS_SUMD TYPE TY_ITEM .
FIELD-SYMBOLS <FS_DATA> TYPE TY_ITEM .
"$. Endregion 此处定义改为需要用到的定义-TODO
*&---------------------------------------------------------------------*
*& Class LCL_EVENT_RECEIVER
*&---------------------------------------------------------------------*
* Text
*----------------------------------------------------------------------*
CLASS LCL_EVENT_RECEIVER DEFINITION.
PUBLIC SECTION.
METHODS HANDLE_DOUBLE_CLICK FOR EVENT DOUBLE_CLICK OF CL_GUI_ALV_GRID "定义类中的方法---双击
IMPORTING E_ROW E_COLUMN ES_ROW_NO. "
" "
METHODS HANDLE_ONF4 FOR EVENT ONF4 OF CL_GUI_ALV_GRID "定义类中的方法---F4帮助
IMPORTING E_FIELDNAME ES_ROW_NO ER_EVENT_DATA . "
"
METHODS HANDLE_TOOLBAR FOR EVENT TOOLBAR OF CL_GUI_ALV_GRID "定义类中的方法---ALV状态栏按钮
IMPORTING E_OBJECT E_INTERACTIVE . "
"
METHODS HANDLE_USER_COMMAND FOR EVENT USER_COMMAND OF CL_GUI_ALV_GRID "定义类中的方法---按钮触发方法
IMPORTING E_UCOMM . "
"
METHODS HANDLE_DATA_CHANGED FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID "定义类中的方法---数据被修改后方法
IMPORTING ER_DATA_CHANGED E_ONF4 E_ONF4_BEFORE E_ONF4_AFTER E_UCOMM. "
ENDCLASS. "LCL_EVENT_RECEIVER
"$. Endregion 定义
"$. Region 选择屏幕-TODO
SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-001.
SELECT-OPTIONS: S_WERKS FOR MARC-WERKS OBLIGATORY NO INTERVALS.
SELECT-OPTIONS: S_LGORT FOR MARD-LGORT .
SELECT-OPTIONS: S_MATKL FOR MARA-MATKL .
SELECT-OPTIONS: S_MATNR FOR MARA-MATNR .
SELECTION-SCREEN SKIP 1 .
PARAMETERS : P_MAIL AS CHECKBOX .
SELECTION-SCREEN END OF BLOCK B1 .
"$. Endregion 选择屏幕-TODO
INITIALIZATION.
STBL-ROW = 'X'.
STBL-COL = 'X'.
AT SELECTION-SCREEN.
"$. Region 权限-TODO
* SELECT T001~BUKRS FROM T001 WHERE T001~BUKRS IN @S_BUKRS INTO TABLE @DATA(GT_BUKRS) .
*
* LOOP AT GT_BUKRS INTO DATA(GS_BUKRS).
* AUTHORITY-CHECK OBJECT 'F_BKPF_BUK'
* ID 'BUKRS' FIELD GS_BUKRS-BUKRS
* ID 'ACTVT' FIELD '03'.
* IF SY-SUBRC <> 0.
* MESSAGE '您没有公司代码' && GS_BUKRS-BUKRS && '的操作权限!' TYPE 'E' .
*
* ENDIF.
*
* ENDLOOP.
"$. Endregion 权限-TODO
START-OF-SELECTION.
PERFORM FRM_GET_DATA.
PERFORM FRM_SEND_MAIL.
IF GT_ITEM[] IS NOT INITIAL AND SY-UNAME <> 'ZJOB01'.
CALL SCREEN 9000.
ENDIF.
"$. Region FORM
MODULE STATUS_9000 OUTPUT.
SET PF-STATUS '9000'.
SET TITLEBAR '9000'.
DATA(GV_FRIST) = 'X' . "判断是不是第一次运行,自添加按钮需要刷新才能显示
PERFORM FRM_DISPLAY_ALV.
IF GV_FRIST = 'X'.
CALL METHOD ALV_GRID->REFRESH_TABLE_DISPLAY "增加按钮需要刷新才会显示出来,否则无法显示。
EXPORTING
IS_STABLE = STBL.
GV_FRIST = '0' ."判断是否为第一次,为第一次则刷新
ENDIF.
ENDMODULE.
*&---------------------------------------------------------------------*
*& Module USER_COMMAND_9000 INPUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_9000 INPUT.
GV_CODE = OK_CODE .
CASE OK_CODE.
WHEN 'BACK'.
CLEAR: GT_ITEM.
LEAVE TO SCREEN 0.
WHEN 'EXIT'.
LEAVE PROGRAM.
WHEN 'CANCEL'.
CLEAR: GT_ITEM.
LEAVE TO SCREEN 0.
WHEN 'SEND'.
P_MAIL = 'X' .
PERFORM FRM_SEND_MAIL.
ENDCASE.
ENDMODULE.
*----------------------------------------------------------------------*
* CLASS LCL_EVENT_RECEIVER IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_EVENT_RECEIVER IMPLEMENTATION.
METHOD HANDLE_DOUBLE_CLICK.
ENDMETHOD. "HANDLE_DOUBLE_CLICK双击后触发该段代码,可接T-CODE跳转等功能
METHOD HANDLE_ONF4.
ENDMETHOD. "需在ALV中调用触发一般与filedcat中的 f4availabl 参数同用
METHOD HANDLE_TOOLBAR. "在ALV状态栏增加按钮,一般是汇总按钮,新增后的按钮可触发HANDLE_USER_COMMAND方法
* DATA: LS_TOOLBAR TYPE STB_BUTTON.
* CLEAR LS_TOOLBAR.
* MOVE 3 TO LS_TOOLBAR-BUTN_TYPE. "分隔符
* APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
*
* CLEAR LS_TOOLBAR.
* MOVE 'ADD' TO LS_TOOLBAR-FUNCTION. "功能码
* MOVE ICON_INSERT_ROW TO LS_TOOLBAR-ICON. "图标
* MOVE '插入行' TO LS_TOOLBAR-QUICKINFO.
* MOVE '插入行' TO LS_TOOLBAR-TEXT. "显示名称
* MOVE ' ' TO LS_TOOLBAR-DISABLED.
* APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
*
* CLEAR LS_TOOLBAR.
* MOVE 'DEL' TO LS_TOOLBAR-FUNCTION. "功能码
* MOVE ICON_DELETE_ROW TO LS_TOOLBAR-ICON. "图标
* MOVE '刪除行' TO LS_TOOLBAR-QUICKINFO.
* MOVE '刪除行' TO LS_TOOLBAR-TEXT. "显示名称
* MOVE ' ' TO LS_TOOLBAR-DISABLED.
* APPEND LS_TOOLBAR TO E_OBJECT->MT_TOOLBAR.
ENDMETHOD. "在ALV状态栏增加按钮,一般是汇总按钮
METHOD HANDLE_USER_COMMAND.
* CASE E_UCOMM.
* WHEN 'ADD'.
* APPEND INITIAL LINE TO GT_ITEM .
* WHEN 'DEL'.
* CALL METHOD ALV_GRID->GET_SELECTED_ROWS
* IMPORTING
* ET_INDEX_ROWS = GT_SELROW.
* LOOP AT GT_SELROW INTO DATA(GS_SELROW).
* DELETE GT_ITEM[] INDEX GS_SELROW-INDEX .
* ENDLOOP .
* WHEN OTHERS.
* ENDCASE.
* CALL METHOD ALV_GRID->REFRESH_TABLE_DISPLAY
* EXPORTING
* IS_STABLE = STBL.
ENDMETHOD. "一般与HANDLE_TOOLBAR同用
METHOD HANDLE_DATA_CHANGED.
ENDMETHOD. "数据修改后触发,一般用在数据联动修改如数量字段修改,同时联动修改金额字段
ENDCLASS. "LCL_EVENT_RECEIVER IMPLEMENTATION
*&---------------------------------------------------------------------*
*& Form FRM_DISPLAY_ALV
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_DISPLAY_ALV .
CLEAR: GT_FIELDCAT,GS_LAYOUT,IT_TOOLBAR_EXCLUDING.
GS_VARIANT-REPORT = SY-REPID.
GS_VARIANT-HANDLE = '0001'.
IF ALV_GRID IS INITIAL .
******实例化 容器
CREATE OBJECT GS_PARENT
EXPORTING
CONTAINER_NAME = 'ALV'. " 界面中的一个CUNSTOMER CONTROL控件 用于存放类对象。
"使用这个控件把名称赋值给CONTAINER_NAME
******将alv植入到容器中
CREATE OBJECT ALV_GRID
EXPORTING
I_PARENT = GS_PARENT.
PERFORM PREPARE_FIELD_CATALOG CHANGING GT_FIELDCAT.
PERFORM PREPARE_LAYOUT CHANGING GS_LAYOUT.
PERFORM TOOLBAR_EXCLUDING_ITEM CHANGING IT_TOOLBAR_EXCLUDING. "ALV按钮排除
CALL METHOD ALV_GRID->SET_TABLE_FOR_FIRST_DISPLAY
EXPORTING
IS_LAYOUT = GS_LAYOUT
I_SAVE = 'A'
I_DEFAULT = 'X'
IS_VARIANT = GS_VARIANT
IT_TOOLBAR_EXCLUDING = IT_TOOLBAR_EXCLUDING
CHANGING
IT_OUTTAB = GT_ITEM
IT_FIELDCATALOG = GT_FIELDCAT.
CREATE OBJECT EVENT_RECEIVER. "创建事件
SET HANDLER EVENT_RECEIVER->HANDLE_DOUBLE_CLICK FOR ALV_GRID. "双击事件
SET HANDLER EVENT_RECEIVER->HANDLE_ONF4 FOR ALV_GRID. "F4帮助事件
SET HANDLER EVENT_RECEIVER->HANDLE_TOOLBAR FOR ALV_GRID. "ALV状态栏
SET HANDLER EVENT_RECEIVER->HANDLE_USER_COMMAND FOR ALV_GRID. "按钮事件
SET HANDLER EVENT_RECEIVER->HANDLE_DATA_CHANGED FOR ALV_GRID. "修改事件
* gt_t_f4 = VALUE #( BASE gt_t_f4 ( fieldname = 'ZBB' register = 'X' getbefore = 'X' chngeafter = 'X' ) ) .
* CALL METHOD alv_grid->register_f4_for_fields
* EXPORTING
* it_f4 = gt_t_f4.
CALL METHOD ALV_GRID->REGISTER_EDIT_EVENT "注册编辑事件,否则不会触发更新事件
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED.
CALL METHOD CL_GUI_CONTROL=>SET_FOCUS
EXPORTING
CONTROL = ALV_GRID.
CALL METHOD CL_GUI_CFW=>FLUSH.
ELSE.
CALL METHOD ALV_GRID->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = STBL.
ENDIF.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form PREPARE_FIELD_CATALOG
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* <--P_GT_FIELDCAT text
*----------------------------------------------------------------------*
FORM PREPARE_FIELD_CATALOG CHANGING P_GT_FIELDCAT TYPE LVC_T_FCAT.
DATA LS_FCAT TYPE LVC_S_FCAT.
DEFINE SET_FCAT.
CLEAR ls_fcat.
ls_fcat-fieldname = &1. "字段
ls_fcat-coltext = &2. "描述
ls_fcat-key = &3. "主键
ls_fcat-edit = &4. "可编辑
ls_fcat-ref_table = &5. "参考表
ls_fcat-ref_field = &6. "参考字段
ls_fcat-ICON = &7. "以圖標輸出
ls_fcat-NO_ZERO = &8. "前导0
ls_fcat-OUTPUTLEN = &9. "列的字符宽度
* ls_fcat-f4availabl = &8.
APPEND ls_fcat TO p_gt_fieldcat.
END-OF-DEFINITION.
SET_FCAT 'MATNR ' '料 号' '' '' 'MARA' 'MATNR' '' '' ''.
SET_FCAT 'WERKS ' '工 廠' '' '' 'MARC' 'WERKS' '' '' ''.
SET_FCAT 'LGORT ' '倉 位' '' '' 'MARD' 'LGORT' '' '' ''.
SET_FCAT 'LABST ' '现有庫存' '' '' 'MSEG' 'MENGE' '' '' ''.
SET_FCAT 'EISBE ' '安全庫存' '' '' 'MSEG' 'MENGE' '' '' ''.
SET_FCAT 'MAKTX ' '品 名' '' '' '' '' '' '' ''.
SET_FCAT 'GEWEI ' '單 位' '' '' 'MARA' 'GEWEI' '' '' ''.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form PREPARE_LAYOUT
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* --> p1 text
* <-- p2 text
*----------------------------------------------------------------------*
FORM PREPARE_LAYOUT CHANGING P_GS_LAYOUT TYPE LVC_S_LAYO.
P_GS_LAYOUT-ZEBRA = 'X'. "斑馬紋顯示
P_GS_LAYOUT-SEL_MODE = 'A'. "選擇模式
P_GS_LAYOUT-CWIDTH_OPT = 'X'. "最佳列寬
ENDFORM.
FORM TOOLBAR_EXCLUDING_ITEM CHANGING PT_EXCLUDE TYPE UI_FUNCTIONS.
DATA LS_EXCLUDE TYPE UI_FUNC.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_DELETE_ROW.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_INSERT_ROW.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_APPEND_ROW.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY_ROW.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_COPY.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE_NEW_ROW.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_MOVE_ROW.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_PASTE.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_CUT.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
LS_EXCLUDE = CL_GUI_ALV_GRID=>MC_FC_LOC_UNDO.
APPEND LS_EXCLUDE TO PT_EXCLUDE.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_GET_DATA
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_GET_DATA .
"1.系统内安全 库存数据
SELECT MARC~MATNR ,
MARC~WERKS ,
MARA~MATKL ,
MARC~EISBE ,
MARA~GEWEI ,
MAKT~MAKTX
FROM MARC
LEFT JOIN MARA ON MARC~MATNR = MARA~MATNR
LEFT JOIN MAKT ON MARC~MATNR = MAKT~MATNR AND MAKT~SPRAS = @SY-LANGU
WHERE MARC~MATNR IN @S_MATNR
AND MARC~WERKS IN @S_WERKS
AND MARA~MATKL IN @S_MATKL
AND MARC~EISBE > 0
INTO TABLE @DATA(LT_MARC) .
"2.MB52实时库存数据
FIELD-SYMBOLS : <LT_ALV_DATA> TYPE ANY TABLE .
CL_SALV_BS_RUNTIME_INFO=>SET(
DISPLAY = ABAP_FALSE
METADATA = ABAP_FALSE
DATA = ABAP_TRUE ).
SUBMIT RM07MLBS "MB52库存清单
WITH WERKS IN S_WERKS "
WITH LGORT IN S_LGORT "
WITH MATKLA IN S_MATKL "
WITH MATNR IN S_MATNR "
WITH negativ = ''
WITH pa_sond = ''
WITH xmchb = 'X'
WITH nozero = 'X'
WITH novalues = ''
WITH pa_hsq = ''
WITH pa_flt = 'X'
WITH p_vari = ''
EXPORTING LIST TO MEMORY
AND RETURN.
IF SY-SUBRC = 0.
TRY.
* cl_salv_bs_runtime_info=>GET_DATA( IMPORTING T_DATA = GT_TABLE ). "submit写法分两种取值方法,FB03那种以SAP数据字典中存在的结构展示的用这种
CL_SALV_BS_RUNTIME_INFO=>GET_DATA_REF( IMPORTING R_DATA = DATA(GT_DATA) ). "MB52这种查看不到标准输出的结构的用这种
ASSIGN GT_DATA->* TO <LT_ALV_DATA> .
IF <LT_ALV_DATA> IS ASSIGNED.
"3.按照物料工厂汇总数据 。
LOOP AT <LT_ALV_DATA> ASSIGNING FIELD-SYMBOL(<FS_DA>).
CLEAR : GS_SUMD .
MOVE-CORRESPONDING <FS_DA> TO GS_SUMD.
COLLECT GS_SUMD INTO GT_SUMD .
ENDLOOP.
IF S_LGORT IS NOT INITIAL .
DELETE GT_SUMD WHERE LGORT NOT IN S_LGORT .
ENDIF.
SORT GT_SUMD BY WERKS MATNR LGORT.
ENDIF.
CATCH CX_SALV_BS_SC_RUNTIME_INFO.
MESSAGE '查询结果为空!' TYPE 'E'.
ENDTRY.
CL_SALV_BS_RUNTIME_INFO=>CLEAR_ALL( ).
ENDIF.
"4.构造最终展示ALV
LOOP AT LT_MARC INTO DATA(LS_MARC).
READ TABLE GT_SUMD WITH KEY WERKS = LS_MARC-WERKS MATNR = LS_MARC-MATNR
INTO GS_SUMD BINARY SEARCH .
IF SY-SUBRC = 0.
LOOP AT GT_SUMD FROM SY-TABIX INTO DATA(LS_SUD).
IF LS_SUD-WERKS <> LS_MARC-WERKS OR LS_SUD-MATNR <> LS_MARC-MATNR.
EXIT .
ENDIF.
* IF SY-SUBRC <> 0.
* GS_SUMD-LABST = 0 .
* ENDIF.
IF GS_SUMD-LABST < LS_MARC-EISBE . "實際庫存小於安全庫存
APPEND INITIAL LINE TO GT_ITEM ASSIGNING FIELD-SYMBOL(<FS_ITEM>) .
IF <FS_ITEM> IS ASSIGNED.
<FS_ITEM>-MATNR = LS_MARC-MATNR .
<FS_ITEM>-WERKS = LS_MARC-WERKS .
<FS_ITEM>-EISBE = LS_MARC-EISBE .
<FS_ITEM>-GEWEI = LS_MARC-GEWEI .
<FS_ITEM>-MAKTX = LS_MARC-MAKTX .
<FS_ITEM>-LGORT = GS_SUMD-LGORT .
<FS_ITEM>-LABST = GS_SUMD-LABST .
ENDIF.
UNASSIGN <FS_ITEM> .
ENDIF.
ENDLOOP.
ELSE .
GS_SUMD-LABST = 0 .
IF GS_SUMD-LABST < LS_MARC-EISBE . "實際庫存小於安全庫存
APPEND INITIAL LINE TO GT_ITEM ASSIGNING <FS_ITEM> .
IF <FS_ITEM> IS ASSIGNED.
<FS_ITEM>-MATNR = LS_MARC-MATNR .
<FS_ITEM>-WERKS = LS_MARC-WERKS .
<FS_ITEM>-EISBE = LS_MARC-EISBE .
<FS_ITEM>-GEWEI = LS_MARC-GEWEI .
<FS_ITEM>-MAKTX = LS_MARC-MAKTX .
<FS_ITEM>-LABST = GS_SUMD-LABST .
ENDIF.
UNASSIGN <FS_ITEM> .
ENDIF.
ENDIF.
ENDLOOP.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form FRM_SEND_MAIL
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM FRM_SEND_MAIL .
CHECK P_MAIL = 'X' . "有勾选发送邮件才发送邮件
CONSTANTS: GC_TAB TYPE C VALUE CL_BCS_CONVERT=>GC_TAB . " 换下一个单元格CL_ABAP_CHAR_UTILITIES=>HORIZONTAL_TAB
CONSTANTS: GC_CRLF TYPE C VALUE CL_BCS_CONVERT=>GC_CRLF. " 换下一行 CL_ABAP_CHAR_UTILITIES=>CR_LF
DATA LV_STRING TYPE STRING.
DATA LS_T100 TYPE T100.
DATA LV_LABST TYPE C LENGTH 20 .
DATA LV_EISBE TYPE C LENGTH 20 .
DATA MAIN_TEXT TYPE BCSY_TEXT.
DATA BINARY_CONTENT TYPE SOLIX_TAB.
DATA SIZE TYPE SO_OBJ_LEN.
DATA SENT_TO_ALL TYPE OS_BOOLEAN.
DATA SEND_REQUEST TYPE REF TO CL_BCS.
DATA DOCUMENT TYPE REF TO CL_DOCUMENT_BCS.
DATA RECIPIENT TYPE REF TO IF_RECIPIENT_BCS.
DATA BCS_EXCEPTION TYPE REF TO CX_BCS.
DATA L_RESULT TYPE OS_BOOLEAN .
DATA LV_MAIL TYPE AD_SMTPADR .
DATA LV_MAIL2 TYPE AD_SMTPADR VALUE 'szmis11@lotestech.com'.
DATA LT_MAIL TYPE TABLE OF AD_SMTPADR .
DATA LT_OBJNAM TYPE TABLE OF SO_OBJ_NAM .
DATA LS_OBJNAM TYPE SO_OBJ_NAM .
DATA W_DOCUMENT TYPE REF TO CL_BCS .
DATA LO_SENDER TYPE REF TO CL_SAPUSER_BCS .
DATA L_BCS_TO TYPE REF TO IF_RECIPIENT_BCS .
"1.构造邮件附件
"1.1附件表头
CONCATENATE '料 号' GC_TAB '工 廠' GC_TAB '倉 位' GC_TAB '现有庫存' GC_TAB
'安全庫存' GC_TAB '品 名' GC_TAB '單 位' GC_TAB GC_CRLF
INTO LV_STRING .
"1.2正文内容
LOOP AT GT_ITEM INTO DATA(LS_ITEM).
LV_LABST = LS_ITEM-LABST .
LV_EISBE = LS_ITEM-EISBE .
CONCATENATE LV_STRING LS_ITEM-MATNR GC_TAB
LS_ITEM-WERKS GC_TAB
LS_ITEM-LGORT GC_TAB
LV_LABST GC_TAB
LV_EISBE GC_TAB
LS_ITEM-MAKTX GC_TAB
LS_ITEM-GEWEI GC_TAB
GC_CRLF INTO LV_STRING.
ENDLOOP.
"1.3生成附件
TRY.
CL_BCS_CONVERT=>STRING_TO_SOLIX(
EXPORTING
IV_STRING = LV_STRING
IV_CODEPAGE = '4103' "suitable for MS Excel, leave empty
IV_ADD_BOM = 'X' "for other doc types
IMPORTING
ET_SOLIX = BINARY_CONTENT
EV_SIZE = SIZE ).
CATCH CX_BCS.
MESSAGE '移轉文件內容時發生錯誤,郵件發送失敗' TYPE 'E' .
ENDTRY.
"2.發送郵件
"2.1獲取郵箱地址
"2.1.1根据选择屏幕获取邮箱组
LOOP AT S_WERKS.
IF S_MATKL IS INITIAL .
CLEAR : LS_OBJNAM .
LS_OBJNAM = S_WERKS-LOW && 'ALL' .
SELECT * FROM SOID
WHERE SOID~OBJNAM = @LS_OBJNAM
APPENDING TABLE @DATA(LT_SOID) .
ELSE .
LOOP AT S_MATKL WHERE OPTION = 'EQ' .
CLEAR : LS_OBJNAM .
LS_OBJNAM = S_WERKS-LOW && S_MATKL-LOW .
SELECT * FROM SOID
WHERE SOID~OBJNAM = @LS_OBJNAM
APPENDING TABLE @LT_SOID .
ENDLOOP.
ENDIF.
ENDLOOP.
"2.1.2根据邮箱组获取邮箱地址
IF LT_SOID[] IS NOT INITIAL.
SELECT SODM~MEMNO FROM SODM
FOR ALL ENTRIES IN @LT_SOID
WHERE SODM~DLITP = @LT_SOID-DLITP
AND SODM~DLIYR = @LT_SOID-DLIYR
AND SODM~DLINO = @LT_SOID-DLINO
INTO TABLE @DATA(LT_SODM) .
LOOP AT LT_SODM INTO DATA(LS_SODM).
DATA(LV_SOKEY) = LS_SODM+2(10) .
SELECT V_ADCP_SO~PERSNUMBER , V_ADCP_SO~ADDRNUMBER , V_ADCP_SO~NAME_TEXT
FROM V_ADCP_SO
WHERE V_ADCP_SO~SO_KEY = @LV_SOKEY
APPENDING TABLE @DATA(LT_SDCP) .
ENDLOOP.
IF LT_SDCP[] IS NOT INITIAL.
SELECT * FROM ADR6
FOR ALL ENTRIES IN @LT_SDCP
WHERE ADR6~ADDRNUMBER = @LT_SDCP-ADDRNUMBER
AND ADR6~PERSNUMBER = @LT_SDCP-PERSNUMBER
INTO TABLE @DATA(LT_ADR6) .
ENDIF.
LOOP AT LT_ADR6 INTO DATA(LS_ADR6).
CLEAR :LV_MAIL.
LV_MAIL = LS_ADR6-SMTP_ADDR .
APPEND LV_MAIL TO LT_MAIL .
ENDLOOP.
ENDIF.
"2.2調用方法發送郵件
TRY.
* -------- create persistent send request ------------------------
SEND_REQUEST = CL_BCS=>CREATE_PERSISTENT( ).
* -------- create and set document with attachment ---------------
* create document object from internal table with text
APPEND '安全庫存預警' TO MAIN_TEXT. " 邮件内容
DOCUMENT = CL_DOCUMENT_BCS=>CREATE_DOCUMENT(
I_TYPE = 'RAW'
I_TEXT = MAIN_TEXT
I_SUBJECT = '安全庫存預警' ). " 邮件主题名
* add the spread sheet as attachment to document object
DOCUMENT->ADD_ATTACHMENT(
I_ATTACHMENT_TYPE = 'XLS' " 附件格式
I_ATTACHMENT_SUBJECT = 'SAP stock' " 附件名稱
I_ATTACHMENT_SIZE = SIZE "附件大小
I_ATT_CONTENT_HEX = BINARY_CONTENT ). "附件内容
* add document object to send request
SEND_REQUEST->SET_DOCUMENT( DOCUMENT ).
* 发件人
* LO_SENDER = CL_SAPUSER_BCS=>CREATE( 'SZMIS11' ).
* SEND_REQUEST->SET_SENDER( LO_SENDER ).
* --------- add recipient (e-mail address) -----------------------
* create recipient object
CLEAR : LV_MAIL .
LOOP AT LT_MAIL INTO LV_MAIL.
RECIPIENT = CL_CAM_ADDRESS_BCS=>CREATE_INTERNET_ADDRESS( LV_MAIL ).
SEND_REQUEST->ADD_RECIPIENT( RECIPIENT ).
ENDLOOP.
* ---------- send document ---------------------------------------
SENT_TO_ALL = SEND_REQUEST->SEND( I_WITH_ERROR_SCREEN = 'X' ).
COMMIT WORK.
WAIT UP TO 2 SECONDS.
SUBMIT RSCONN01 WITH MODE = 'INT'
WITH OUTPUT = 'X'
AND RETURN.
* ------------ exception handling ----------------------------------
* replace this rudimentary exception handling with your own one !!!
CATCH CX_BCS INTO BCS_EXCEPTION.
MESSAGE '移轉文件內容時發生錯誤,郵件發送失敗' TYPE 'E' .
ENDTRY.
ENDFORM.
post SAP-Garson
原文链接:https://blog.csdn.net/Qunending/article/details/114069773文章来自于网络,如果侵犯了您的权益,请联系站长删除!