【SAP Abap】记录一次SAP长文本内容通过Web页面完整显示的应用

news2024/9/26 22:17:15

【SAP Abap】记录一次SAP长文本内容通过Web页面完整显示的应用

  • 1、业务背景
  • 2、实现效果
  • 3、开发代码
    • 3.1、拼接html
    • 3.2、显示html
    • 3.3、ALV导出Excel

1、业务背景

业务在销售订单中,通过长文本描述,记录了一些生产备注信息,如生产标准、客户要求等等。要求开发一个报表,能够方便查看和导出长文本信息。

2、实现效果

由于ALV列表长文本显示不友好,且长度有限制,仅能显示128位,故考虑双击展示长文本详细内容,最终实现效果如下:

ALV列表:
在这里插入图片描述
双击行详情:
在这里插入图片描述
超链接支持右键下载:
在这里插入图片描述

3、开发代码

3.1、拼接html

FUNCTION zmmfm056h.
*"----------------------------------------------------------------------
*"*"本地接口:
*"  EXPORTING
*"     REFERENCE(EV_HTML) TYPE  STRING
*"  TABLES
*"      IT_DATA STRUCTURE  ZSMM114
*"----------------------------------------------------------------------

  "说明:Web页面调试工具:https://www.runoob.com/try/try.php?filename=tryhtml_tables
  types:begin of ty_str,
    str(1000),
    END OF ty_str.
  TYPES: BEGIN OF ty_url,
           name TYPE string,
           url  TYPE string,
         END OF ty_url.

  DATA: lt_str TYPE TABLE OF ty_str,
        lt_url TYPE TABLE OF ty_url WITH HEADER LINE.

  IF it_data[] IS INITIAL.
    ev_html = |<!DOCTYPE html><html><head><title>abap show html</title></head><body><p>请输入要展示的数据</p></body></html>|.
    RETURN.
  ENDIF.

  SORT it_data[] BY vbeln posnr.

  ev_html = |<!DOCTYPE html><html><head><title>明细数据</title></head><body link="#0563C1" vlink="#954F72" style="word-wrap:break-word">|
         && |<h1 style="text-align:center;">销售订单生产备注信息</h1>|
         && |<h4 style="text-align:center;">导出人:{ sy-uname }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;导出日期:{ sy-datum }</h4>|.

  LOOP AT it_data[] ASSIGNING FIELD-SYMBOL(<fs_data>).
    AT NEW vbeln.
      ev_html = ev_html
             && |<h3 style="text-align:left;">序号:{ sy-index }</h3>|
             && |<table border=1 width=800 style='border-collapse:collapse;table-layout:fixed;'>|
             && | <tr style='font-family:arial;color:black;font-weight:bold;font-size:16px;text-align:center'>|
             && |  <td width=160>计划编号</td><td width=160>客户参考</td><td width=160>CRM下单人员</td><td width=160>销售订单类型</td><td width=160>销售订单号</td></tr>|
             && | <tr style='text-align:center'><td>{ <fs_data>-bstkd_e }</td><td>{ <fs_data>-bstnk }</td>|
             && |  <td>{ <fs_data>-zzxdry }</td><td>{ <fs_data>-auart }</td><td>{ <fs_data>-vbeln }</td></tr>|
             && | <tr><td style='font-family:arial;color:black;font-weight:bold;font-size:16px;text-align:center'>抬头生产备注</td><td colspan=4>{ <fs_data>-zscbz1 }</td></tr>|
             && | <tr><td style='font-family:arial;color:black;font-weight:bold;font-size:16px;text-align:center'>环保技术要求</td><td colspan=4>{ <fs_data>-zhbjsyq }</td></tr>|
             .
            
      IF <fs_data>-zfiles IS INITIAL.
        ev_html = ev_html && | <tr><td style='font-family:arial;color:black;font-weight:bold;font-size:17px;text-align:center'>附件名称及链接</td>|
                          && | <td colspan=4>[无附件]</td></tr>|.
      ELSE.
        SPLIT <fs_data>-zfiles AT '||' INTO TABLE lt_str.
        IF lt_str[] IS INITIAL.
          ev_html = ev_html && | <tr><td style='font-family:arial;color:black;font-weight:bold;font-size:17px;text-align:center'>附件名称及链接</td>|
                             && | <td colspan=4>{ <fs_data>-zfiles }</td></tr>|.
        ELSE.
          ev_html = ev_html && | <tr><td rowspan={ lines( lt_str[] ) } style='font-family:arial;color:black;font-weight:bold;font-size:17px;text-align:center'>附件名称及链接</td>|.
          LOOP AT lt_str ASSIGNING FIELD-SYMBOL(<fs_str>).
            split <fs_str>-str at '|' into data(lstr1) DATA(lstr2).
            AT FIRST.
              ev_html = ev_html
                    && | <td colspan=4><a href="{ lstr2 }" target="_blank" rel="noopener noreferrer">{ lstr1 }</a></td></tr>|.
              CONTINUE.
            ENDAT.
            ev_html = ev_html
                  && | <tr><td colspan=4><a href="{ lstr2 }" target="_blank" rel="noopener noreferrer">{ lstr1 }</a></td></tr>|.
          ENDLOOP.
        ENDIF.
      ENDIF.
      ev_html = ev_html && | </table>|.
    ENDAT.
    SHIFT <fs_data>-posnr LEFT DELETING LEADING '0'.
    ev_html = ev_html
           && |<table border=1 width=800 style='border-collapse:collapse;table-layout:fixed;'>|
           && | <tr style='font-family:arial;color:black;font-weight:bold;font-size:16px;text-align:center'>|
           && |  <td rowspan=5 width=60>{ <fs_data>-posnr }</td><td width=130>是否按单</td><td width=115>物料号</td><td width=160>物料描述</td>|
           && | <td width=70>订单数量</td><td width=70>销售单位</td><td width=70>生产工厂</td><td width=120>供应链转储订单</td></tr>|
           && | <tr style='text-align:center'><td>{ <fs_data>-ismto }</td><td>{ <fs_data>-matnr ALPHA = out }</td><td>{ <fs_data>-arktx }</td>|
           && | <td>{ <fs_data>-kwmeng }</td><td>{ <fs_data>-vrkme }</td><td>{ <fs_data>-reswk }</td><td>{ <fs_data>-ebeln }</td></tr>|
           && | <tr><td style='font-family:arial;color:black;font-weight:bold;font-size:16px;text-align:center'>物料长文本</td><td colspan=6>{ <fs_data>-ltext }</td></tr>|
           && | <tr><td style='font-family:arial;color:black;font-weight:bold;font-size:16px;text-align:center'>行项目生产备注</td><td colspan=6>{ <fs_data>-zscbz2 }</td></tr>|
           && | <tr><td style='font-family:arial;color:black;font-weight:bold;font-size:16px;text-align:center'>客户标准号</td><td colspan=6>{ <fs_data>-zkhbzh }</td></tr>|
           && |</table>|.

  ENDLOOP.

  ev_html = ev_html && |</body></html>|.

