ABAP DOI详解

2023-11-18

导语:DOI是SAP与Office集成的一种技术,是早期OLE的升级版本,把Excel嵌套在程序当中进行展示,需要提前上传模板,在Excel模板中,可以事先设计好公式,在SAP将数据写入Excel中之后会自动用公式进行计算,对于习惯于用Excel的用户来说,从界面上来说比较舒适,链接【ABAP DOI模板上传】

本次分享的是一个简单的DOI实现,展示销售订单的一些信息,由于本人比较懒,就不对每一个组件进行详细介绍了,直接贴代码了,代码里有详细的注释,包括定义,取数,实现过程,以及如何批量写数据给Excel,如何逐个单元格写数据给Excel,代码放到程序中,创建一个screen 100之后直接就可以使用,screen 100的参数在文章的最后。

代码如下

*&---------------------------------------------------------------------*
*& Report Z_JYH_DOI
*&---------------------------------------------------------------------*
*& 本程序是DOI的demo测试程序,用excel展示内表的数据
*&---------------------------------------------------------------------*
REPORT z_jyh_doi.

TABLES : ekko.

*-->控件及界面定义
DATA: gv_container  TYPE scrfname VALUE 'ALV_CON',  "ALV控键定义
      g_cust_con    TYPE REF TO cl_gui_custom_container,
      g_container   TYPE REF TO cl_gui_container,
      g_control     TYPE REF TO i_oi_container_control,
      g_document    TYPE REF TO i_oi_document_proxy,
      g_spreadsheet TYPE REF TO i_oi_spreadsheet.

*-->类型池定义
DATA: g_bds_documents      TYPE REF TO cl_bds_document_set,
      gv_classname         TYPE sbdst_classname,
      gv_classtype         TYPE sbdst_classtype,
      gv_objectkey         TYPE sbdst_object_key,
      gv_doc_components    TYPE sbdst_components,
      gv_doc_signature     TYPE sbdst_signature,
      gt_bds_uris          TYPE sbdst_uri,
      gs_bds_url           LIKE LINE OF gt_bds_uris,
      gv_template_url(256) TYPE c.    "模板url存储

*-->定义写入excel时需要的ranges和contents
DATA: gt_ranges   TYPE soi_range_list,
      gs_range    TYPE soi_range_item,
      gt_contents TYPE soi_generic_table,
      gs_content  TYPE soi_generic_item.


*-->内表定义
DATA : BEGIN OF gw_ekko,
         ebeln TYPE ekko-ebeln,
         bsart TYPE ekko-bsart,
         aedat TYPE ekko-aedat,
         lifnr TYPE ekko-lifnr,
       END OF gw_ekko.
DATA : gt_ekko LIKE TABLE OF gw_ekko.

*-->辅助字段定义
DATA : ok_code TYPE sy-ucomm.

*-->选择屏幕定义
SELECTION-SCREEN BEGIN OF BLOCK blc_01 WITH FRAME TITLE TEXT-001.
  SELECT-OPTIONS : s_ebeln FOR ekko-ebeln.
SELECTION-SCREEN END OF BLOCK blc_01.


INITIALIZATION.
  "为参数赋值,此处对应事务码OAOR上传的文档信息
  gv_classname = 'HRFPM_EXCEL_STANDARD'.
  gv_classtype = 'OT'.
  gv_objectkey = 'DOITEST'.

START-OF-SELECTION.

  PERFORM frm_get_data.

  PERFORM frm_deal_data.

  CALL SCREEN 100.

end-of-SELECTION.
*&---------------------------------------------------------------------*
*& Form frm_get_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_get_data .
  SELECT ebeln
         bsart
         aedat
         lifnr
    FROM ekko
    INTO TABLE gt_ekko
    WHERE ebeln IN s_ebeln.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_deal_data
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_deal_data .

ENDFORM.
*&---------------------------------------------------------------------*
*& Module STATUS_0100 OUTPUT
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  SET PF-STATUS '100'.
  SET TITLEBAR '100'.
  PERFORM frm_excel_output.
