UI5与后端的文件交互(二)

文章目录

  • 前言
  • 一、开发Action
    • 1. 创建Structure
    • 2. BEDF添加Action
    • 3. class中实现Action
  • 二、修改UI5 项目
    • 1. 添加一个按钮
    • 2. 定义事件函数
  • 三、测试及解析
    • 1. 测试
    • 2. js中提取到的excel流数据
    • 3. 后端解析


前言

这系列文章详细记录在Fiori应用中如何在前端和后端之间使用文件进行交互。
这篇的主要内容有:

1.后端RAP的开发(S4HANA On-Premise)
- 开发Action
2.前端(UI5)读取Excel文件并保存到后端
- 传输文件流,并在ABAP中解析数据


一、开发Action

1. 创建Structure

  • 用于在UI5中把文件流传输到后端
@EndUserText.label : 'File'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
define structure ymoon_s010 {
  content : abap.string(0);
}

2. BEDF添加Action

managed implementation in class zbp_moon_i_010 unique;
strict ( 2 );

define behavior for ymoon_i_010 alias Student
persistent table YMOON_T010
early numbering
lock master
authorization master ( instance )
//etag master <field_name>
{
  create;
  update;
  delete;

  //Add Action
  static action upload_file parameter ymoon_s010;

}

3. class中实现Action

这里使用abap2xlsx解析excel文件

  method upload_file.

    types:begin of upload_type,
            name   type ymoon_t010-name,
            age    type ymoon_t010-age,
            gender type ymoon_t010-gender,
            city   type ymoon_t010-city,
          end of upload_type.
    data:ls_upload type upload_type.
    data:lt_ymoon_t010 type table of ymoon_t010,
         ls_ymoon_t010 type  ymoon_t010.

    "获取UI5传送的parameter
    data(content) = keys[ 1 ]-%param-content.

    "拆分数据,只保留excel内容 - lv_data
    split content at `;` into data(lv_dummy) data(lv_data).
    split lv_data at `,` into data(lv_format) lv_data.

    data:lv_excel_data type xstring.
    "将base64的String转换为xstring
    call function 'SCMS_BASE64_DECODE_STR'
      exporting
        input  = lv_data
      importing
        output = lv_excel_data
      exceptions
        failed = 1
        others = 2.

    "ABAP2XLSX生命
    data: lo_excel  type ref to zcl_excel, "엑셀
          lo_reader type ref to zif_excel_reader,
          lo_root   type ref to cx_root. "异常类
    data: lo_worksheet   type ref to zcl_excel_worksheet,
          highest_column type zexcel_cell_column,
          highest_row    type int4,
          column         type zexcel_cell_column value 1,
          col_str        type zexcel_cell_column_alpha,
          row            type int4               value 1,
          value          type zexcel_cell_value,
          converted_date type d.

    "创建reader
    create object lo_reader type zcl_excel_reader_2007.

    lo_excel = lo_reader->load( i_excel2007 = lv_excel_data ).
    lo_worksheet = lo_excel->get_active_worksheet( ).

    "计算行列最大值
    highest_column = lo_worksheet->get_highest_column( ).
    highest_row    = lo_worksheet->get_highest_row( ).

    row += 1.

    while row <= highest_row.
      while column <= highest_column.
        col_str = zcl_excel_common=>convert_column2alpha( column ).
        "读取cell数据
        lo_worksheet->get_cell(
          exporting
            ip_column = col_str
            ip_row    = row
          importing
            ep_value = value
        ).


        assign component column of structure ls_upload to field-symbol(<fs>).
        <fs> = value.
        column = column + 1.
      endwhile.

      column = 1.

      clear ls_ymoon_t010.
      move-corresponding ls_upload to ls_ymoon_t010.
      ls_ymoon_t010-uuid = cl_system_uuid=>create_uuid_x16_static( ).
      append ls_ymoon_t010 to lt_ymoon_t010.
      row = row + 1.
    endwhile.

    modify ymoon_t010 from table lt_ymoon_t010.


  endmethod.

二、修改UI5 项目

1. 添加一个按钮

  • 点击时将触发onUploadStream事件
<Button
    id="_IDGenButton4"
    press="onUploadStream"
    icon="sap-icon://upload"
    text="Upload Stream"
    type="Success"
    class="sapUiSmallMarginBegin"
/>

2. 定义事件函数

  • 这里不解析excel里的数据,只把文件流推给后端
