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

2024-01-05 10:12
文章标签 交互 端的 ui5

本文主要是介绍UI5与后端的文件交互(四),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、后端开发
    • 1. 新建管理模板表格
    • 2. 新建Function,动态创建文档
  • 二、修改UI5项目
    • 1.Table里添加下载证明列
    • 2. 实现onClickDown事件
  • 三、测试
  • 四、附


前言

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

  1. 后端RAP的开发(S4HANA On-Premise)
    • 新建表格及CDS,管理模板文件
    • 新建Function(动态创建Excel文档并返回文件流)
  2. 前端(UI5)
    • 提交请求并下载文档(例:在职证明)

一、后端开发

1. 新建管理模板表格

@EndUserText.label : 'Form Template Table'
@AbapCatalog.enhancement.category : #NOT_EXTENSIBLE
@AbapCatalog.tableCategory : #TRANSPARENT
@AbapCatalog.deliveryClass : #A
@AbapCatalog.dataMaintenance : #ALLOWED
define table ymoon_t000 {key client   : abap.clnt not null;key uuid     : sysuuid_x16 not null;attachment   : abap.string(0);attachment_x : abap.rawstring(0);filename     : abap.char(200);erdat        : erdat;erzet        : erzet;}
  • 附上数据
    在这里插入图片描述

工作模式和之前里的内容是一样的。就是把文件流保存到表格里。 额外一点就是把XString类型的数据也一并保存。这里不再熬述

  • Method实现
  method upload_template."获取UI5传送的parameterdata(attachment) = keys[ 1 ]-%param-attachment.data(filename_full) = keys[ 1 ]-%param-filename."split filename_full at `.` into data(lv_filename) data(lv_filetype)."拆分数据,只保留excel内容 - lv_datasplit attachment 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转换为xstringcall function 'SCMS_BASE64_DECODE_STR'exportinginput  = lv_dataimportingoutput = lv_excel_dataexceptionsfailed = 1others = 2."更新模板文件data:ls_t000 type ymoon_t000.select single uuid from ymoon_t000 into @data(uuid_00) where filename = @filename_full.if uuid_00 is not initial.ls_t000-uuid = uuid_00.else.ls_t000-uuid = cl_system_uuid=>create_uuid_x16_static( ).endif.ls_t000-attachment = attachment.ls_t000-attachment_x = lv_excel_data.ls_t000-filename = filename_full.ls_t000-erdat = sy-datum.ls_t000-erzet = sy-uzeit.modify ymoon_t000 from ls_t000.endmethod.

2. 新建Function,动态创建文档

  • BEDF 添加Function
static function download_form parameter ymoon_s012 result [1] ymoon_s013;
  • Method实现(使用abap2xlsx插入数据并返回base64值)
  method download_form.types: begin of t_sheet1,name          type c length 60,bdate(200),id(20),sdate(200),position(100),salary(20),nyear(4),nmonth(2),nday(2),end of t_sheet1.data: gs_sheet1 type t_sheet1.data: ls_ymoon_s013 type ymoon_s013,ls_t000       type ymoon_t000.data: lo_excel  type ref to zcl_excel, "엑셀lo_reader type ref to zif_excel_reader,lo_root   type ref to cx_root. "异常类"excel worksheet类对象data:lo_worksheet type ref to zcl_excel_worksheet."excel超链接data:lo_hyperlink type ref to zcl_excel_hyperlink."style类data:lo_style type ref to zcl_excel_style."style的guiddata:lv_style_guid type zexcel_cell_style.data:lo_column    type ref to zcl_excel_column.data: lo_data type ref to zcl_excel_template_data.data:lv_line  type sy-tabix,lv_line2 type sy-tabix,lv_line3 type sy-tabix.data(uuid) = keys[ 1 ]-%param-uuid."动态获取内容select single name from ymoon_t010 into @data(lv_uname) where uuid = @uuid."测试数据gs_sheet1-name     = lv_uname.gs_sheet1-bdate    = '1990年1月1日'.gs_sheet1-id       = '11101019900101XXXX'.gs_sheet1-sdate    = '2020年10月20日'.gs_sheet1-position = '技术总监'.gs_sheet1-salary   = '20,000'.gs_sheet1-nyear    = sy-datum+0(4).gs_sheet1-nmonth   = sy-datum+4(2).gs_sheet1-nday     = sy-datum+6(2).select single attachment_x from ymoon_t000 into @data(lv_attachment_x).try.