ENDMODULE.
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.

  CASE ok_code.
    WHEN '&F03' OR '&F12' OR '&F15'.
      "退出前进行对象的释放
      PERFORM release_objects.
      LEAVE TO SCREEN 0.
  ENDCASE.

ENDMODULE.
*&---------------------------------------------------------------------*
*& Form main
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM frm_excel_output .

  DATA: gv_available TYPE i.
  DATA: gv_row       TYPE i.  "计算内表有多少行
  DATA: gv_col       TYPE i.  "计算内表有多少列
  DATA: row_index    TYPE i.  "数据写入时的行

  DEFINE add_content.
    gs_content-row    = &1.
    gs_content-column = &2.
    gs_content-value  = &3.
    APPEND gs_content TO gt_contents.
    CLEAR gs_content.
  END-OF-DEFINITION.

  IF g_cust_con IS INITIAL.
    CREATE OBJECT g_cust_con
      EXPORTING
        container_name = gv_container.
  ENDIF.

*-->创建容器 create container control
  CALL METHOD c_oi_container_control_creator=>get_container_control
    IMPORTING
      control = g_control.

*-->初始化
  CALL METHOD g_control->init_control
    EXPORTING
      inplace_enabled          = 'X '
      inplace_scroll_documents = 'X'
      register_on_close_event  = 'X'
      register_on_custom_event = 'X'
      r3_application_name      = 'JYH test doi'
      parent                   = g_cust_con.

*-->url获取
  CREATE OBJECT g_bds_documents.
  CALL METHOD cl_bds_document_set=>get_info
    EXPORTING
      classname  = gv_classname  "initialization位置下定义
      classtype  = gv_classtype  "initialization位置下定义
      object_key = gv_objectkey  "initialization位置下定义
    CHANGING
      components = gv_doc_components
      signature  = gv_doc_signature.

  CALL METHOD cl_bds_document_set=>get_with_url
    EXPORTING
      classname  = gv_classname
      classtype  = gv_classtype
      object_key = gv_objectkey
    CHANGING
      uris       = gt_bds_uris
      signature  = gv_doc_signature.

  FREE g_bds_documents.

  "读取
  READ TABLE gt_bds_uris INTO gs_bds_url INDEX 1.
  gv_template_url = gs_bds_url-uri.


*-->打开上传的excel文档
  "
  CALL METHOD g_control->get_document_proxy
    EXPORTING
      document_type      = 'Excel.Sheet'
      no_flush           = 'X'
      register_container = 'X'
    IMPORTING
      document_proxy     = g_document.

  CALL METHOD g_document->open_document
    EXPORTING
      open_inplace = 'X'
      document_url = gv_template_url.

  CALL METHOD g_document->has_spreadsheet_interface
    EXPORTING
      no_flush     = 'X'
    IMPORTING
      is_available = gv_available.

  CALL METHOD g_document->get_spreadsheet_interface
    EXPORTING
      no_flush        = 'X'
    IMPORTING
      sheet_interface = g_spreadsheet.

  "选择展示的sheet页
  CALL METHOD g_spreadsheet->select_sheet
    EXPORTING
      name     = 'Sheet1'
      no_flush = 'X'.