onUploadStream:function(){
                var that = this
                var oModel = this.getView().getModel();
                
                var oFileUploader = this.byId("fileUploader");
                var filename = oFileUploader.getProperty('value')
                var file = oFileUploader.oFileUpload.files[0];


                var reader = new FileReader();
                reader.onload = function (evt) {
                    // 获取base64值
                    var vContent = evt.currentTarget.result;

                    oModel.callFunction("/upload_file",   //BDEF中定义的action名 
                        {
                            method: "POST", // 使用POST 
                            urlParameters: {   //定义的参数,首字母必须要大写 
                                "Content": vContent
                            },
                            success: function (odata, response) {
                                //Model Refresh
                                oModel.refresh(true);
                            },
                            error: function (res) {
                                console.log(res)
                            }
                        })


                }
                //读取文件
                reader.readAsDataURL(file);
            }

三、测试及解析

1. 测试

在这里插入图片描述

2. js中提取到的excel流数据

  • 蓝色框里的是我们需要的Excel数据,需要在后端解析
    在这里插入图片描述

3. 后端解析

  • 使用SCMS_BASE64_DECODE_STR函数,把base64转为xstring
    在这里插入图片描述

  • 再通过zcl_excel_reader_2007对象传入xstring值创建一个zcl_excel对象。 然后使用zcl_excel_worksheet中的get_cell方法提取数据
    在这里插入图片描述

  • 数据库
    在这里插入图片描述

接下来的文章制作一个任意文件的上传和下载

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字图像处理(图像灰度变换、图像直方图及均衡、图像中值滤波、图像空域锐化增强、图像频域滤波)

数字图像处理&#xff08;图像灰度变换、图像直方图及均衡、图像中值滤波、图像空域锐化增强、图像频域滤波&#xff09; 目录 1 图像灰度变换 1.1 灰度线性变换 1.2 图像二值化 1.3 负象变换 1.4 灰度非线性变换 1.5 程序设计流程图 2 图像直方图及均衡 2.1 直方图 2…

了解单元测试

一&#xff0c;测试分类 1.1 E2E测试&#xff08;end to end端到端测试&#xff09; 属于黑盒测试。 主要通过测试框架&#xff0c;站在用户测试人员的角度&#xff0c;模拟用户的操作进行页面功能的验证&#xff0c;不管内部实现机制&#xff0c;完全模拟浏览器的行为。&am…

Pytest——Fixture夹具的使用

一、什么是Fixture 在测试开展的过程中&#xff0c;会需要考虑到测试前的准备工作&#xff0c;以及测试后的释放操作行为。这些在Pytest中&#xff0c;会通过Fixture的方式来实现。如果说在运行pytest的测试用例的时候&#xff0c;需要调用一些数据来实现测试行为&#xff0c;…

thingsboard规则节点功能记录(自用)

本文是对【ThingsBoard源码级分析规则节点使用第一季】 https://www.bilibili.com/video/BV1CT411e7vt/?p4&share_sourcecopy_web&vd_source9a5ca7ed3cff97385fdab4b6188e485c 学习的一些记录&#xff0c;加深自己的理解&#xff0c;在此声明。 asset profile switch…

五、HTML 标题

在 HTML 文档中&#xff0c;标题很重要。 一、HTML 标题 标题&#xff08;Heading&#xff09;是通过 <h1> - <h6> 标签进行定义的。<h1> 定义最大的标题。 <h6> 定义最小的标题。 <h1>这是一个标题。</h1> <h2>这是一个标题。&l…

微型导轨在设备中起什么作用

微型导轨精度高&#xff0c;摩擦系数小&#xff0c;自重轻&#xff0c;结构紧凑&#xff0c;可以用于电子制造设备、半导体制造设备、医疗设备、光学设备和机器人等各种工业机械设备中&#xff0c;那么微型导轨在设备中起什么作用呢&#xff1f; 1、导向与定位&#xff1a;为机…

Flume基础知识(九):Flume 企业开发案例之复制和多路复用

1&#xff09;案例需求 使用 Flume-1 监控文件变动&#xff0c;Flume-1 将变动内容传递给 Flume-2&#xff0c;Flume-2 负责存储 到 HDFS。同时 Flume-1 将变动内容传递给 Flume-3&#xff0c;Flume-3 负责输出到 Local FileSystem。 2&#xff09;需求分析&#xff1a; 3&…

【论文解读】基于神经辐射场NeRF的像素级交互式编辑(Seal-3D)

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/pdf/2307.15131 项目主页&#xff1a;https://windingwind.github.io/seal-3d/ 摘要&#xff1a; 随着隐式神经表征或神经辐射场&#xff08;NeRF&#xff09;的普及…