* prepare datacreate object lo_data.lo_data->add( iv_sheet = 'Sheet1' iv_data = gs_sheet1 ).* create readercreate object lo_reader type zcl_excel_reader_2007.* load templatelo_excel = lo_reader->load( i_excel2007 = lv_attachment_x ).* merge data with templatelo_excel->fill_template( lo_data ).lo_worksheet = lo_excel->get_active_worksheet( ).*      lo_worksheet->set_cell( ip_column = 'C' ip_row = 4 ip_value = '테스트' ).
*lo_worksheet->calculate_column_widths( ).*** Create outputdata cl_writer type ref to zif_excel_writer.create object cl_writer type zcl_excel_writer_2007.data: xdata     type xstring,             " Will be used for sending as emailt_rawdata type solix_tab,           " Will be used for downloading or open directlybytecount type i.                   " Will be used for downloading or open directlyxdata = cl_writer->write_file( lo_excel ).data:lv_base64  type string.call function 'SCMS_BASE64_ENCODE_STR'exportinginput  = xdataimportingoutput = lv_base64.ls_ymoon_s013-attachment = lv_base64.ls_ymoon_s013-filename = '在职证明-' && lv_uname && '.xlsx'."返回base64append value #( %param = ls_ymoon_s013 ) to result .catch cx_root into lo_root.endtry.endmethod.

二、修改UI5项目

1.Table里添加下载证明列

<Button text="下载证明" press="onClickDown" type="Neutral"></Button>

2. 实现onClickDown事件

这里需要注意的是BDEF里定义的function是GET方法

