ABAP 发送带EXCEL邮件
前言
没啥特殊需求,就是有个库龄报表用户想整邮件发送
实现
用的最简单的XLS文件作为excel附件发送出去
观察XLS文件的纯文本格式,每列之间用TAB制表符分隔,每行之间用回车符分隔
思路也比较明确,在SAP中实现这种格式,再转二进制流就好了
下面的代码替换掉lt_data就可以直接使用,用的动态内表自动将内表转成纯文本
*&---------------------------------------------------------------------*
*& Form frm_2023122702
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
FORM frm_2023122702 .TYPES: BEGIN OF ty_mrtab,matnr TYPE mara-matnr,maktx TYPE makt-maktx,mtart TYPE mara-mtart,END OF ty_mrtab.FIELD-SYMBOLS: <gt_table> TYPE table. "DYNAMIC TABLE INDICATE" 容器字段FIELD-SYMBOLS: <fs_data> TYPE any,<fs_cell_data> TYPE any.DATA: lr_data TYPE REF TO data,lo_descr TYPE REF TO cl_abap_typedescr,lo_str_descr_in TYPE REF TO cl_abap_structdescr,ls_abap_comp_descr TYPE abap_compdescr."附件参数DATA: lt_otf TYPE TABLE OF itcoo,lt_tline TYPE TABLE OF tline,lt_record TYPE TABLE OF solisti1,ls_otf TYPE itcoo,ls_tline TYPE tline,ls_record TYPE solisti1."邮件参数DATA: lv_size TYPE i, "邮件附件大小lv_lines_txt TYPE i, "邮件文本行数lv_lines_bin TYPE i, "邮件附件行数lv_benfile TYPE xstring,lv_object TYPE char50, "邮件主题lv_filename TYPE char50,lt_objpack TYPE TABLE OF sopcklsti1 , "邮件内容 正文+附件lt_objtxt TYPE TABLE OF solisti1 , "正文内容lt_objbin TYPE TABLE OF solisti1 , "附件内容lt_reclist TYPE TABLE OF somlreci1 , "收件人ls_doc_chng TYPE sodocchgi1, "邮件属性ls_objpack TYPE sopcklsti1,ls_objtxt TYPE solisti1,ls_objbin TYPE solisti1,ls_reclist TYPE somlreci1.DATA: lv_str TYPE string,lv_cell TYPE string.* 需要转excel的内表DATA: lt_data TYPE TABLE OF ty_mrtab.lt_data = VALUE #( ( matnr = '100' maktx = '硅粉621,纯度≥99.1%,P<80ppm;B<50ppm' mtart = '1000' )( matnr = '200' maktx = '硅粉621,纯度≥99.1%,P<80ppm;B<50ppm' mtart = '1000' ) )." 转动态内表以符合各种场景ASSIGN lt_data TO <gt_table>.*&--获取lt_data的表结构CREATE DATA lr_data LIKE LINE OF <gt_table>.ASSIGN lr_data->* TO <fs_data>." EXCEL表头
* LOOP AT gt_fieldcat_alv INTO DATA(ls_fieldcat_alv).
* " 单元格 + TAB符
* lv_str = lv_str && ls_fieldcat_alv-seltext_l && cl_abap_char_utilities=>horizontal_tab.
* ENDLOOP.
* " 最后使用回车符换行
* lv_str = lv_str && cl_abap_char_utilities=>cr_lf.*&--获取内表列字段CALL METHOD cl_abap_structdescr=>describe_by_dataEXPORTINGp_data = <fs_data>RECEIVINGp_descr_ref = lo_descr.lo_str_descr_in ?= lo_descr.*&--EXCEL表体LOOP AT <gt_table> ASSIGNING <fs_data>.
* CLEAR: lv_str,lv_start,lv_end." 循环每行的每个单元格LOOP AT lo_str_descr_in->components INTO ls_abap_comp_descr." 根据字段名找到字段ASSIGN COMPONENT ls_abap_comp_descr-name OF STRUCTURE <fs_data> TO <fs_cell_data>." 去除首尾引号,否则xls文件中tab符会有问题lv_cell = <fs_cell_data>.REPLACE ALL OCCURRENCES OF REGEX '^"*|"*$' IN lv_cell WITH ''." 单元格 + TAB符lv_str = lv_str && lv_cell && cl_abap_char_utilities=>horizontal_tab.ENDLOOP." 最后使用回车符换行lv_str = lv_str && cl_abap_char_utilities=>cr_lf.ENDLOOP."string类型-> XSTRINGCALL FUNCTION 'SCMS_STRING_TO_XSTRING'EXPORTINGtext = lv_str
* mimetype = 'XLS'encoding = '8404' "防止中文乱码IMPORTINGbuffer = lv_benfileEXCEPTIONSfailed = 1OTHERS = 2.IF lv_benfile IS NOT INITIAL.CALL FUNCTION 'SCMS_XSTRING_TO_BINARY'EXPORTINGbuffer = lv_benfileIMPORTINGoutput_length = lv_sizeTABLESbinary_tab = lt_record.ENDIF."将转换后的文件添加到邮件附件APPEND LINES OF lt_record TO lt_objbin.* &---邮件处理" 获取收件人SELECT DISTINCTsmtp_addrFROM zmmt045INTO TABLE @DATA(lt_receiver).lv_size = lines( lt_objbin ) * 255."添加邮件正文ls_objtxt = 'ZMMR011报表已导出,请查看附件'. "APPEND ls_objtxt TO lt_objtxt."邮件正文行数lv_lines_txt = lines( lt_objtxt ).lv_object = 'ZMMR011导出'. " 标题:ZMMR011报表lv_filename = 'ZMMR011.XLS'. " 附件XLS命名ls_doc_chng-obj_langu = sy-langu.ls_doc_chng-obj_name = 'Email'. " Email
* ls_doc_chng-expiry_dat = sy-datum + 10. " 邮件过期日,在此日期后邮件将无法被查看ls_doc_chng-obj_descr = lv_object. "邮件标题
* ls_doc_chng-sensitivty = 'F'. " 邮件保密等级ls_doc_chng-doc_size = lv_lines_txt * 255 + lv_size.ls_doc_chng-priority = '3'. " 1:低优先级 3:普通优先级 5:高优先级CLEAR ls_objpack-transf_bin.ls_objpack-head_start = 1.ls_objpack-head_num = 0.ls_objpack-body_start = 1.ls_objpack-body_num = lv_lines_txt.ls_objpack-doc_type = 'RAW'.APPEND ls_objpack TO lt_objpack.CLEAR:lv_lines_bin.ls_objpack-transf_bin = 'X'.ls_objpack-head_start = 1.ls_objpack-head_num = 1.ls_objpack-body_start = 1.lv_lines_bin = lines( lt_objbin ).ls_objpack-doc_size = lv_size .ls_objpack-body_num = lv_lines_bin.ls_objpack-doc_type = 'XLS'.ls_objpack-obj_descr = lv_filename.APPEND ls_objpack TO lt_objpack.lt_reclist = VALUE #( FOR lw_receiver IN lt_receiver( receiver = lw_receiver " 收件人邮箱rec_type = 'U' ) ).CALL FUNCTION 'SO_NEW_DOCUMENT_ATT_SEND_API1'EXPORTINGdocument_data = ls_doc_chng " 邮件属性put_in_outbox = ''commit_work = 'X'TABLESpacking_list = lt_objpack " 邮件内容contents_bin = lt_objbin " 附件内容(二进制)contents_txt = lt_objtxt " 邮件内容(直接填入)receivers = lt_reclist " 收件箱地址EXCEPTIONStoo_many_receivers = 1document_not_sent = 2document_type_not_exist = 3operation_no_authorization = 4parameter_error = 5x_error = 6enqueue_error = 7OTHERS = 8.IF sy-subrc = 0.
* es_return-type = 'S'.
* es_return-message = es_return-message && TEXT-m19. " 邮件发送成功WAIT UP TO 1 SECONDS." 立即发送邮件SUBMIT rsconn01 "#EC CI_SUBMITWITH mode = 'INT' WITH output = '' AND RETURN. ".ELSE.
* es_return-type = 'S'.
* es_return-message = es_return-message && TEXT-m20. " 邮件发送失败ENDIF.ENDFORM.
相关文章:
ABAP 发送带EXCEL邮件
前言 没啥特殊需求,就是有个库龄报表用户想整邮件发送 实现 用的最简单的XLS文件作为excel附件发送出去 观察XLS文件的纯文本格式,每列之间用TAB制表符分隔,每行之间用回车符分隔 思路也比较明确,在SAP中实现这种格式…...
Linux Nginx SSL 证书配置正确,扔展示不安全
Nginx SSL 配置 首先我能够确定自己的Nginx SSL是配置正确的: 问题展示 通过浏览器访问自己域名,点击不安全后查看证书,展示的证书并不是自己所配置的证书,如下: 通过curl -vvv https://域名访问返回的证书是过期…...
算法沉淀——动态规划之子数组、子串系列(上)(leetcode真题剖析)
算法沉淀——动态规划之子数组、子串系列 01.最大子数组和02.环形子数组的最大和03.乘积最大子数组04.乘积为正数的最长子数组长度 01.最大子数组和 题目链接:https://leetcode.cn/problems/maximum-subarray/、 给你一个整数数组 nums ,请你找出一个具…...
Flutter GetX 之 暗黑模式
我们紧接上篇文章,今天继续讲解一下强大的 GetX 的另一个功能,就是 暗黑模式 ,在iOS 13开始苹果的应用慢慢的都开始适配 暗黑模式,andr。oid 也慢慢的 开始跟进,截止到目前,商店的大部分应用都已经完成了 暗…...
SQLlabs46关
看看源码 最终我们的id是放到order by后面了 如果我们直接用列去排序 ?sortusername/password username: passward 可以看到顺序是不同的,当然第一列第二列第三列也可以,基本上都是这个原理,那怎么去实现注入呢,我…...
【Android移动开发】Windows10平台安装Android Studio与人工智能算法模型部署案例
目录 一、Android Studio下载地址二、开发环境JDK三、开始安装Android Studio四、案例展示与搭建五、人工智能算法模型移动端部署案例参考 一、Android Studio下载地址 https://developer.android.google.cn/studio/install.html 电脑配置要求: 下载保存在指定文…...
【IDEA】java 项目启动偶现Kotlin 版本问题 error:Kotlin:module was
一、问题描述: error:Kotlin:module was compiled with an incompatible version of kotlin the binary version of its metadata is二、问题原因: jar包版本冲突 三、解决方式: 1、Rebuild Project(推荐☆) 重新构…...
Jmeter系列(2)目录介绍
目录 Jmeter目录介绍bin目录docsextrasliblicensesprintable_docs Jmeter目录介绍 在学习Jmeter之前,需要先对工具的目录有些了解,也会方便后续的学习 bin目录 examplesCSV目录中有CSV样例jmeter.batwindow 启动文件jmeter.shMac/linux的启动文件jmete…...
vue基础操作(vue基础)
想到多少写多少把,其他的想起来了在写。也写了一些css的 input框的双向数据绑定 html <input value"123456" type"text" v-model"account" input"accou" class"bottom-line bottom" placeholder"请输入…...
EEA架构
概念 EEA(Electrical/Electronic Architecture)是一个综合性的概念,它涉及汽车电子电气系统的设计和整合。EEA是汽车上电气部件之间的相互关系,以及包含所有电气部件和电气系统所承载的逻辑功能的组织结构。它是系统的组织结构表…...
【物联网应用案例】牧场牛棚环境管理项目
众所周知,奶牛的健康和牛奶的产量在很大程度上取决于其所在的环境。对于牧场而言,牛棚内的环境更是至关重要。一个适宜的环境不仅能保证奶牛的舒适度,还能提高其产奶量,从而为牧场带来更多的经济效益。 为了更好地理解牛棚环境对…...
【Vue】组件通信组件通信
📝个人主页:五敷有你 🔥系列专栏:JVM ⛺️稳中求进,晒太阳 组件通信 组件通信,就是指组件与组件之间的数据传递 组件的数据是独立的,无法直接访问其他组件的数据想用其他组件的数据--&…...
瑞_Redis_Redis客户端
文章目录 1 Redis客户端1.1 Redis命令行客户端1.2 图形化桌面客户端1.2.1 资源准备1.2.2 安装1.2.3 建立连接 🙊 前言:本文章为瑞_系列专栏之《Redis》的基础篇的Redis客户端章节。由于博主是从B站黑马程序员的《Redis》学习其相关知识,所以本…...
在Ubuntu系统下搭建TDengine集群
目录 一、Ubuntu虚拟机创建 二、系统相关配置 1、设置系统hostname 2、网络配置及IP规划 3、配置FQDN(etc/hosts) 4、服务端口设置 三、TDengine server安装 1、服务安装 2、修改配置 3、启动taosd 4、服务卸载 四、客户端安装 1、client安…...
Easy-Jmeter: 性能测试平台
目录 写在开始1 系统架构2 表结构设计3 测试平台生命周期4 分布式压测5 压力机管理6 用例管理6.1 新增、编辑用例6.2 调试用例6.3 启动测试6.4 动态控量6.5 测试详情6.6 环节日志6.7 实时数据6.8 测试结果 7 测试记录7 用例分析8 系统部署8.1普通部署8.2容器化部署 写在最后 写…...
Unity3D Lua与C#的相互调用与性能剖析详解
前言 在游戏开发中,经常会遇到Lua与C#之间的相互调用的情况。本文将详细介绍Unity3D中Lua与C#的相互调用的方式,并对其性能进行剖析。 对惹,这里有一个游戏开发交流小组,希望大家可以点击进来一起交流一下开发经验呀!…...
鸿蒙开发路由跳转踩坑
文章目录 前言常见路由不能跳转问题总结 一、前言 02-25 10:40:10.799 42182-2075594 E C03900/Ace: [manifest_router.cpp(GetPagePath)-(0)] [Engine Log] cant find this page pages 02-25 10:40:10.799 42182-2075594 E C03900/Ace: [page_router_manager.cpp(StartPush…...
SpringBoot 3 新特性
目录 1. GraalVM1.1 生成本地可执行应用1.2 生成docker镜像 2. 支持虚拟线程3. HTTP Interface 1. GraalVM 使用GraalVM将SpringBoot应用程序编译成本地可执行的镜像文件,可以显著提升启动速度、峰值性能以及减少内存应用。传统的应用都是编译成字节码,…...
Day02:Web架构前后端分离站Docker容器站集成软件站建站分配
目录 常规化站点部署 站库分离 前后端分离 集成软件搭建Web应用 Docker容器搭建Web应用 建立分配站 静态 与 伪静态 总结 章节知识点: 应用架构:Web/APP/云应用/三方服务/负载均衡等 安全产品:CDN/WAF/IDS/IPS/蜜罐/防火墙/杀毒等 渗…...
链表和顺序表的优劣分析及其时间、空间复杂度分析
链表和顺序表的优劣分析及其时间、空间复杂度分析 一、链表和顺序表的优劣分析二、算法复杂度<font face "楷体" size 5 color blue>//上面算法的执行次数大致为:F(N) N^22*N10; N 10,F(10) 1002010 130次 N 1…...
QQ防红跳转短网址生成网站完整源码
使用此源码可以生成QQ自动跳转到浏览器的短链接,无视QQ报毒,任意网址均可生成。 全新界面,网站背景图采用Bing随机壁纸 支持生成多种短链接 兼容电脑和手机页面 生成网址记录功能,域名黑名单功能 网站后台可管理数据 安装说明&am…...
面试redis篇-10Redis集群方案-主从复制
在Redis中提供的集群方案总共有三种: 主从复制哨兵模式分片集群主从复制 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。 主从数据同步原理 Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每…...
【BUG 记录】史诗级 BUG - MYSQL 删库删表却没有备份如何恢复数据
【BUG 记录】史诗级 BUG - MYSQL 删库删表却没有备份如何恢复数据 1. 问题描述2. 解决方案(binlog)2.1 构造测试环境2.2 查看 MySQL 环境是否开启 binlog2.3 查看所有的 binlog 日志记录2.4 查看当前正在使用的是哪一个 binlog 文件2.5 查看此时的 binlo…...
天翼云登录参数JavaSrcipt逆向
天翼云登录参数 password 、comParam_curTime、comParam_seqCode、comParam_signature JavaSrcipt逆向 目标网站 https://m.ctyun.cn/wap/main/auth/login?redirect/my 目标参数 要逆向的有 password、comParam_curTime、comParam_seqCode、comParam_signature 四个参数 …...
AI与大数据:智慧城市安全的护航者与变革引擎
一、引言 在数字化浪潮的席卷下,智慧城市正成为现代城市发展的新方向。作为城市的神经系统,AI与大数据的融合与应用为城市的安全与应急响应带来了革命性的变革。它们如同城市的“智慧之眼”和“聪明之脑”,不仅为城市管理者提供了强大的决策…...
adb pull 使用
adb pull 是 Android Debug Bridge (ADB) 工具提供的一个命令,用于将设备上的文件拷贝到计算机上。通过 adb pull 命令,实现从 Android 设备上获取文件并保存到本地计算机上。 使用 adb pull 命令的基本语法如下: adb pull <设备路径>…...
算法【线性表的查找-顺序查找】
线性表的查找-顺序查找 顺序查找基本思想应用范围顺序表的表示数据元素类型定义查找算法示例分析 时间效率分析顺序查找的特点如何提高查找效率 顺序查找 基本思想 在表的多种结构定义方式中,线性表是最简单的一种。而顺序查找是线性表查找中最简单的一种。 顺序查…...
力扣1143. 最长公共子序列(动态规划)
Problem: 1143. 最长公共子序列 文章目录 题目描述思路复杂度Code 题目描述 思路 我们统一标记:str1[i]代表text1表示的字符数组,str2[j]代表text2表示的字符数组;LCS代表最长的公共子序列;(我们易得只有str1[i]和str…...
如何使用群晖NAS中FTP服务开启与使用固定地址远程上传下载本地文件?
文章目录 1. 群晖安装Cpolar2. 创建FTP公网地址3. 开启群晖FTP服务4. 群晖FTP远程连接5. 固定FTP公网地址6. 固定FTP地址连接 本文主要介绍如何在群晖NAS中开启FTP服务并结合cpolar内网穿透工具,实现使用固定公网地址远程访问群晖FTP服务实现文件上传下载。 Cpolar内…...
C语言文件知识点
一.解释一些问题 1.标准输入文件(sdtin),通常对应终端的键盘。 2.标准输出文件(stdout)和标准错误输出文件(stderr),这两个文件 都对应终端的屏幕。 (解释:…...
wordpress divi 教程/在seo优化中
自己写的程序CPU占用率过高,无法锁定原因时,可以用VS2013帮忙检测 1. 打开VS 性能分析 2. 启动项目进行检测 3. 选择CPU采样 完成 4. 分析一段时间 然后停止分析 5. 选择显示代码 6. 阿萨德 可以查看具体函数的占用比了 原文:http://blog.csdn.n…...
深圳微信商城网站设计联系电话/小红书怎么推广引流
国家广电总局 SARFT: State Administration of Radio, Film and Television. 服务等级协议定义SLA:Service-Level Agreement...
新西兰做网站代购/湖南中高风险地区
题目描述 兄弟俩骑车郊游,弟弟先出发,每分钟X米,M分钟后,哥哥带一条狗出发。以每分钟Y米的速度去追弟弟,而狗则以每分钟Z米的速度向弟弟跑去,追上弟弟后又立即返回,直到哥哥追上弟弟时ÿ…...
深圳网站制作作/seo推广怎么入门
所以我正在用Python编写一个程序来获取任意数量的GCD. def GCD(numbers): if numbers[-1] 0: return numbers[0] # im stuck here, this is wrong for i in range(len(numbers)-1): print GCD([numbers[i1], numbers[i] % numbers[i1]]) print GCD(30, 40, 36) 该函数采用数字…...
wordpress首页仅显示标题/seol英文啥意思
原标题:小猿圈分享Linux删除和替换文件中某一行的方法本篇文章小猿圈linux老师给大家分享一下Linux删除和替换文件中某一行的方法,对Linux开发技术感兴趣的小伙伴就一起来看一下吧。如果有一个abc.txt文件,内容是:aaabbbBATBUSINESSTYPE, INS…...
产品发布会详细流程/德州seo优化
大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。声卡用手机唱歌的方法:1、将手机重启。2、使用标配中带有一个开关的音频线连接直播手机和声卡,靠近开关的那头连接手机的耳机孔。3、将音频线的另一端连接在声…...