在SAP C4C里使用Restful服务消费SAP S/4HANA的标准功能
I have a requirement recently to trigger the creation of the corresponding S/4HANA outbound delivery document in SAP Cloud for Customer.
The basic idea is to replicate Sales order created in SAP C4C into S/4HANA, trigger the production and delivery process. Once the production is finished in S/4HANA, it is required to trigger the outbound delivery creation in C4C Sales Order UI.
(1) The easiest part is to implement the outbound delivery creation in S/4HANA using function module BAPI_OUTB_DELIVERY_CREATE_SLS.
REPORT zcreate_dn.
DATA:lv_ship_point TYPE bapidlvcreateheader-ship_point VALUE '0001',
lv_due_date TYPE datum VALUE '20181205',
lv_delivery TYPE bapishpdelivnumb-deliv_numb,
lt_so_items LIKE TABLE OF bapidlvreftosalesorder,
ls_so_items LIKE LINE OF lt_so_items,
lt_return TYPE TABLE OF bapiret2,
ls_read TYPE order_view,
lt_item TYPE TABLE OF bapisdit,
lt_order_headers_out TYPE TABLE OF bapisdhd,
lt_header TYPE TABLE OF sales_key,
lt_bapisdtehd TYPE TABLE OF bapisdtehd,
lt_bapitextli TYPE TABLE OF bapitextli,
lt_bapiret2 LIKE bapiret2 OCCURS 0 WITH HEADER LINE.
APPEND INITIAL LINE TO lt_header ASSIGNING FIELD-SYMBOL(<header>).
ls_read-item = 'X'.
<header>-vbeln = '0000000376'.
CALL FUNCTION 'BAPISDORDER_GETDETAILEDLIST'
EXPORTING
i_bapi_view = ls_read
TABLES
sales_documents = lt_header
order_items_out = lt_item.
LOOP AT lt_item ASSIGNING FIELD-SYMBOL(<item>).
APPEND INITIAL LINE TO lt_so_items ASSIGNING FIELD-SYMBOL(<fill>).
<fill>-ref_doc = <item>-doc_number.
<fill>-ref_item = <item>-itm_number.
<fill>-dlv_qty = <item>-req_qty.
<fill>-sales_unit = 'EA'.
ENDLOOP.
CALL FUNCTION 'BAPI_OUTB_DELIVERY_CREATE_SLS'
EXPORTING
ship_point = lv_ship_point
due_date = lv_due_date
IMPORTING
delivery = lv_delivery
TABLES
sales_order_items = lt_so_items
return = lt_return.
LOOP AT lt_return ASSIGNING FIELD-SYMBOL(<return>).
WRITE:/ | Type: { <return>-type }: { <return>-message } | COLOR COL_NEGATIVE.
ENDLOOP.
CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
EXPORTING
wait = 'X'
IMPORTING
return = lt_bapiret2.
LOOP AT lt_bapiret2 ASSIGNING <return>.
WRITE:/ 'Message:', <return>-message COLOR COL_POSITIVE.
ENDLOOP.
The idea is first to read Sales Order line item detail via function module BAPISDORDER_GETDETAILEDLIST, then BAPI_OUTB_DELIVERY_CREATE_SLS did the job.
Replace your actual Sales Order ID with the hard coded value in line 21.
Create a new SICF service node and wrap the above ABAP code into the method HANDLE_REQUEST of the service node’s handler class.
For more detail about ABAP SICF handler class, please refer to my blogs:
ABAP ICF handler and Java Servlet Export WebClient UI table to PDF
(2) Create a new action triggerOutboundDelivery in Business Object CustomerQuote which is the data model of Sales Order TI page in C4C.
It’s time now to consume the S/4HANA SICF service created in previous step as a restful service in this custom BO action implementation.
Some necessary model must be created as prerequisite before we start to implement service consumption in ABSL code. Create a new External Web Service Integration named “JerryExternal”:
Paste the service url created in previous step into service maintenance window here and choose “REST” as web service type:
A new communication scenario is also generated meanwhile:
Right click Communication Scenario and choose “Manage Communication Arrangement” to finish the left Communication Arrangement maintenance task.
The configuration UI will be launched by a new browser window.
Select the Communication Scenario created in SAP Cloud application studio and create a new Communication arrangement based on it:
Maintain the credentials of communication user and activate this arrangement.
Now we can start to program in Sales order’s action triggerOutboundDelivery using ABSL. The restful service consumption is fired by ABSL utility method WebServiceUtilities.ExecuteRESTService. We can figure out its signature via code auto completion:
Here below is my complete implementation for BO action:
import ABSL;
var HttpMethod = "GET";
var HttpResource = ""; // not required
var ContentType = ""; // not required
var Body = ""; // not required
var HeaderParameter : collectionof NameAndValue; // not required
var URLParameter : collectionof NameAndValue;
var URLParameterEntry : NameAndValue;
URLParameterEntry.Name = "SoID";
URLParameterEntry.Value = this.ID.content;
URLParameter.Add(URLParameterEntry);
WebServiceUtilities.ExecuteRESTService("JerryExternalService", "JerryExternal", HttpMethod, HttpResource,
URLParameter, HeaderParameter,ContentType, Body);
Activate the method implementation and now we can test: Choose Sales Order 9000000325 and press “Trigger Delivery” button,
the S/4HANA SICF service implementation is called as expected, with Sales Order ID from C4C successfully passed.
- 基于FPGA的均值滤波(二)
- 【实现】表单控件里的子控件的变化。
- 【实现】表单控件的UI布局,实现方式
- 监控利器之nagios原理详解
- 用户首次付费分析
- 【陆勤创业】德鲁克:如何管理自己?
- 基于FPGA的非线性滤波器(三)
- Mesos+Marathon+Docker构建docker集群化管理
- 【测试】两种数据库,四种分页算法的效率比较
- 【开源】QuickPager 分页控件的内部结构,和OO原则与设计模式
- 【实体类变形】—— 元数据(另类ORM) 描述字段的数据
- 【陆勤践行】奇异值分解 - 最清晰易懂的svd 科普
- 快速自检电脑是否被黑客入侵过(Linux版)
- 【陆勤践行】机器学习中距离和相似性度量方法
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Ubuntu 16.04 LTS系统里中文txt文件打开的问题解决
- linux nand flash驱动编写
- 在Linux中使用Vundle管理Vim插件的方法
- 详解linux添加硬盘分区挂载教程
- CentoS6.5环境下redis4.0.1(stable)安装和主从复制配置方法
- 详解linux dma驱动编写
- CentOS6.5环境安装nginx服务器及负载均衡配置操作详解
- 详解linux 驱动编写(sd卡驱动)
- Centos 6.9环境下创建用户及删除用户的方法
- 详解linux驱动编写(入门)
- Ubuntu使用国内源出现Hash Sum mismatch错误的解决
- CentOS基于nginx反向代理实现负载均衡的方法
- CentOS7服务器环境下vsftpd安装及配置方法
- Linux date 时间设置同步命令分享
- Gerrit设置开机启动方法