*-->往excel中写入数据
  "检查内表是否有数据
  CHECK gt_ekko IS NOT INITIAL.

  "获取内表的行数和列数
  PERFORM frm_get_line_col USING gv_row gv_col.

  CALL METHOD g_spreadsheet->insert_range_dim
    EXPORTING
      name     = 'cell'
      no_flush = 'X'
      top      = 3        "从第几行开始
      left     = 1        "从第几列考试
      rows     = gv_row   "写几行
      columns  = gv_col.  "写几列

  "根据行列填充ranges
  CLEAR :gs_range,gt_ranges.
  gs_range-name = 'cell'.
  gs_range-rows = gv_row.
  gs_range-columns = gv_col.
  gs_range-code = 4.
  APPEND gs_range TO gt_ranges.

  "批量的把数据写入
  CLEAR row_index .
  row_index = '1'.

  "把值精确到每一行每一列的单元格
  LOOP AT gt_ekko INTO gw_ekko.
    CLEAR gs_content.
    add_content row_index 1 gw_ekko-ebeln.
    add_content row_index 2 gw_ekko-bsart.
    add_content row_index 3 gw_ekko-aedat.
    add_content row_index 4 gw_ekko-lifnr.
    row_index = row_index + 1.
  ENDLOOP.

  CALL METHOD g_spreadsheet->set_ranges_data
    EXPORTING
      ranges   = gt_ranges
      contents = gt_contents
      no_flush = 'X'.

  "把数据精确写入到某一行某一列

  PERFORM frm_write_single USING '1' '7' sy-uname.
  PERFORM frm_write_single USING '2' '7' sy-datum.

ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_get_line_col
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> P_
*&      --> GV_LINE
*&      --> GV_COL
*&---------------------------------------------------------------------*
FORM frm_get_line_col  USING p_row p_col.
  CLEAR : p_row,p_col.
  FIELD-SYMBOLS <fs>.
  "获取行数
  p_row = lines( gt_ekko ).
  "获取列数
  DO.
    ASSIGN COMPONENT sy-index OF STRUCTURE gw_ekko TO <fs>.
    IF sy-subrc IS INITIAL.
      p_col = p_col + 1.
    ELSE.
      EXIT.
    ENDIF.
  ENDDO.
ENDFORM.
*&---------------------------------------------------------------------*
*& Form release_objects
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM release_objects .

  IF NOT g_document IS INITIAL.
    CALL METHOD g_document->close_document.
    FREE g_document.
  ENDIF.

  IF NOT g_control IS INITIAL.
    CALL METHOD g_control->destroy_control.
    FREE g_control.
  ENDIF.

  IF g_container IS NOT INITIAL.
    CALL METHOD g_container->free.
  ENDIF.


ENDFORM.
*&---------------------------------------------------------------------*
*& Form frm_write_single
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*&      --> P_
*&      --> P_
*&      --> SY_UNAME
*&---------------------------------------------------------------------*
FORM frm_write_single  USING  p_row p_col p_value.
  DATA : lt_ranges   TYPE soi_range_list,
         ls_ranges   TYPE soi_range_item,
         lt_contents TYPE soi_generic_table,
         ls_contents TYPE soi_generic_item.

  CLEAR :lt_ranges,ls_ranges,lt_contents,ls_contents.
  "ranges中只存储一行一列
  ls_ranges-name = 'cell' .
  ls_ranges-columns = 1.
  ls_ranges-rows = 1.
  ls_ranges-code = 4.
  APPEND ls_ranges TO lt_ranges.
  "写入数据也只存一个值
  ls_contents-column = 1.
  ls_contents-row = 1.
  ls_contents-value = p_value.
  APPEND ls_contents TO lt_contents.

  "每次只写一行一列
  CALL METHOD g_spreadsheet->insert_range_dim
    EXPORTING
      name     = 'cell'
      no_flush = 'X'
      top      = p_row
      left     = p_col
      rows     = 1
      columns  = 1.

  CALL METHOD g_spreadsheet->set_ranges_data
    EXPORTING
      ranges   = lt_ranges
      contents = lt_contents
      no_flush = 'X'.
ENDFORM.