ENDFUNCTION.

3.2、显示html

(1)方式一:ABAP对话框显示html(本例使用,查看不用授权)

FORM frm_double_click  USING    p_row TYPE salv_de_row
                                p_column TYPE salv_de_column.
  DATA: lt_data TYPE TABLE OF zsmm114 WITH HEADER LINE.

  READ TABLE gt_vbak_po INTO DATA(ls_wa) INDEX p_row."读当前行
  CLEAR: lt_data,lt_data[].
  IF p_column EQ 'VBELN'.   "按订单查询
    LOOP AT gt_vbak_po ASSIGNING FIELD-SYMBOL(<fs_vbak>) WHERE vbeln = ls_wa-vbeln.
      lt_data = CORRESPONDING #( <fs_vbak> ).
      APPEND lt_data.
      CLEAR lt_data.
    ENDLOOP.
  ELSE.                     "按订单行查询
    lt_data = CORRESPONDING #( ls_wa ).
    APPEND lt_data.
    CLEAR lt_data.
  ENDIF.

  CHECK lt_data[] IS NOT INITIAL.
  DATA: lv_html_str TYPE string.
  CALL FUNCTION 'ZMMFM056H'
    IMPORTING
      ev_html = lv_html_str
    TABLES
      it_data = lt_data[].

  "lv_html_str = |<!DOCTYPE html><html><head><title>abap show html</title></head><body><p>Hello  world </p></body></html>|.
  cl_abap_browser=>show_html( html_string = lv_html_str context_menu = 'X' printing = 'X' title = '销售订单生产备注信息').
  