onClickDown: function (e) {var that = thisvar oModel = this.getView().getModel();var uuid = e.getSource().getBindingContext().getProperty("Uuid");oModel.callFunction("/download_form",{method: "GET",urlParameters: {   //参数,首字母大写 "Uuid": uuid},success: function (odata, response) {//Model Refresh// debuggervar vContent = response.data.download_form;var file = vContent.Filename.split(".")var blob = that.base64toBlob(vContent.Attachment, 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');File.save(blob, file[0], file[1], 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');},error: function (res) {console.log(res)}})},

三、测试

在这里插入图片描述

四、附

  • 此外,如果是OP的话,可以使用smw0管理模板文件。具体load方法可以参考如下代码。
//io_reader  type ref to zif_excel_reader
//ro_excel   type ref to zcl_excells_key-relid = 'MI'.ls_key-objid = iv_w3objid .  //对象名称" 读取SMW0文件call function 'WWWDATA_IMPORT'exportingkey    = ls_keytablesmime   = lt_mimeexceptionsothers = 1.if sy-subrc <> 0.lv_errormessage = 'A problem occured when reading the MIME object'(004).zcx_excel=>raise_text( lv_errormessage ).endif." 读取 filesize call function 'WWWPARAMS_READ'exportingrelid = ls_key-relidobjid = ls_key-objidname  = 'filesize'importingvalue = lv_filesizec.* XSTRING转换lv_filesize = lv_filesizec.call function 'SCMS_BINARY_TO_XSTRING'exportinginput_length = lv_filesizeimportingbuffer       = lv_excel_datatablesbinary_tab   = lt_mimeexceptionsfailed       = 1others       = 2.*--------------------------------------------------------------------*
* Parse Excel data into ZCL_EXCEL object from binary string
*--------------------------------------------------------------------*ro_excel = io_reader->load( i_excel2007 = lv_excel_data ).

这篇关于UI5与后端的文件交互(四)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/572519

相关文章

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将

uniapp设置微信小程序的交互反馈

链接:uni.showToast(OBJECT) | uni-app官网 (dcloud.net.cn) 设置操作成功的弹窗: title是我们弹窗提示的文字 showToast是我们在加载的时候进入就会弹出的提示。 2.设置失败的提示窗口和标签 icon:'error'是设置我们失败的logo 设置的文字上限是7个文字,如果需要设置的提示文字过长就需要设置icon并给

Kubernetes 之 kubelet 与 CRI、CNI 的交互过程

序言 当一个新的 Pod 被提交创建之后,Kubelet、CRI、CNI 这三个组件之间进行了哪些交互? Kubelet -> CRI -> CNI 如上图所示: Kubelet 从 kube-api-server 处监听到有新的 pod 被调度到了自己的节点且需要创建。Kubelet 创建 sandbox 并配置好 Pod 的环境,其中包括: Kubelet 通过 gRPC 调用 C

【SpringMVC学习07】SpringMVC与前台的json数据交互

json数据格式在接口调用中、html页面中比较常用,json格式比较简单,解析也比较方便,所以使用很普遍。在springmvc中,也支持对json数据的解析和转换,这篇文章主要总结一下springmvc中如何和前台交互json数据。 1. 两种交互形式  springmvc和前台交互主要有两种形式,如下图所示: 可以看出,前台传过来的方式有两种,一种是传json格式的数据过来,另一种

【Qt】Qt与Html网页进行数据交互

前言:此项目使用达梦数据库,以Qt制作服务器,Html制作网页客户端界面,可以通过任意浏览器访问。 1、Qt与网页进行数据交互 1.1、第一步:准备qwebchannel.js文件 直接在qt的安装路径里复制即可 1.2、第二步:在Qt的.pro文件加载webchannel组件 在.pro文件添加如下组件: QT += core gui sql webchannel wi

android 的webView加载h5,和h5的交互(java和JavaScript的交互)

Android提供了一个很强大的WebView控件用来处理Web网页,而在网页中,JavaScript又是一个很举足轻重的脚本。本文将介绍如何实现Java代码和Javascript代码的相互调用。(通俗点说就是,点击那个Web页面的按钮啥的,可以传到原生app;或者原生app调用Web页面的js方法) 如何实现 实现Java和js交互十分便捷。通常只需要以下几步。 WebView

Java-IDEA模拟一个Redis服务器,与Redis客户端进行一次简单的交互。默认端口号:6379

首先要了解Redis的交互协议。 摘抄: 简单字符串(Simple Strings): 以 “+” 开头,例如 “+OK\r\n” 表示一个成功的响应。错误(Errors): 以 “-” 开头,例如 “-ERR unknown command\r\n” 表示一个错误响应。整数(Integers): 以 “:” 开头,例如 “:1000\r\n” 表示整数1000。批量字符串(Bulk St

Result 和 自定义异常 在前后端交互中的作用

Result 和自定义异常在前后端交互中扮演着重要的角色。它们可以帮助我们规范化接口返回值,提高错误处理的可读性和可维护性。 Result的作用 Result通常是一个封装了请求结果的类,它包含了请求的状态码、消息和数据。在前端和后端的交互中,Result的作用主要体现在以下几个方面: 统一返回格式:通过Result类,后端可以将请求的结果统一封装成一个固定的格式返回给前端,这样前端可以更

使用Node-API实现跨语言交互开发流程

一、前言         使用Node-API实现跨语言交互,首先需要按照Node-API的机制实现模块的注册和加载等相关动作。 ArkTS/JS侧:实现C++方法的调用。代码比较简单,import一个对应的so库后,即可调用C++方法。 Native侧:.cpp文件,实现模块的注册。需要提供注册lib库的名称,并在注册回调方法中定义接口的映射关系,即Native方法及对应的JS/ArkT

flutter的入口和原生交互

从今天起,笔者要开始从flutter列表页面向原生页面跳转了 首先遇到了N个No such module "Flutter" 因为笔者的公司其实是从前往后改造Flutter的,所以也不需要引擎组,但是笔者搞不懂,只能照着葫芦画瓢,以后等笔者Flutter技术日渐精进,一定回过来更新怎么单个页面嵌入flutter。 在Appdelegate里还有很多_lifeCycleDelega