推荐几个免费的HTTP接口Mock网站和工具

在前后端分离开发架构下&#xff0c;经常遇到调用后端数据API接口进行测试、集成、联调等需求&#xff0c;比如&#xff1a; &#xff08;1&#xff09;前端开发人员很快开发完成了UI界面&#xff0c;但后端开发人员的API接口还没有完成&#xff0c;不能进行前后端数据接口对接…

嵌入式开发——电源管理单元PMU

学习目标 了解什么是电池管理单元PMU了解ARM32中的电源域了解几种省电模式学习内容 PMU PMU全称Power Management Unit,电源管理单元。 电源域 总共有三大电源域,包括VDD / VDDA域,1.2V域和备份域。 VDD/VDDA域 VDD/VDDA域如下图: 提供PMU 常规电源供应以下模块的供电…

C# 反射的乌云,MethodInfo的Json序列化参数入参问题

文章目录 前言直接运行MethodInfo运行结果 Json解决ParamterInfo实例化运行结果无法实例化问题部分参数的问题 Json反序列化 经过长达一天的研究&#xff0c;我终于完全的解决的了实战思路方法测试用例运行测试运行结果 代码总结总结 前言 我上篇文章已经基本解决了反射的基本…

【SpringCloud】之远程消费(进阶使用)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringCloud开发之远程消费》。&#x1f3af;&a…

python画图工具总结

一、python工具 python运行工具&#xff1a;Anaconda3 Anaconda3运行模式&#xff1a;jupyter notebook 操作系统&#xff1a;window11 二、折线图 from matplotlib import pyplot import matplotlib.pyplot as plt from math import sqrt import pandas as pd from matplot…

ffmpeg.c(4.3.1)源码剖析

文章目录 前言一、FFmpeg 源码结构图二、ffmpeg.h 头文件详解三、main 函数主要流程分析四、ffmpeg_parse_options1、命令行例子①、解析命令行 split_commandline()②、parse_optgroup()③、MATCH_PER_XXX_OPT() 2、vf 选项解析①、filters②、vf 术语③、avfilter_graph_pars…

【LeetCode每日一题】2807. 在链表中插入最大公约数(模拟+求最大公约数的6中写法)

2024-1-6 文章目录 [2807. 在链表中插入最大公约数](https://leetcode.cn/problems/insert-greatest-common-divisors-in-linked-list/)思路&#xff1a;模拟求最大公约数的几种方法&#xff1a; 1.暴力枚举法2.辗转相除法3.辗转相除法 ---递归调用4.辗转相除法 ---递归调用---…

微服务注册中的负载均衡

背景 随着互联网行业的发展&#xff0c;对服务的要求也越来越高&#xff0c;服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢&#xff1f; 单体架构&#xff1a;简单方便&#xff0c;高度耦合&#xff0c;扩展性差&#xff0c;适合小型项目。…

【计算机毕业设计】SSM在线化妆品网站

项目介绍 本项目为前后台项目&#xff0c;前台为普通用户登录&#xff0c;后台为管理员登录&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,分类管理,产品管理,用户管理,订单管理等功能。 用户角色包含以下功能&#xff1a; 提交订单,用户登录,用户首页,查看…

MySQL数据库期末知识点总结(复习版)

一、数据库基本知识 数据库中的数据有什么特点 1、数据是按某种结构组织的 2、数据有整体性、共享性和较高的独立性 数据管理技术经历了哪三个阶段 1、手工管理 2、文件管理 3、数据库管理 数据库管理系统的主要功能有哪些 数据库管理系统的主要功能包括数据定义、数据…

欧科云链研究院:奔赴2024,Web3与AI共振引爆数字时代潘多拉魔盒

出品&#xff5c;欧科云链研究院 2024年&#xff0c;Web3与AI两个数字科技的巅峰碰撞&#xff0c;欧科云链研究院探索AI与Web3的技术融合&#xff0c;与澎湃科技联合发布2024年展望&#xff0c;原标题为《2024年展望&#xff1a;Web3与AI共振引爆可信数字社会》&#xff0c;共…

Mybatis-Mapper代理开发

Mapper代理开发 目的使用Mapper代理方式入门1.定义与SQL映射文件同名的Mapper接口&#xff0c;并且将Mapper接口和SQL映射文件放置在同一目录下首先新建一个Mapper接口编译mybatis-demo更改sql映射文件路径 2.设置SQL映射文件的namespace属性为Mapper接口全限定名3.在Mapper 接…