效果展示
在这里插入图片描述
SCREEN 100 参数
在这里插入图片描述
在这里插入图片描述
作者:小飞猪猪猪猪猪猪猪–CSDN

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ABAP DOI详解 的相关文章

  • ChatGPT懂SAP吗?跟ChatGPT聊完后,我暂时还不担心会被它取代岗位

    我弄了个ChatGPT账号 随便问了一下他SAP的问题 它的回答还是比较有意思的 贴出来跟大家分享一下 问题1 我是 SAP 开发工程师 你有什么可以帮到我 作为一个语言模型 我可以为您提供关于SAP开发的一般性建议 以及关于如何使用SAP
  • SAP FICO 会计凭证打印开发说明书(包括测试样例、程序代码仅作参考,不保证一定可以运行)

    开发说明书 输入屏幕 输出布局及样式 程序逻辑 输入表屏幕逻辑 查询表BKPF 根据条件 BKPF BUKRS 输入条件的公司代码 BKPF BUDAT 输入的过账日期 取值 SAP会计凭证号码 BKPF BELNR 公司代码 BKPF B
  • SAP 在制品明细

    Report ZCO019 REPORT zco019 TABLES matdoc SELECT OPTIONS s bukrs FOR matdoc bukrs OBLIGATORY s bu
  • 三步搞定ABAP DOI操作EXCEL

    ABAP可以使用OLE与DOI两种方式实现操作EXCEL 使用OLE时 每个单元格的值和样式都需要写代码实现 特别是对于不规则的格式 代码量巨大 而DOI是从服务器已经上传的EXCEL模板中下载模板然后打开修改实现数据保存 当然 也可以直接
  • 如何让程序在单击按钮时返回表中的多个表字段?

    我正在尝试创建一个程序 允许用户输入foodCode为了收到Item and Description按下按钮后 有没有办法可以将结果放在同一屏幕上的表格中 如何 report demo tables food SELECTION SCREE
  • 不使用TMS将TR文件推送到SAP ERP系统

    我是 salesforce com 开发人员 我需要构建一个简单的 SFDC SAP 集成场景以用于演示目的 我对 SAP 完全没有经验 但我们至少有一个 SAP 演示系统 我目前只能通过 SAP GUI 访问 现在 第三方集成解决方案提供
  • ABAP中WITH HEADER LINE的作用是什么?

    我一直在研究这个book并引用其中 DATA BEGIN OF CUSTOMER TAB OCCURS 5 KUNNR TYPE KNA1 KUNNR NAME1 TYPE KNA1 NAME1 END OF CUSTOMER TAB Th
  • HTTPS 通信失败 ABAP

    我正在开发一个应连接到两个 Web 应用程序的应用程序 第一个 Web 应用程序已完成 http example com 不幸的是 第二个 Web 应用程序使用 HTTPS https example com 抛出这个错误 Http Com
  • 如何从 SAP ABAP 系统中提取数据?

    我需要以某种格式从 SAP ABAP 系统中提取数据 然后将其加载到 Oracle 数据库中 xlsx csv dmp 等 提取数据后 我将使用 Pentaho 将其上传到 Oracle 数据库中 有没有办法从SAP中提取数据 我还需要自动
  • 除了锁定的对象之外,我还可以将对象更改保存到另一个 TR 中吗?

    当我尝试切换到报告源的编辑模式时 会出现一个弹出窗口告诉我 将为用户XXX的以下请求创建一个新任务 还提出了运输请求 但是 我不想在此请求中保存我的更改 而是在另一个现有请求中保存更改 我不知道我的系统中正在实施任何版本控制系统 也不知道如
  • sap abap 中系统忽略条件的循环

    我尝试应用带有条件的循环来总结相应的行 字段 其中条件应该是正确的 但在系统运行期间 程序忽略了条件并总结了所有行 有什么建议来解决这个问题吗 SELECT FROM LIPS INTO CORRESPONDING FIELDS OF TA
  • ABAP ADT 先决条件?

    在 Eclipse 中建立与本地数据库的连接以开始在 ABAP 中进行开发需要什么 我已经安装了 ABAP 插件 但无法连接到数据库 有什么建议么 ABAP 开发工具 ADT https tools hana ondemand com ab
  • 更新标准表中的字段 LIPS-LFIMG 时出现问题

    所有的流程看起来都不错 但是当通过调用函数时 更新也失败 需要更新的字段没有更新 不知道问题出在哪里 有人可以帮我解决这个问题吗 我错过了什么步骤吗 错误消息登录 LT PROT DATA LT PROT LIKE PROTT OCCURS
  • 从 Fiori 列表报告导航到标准应用程序(例如热点)?

    我已经根据之前创建的 CDS 视图创建了列表报告 Fiori 应用程序 是否有可能在现有和 或附加 CDS 视图中使用一些注释来创建供应商编号上的热点智能字段 IE 当我点击它时 它会将我导航到该供应商的标准 业务合作伙伴 应用程序 如果这
  • 我可以使用 line_exists 检查初始值或不相等的值吗?

    ABAP 7 40 添加了line exists 谓词函数来分析内表 但我有什么办法可以检查是否存在特定列为初始值或与目标值不同的行 例如 如何检查具有初始材料列的行 例如此表中的第三行 Document Country Material
  • 调用 HTTP_POST 时出现 Bad Request 错误?

    我有一个关于 SAP 功能模块 http post 的问题 我只想将 SAP 中的一条短消息 msg 发布到我之前安装的推送通知服务器 pushd Github Projekt 现在我不知道如何传递消息 我用测试符号测试了 FM CALL
  • 在包内的所有程序中搜索 MODIFY 语句

    我想搜索包内所有使用以下语句的程序 从 wa itab xyz 修改 itab xyz 最好使用通配符 如 itab 搜索字符串 对于一系列 itab values 如 itab abc itab def itab ghi ETC 我如何在
  • 将 JSON 反序列化为表

    我需要根据通过 API 接收的数据填充 ABAP 中的表 我正在使用以下 ABAP 函数从 json 填充现有的 ABAP 表 JSON 是正确的 表中包含相应的表 ui2 cl json gt deserialize EXPORTING
  • 找出所有程序 dynpro 屏幕?

    我是ABAP新手 我想制作一个具有多个屏幕和一个初始主屏幕的程序 可以在其中看到所有程序屏幕的列表 我知道我可以对它们进行硬编码 但应该有更好的方法 如果有任何类型的字段 区域 我需要使该列表可点击 以转到屏幕 到目前为止 我已经制作了一个
  • 在ABAP中显示消息语句内的变量

    如何在不使用消息类的情况下显示消息语句中的变量 IF acct bal lt min bal MESSAGE customer balance less than minimum Balance gt acct bal TYPE E END