ENDFORM.

(2)方法二:调用外部浏览器显示html
需要先下载,再访问,保存文件的时候需要授权。

   CALL  FUNCTION  'GUI_DOWNLOAD'
     EXPORTING
      FILENAME                 =  'C:\hello.html'
     TABLES
      DATA_TAB                 = T_HTML
     EXCEPTIONS
      FILE_WRITE_ERROR         =  1
      NO_BATCH                 =  2
      GUI_REFUSE_FILETRANSFER  =  3
      INVALID_TYPE             =  4
      NO_AUTHORITY             =  5
      UNKNOWN_ERROR            =  6
      HEADER_NOT_ALLOWED       =  7
      SEPARATOR_NOT_ALLOWED    =  8
      FILESIZE_NOT_ALLOWED     =  9
      HEADER_TOO_LONG          =  10
      DP_ERROR_CREATE          =  11
      DP_ERROR_SEND            =  12
      DP_ERROR_WRITE           =  13
      UNKNOWN_DP_ERROR         =  14
      ACCESS_DENIED            =  15
      DP_OUT_OF_MEMORY         =  16
      DISK_FULL                =  17
      DP_TIMEOUT               =  18
      FILE_NOT_FOUND           =  19
      DATAPROVIDER_EXCEPTION   =  20
      CONTROL_FLUSH_ERROR      =  21
       OTHERS                   =  22 .
   IF SY -SUBRC <>  0 .
     MESSAGE  ID SY -MSGID  TYPE SY -MSGTY  NUMBER SY -MSGNO
     WITH SY -MSGV1 SY -MSGV2 SY -MSGV3 SY -MSGV4 .
   ENDIF .
 
   CALL  FUNCTION  'GUI_RUN'
     EXPORTING
      COMMAND  =  'C:\hello.html'
*     PARAMETER        =
*     CD      =
*   IMPORTING
*     RETURNCODE       =

3.3、ALV导出Excel

FORM frm_export_xls.
  DATA: lt_vbak_po LIKE gt_vbak_po.
  CLEAR: lt_vbak_po, lt_vbak_po[].
  lt_vbak_po[] = CORRESPONDING #( gt_vbak_po[] ).
  LOOP AT lt_vbak_po[] ASSIGNING FIELD-SYMBOL(<fs_lt_po>).
    REPLACE ALL OCCURRENCES OF '||' IN <fs_lt_po>-zfiles WITH cl_abap_char_utilities=>cr_lf.
  ENDLOOP.

  DATA: lo_converter TYPE REF TO zcl_excel_converter.
  "创建zcl_excel_converter类
  CREATE OBJECT lo_converter.
  TRY .
      lo_converter->convert(
        EXPORTING
          io_alv        = gr_table
          it_table      = lt_vbak_po[]
          i_row_int     = 1
          i_column_int  = 1
          ).
    CATCH zcx_excel.
  ENDTRY.

  "选择文件保存路径
  TRY.
      DATA:filepath TYPE string VALUE 'D:'.
      cl_gui_frontend_services=>directory_browse(
          EXPORTING
            window_title         = 'Select path to download EXCEL-file'
            initial_folder       = filepath
          CHANGING
            selected_folder      = filepath
          EXCEPTIONS
            cntl_error           = 1
            error_no_gui         = 2
            not_supported_by_gui = 3
            OTHERS               = 4
        ).
  ENDTRY.
  CHECK sy-subrc IS INITIAL AND filepath IS NOT INITIAL.

  "调用write_file方法导出excel
  lo_converter->write_file( i_path = |{ filepath && '\' }销售订单生产备注-{ sy-datum }.xlsx| ).

ENDFORM.

原创文章,转载请注明来源-X档案

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/809075.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java面试丨企业场景】常见技术场景

一、单点登录怎么实现的 1. 介绍 单点登录&#xff08;Single Sign On&#xff0c;SSO&#xff09;&#xff1a;只需要登录一次&#xff0c;就可以访问所有信任的应用系统 2. 解决方案 JWT解决单点登录问题 用户访问应用系统&#xff0c;会在网关判断Token是否有效如果Tok…

位运算 剑指offer15 二进制中1的个数 搜索算法:55-II 平衡二叉树 数值的整数次方 39数组中出现次数超过一半的数字

可能会引起死循环的解法&#xff1a; 看最右边一位是不是1&#xff0c;然后将输入的整数右移一位&#xff0c;再判断最右边一位&#xff08;即倒数第二位&#xff09;是否为1&#xff0c;接着再右移&#xff0c;知道整数移动到0为止 这个解法&#xff0c;把整数右移一位和把整数…

mfc140u.dll丢失怎样修复?这三个方法的可以修复

最近遇到了mfc140u.dll丢失的问题&#xff0c;让我感到非常困扰。在使用某个软件时&#xff0c;突然弹出了一个错误提示&#xff0c;说是mfc140u.dll文件不存在&#xff0c;导致该软件无法正常运行。一开始我并不知道这个文件是什么&#xff0c;也不知道为什么会丢失。于是我开…

7.29训练总结

CodeForces - 1609E 这种使得整个串不包含子串’abc’的题目&#xff0c;发现可以用线段树维护 #include<bits/stdc.h> using namespace std; const int maxn1e55; #define lson now<<1 #define rson now<<1|1 struct seg {int a,b,c;int ab,bc,abc; }tr[m…

使用开源免费AI绘图工具神器-Stable Diffusion懒人整合包

使用开源免费AI绘图工具神器-Stable Diffusion懒人整合包 Stable Diffusion 是什么 Stable Diffusion (简称 SD) 是一款开源免费的以文生图的 AI 扩散模型&#xff0c;它和付费的 Midjourney 被人称为当下最好用的 AI 绘画工具。你在网上看到的绝大多数优秀 AI 图片作品&…

智能垃圾桶

1.树莓派3B引脚图 2. 原理图 3.舵机线图 搜了这个这么多3b的资料&#xff0c;自己只是想解决如何下程序和运行程序的博客&#xff0c;网上搜集的资料全是讲如何通过SSH或者网线连接树莓派&#xff0c;通过直接连接屏幕的教程较少。 棕 : GND 红 : VCC 黄&#xff1a; 信号线…

【Ubuntu系统18.04虚拟机ros下实现darknet_ros(YOLO V3)检测问题解析最全】

原本打算在搭载Ubuntu18.04的智能小车上面运行使用darknet_ros 包来进行yolov3的检测&#xff0c;但是运行过程中遇到了不少问题&#xff0c;从头到尾部的运行包括遇到的解决方法以及对应的文章一并列出&#xff0c;免得到处查找。 首先是在ROS下实现darknet_ros(YOLO V3)检测…

127.【SpringBoot 源码刨析D】

SpringBoot 源码刨析D (三)、SpringBoot 核心功能4.单元测试功能(1).JUnit5 的变化(2).JUnit5常用注解(3).断言&#xff08; assertions &#xff09;(3.1).简单断言(3.2).数组断言(3.3).组合断言(3.4).异常断言(3.5).超时断言(3.6).快速失败 (4).前置条件&#xff08; assumpt…

【小白必看】Python爬虫实战之批量下载女神图片并保存到本地

文章目录 前言运行结果部分图片1. 引入所需库2. 发送请求获取网页内容3. 解析网页内容并提取图片地址和名称4. 下载并保存图片完整代码关键代码讲解 结束语 前言 爬取网络上的图片是一种常见的需求&#xff0c;它可以帮助我们批量下载大量图片并进行后续处理。本文将介绍如何使…

如何选择台式还是便携式多参数水质检测仪呢

选择台式还是便携式多参数水质检测仪主要取决于具体的使用需求和场景。 1.便携式多参数水质检测仪适用于需要在不同地点进行水质检测的情况&#xff0c;例如户外采样、实地调查等。它具有小巧轻便的特点&#xff0c;方便携带和操作&#xff0c;适合需要频繁移动或需要灵活使用的…

深入解析Linux进程内存:VSS、RSS、PSS、USS及查看方式

VSS 虚拟耗用内存大小&#xff0c;是进程可以访问的所有虚拟内存的总量&#xff0c;包括进程独自占用的物理内存、和其他进程共享的内存、分配但未使用的内存。 RSS 驻留内存大小&#xff0c;是进程当前实际占用的物理内存大小&#xff0c;包括进程独自占用的物理内存、和其…

bootstrap入门到精通

官网&#xff1a;列表组 - Bootstrap框架 (bootstrapdoc.com) 菜鸟教程&#xff1a;Bootstrap 列表组 | 菜鸟教程 (runoob.com) 1.什么是bootstrap bootstrap是一个用于快速开发web应用程序和网站的前端框架。基于HTML、CSS和JavaScript封装 响应式 ElementUI 更适合用于企…

WIZnet W5500-EVB-Pico DHCP 配置教程(三)

DHCP协议介绍 什么是DHCP&#xff1f; 动态主机配置协议DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;是一种网络管理协议&#xff0c;用于集中对用户IP地址进行动态管理和配置。 DHCP于1993年10月成为标准协议&#xff0c;其前身是BOOTP协议。DHCP协议由R…

Spring源码(五)— 解析XML配置文件(一) bean标签解析流程

前面几章的内容已经介绍了BeanFactory创建前的准备工作&#xff0c;以及加载XML配置文件前的准备的步骤。本章会着重介绍解析XML的步骤。 registerBeanDefinitions 前几个方法不做过多的赘述&#xff0c;着重看registerBeanDefinitions方法中解析XML的步骤。 public int regi…

C++ 多进程学习总结

C多进程 进程间通信 消息队列 消息队列&#xff1a;提供一个种进程间发送/接收数据块&#xff08;常为结构体数据&#xff09;的方法。 函数接口 ftok()&#xff1a;获取消息队列键值msgget()&#xff1a;创建和访问消息队列msgsnd()&#xff1a;向消息队列发送数据msgrcv…

罗布乐思Roblox学习笔记

罗布乐思 文章目录 罗布乐思基本操作CFrameGUIModule script呼吸灯商店imageChangetag标签知识答题showTips 基本操作 缩放按shift 等比例缩放 ctrl 双向缩放 复制对象 ctrlD &#xff08;如果选择多个对象&#xff0c;按住ctrl&#xff09; F 聚焦 Workspace ​ Terrain…

看完这篇文章,你还会用再用AUTOMATIC1111 WebUI吗?

​说起 AUTOMATIC1111 的 Stable diffusion-wbui 这个项目&#xff0c;使用过Stable diffusion的人应该无人不知吧&#xff0c;网络上基本一边倒的在使用他家的项目&#xff0c;而且fork量和star量还不小&#xff1a; 但是AUTOMATIC1111 这个名字总给我一些不靠谱的感觉&#x…

【C++】多态、黑马程序员案例— —电脑组装、Visual Studio开发人员工具查看内部结构,cl /d1 reportSingleClassLayout

author&#xff1a;&Carlton tag&#xff1a;C topic&#xff1a;【C】多态、黑马程序员案例— —电脑组装、Visual Studio开发人员工具查看内部结构,cl /d1 reportSingleClassLayout website&#xff1a;黑马程序员C date&#xff1a;2023年7月24日 目录 纯虚函数、抽…

map的初始化、erase()、写入与写出

运行代码&#xff1a; //map的初始化、erase()、写入与写出 #include"std_lib_facilities.h"istream& operator>>(istream& is, map<string, int>&mm) {string ss"";int ii0;is >> ss;if(is>>ii)mm[ss] ii;return i…

【数据集】3小时尺度降水数据集-MSWEPV2

1 MSWEP V2 precipitation product 官网-MSWEP V2降水产品 参考