随机推荐

  • 解决前端websocket数据帧接收数据大小限制(数据分帧)问题

    websocket前后台出现问题解决方法 一开始通过限制后台返回数据帧以125字节分隔分段数据返回给前台 但调试时发现只要加上其他的一些信息返回json string很容易就会超过了125字节 于是在后台修改了这个限制大小为2048 但是这
  • react的条件渲染(或者组件渲染)五种方式 --开发基础总结

    1 使用if的方式判断是否渲染某个组件 function UserGreeting props return h1 Welcome back h1 function GuestGreeting props return h1 Please
  • [转]JDBC中日期时间的处理技巧

    Java中用类java util Date对日期 时间做了封装 此类提供了对年 月 日 时 分 秒 毫秒以及时区的控制方法 同时也提供一些工具方法 比如日期 时间的比较 前后判断等 java util Date中采用一个long型的数来保存
  • 关于Android Studio使用intent跳转到新的Activity出现not an enclosing class报错的解决办法

    目前遇到not an enclosing class这个问题两次 分别是犯了不同的错误 1 第一个参数输入错误 第一个参数应该是当前活动的上下文 也就是当前Activity的参数 例如我的当前Activity是MainActivity 要跳
  • LeetCode:283(Python)—— 移动零(简单)

    移动零 概述 给定一个数组 nums 编写一个函数将所有 0 移动到数组的末尾 同时保持非零元素的相对顺序 请注意 必须在不复制数组的情况下原地对数组进行操作 输入 nums 0 1 0 3 12 输出 1 3 12 0 0 输入 nums
  • 同样将AI装进“办公全家桶”,Microsoft 与 Google有何不同?

    继GPT 4发布之后 北美时间3月16日 微软在 The Future of Work With AI 大会上发布了Microsoft 365 Copilot 再次掀起一股科技圈浪潮 据介绍 Microsoft 365 Copilot是一种
  • C和C++结构体的区别

    C语言中的结构体只涉及到数据结构 而不涉及到算法 也就是说在C中数据结构和算法是分离的 换句话说就是C语言中的结构体只能定义成员变量 但是不能定义成员函数 然而在C 中既可以定义成员变量又可以定义成员函数 C 中的结构体和类体现了数据结构和
  • Linux系统shell脚本之检测两台服务器指定目录下的文件一致性

    Linux系统shell脚本之检测两台服务器指定目录下的文件一致性 一 脚本要求 二 脚本内容 三 测试设置 1 server1创建文件 2 server2创建文件 3 配置ssh免密 四 执行脚本 一 脚本要求 检测两台服务器指定目录下的
  • 安装 Debian10 提示缺少 bnx2/bnx2-mips-06-6.2.3.fw

    安装过程中报错 提示缺少文件 如果跳过 配置网络报错 安装好后网络是配置好的 但是插上网线状态一直是down 处理过程 下载firmware bnx2 20161130 5 deb8u1 all deb u盘拷贝到debian dpkg i
  • 【基础算法】简单了解一下常见的几种散列算法?

    简单了解一下常见的几种散列算法 如果觉得对你有帮助 能否点个赞或关个注 以示鼓励笔者呢 博客目录 先点这里 前提概念 好的哈希函数 MD5 与 SHA MD5 SHA 家族 CRC MurmurHash times31 33 times33
  • QML的基本使用:建立一个简单得窗口以及一些属性的基本使用

    QML得基本使用 建立一个简单得窗口弹出式对话框 QML的基本使用之有标题栏和无标题栏的区别 首先本人使用的Qt版本是6 3 2因为公司做项目就是用的这个版本所以如果你使用的版本不一样 请自行对代码进行转换 本人建议如果版本不一样 可以通过
  • HarmonyOS应用开发者高级认证练习题

    系列文章目录 HarmonyOS应用开发者基础认证练习题 HarmonyOS应用开发者高级认证练习题 文章目录 系列文章目录 前言 一 判断 二 单选 三 多选 前言 本文所有内容来源于个人进行HarmonyOS应用开发者系列认证的学习过程
  • 3、设置IP地址:节点名

    1 vi空格 etc hosts 点击回车 2 删除当前页面内容后编辑 192 168 空格hadoop1 192 168 空格hadoop2 192 168 空格hadoop3 3 Esc wq 保存退出 是强制退出
  • 无线组网168元的4G路由器真实价值多少?蒲公英4G路由器X4C测评

    4G路由器 看不上 觉得有网线为什么还要4G 就好比无线鼠标和有线鼠标 我肯定选有线鼠标 低延迟先不说 还不需要充电 一样的道理4G有宽带稳定 速度快吗 但是回家过了趟年就有了改观 关在家里两个月 还没有网 只能靠手机打发时间 难受香菇 还
  • serverTimezone

    今天第一次写springboot的时候遇到了这个问题 页面一直刷新不出来 显示url有问题 后来发现在url后面加上 serverTimezone GMT即可 spring datasource url jdbc mysql 127 0 0
  • pandas基本操作3

    字典转DataFrame出错 ValueError If using all scalar values you must pass an index 使用DataFrame columns 初始化并结合使用df append 字典 增加行
  • hadoop集群出现两个datanode节点互相排斥的情况解决

    我明明配置了3个节点的datanode 但是在 http mini2 50070 dfshealth html tab overview 的管理界面了只看到两天存活 Live Nodes 为 2 Dead Nodes 为 0 我想就算有一台
  • Montreal Forced Aligner (MFA)安装教程&失败原因集合

    写在前面 本文章只考虑2 x版本以后的安装时遇到的问题 推荐大家看官方的安装教程 里面设计不同系统 不同场景的安装方式 官网安装教程地址 https montreal forced aligner readthedocs io en lat
  • 出现( linker command failed with exit code 1)错误总结

    这种问题 通常出现在添加第三方库文件或者多人开发时 这种问题一般是找不到文件而导致的链接错误 我们可以从如下几个方面着手排查 1 以如下错误为例 如果是多人开发 你同步完成后发现出现如下的错误 Undefined symbols for a
  • ABAP DOI详解

    导语 DOI是SAP与Office集成的一种技术 是早期OLE的升级版本 把Excel嵌套在程序当中进行展示 需要提前上传模板 在Excel模板中 可以事先设计好公式 在SAP将数据写入Excel中之后会自动用公式进行计算 对于习惯于用Ex