关于saprfc:如何在-SAP-Fiori-Elements-框架里通过注解定义一个表格行项目的列

有一段 xml 代码: <Annotation Term="UI.LineItem"> <Collection> <Record Type="UI.DataField"> <PropertyValue Property="Value" Path="ProductPictureURL"/> <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/> </Record>在解析这段 SAP Fiori Elements 的 Annotations 定义之前,咱们须要理解 SAP Fiori Elements 是一套容许开发者通过配置而非编码来创立标准化应用程序的框架。Annotations(注解)在这个过程中扮演着要害角色,它们提供了一种申明式的办法来定义 UI 行为和显示逻辑,而不是通过传统的编程。这种办法大大简化了开发过程,同时确保了利用的一致性和高质量。 接下来,咱们将逐行解析提供的 Annotations 代码,这段代码定义了一个名为 UI.LineItem 的注解,其目标是配置 Fiori 利用中的一个列表项的显示。 <Annotation Term="UI.LineItem">这行代码定义了一个 Annotation,它应用了 Term="UI.LineItem"。在 SAP Fiori Elements 中,UI.LineItem 用于形容列表报告或表格中的每一行应该如何展现。它是 Fiori 利用中数据展现的一个要害组成部分,使得开发者可能准确控制数据的展示形式。 <Collection><Collection> 标签示意这个 UI.LineItem 注解将蕴含一系列的记录(Record)。在这个上下文中,每个 Record 代表列表中的一个字段或列。Collection 的应用表明你能够定义多个数据字段,每个字段都有本人的展现逻辑和属性。 <Record Type="UI.DataField">这一行开始定义一个 Record,它的 Type 属性被设置为 UI.DataField。这意味着这个记录代表一个数据字段,用于显示数据模型中的某个属性值。UI.DataField 是用来间接从后端数据模型中取值显示在 UI 上的一种元素类型。 <PropertyValue Property="Value" Path="ProductPictureURL"/>这里,<PropertyValue> 定义了具体的属性值,Property="Value" 示意这个 Record 将展现的内容。Path="ProductPictureURL" 指定了这个值来自数据模型中的 ProductPictureURL 属性。这意味着列表中的这一列将显示每个产品的图片 URL。 <Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>最初,这一行通过 UI.Importance 注解为这个字段设置了重要性级别。EnumMember="UI.ImportanceType/High" 表明这个字段在 UI 展现时具备高重要性。在 Fiori Elements 利用中,这能够影响字段在不同屏幕尺寸或设施上的显示方式,例如,在挪动设施上优先展现或在紧凑视图中依然保留。 ...

February 24, 2024 · 1 min · jiezi

关于saprfc:SAP-UI5-complex-parser-只有在-126-版本之后才能使用

上面是一个例子: 语义是,complex Parser 性能,只能在 1.26 及其之后的版本应用: if ( config["bindingSyntax"] === "default" ) { config["bindingSyntax"] = (config.getCompatibilityVersion("sapCoreBindingSyntax").compareTo("1.26") < 0) ? "simple" : "complex"; } 版本号是 1.26: 解析出主版本号为1,次版本号为 26: 以后次版本号是 110: 以后 SAP UI5 版本的次版本号是怎么求进去的? SAP UI5 默认的 jQuery 版本是 3.6.0,如果不是这个版本,在 console 会打印正告音讯。 Add all defined events to the event infrastructurejQuery has inversed the order of event registration when multiple events are passed into jQuery.on method from version 1.9.1. ...

March 13, 2023 · 1 min · jiezi

关于saprfc:SAP-Product-Lifecycle-Costing-里的-Costing-Sheet-成本核算表

有敌人在我的常识星球里向我发问: 请您帮忙讲一下这个AP0100的costing sheet rows这里都示意什么意思吗?比方row10、base Z010、overhead啥、形容、from、to row、credit都阐明了什么,可能实现下面的指标吗,感激!!! 我在 Google 里依据关键字 Costing sheet rows 进行搜寻,第一个搜寻后果就是 SAP help 官网文档对于 SAP Product Lifecycle Costing 产品的介绍。 然而把敌人的截图同官网文档形容的内容比拟,仿佛不齐全 match: 问题里给出的截图,实际上是成本核算表业务数据增删改查的治理界面。 这里能够创立、编辑和删除 SAP Product Lifecycle Costing 中应用的成本核算表(Costing Sheet)。成本核算表定义了用于计算 overheads 和 sums 的规定。 成本核算表由多行组成,在一个特定的 Calculation Versions 中计算 overheads 和 sums 时,这些行依照从上到下的程序顺次被解决。 Costing Sheet 反对下列三种行类型: BaseOverheadSum这些行类型之间存在依赖关系。 最重要的是,成本核算表中的第一行必须是根本行即 Base Row. 这是因为 Overhead 行和 Sum 行只能援用位于它们之上的行。 能够依据须要增加任意数量的 Base 行和 Overhead 行。 然而,被援用的 Base 行必须始终位于 Overhead 行之上。 这同样实用于 Sum 行。 只有位于 Sum 行之上的行能力在 Sum 行中被援用。 ...

December 24, 2022 · 1 min · jiezi

关于saprfc:本地开发好的-SAP-UI5-应用部署到-ABAP-服务器时中文字符变成乱码的原因分析和解决方案

一套适宜 SAP UI5 初学者循序渐进的学习教程作者简介Jerry Wang,2007 年从电子科技大学计算机专业硕士毕业后退出 SAP 成都研究院工作至今。Jerry 是 SAP 社区导师,SAP 中国技术大使。在长达 15 年的 SAP 规范产品开发生涯里,Jerry 已经先后参加 SAP Business ByDesign, SAP CRM, SAP Cloud for Customer, SAP S/4HANA, SAP Commerce Cloud(电商云)等规范产品的研发工作。 Jerry 工作中应用 ABAP, Java, JavaScript 和 TypeScript 进行开发, 对包含 SAP UI5 在内的多款 SAP 自研框架有深刻的钻研。 教程目录SAP UI5 本地开发环境的搭建SAP UI5 利用开发教程之一:Hello WorldSAP UI5 利用开发教程之二:SAP UI5 的疏导过程 BootstrapSAP UI5 利用开发教程之三:开始接触第一个 SAP UI5 控件SAP UI5 利用开发教程之四:XML 视图初探SAP UI5 利用开发教程之五:视图控制器初探SAP UI5 利用开发教程之六 - 理解 SAP UI5 的模块(Module)概念SAP UI5 利用开发教程之七 - JSON 模型初探SAP UI5 利用开发教程之八 - 多语言的反对SAP UI5 利用开发教程之九 - 创立第一个 ComponentSAP UI5 利用开发教程之十 - 什么是 SAP UI5 利用的描述符 DescriptorSAP UI5 利用开发教程之十一 :SAP UI5 容器类控件 Page 和 PanelSAP UI5 利用开发教程之十二 - 应用 CSS 类对 UI 进行进一步丑化SAP UI5 利用开发教程之十三 - 如何增加自定义 CSS 类SAP UI5 利用开发教程之十四 - 嵌入视图的应用形式SAP UI5 利用开发教程之十五 - 对话框和 Fragments 的应用形式SAP UI5 利用开发教程之十六 - 图标 icon 的应用SAP UI5 利用开发教程之十七 - 聚合绑定在 UI5 复合控件中的应用SAP UI5 利用开发教程之十八 - SAP UI5 数据绑定语法里的特殊符号,以及相对绑定和绝对绑定概念详解SAP UI5 利用开发教程之十九 - SAP UI5 数据类型和简单的数据绑定SAP UI5 利用开发教程之二十 - SAP UI5 的表达式绑定用法解说SAP UI5 利用开发教程之二十一 - SAP UI5 的自定义格局器 Custom FormatterSAP UI5 利用开发教程之二十二 - 过滤器 filter 的开发和应用SAP UI5 利用开发教程之二十三 - 列表控件的排序 Sort 和分组 GroupSAP UI5 利用开发教程之二十四 - 如何应用 OData 数据模型SAP UI5 利用开发教程之二十五 - 应用代理服务器解决 SAP UI5 利用拜访远端 OData 服务的跨域问题SAP UI5 利用开发教程之二十六 - OData 服务配合 Mock 服务器的应用步骤详解SAP UI5 利用开发教程之二十七 - SAP UI5 利用的单元测试工具 QUnit 介绍SAP UI5 利用开发教程之二十八 - SAP UI5 利用的集成测试工具 OPA 介绍SAP UI5 利用开发教程之二十九 - SAP UI5 的路由和导航性能介绍SAP UI5 利用开发教程之三十 - SAP UI5 的路由过程中进行参数传递SAP UI5 利用开发教程之三十一 - SAP UI5 的路由历史和路由回退(Routing back and history)SAP UI5 利用开发教程之三十二 - 如何创立一个自定义 SAP UI5 控件SAP UI5 利用开发教程之三十三 - SAP UI5 利用的响应式布局个性(Responsiveness)SAP UI5 利用开发教程之三十四 - SAP UI5 利用基于设施类型的页面适配性能(Device Adaptation)SAP UI5 利用开发教程之三十五 - 如何把本地开发的 SAP UI5 利用部署到 ABAP 服务器上SAP UI5 利用开发教程之三十六 - 应用 Chrome 开发者工具 Elements 标签动静批改 CSS 类SAP UI5 利用开发教程之三十七 - 应用 Chrome 开发者工具 Console 面板进行元素审查SAP UI5 利用开发教程之三十八 - 应用 Chrome 开发者工具查看程序执行出错时的上下文信息SAP UI5 利用开发教程之三十九 - SAP UI5 利用呈现白屏的一些常见谬误和分析方法分享SAP UI5 利用开发教程之四十 - 如何制作蕴含了 component-preload.js 在内的 SAP UI5 公布版本SAP UI5 利用开发教程之四十一 - Chrome 扩大 UI5 Inspector 的离线装置和应用办法SAP UI5 利用开发教程之四十二 - SAP UI5 自带的 Diagnostics 诊断工具应用办法介绍SAP UI5 利用开发教程之四十三 - SAP UI5 自带的 Support Assistant 工具应用办法介绍SAP UI5 利用开发教程之四十四 - Label 和 Input 控件文本没有程度对齐的起因剖析和解决方案SAP UI5 利用开发教程之四十五 - 如何在 SAP UI5 利用里应用 jQuery 和原生的 DOM APISAP UI5 利用开发教程之四十六 - 应用 Message Manager 实现开箱即用的验证(Validation)信息抛出SAP UI5 利用开发教程之四十七 - 如何自定义 SAP UI5 字符串类型输出字段的校验逻辑SAP UI5 利用开发教程之四十八 - 如何在 SAP UI5 利用里开发条形码扫描性能SAP UI5 利用开发教程之四十九 - 如何在桌面电脑端调试运行在手机上的 SAP UI5 利用SAP UI5 利用开发教程之五十 - 如何应用 Cordova 将 SAP UI5 利用生成一个能在 Android 手机上安装的混合利用SAP UI5 利用开发教程之五十一 - 如何应用 Chrome 调试运行在手机上的 SAP UI5 Cordova 混合利用SAP UI5 利用开发教程之五十二 - 如何应用 SAP UI5 的规范控件联合 Cordova 插件调用手机摄像头进行条形码扫描SAP UI5 利用开发教程之五十三 - 如何自定义 SAP UI5 数据类型(Data Type)SAP UI5 利用开发教程之五十四 - 如何将本地 SAP UI5 利用配置到本地 Fiori Launchpad 中SAP UI5 利用开发教程之五十五 - 如何将本地 SAP UI5 利用通过 Node.js Express 部署到公网上SAP UI5 利用开发教程之五十六 - SAP UI5 树控件(tree)的开发SAP UI5 利用开发教程之五十七 - 基于 OData 注解的 Smart Field 应用办法学习SAP UI5 利用开发教程之五十八 - 应用工厂办法在运行时动态创建不同类型的列表行我的项目控件SAP UI5 利用开发教程之五十九 - 如何在 SAP UI5 利用里显示世界地图SAP UI5 利用开发教程之六十 - SAP UI5 地图控件的一些高级用法SAP UI5 利用开发教程之六十一 - 在 SAP UI5 利用里绘制甘特图 Gantt ChartSAP UI5 利用开发教程之六十二 - 基于 OData V4 的 SAP UI5 表格控件应用办法介绍SAP UI5 利用开发教程之六十三 - 基于 OData V4 的本地 Mock Server 实现的深刻介绍SAP UI5 利用开发教程之六十四 - 基于 OData V4 的 SAP UI5 表格控件如何实现 filter(过滤) 和 sort(排序)性能SAP UI5 利用开发教程之六十五 - 基于 OData V4 的 SAP UI5 表格控件如何实现创立,编辑和保留性能SAP UI5 利用开发教程之六十六 - 基于 OData V4 的 SAP UI5 表格控件如何实现删除性能SAP UI5 利用开发教程之六十七 - 基于 OData V4 的 SAP UI5 List-Detail(列表-明细)布局的实现形式SAP UI5 利用开发教程之六十八 - 如何实现 SAP UI5 路由失败时显示自定义的 NOT Found 页面SAP UI5 利用开发教程之六十九 - 如何从 SAP UI5 Not Found 页面跳转回到失常的利用页面SAP UI5 利用开发教程之七十 - 如何应用按钮控件触发页面路由跳转SAP UI5 利用开发教程之七十一 - SAP UI5 页面的嵌套路由SAP UI5 利用开发教程之七十二 - SAP UI5 页面路由的动画成果设置SAP UI5 利用开发教程之七十三 - 应用自定义 Query 实现 SAP UI5 页面路由的书签性能SAP UI5 利用开发教程之七十四 - SAP UI5 利用应用 OData V4 显示 Table 表格数据的一个陷阱SAP UI5 利用开发教程之七十五 - 如何采纳SAP UI5 主从表格的联动技术显示简单表格内容SAP UI5 利用开发教程之七十六 - 如何实现 SAP UI5 的 Lazy Loading(提早加载,懒加载)SAP UI5 利用开发教程之七十七 - SAP UI5 动静页面路由的高级用法:路由记录 routes 和 target 的一对多关系SAP UI5 利用开发教程之七十八 - 如何通过 url 放弃 SAP UI5 搜寻的状态,让其反对书签性能SAP UI5 利用开发教程之七十九 - 采纳测试驱动开发理念(Test Driven Development)进行 SAP UI5 利用的性能开发(一)SAP UI5 利用开发教程之八十 - 采纳测试驱动开发理念(Test Driven Development)进行 SAP UI5 利用的性能开发(二)SAP UI5 利用开发教程之八十一 - 采纳 OPA5 进行 SAP UI5 集成测试(Integration Test)的一个例子SAP UI5 利用开发教程之八十二 - 采纳 OPA5 开发反对页面跳转的 SAP UI5 集成测试用例SAP UI5 利用开发教程之八十三 - SAP UI5 的自动化测试套件页面的开发步骤介绍SAP UI5 利用开发教程之八十四 - 如何指定 SAP UI5 应用程序基于某个特定的版本运行SAP UI5 利用开发教程之八十五 - 如何用 OPA5 编写测试用例来测试用户输出文本的性能SAP UI5 利用开发教程之八十六 - 入手开发一个最简略的本地 Mock 数据服务器SAP UI5 利用开发教程之八十七 - 如何让 SAP UI5 Mock 服务器反对自定义 url 参数SAP UI5 利用开发教程之八十八 - SAP UI5 Mock 服务器如何实现自定义 Function ImportSAP UI5 利用开发教程之八十九 - 如何给 SAP UI5 列表控件削减多个图形界面的过滤器SAP UI5 利用开发教程之九十 - 基于 OData V2 的 SAP UI5 List-Detail(列表-明细)布局的实现形式SAP UI5 利用开发教程之九十一 - 如何应用客户端 JSON 模型构建一个 Master-Detail-Detail 布局中的列表页面SAP UI5 利用开发教程之九十二 - 基于 SAP UI5 JSONModel 客户端模型的列表分页显示(Table Pagination)前提SAP UI5 利用开发教程之九十三 - 基于 JSONModel 数据模型的列表控件显示数据的深刻探讨SAP UI5 利用开发教程之九十四 - 基于 JSONModel 数据模型的 SAP UI5 列表控件分页显示数据的残缺解决方案SAP UI5 利用开发教程之九十五 - SAP UI5 下拉菜单(Select) 控件的应用形式SAP UI5 利用开发教程之九十六 - SAP UI5 列表控件分页显示数据时,如何自定义分页大小SAP UI5 利用开发教程之九十七 - 如何应用客户端 JSON 模型构建一个 Master-Detail-Detail 布局中的明细页面SAP UI5 利用开发教程之九十八 - 从 viewId 这个属性谈起,聊聊 SAP UI5 的 HTML 源代码生成机制SAP UI5 利用开发教程之九十九 - 深入探讨 SAP UI5 本地开发环境里的 package.json 和 ui5.yamlSAP UI5 利用开发教程之一百 - 如何批改 SAP UI5 框架的源代码实现,以及应用本地部署的 SAP UI5 SDKSAP UI5 利用开发教程之一百零一 - SAP UI5 利用的 Locale 决定机制SAP UI5 利用开发教程之一百零二 - SAP UI5 利用的打印(Print)性能实现详解SAP UI5 利用开发教程之一百零三 - 如何在 SAP UI5 利用中生产第三方库SAP UI5 利用开发教程之一百零四 - SAP UI5 表格控件的反对复选(Multi-Select)以及如何用代码一次选中多个表格行我的项目SAP UI5 利用开发教程之一百零五 - SAP UI5 Master-Detail 布局模式的联动成果实现明细介绍SAP UI5 利用开发教程之一百零六 - 如何进步 SAP UI5 利用路由 url 的可读性SAP UI5 利用开发教程之一百零七 - SAP UI5 OverflowToolbar 容器控件以及 resize 事件处理的一些细节介绍SAP UI5 利用开发教程之一百零八 - SAP UI5 图片显示控件 Avatar 的应用形式介绍SAP UI5 利用开发教程之一百零九 - 应用 SAP UI5 FileUploader 控件上传本地文件SAP UI5 利用开发教程之一百一十 - SAP UI5 FileUploader 控件深刻介绍 - 为什么须要一个暗藏的 iframeSAP UI5 利用开发教程之一百一十一 - SAP UI5 FileUploader 控件实现本地文件上传,接管服务器端的响应时遇到跨域拜访谬误SAP UI5 利用开发教程之一百一十二 - 应用自开发的代理服务器解决 SAP UI5 FileUploader 上传文件时遇到的跨域拜访谬误SAP UI5 利用开发教程之一百一十三 - 授人以渔 - 如何自行查问任意 SAP UI5 控件属性的文档和技术实现细节SAP UI5 利用开发教程之一百一十四 - 如何通过单步调试的形式找到引起 Fiori Launchpad 路由谬误的起因SAP UI5 利用开发教程之一百一十五 - 对于将本地 SAP UI5 利用配置到本地 Fiori Launchpad 的技术实现深刻解说SAP UI5 利用开发教程之一百一十六 - 在 SAPGUI 里应用 ABAP 报表上传 SAP UI5 利用到 ABAP 服务器SAP UI5 利用开发教程之一百一十七 - 本地开发好的 SAP UI5 利用部署到 ABAP 服务器时,中文字符变成乱码的起因剖析和解决方案SAP UI5 利用开发教程之一百一十八 - 正在写作中......阐明Jerry 从 2014 年退出 SAP成都研究院 CRM Fiori 开发团队之后开始接触 SAP UI5,已经在 SAP 社区和“汪子熙”微信公众号上发表过多篇对于 SAP UI5 工作原理和源码解析的文章。 ...

August 12, 2022 · 5 min · jiezi

关于saprfc:几种-SAP-ABAP-OData-服务的性能评估和测试工具介绍试读版

正如本教程的开篇介绍文章SAP OData 开发教程 - 从入门到进步(蕴含 SEGW, RAP 和 CDP)所提到的,SAP OData 服务开发,从实现技术上来说,能够分为三大类。因而本教程也分为三大部分,别离进行介绍。本文是本教程的文章目录。 作者简介Jerry Wang,2007 年从电子科技大学计算机专业硕士毕业后退出 SAP 成都研究院工作至今。Jerry 是 SAP 社区导师,SAP 中国技术大使。在长达 15 年的 SAP 规范产品开发生涯里,Jerry 已经先后参加 SAP Business ByDesign, SAP CRM, SAP Cloud for Customer, SAP S/4HANA, SAP Commerce Cloud(电商云)等规范产品的研发工作。 Jerry 对 SAP OData 服务的开发,测试,公布,部署,测试,及基于各种不同 SAP 技术实现的 OData 服务的幕后技术实现细节和应用场合,均有着深刻的钻研。 基于 SEGW - Gateway Service Builder 的开发教程1. 在 SAP ABAP 事物码 SEGW 里创立 SAP OData 我的项目2. 在 SAP ABAP 系统对事物码 SEGW 创立的 OData 服务进行配置并测试3. SAP ABAP OData 服务诊断工具 /IWFND/ERROR_LOG 的应用办法4. SAP ABAP OData 服务 Data Provider Class 的 GET_ENTITYSET 办法实现指南5. SAP ABAP OData 服务如何反对 $filter (过滤)操作6. 应用 Postman 工具高效治理和测试 SAP ABAP OData 服务7. SAP ABAP OData 服务如何反对 $orderby (排序)操作8. SAP ABAP OData 服务如何反对创立(Create)操作9. SAP ABAP OData 服务如何反对删除(Delete)操作10. SAP ABAP OData 服务如何反对批改(Update)操作11. 应用 HTTP PUT, PATCH 以及 MERGE 申请生产 SAP ABAP OData 服务批改操作的实现及其区别12. SAP ABAP OData 服务如何反对 $select 有选择性地仅读取局部模型字段值13. SAP ABAP OData 服务的分页加载数据集的实现(Paging)14. 几种 SAP ABAP OData 服务的性能评估和测试工具介绍更多文章正在写作中,敬请期待应用 Restful ABAP Programming 编程模型(简称 RAP) 开发 OData 服务正在写作中,敬请期待应用 SAP Cloud Application Programming 编程模型开发 OData 服务正在写作中,敬请期待本教程至此曾经实现了 13 个章节的介绍,咱们初步把握了 SAP ABAP OData 服务在事物码 SEGW 中的建模,以及该模型对应的 DPC - Data Provider Class 针对 CRUD(增删改查),过滤($filter), 排序($orderby), 选择性返回字段($select), 以及分页读取数据集($skip 和 $top) 等操作的具体实现步骤。 ...

August 12, 2022 · 1 min · jiezi

关于saprfc:SAP-SEGW-事物码里的导航属性Navigation-Property-和-EntitySet-使用方法

实体类型包含一个或多个导航属性。导航属性形容实体关系之间的导航门路。 它是一个实体的属性,示意从该实体到一个或多个相干实体的链接。 导航属性绑定到关联类型(association type),容许从申明导航属性的实体类型的一端(导航的数据源)导航到另一端相干的端。 导航属性是创立通过 association 从一个实体到另一个实体的链接所必须的。 在创立导航属性之前,须要首先创立实体类型和关联(association)。 导航属性文件夹仅在增加实体类型之后才会显示。 双击 SEGW 里的 Navigation Properties 文件夹,关上 mass edit view,能看到每个 navigation property 对应下列五列须要保护: 在 Service Builder 我的项目中应用实体集将实体类型的实例与派生自此特定实体类型的任何类型的实例组合在一起。 实体类型(Entity Type)形容数据结构,而实体集蕴含给定构造的实例(instance)。 右键单击“数据模型”文件夹,抉择“创立”,而后抉择“实体集”。另外,当右键单击实体集文件夹并抉择创立时,能够创立一个新的实体集。关上“创立实体集”对话框。 如下图所示: Requires filter checkbox 的含意:选中此复选框示意服务实现须要筛选器(filter)。如果选中此复选框,则不能间接拜访实体集,并且不能在没有 $filter 表达式的状况下查问实体集。 Association关联形容了两个或多个实体之间的关系,这种关系具备显式命名。 关联定义了参加实体类型之间的对等关系,能够在两端反对不同的 multiplicities, 比方 1 对多,多对1,N:M 等等。 关联的一个例子是 Customer 和 Order 实体之间的关系,如下图所示:

June 30, 2022 · 1 min · jiezi

关于saprfc:通过-OData-里面写代码去检查有没有某一个-catalog-的权限

对于题目这个需要,首先要思考在 OData 实现的什么中央去编写查看逻辑。 能够思考在 OData 模型的 Function Import 里编写查看逻辑。 如果是用 Gateway Builder 即 SEGW 事物码开发的 OData,首先在 SEGW 我的项目里创立 Function Import: 而后在对应的 class 里编写 Function import 的具体实现代码。 至于如何查看一个用户是否被调配了某个 catalog,请浏览我这篇文章SAP Fiori Launchpad Tile,UI5利用,和PFCG Role的对应关系。 首先须要晓得待查看的 catalog,被调配到哪个具体的 PFCG role 里,而后检查用户是否被调配到这个查到的 PFCG role 里。 举个例子:我想检查用户 WANGJER 是否被调配了 catalog X-SAP-UI2-CATALOGPAGE:SAP_CRM_BC_SALESREP。 首先弄清楚 X-SAP-UI2-CATALOGPAGE:SAP_CRM_BC_SALESREP 被哪些 PFCG role 蕴含了? 答案是 ZSAP_CRM_BCR_SALESREP: 而后是查看 WANGJER 这个用户是否被调配给 这个PFCG role 了? 答案是 Yes,因而查看后果,WANGJER 这个用户,领有 X-SAP-UI2-CATALOGPAGE:SAP_CRM_BC_SALESREP 的权限。 当然,须要应用 ST05 等工具,找到哪些数据库表,存储了 catalog 与 PFCG role,以及 PFCG role 与用户名的对应关系。 ...

June 30, 2022 · 1 min · jiezi

关于saprfc:SAP-UI5-应用-indexhtml-里引导-script-属性的解析原理

一套适宜 SAP UI5 初学者循序渐进的学习教程作者简介Jerry Wang,2007 年从电子科技大学计算机专业硕士毕业后退出 SAP 成都研究院工作至今。Jerry 是 SAP 社区导师,SAP 中国技术大使。在长达 15 年的 SAP 规范产品开发生涯里,Jerry 已经先后参加 SAP Business ByDesign, SAP CRM, SAP Cloud for Customer, SAP S/4HANA, SAP Commerce Cloud(电商云)等规范产品的研发工作。 Jerry 工作中应用 ABAP, Java, JavaScript 和 TypeScript 进行开发, 对包含 SAP UI5 在内的多款 SAP 自研框架有深刻的钻研。 教程目录SAP UI5 本地开发环境的搭建SAP UI5 利用开发教程之一:Hello WorldSAP UI5 利用开发教程之二:SAP UI5 的疏导过程 BootstrapSAP UI5 利用开发教程之三:开始接触第一个 SAP UI5 控件SAP UI5 利用开发教程之四:XML 视图初探SAP UI5 利用开发教程之五:视图控制器初探SAP UI5 利用开发教程之六 - 理解 SAP UI5 的模块(Module)概念SAP UI5 利用开发教程之七 - JSON 模型初探SAP UI5 利用开发教程之八 - 多语言的反对SAP UI5 利用开发教程之九 - 创立第一个 ComponentSAP UI5 利用开发教程之十 - 什么是 SAP UI5 利用的描述符 DescriptorSAP UI5 利用开发教程之十一 :SAP UI5 容器类控件 Page 和 PanelSAP UI5 利用开发教程之十二 - 应用 CSS 类对 UI 进行进一步丑化SAP UI5 利用开发教程之十三 - 如何增加自定义 CSS 类SAP UI5 利用开发教程之十四 - 嵌入视图的应用形式SAP UI5 利用开发教程之十五 - 对话框和 Fragments 的应用形式SAP UI5 利用开发教程之十六 - 图标 icon 的应用SAP UI5 利用开发教程之十七 - 聚合绑定在 UI5 复合控件中的应用SAP UI5 利用开发教程之十八 - SAP UI5 数据绑定语法里的特殊符号,以及相对绑定和绝对绑定概念详解SAP UI5 利用开发教程之十九 - SAP UI5 数据类型和简单的数据绑定SAP UI5 利用开发教程之二十 - SAP UI5 的表达式绑定用法解说SAP UI5 利用开发教程之二十一 - SAP UI5 的自定义格局器 Custom FormatterSAP UI5 利用开发教程之二十二 - 过滤器 filter 的开发和应用SAP UI5 利用开发教程之二十三 - 列表控件的排序 Sort 和分组 GroupSAP UI5 利用开发教程之二十四 - 如何应用 OData 数据模型SAP UI5 利用开发教程之二十五 - 应用代理服务器解决 SAP UI5 利用拜访远端 OData 服务的跨域问题SAP UI5 利用开发教程之二十六 - OData 服务配合 Mock 服务器的应用步骤详解SAP UI5 利用开发教程之二十七 - SAP UI5 利用的单元测试工具 QUnit 介绍SAP UI5 利用开发教程之二十八 - SAP UI5 利用的集成测试工具 OPA 介绍SAP UI5 利用开发教程之二十九 - SAP UI5 的路由和导航性能介绍SAP UI5 利用开发教程之三十 - SAP UI5 的路由过程中进行参数传递SAP UI5 利用开发教程之三十一 - SAP UI5 的路由历史和路由回退(Routing back and history)SAP UI5 利用开发教程之三十二 - 如何创立一个自定义 SAP UI5 控件SAP UI5 利用开发教程之三十三 - SAP UI5 利用的响应式布局个性(Responsiveness)SAP UI5 利用开发教程之三十四 - SAP UI5 利用基于设施类型的页面适配性能(Device Adaptation)SAP UI5 利用开发教程之三十五 - 如何把本地开发的 SAP UI5 利用部署到 ABAP 服务器上SAP UI5 利用开发教程之三十六 - 应用 Chrome 开发者工具 Elements 标签动静批改 CSS 类SAP UI5 利用开发教程之三十七 - 应用 Chrome 开发者工具 Console 面板进行元素审查SAP UI5 利用开发教程之三十八 - 应用 Chrome 开发者工具查看程序执行出错时的上下文信息SAP UI5 利用开发教程之三十九 - SAP UI5 利用呈现白屏的一些常见谬误和分析方法分享SAP UI5 利用开发教程之四十 - 如何制作蕴含了 component-preload.js 在内的 SAP UI5 公布版本SAP UI5 利用开发教程之四十一 - Chrome 扩大 UI5 Inspector 的离线装置和应用办法SAP UI5 利用开发教程之四十二 - SAP UI5 自带的 Diagnostics 诊断工具应用办法介绍SAP UI5 利用开发教程之四十三 - SAP UI5 自带的 Support Assistant 工具应用办法介绍SAP UI5 利用开发教程之四十四 - Label 和 Input 控件文本没有程度对齐的起因剖析和解决方案SAP UI5 利用开发教程之四十五 - 如何在 SAP UI5 利用里应用 jQuery 和原生的 DOM APISAP UI5 利用开发教程之四十六 - 应用 Message Manager 实现开箱即用的验证(Validation)信息抛出SAP UI5 利用开发教程之四十七 - 如何自定义 SAP UI5 字符串类型输出字段的校验逻辑SAP UI5 利用开发教程之四十八 - 如何在 SAP UI5 利用里开发条形码扫描性能SAP UI5 利用开发教程之四十九 - 如何在桌面电脑端调试运行在手机上的 SAP UI5 利用SAP UI5 利用开发教程之五十 - 如何应用 Cordova 将 SAP UI5 利用生成一个能在 Android 手机上安装的混合利用SAP UI5 利用开发教程之五十一 - 如何应用 Chrome 调试运行在手机上的 SAP UI5 Cordova 混合利用SAP UI5 利用开发教程之五十二 - 如何应用 SAP UI5 的规范控件联合 Cordova 插件调用手机摄像头进行条形码扫描SAP UI5 利用开发教程之五十三 - 如何自定义 SAP UI5 数据类型(Data Type)SAP UI5 利用开发教程之五十四 - 如何将本地 SAP UI5 利用配置到本地 Fiori Launchpad 中SAP UI5 利用开发教程之五十五 - 如何将本地 SAP UI5 利用通过 Node.js Express 部署到公网上SAP UI5 利用开发教程之五十六 - SAP UI5 树控件(tree)的开发SAP UI5 利用开发教程之五十七 - 基于 OData 注解的 Smart Field 应用办法学习SAP UI5 利用开发教程之五十八 - 应用工厂办法在运行时动态创建不同类型的列表行我的项目控件SAP UI5 利用开发教程之五十九 - 如何在 SAP UI5 利用里显示世界地图SAP UI5 利用开发教程之六十 - SAP UI5 地图控件的一些高级用法SAP UI5 利用开发教程之六十一 - 在 SAP UI5 利用里绘制甘特图 Gantt ChartSAP UI5 利用开发教程之六十二 - 基于 OData V4 的 SAP UI5 表格控件应用办法介绍SAP UI5 利用开发教程之六十三 - 基于 OData V4 的本地 Mock Server 实现的深刻介绍SAP UI5 利用开发教程之六十四 - 基于 OData V4 的 SAP UI5 表格控件如何实现 filter(过滤) 和 sort(排序)性能SAP UI5 利用开发教程之六十五 - 基于 OData V4 的 SAP UI5 表格控件如何实现创立,编辑和保留性能SAP UI5 利用开发教程之六十六 - 基于 OData V4 的 SAP UI5 表格控件如何实现删除性能SAP UI5 利用开发教程之六十七 - 基于 OData V4 的 SAP UI5 List-Detail(列表-明细)布局的实现形式SAP UI5 利用开发教程之六十八 - 如何实现 SAP UI5 路由失败时显示自定义的 NOT Found 页面SAP UI5 利用开发教程之六十九 - 如何从 SAP UI5 Not Found 页面跳转回到失常的利用页面SAP UI5 利用开发教程之七十 - 如何应用按钮控件触发页面路由跳转SAP UI5 利用开发教程之七十一 - SAP UI5 页面的嵌套路由SAP UI5 利用开发教程之七十二 - SAP UI5 页面路由的动画成果设置SAP UI5 利用开发教程之七十三 - 应用自定义 Query 实现 SAP UI5 页面路由的书签性能SAP UI5 利用开发教程之七十四 - SAP UI5 利用应用 OData V4 显示 Table 表格数据的一个陷阱SAP UI5 利用开发教程之七十五 - 如何采纳SAP UI5 主从表格的联动技术显示简单表格内容SAP UI5 利用开发教程之七十六 - 如何实现 SAP UI5 的 Lazy Loading(提早加载,懒加载)SAP UI5 利用开发教程之七十七 - SAP UI5 动静页面路由的高级用法:路由记录 routes 和 target 的一对多关系SAP UI5 利用开发教程之七十八 - 如何通过 url 放弃 SAP UI5 搜寻的状态,让其反对书签性能SAP UI5 利用开发教程之七十九 - 采纳测试驱动开发理念(Test Driven Development)进行 SAP UI5 利用的性能开发(一)SAP UI5 利用开发教程之八十 - 采纳测试驱动开发理念(Test Driven Development)进行 SAP UI5 利用的性能开发(二)SAP UI5 利用开发教程之八十一 - 采纳 OPA5 进行 SAP UI5 集成测试(Integration Test)的一个例子SAP UI5 利用开发教程之八十二 - 采纳 OPA5 开发反对页面跳转的 SAP UI5 集成测试用例SAP UI5 利用开发教程之八十三 - SAP UI5 的自动化测试套件页面的开发步骤介绍SAP UI5 利用开发教程之八十四 - 如何指定 SAP UI5 应用程序基于某个特定的版本运行SAP UI5 利用开发教程之八十五 - 如何用 OPA5 编写测试用例来测试用户输出文本的性能SAP UI5 利用开发教程之八十六 - 入手开发一个最简略的本地 Mock 数据服务器SAP UI5 利用开发教程之八十七 - 如何让 SAP UI5 Mock 服务器反对自定义 url 参数SAP UI5 利用开发教程之八十八 - SAP UI5 Mock 服务器如何实现自定义 Function ImportSAP UI5 利用开发教程之八十九 - 如何给 SAP UI5 列表控件削减多个图形界面的过滤器SAP UI5 利用开发教程之九十 - 基于 OData V2 的 SAP UI5 List-Detail(列表-明细)布局的实现形式SAP UI5 利用开发教程之九十一 - 如何应用客户端 JSON 模型构建一个 Master-Detail-Detail 布局中的列表页面SAP UI5 利用开发教程之九十二 - 基于 SAP UI5 JSONModel 客户端模型的列表分页显示(Table Pagination)前提SAP UI5 利用开发教程之九十三 - 基于 JSONModel 数据模型的列表控件显示数据的深刻探讨SAP UI5 利用开发教程之九十四 - 基于 JSONModel 数据模型的 SAP UI5 列表控件分页显示数据的残缺解决方案SAP UI5 利用开发教程之九十五 - SAP UI5 下拉菜单(Select) 控件的应用形式SAP UI5 利用开发教程之九十六 - SAP UI5 列表控件分页显示数据时,如何自定义分页大小SAP UI5 利用开发教程之九十七 - 如何应用客户端 JSON 模型构建一个 Master-Detail-Detail 布局中的明细页面SAP UI5 利用开发教程之九十八 - 从 viewId 这个属性谈起,聊聊 SAP UI5 的 HTML 源代码生成机制阐明Jerry 从 2014 年退出 SAP成都研究院 CRM Fiori 开发团队之后开始接触 SAP UI5,已经在 SAP 社区和“汪子熙”微信公众号上发表过多篇对于 SAP UI5 工作原理和源码解析的文章。 ...

June 20, 2022 · 5 min · jiezi

关于saprfc:SAP-UI5-OData-V4-模型的构造方式

sap.ui.model.odata.v4.ODataModel 是应用 OData V4 服务的模型实现。 SAP Fiori 元素构建块 (sap.fe.macros) 必须与 SAPUI5 OData V4 模型一起应用,而不是智能控件(sap.ui.comp 库)或 sap.ui.table.AnalyticalTable(或剖析表计划)。不反对 TreeTable 与 SAPUI5 OData V4 模型一起应用。 OData V4 模型次要是为 OData V4 服务设计的。 不过,也能够通过适配器应用 OData V2 服务。OData V2 和 V4 两种模型的区别,参考这个链接。 无关更多信息,请参阅:应用 OData V4 模型应用 OData V2 服务 创立 OData V4 模型实例时,须要传入一个 map option 参数,该参数必须至多蕴含属性 serviceUrl 和同步模式。上面是一个例子: sap.ui.define(["sap/ui/model/odata/v4/ODataModel"], function (ODataModel) { var oModel = new ODataModel({ serviceUrl : "/sap/opu/odata4/IWBEP/V4_SAMPLE/default/IWBEP/V4_GW_SAMPLE_BASIC/0001/", synchronizationMode : "None" });});也能够指定自定义 query: ...

April 29, 2022 · 1 min · jiezi

关于saprfc:不借助-Fiori-client直接在手机浏览器里调用-SAP-UI5-BarcodeScanner-实现条形码扫描的可能性

这个 StackOverflow 探讨 说不可行。 sap.ndc.BarcodeScanner 在命名空间 sap.ndc 下申明。 这里的“ndc”代表 Native Device Capabilities。 这些 API 将应用 cordova 插件来调用本机设备性能,例如相机。 sap.ndc.BarcodeScanner 将查看 cordova 插件的可用性。 如果应用程序是通过浏览器关上的,则 BarcodeScanner 将简略地关上一个对话框并要求最终用户手动输出条形码。 如果应用程序是通过 cordova 应用程序或 SAP Fiori Client(构建在 cordova 之上)关上的,那么它将调用设施摄像头。 能够尝试这个 note:2402585 - sap.ndc.BarcodeScannerButton in Fiori SAP Fiori Client 是 SAP Fiori 应用程序的原生挪动利用程序运行时容器。 SAP Fiori Client 容许用户以在线模式拜访其 SAP Fiori 应用程序。 SAP Fiori Client 通过为 SAP Fiori 应用程序资产提供牢靠的缓存机制来克服挪动浏览器中的限度,并为 SAP Fiori 应用程序提供设施 API(如相机、条形码扫描仪和天文定位)。 SAP Fiori Client 围绕 Apache Cordova 架构设计,其中设施 API 和自定义性能通过插件增加。无关 SAP Fiori Client 中蕴含的插件列表,请参阅实用于 SAP Fiori Client 的 Kapsel 和 Cordova 插件。 ...

March 16, 2022 · 1 min · jiezi

关于saprfc:什么是-SAP-HCEA

HCEA 的全称是 Hybris Citizen Engagement Accelerator 是一种全渠道解决方案,实用于政府部门等公共部门组织,心愿为其公民开发更精简、无缝的体验,使他们无论应用何种渠道或服务都能轻松互动。 性能列表如下: Citizen Engagement Accelerator 提供了公共部门组织所需的许多要害性能。 服务申请市民能够将服务申请增加到他们的购物车中,而后依据特定的服务申请详细信息,通过可选的身份验证和免费进行结账。 Citizen Engagement Accelerator 容许与服务申请相干的老本依据公民在输出其申请的详细信息时给出的答案而有所不同。例如,一个特定的申请对志愿者来说可能是收费的,但对付费的专业人士来说则须要花钱。 账单Citizen Engagement Accelerator 可能通过其 API 从内部零碎接管账单,而后容许公民通过对立的界面查看、下载和领取这些账单。 付款详细信息通过 API 发送回内部零碎,提供计费和付款周期的残缺往返集成。 关系公民可能在他们之间建设关系,这使他们可能代表彼此行事。关系能够通过可自定义的权限来限度,这些权限限度了关系中的每个人能够为另一个人做什么。 用户能够随时更改这些设置,系统管理员能够从 SAP Commerce Backoffice 全局启用或禁用某些权限。 反对以下权限: Personal Details集体详细信息权限容许关系中的每个公民查看(但不更新)彼此的姓名和电子邮件地址。此权限是主动授予的。 Bill向另一个公民授予账单权限的公民容许其余公民查看、下载和领取他们的账单,以及查看他们的收据。 Documents向另一个公民授予文档权限的公民容许该其余公民查看和下载与他们的帐户相关联的任何文档。 Service Requests向另一个公民授予服务申请权限的公民容许其余公民代表他们操纵服务申请。其余公民能够保留和检索草稿、填写服务申请和提交服务申请。 Address Books向另一个公民授予地址簿权限的公民容许他们应用他们的地址簿在服务申请和其余数据输出表单中预填地址详细信息。 留神关系绝不允许公民拜访彼此的明码或存储的信用卡详细信息。 Accelerator 还反对委托书关系,它赋予一个公民代表另一个公民行事的齐全势力。在这些关系中,用户无奈抉择权限。除了明码拜访、信用卡拜访和更新集体详细信息的能力之外,授权书持有人被隐含地授予所有权限。 扩大用户类型Citizen Engagement Accelerator 反对三种不同的用户类型: Unidentified: 身份不明的用户是齐全匿名的。加速器不晓得用户是谁。Guest: 来宾用户没有注册帐户,但他们提供了一个电子邮件地址,加速器能够将其用作该用户的永恒链接。registered: 注册用户领有一个带加速器的帐户,并领有与长久身份相干的益处——我的帐户页面等。单个服务申请能够形容他们反对的用户类型。示例服务申请展现了其中的一系列。 该报告涂鸦样品,例如,容许用户依然不明,而泳池修建许可样品须要用户是客人或注册用户。 历史公民能够在他们的“我的帐户” 页面中查看他们的互动历史记录。他们能够查看他们申请的服务、申请的工夫、为反对申请而提供的信息以及申请的后果。 帐户治理Citizen Engagement Accelerator反对基于规范SAP Commerce帐户治理的扩大帐户治理。 利用程序接口通过增加对服务申请、账单、关系和文档的反对,能够利用SAP Commerce Data Hub。这容许: 向内部零碎公布服务申请以实现;在公民参加加速器内接管来自内部零碎的账单以 提供全渠道接口;向内部零碎公布账单领取细节;从内部零碎接管关系更新;向内部零碎公布关系更新;从内部零碎接管服务申请状态更新;和从内部零碎接管生成的文档。

December 19, 2021 · 1 min · jiezi

关于saprfc:什么是-SAP-enhancement-package

借助加强包交付技术,SAP 可为您现有的 SAP ERP 装置提供应用程序的新开发和加强性能。这意味着您能够在须要时并依据本人的要求应用为您的业务流程提供的新开发。 只有在您决定应用这些新性能、装置相干技术组件并在基于 ABAP 的 SAP Enterprise Central Components 零碎(SAP ECC 零碎)中激活相应的业务性能后,新的开发和加强才会失效。您未激活业务性能的现有业务流程放弃不变。 这种交付理念为您提供以下劣势: (1) 它在稳固的平台上为您提供长期布局平安,但并不意味着您无奈利用翻新和新倒退。 (2) 您无需导入新的 SAP NetWeaver 版本即可应用新开发。 (3) 您能够随时为各个部门提供新的倒退,而其余部门能够持续工作,并且零碎行为或用户界面没有变动。 (4) 因为施行流动仅对新性能是必要的,因而这大大减少了施行新应用程序和性能所需的工作量和工夫。不受新性能影响的业务流程不须要任何流动。 (5) 您的员工和用户只须要针对您被动决定应用的应用程序和性能进行培训。对接口和业务流程的更改仅对您已在零碎中激活的应用程序失效。其余应用程序不受影响。 (6) 您还能够缩小测试所需的工作量。您只需测试已通过激活业务性能被动决定优化的业务流程的应用程序。 (7) 对于每个业务性能,SAP 都提供了测试用例模板,使您能够更轻松地测试新性能 应用 SAP Enhancement package 的前提条件: 您正在应用相干的残缺版本(例如,SAP ERP 6.0)并且您曾经在那里设置了与您的业务相干的业务流程。 在装置加强包之前,您已取得无关与您的业务流程相干的业务性能的信息。依据您要应用的业务性能,而后施行相干的软件组件版本和内容包。请参阅 SAP 阐明 1052470。 无关业务性能的信息,请参阅 SAP ERP Central Component <number of the加强包> SAP Library Business Function Sets 下的 SAP Service Marketplace (service.sap.com/erp-ehp) 和 SAP Help Portal (help.sap.com)和业务性能。 ...

November 17, 2021 · 1 min · jiezi

关于saprfc:SAP-电商云-Spartacus-UI-SSR-里-engine-和-engine-instance-的区别

传入 originalEngine 到装璜器 decorateExpressEngine 里: 传出的是一个 engine 函数,engine 函数包含了 original Engine 这个函数,而后调用 engine 函数,同时将 Engine 参数传入,失去第二个 engine instance 函数。 最初的服务器端渲染,就是该 engine instance 函数负责解决。 咱们再来看看生产版本的 engine 实现原理:传入 decorator 的第一个 engine 实例,来自 Angular @nguniversal/express-engine: 这个装璜器返回一个新的函数。 (1) NgExpressEngine 的输出参数(2) Spartacus 开发团队引入的优化参数,通过闭包传入(3) Angular 规范的 NgExpressEngine 实例 在理论的生产代码里,通过装璜器的 get 办法,传入 nguniversal/express-engine 规范的 engine,返回 ngExpressEngine: 而后这个 ngExpressEngine 被作为参数,传入 server.engine 解决参数: 再看单元测试里的代码:传入装璜器的第二个参数为 null,意思是不应用 optimization engine: 第135行代码返回的是下图第47行的函数体自身: 如果咱们察看返回的 engine 实例,就能发现它外部蕴含两个闭包,存储了装璜器调用时,传入的 originalEngine 和 optimization option 的值: ...

October 6, 2021 · 1 min · jiezi

关于saprfc:聊聊-SAP-产品-UI-上的消息显示机制

这是 Jerry 2021 年的第 60 篇文章,也是汪子熙公众号总共第 337 篇原创文章。 本文从 StackOverflow 社区上来自 Partner 的一个 SAP Commerce Cloud Spartacus UI 的定制化需要说起。 这个需要的背景是,客户在 SAP 电商云的产品明细页面,能够留下本人的评论,点击 Submit 按钮提交。 提交之后,能看到“谢谢评论”的提醒音讯。 客户定制化需要是:不执行这个默认的音讯显示逻辑,即不显示音讯,而是执行其余逻辑,比方短信告诉或邮件告诉。 咱们先简略回顾 SAP 其余产品的 UI 音讯显示机制。 音讯是应用程序执行过程中给用户提供反馈的重要渠道之一,通常由用户某个动作间接触发,显示在产品界面上。当然应用程序后台作业运行到某个阶段,在满足指定条件时也能触发音讯显示。扼要、清晰而精确的音讯,能帮忙用户明确程序以后的运行状况,指引其下一步的操作。 SAP 产品 UI 显示的音讯文本,均有业余的 Knowledge Management 即 KM 团队负责审查和公布。 对于 SAP 开发人员来说,更关怀的则是这些音讯显示的上下文;换言之,看到 UI 上显示一条音讯之后,是否在最短的工夫内,高效定位到抛出该音讯的精确代码地位。 如下图所示,在经典的 SAPGUI SE38 ABAP 程序编辑器,输出一个不存在的报表名称,会显示一条音讯: Program XX does not exist. 其中 XX 是占位符,会被用户理论输出的报表名称所替换。 基于 ABAP 实现的所有 SAP 产品,比方 SAP CRM,SAP SRM,SAP S/4HANA,SAP Cloud for Customer,UI 上显示的每一条音讯,在 ABAP 后盾均有一条对应的音讯记录,保护在事物码 SE91 里。 ...

September 11, 2021 · 3 min · jiezi

关于saprfc:使用-SAP-UI5-系统测试工具-UIVeri5-的一个具体例子

https://developers.sap.com/tu... UIVeri5 是用于 SAPUI5 应用程序的 SAP 开源 JavaScript 测试框架。 它为您部署的应用程序驱动一个实在的浏览器并模仿实在的用户场景。 零碎测试查看前端和后端,并确保应用程序的所有局部都能很好地协同工作。 下图显示了与其余测试方法和工具相比,应用 UIVeri5 进行零碎测试的定位。 箭头形态阐明了办法的粒度:与单元、组件或集成测试相比,零碎测试查看的细节较少,而是专一于要害的工作流程。 About the SAPUI5 Test RecorderSAPUI5 测试记录器是一种帮忙您创立集成和零碎测试的工具。 您能够在任何 SAPUI5 应用程序中应用它来查看其用户界面、查看控件属性并获取 OPA5 和 UIVeri5 测试的代码片段。 从 1.74 版开始,它是 SAPUI5 框架的一部分。 About CI/CD with Project “Piper”“Piper”我的项目是 SAP 的继续集成和交付解决方案之一。 它提供了预配置的 Jenkins 管道,您能够在本人的 Jenkins 主基础架构中应用这些管道并依据您的需要进行调整。 “Piper” 我的项目由两个不同的局部组成: 一个共享库,其中蕴含应用 Jenkins 管道所需的步骤、场景和实用程序的形容一组可用于实现最佳实际流程的 Docker 镜像CTRL + SHIFT + ALT + T,应用这组快捷键,关上 SAP UI5 自带的 Test Recorder: 对着 Create 按钮单击右键,抉择 Press: ...

September 2, 2021 · 1 min · jiezi

关于saprfc:SAP-Spartacus-服务器端渲染的三种可能情形

执行到代码 166 行,将管制逻辑交给 expressEngine 之后,点 F8 后,下列三种不同色彩的代码块可能会被调用到: 绿色代码块阐明 timeout 指定的工夫距离到了。timeout:Time in milliseconds to wait for SSR rendering to happen, 期待 SSR 渲染开始的超时工夫,而不是 SSR 渲染的 duration. 黄色代码块SSR 执行工夫太长了,还没有实现。如果超过 maxRenderTime,会强行开释 concurrency slot, 容许新的申请被 SSR 响应。然而,对于超时的 SSR 服务申请,申请的资源并未开释,可能会导致内存透露。默认工夫为 5 分钟。 红色代码块如果执行到这里,并且 maxRenderTimeout 不为 undefined,阐明是失常的 SSR 渲染申请执行胜利的情景。 更多Jerry的原创文章,尽在:"汪子熙":

August 26, 2021 · 1 min · jiezi

关于saprfc:ABAP-真的会过时吗聊聊-ABAP-的过去现在和未来

这是 Jerry 2021 年的第 56 篇文章,也是汪子熙公众号总共第 333 篇原创文章。 本文目录SAP R/1:ABAP 老成持重SAP R/2:ABAP 初试锋芒SAP R/3:ABAP 一举成名ABAP 的语法SAP ALVABAP 的将来ABAP 未来会沦亡吗?SAP 总是长于依据市场最新的动静和变动,来调整其产品的命名策略。一个例子就是从诞生之初的 SAP HANA Cloud Platform,到 SAP Cloud Platform,再到现在的 SAP Business Technology Platform (简称 SAP BTP). 而作为 SAP 最胜利,最为人所知,最具代表性的标记之一,ABAP, 诞生之初的德文全称是 "Allgemeines Beleg Auswertungs Programm", 翻译成英语为 "General Program to Evaluate Documents", 中文意思为 "解决评估文档的通用程序"。 其后 ABAP 随同着 SAP R/2 到 SAP R/3 的成长,其全称也更名为 "Allgemeiner Berichts Aufbereitungs Prozessor", 翻译成英文为 "Generic Report Preparation Processor", 即 "通用报表编写处理器"。 ...

August 16, 2021 · 3 min · jiezi

关于saprfc:SAP-Commerce-Cloud-架构概述

SAP Commerce Cloud Architecture 只管咱们在“SAP Commerce Cloud 入门”一文中介绍了 SAP Commerce Cloud 的一些高级架构,但在此咱们将重点介绍在您的我的项目期间须要做出的一些理论架构决策。 应用 SAP Commerce Cloud 时,您可能会发现存在一些在 On-Premises 我的项目中不存在的限度。 然而,事实并非如此。这只是以不同形式设计您的解决方案的问题。 High-Level Software ArchitectureSAP Commerce Cloud 蕴含可用于创立定制商务解决方案的强制性和可选软件包的组合。 这些包含: 云自动化Microsoft Azure - 公共云基础架构提供商SAP 业务技术平台 - 用于托管 SAP Commerce Cloud Portal、SAP ntegration Suite 和 SAP Extension Suite 等应用程序/服务的业务平台Kubernetes - 用于编排运行商业解决方案所需的 docker 节点可定制的软件SAP Commerce - 在 Cloud Portal 构建过程中与您的自定义代码联合的外围平台Accelerator - 基于 SAP Commerce 中提供的模板的定制店面。Spartacus JavaScript 店面 - 一个解耦的开源店面,它应用全方位商务连贯 (OCC) API 与您的 SAP Commerce Cloud 环境进行通信。 无关更多详细信息,请参阅为您的 SAP Commerce Cloud 解决方案抉择要应用的店面。行业加速器(文档) - 行业特定店面模板数据中心(文档)- 用于为每个 SAP Commerce Cloud 环境导入/导出主数据的选项。 无关更多详细信息,请参阅 SAP Commerce Cloud 的集成选项。SAP 扩大套件 - 基于开源我的项目“Kyma”的微服务扩大层。 无关更多详细信息,请参阅 SAP Commerce Cloud 的集成选项。 ...

July 27, 2021 · 2 min · jiezi

关于saprfc:如何给-SAP-Spartacus-Storefront-创建新的页面

Creating New Pages and Components Spartacus 是一个单页面的应用程序,但它依然应用页面的概念来辨别应用程序内的不同视图。 Spartacus 页面来自 CMS,由插槽和组件形成。 页面蕴含插槽,插槽蕴含组件。 为了组织公共插槽和组件,Spartacus 反对页面模板。 页面模板蕴含布局以及可全局应用的组件,例如页眉和页脚局部。 Spartacus 从 CMS 接管每个页面,其中蕴含一个插槽和组件列表,该列表用于出现相应的组件。 Creating a New PageSpartacus 中的页面基于应用负责 API 从 SAP Commerce 后端获取的 CMS 页面。 来自 SAP Commerce 端的数据定义了元数据,如 url、题目等,以及页面的构造。 构造意味着可用的局部类型以及调配给这些局部的 CMS 组件。 Spartacus 接管此信息并为该构造提供真正的组件,包含逻辑、ui、响应式设计、款式等。因为这种定义的办法,它须要 2 个步骤来创立新的 Spartacus 页面。 首先,须要在 SAP Commerce 端创立 CMS 页面。 其次,须要创立 Spartacus 端的组件并将其调配给 CMS 组件。 要在 Spartacus 中创立新页面,首先须要在 CMS 中创立相干页面。 SmartEdit 提供了一个直观的向导,您能够应用它为内容目录创立类别、内容、电子邮件和产品页面。您还能够向页面增加限度,以指定在何种条件下向客户显示页面。 SmartEdit 提供了一个直观的向导来帮忙您为内容目录创立页面。您能够创立类别、内容、电子邮件和产品页面。创立页面时,您能够抉择创立主页面或变体页面。 主页(Primary page)是始终向所有用户显示的默认版本。您创立的所有变体页面都基于主页面。您不能为主页调配限度。当不存在变体页面或不存在与以后显示条件匹配的变体页面时,即显示条件不满足利用于现有的工夫、用户组、类别等限度规定时,显示主页面变体页面。 变体页面(viration page)基于主页面,但增加了限度。限度指定在何种条件下显示变体页面,例如当属于特定组的用户查看页面时,或者当用户在指定日期期间抉择页面并且存在要在指定日期显示的变体页面时.您能够为变体页面增加类别、工夫、用户组和其余限度。您能够增加到变体页面的限度类型取决于页面的类型。 创立页面时,您应该留神以下事项: ...

July 27, 2021 · 2 min · jiezi

关于saprfc:写给即将离开校园准备进入-SAP-研究院实习的朋友

这是一位匿名敌人向我发动的征询: 汪老师您好,我有幸下个月将会去SAP实习,自认为是一个自律勤奋好学的学生,然而还是很不自信,很缓和很缓和,第一次踏上社会走人工作岗位,怕去了当前什么也不会而被前辈们厌弃,毕竟书本上的货色跟实际差别很大,想请问一下您,如何成为SAP的优良实习生,有什么注意事项,这个问题其实很弱智,然而筹备功课做到后面能力让我更快的融入大家,更好的去工作,万一有什么禁忌也好防止在工作中产生误会。当然,我会好好把握这次百年不遇的机会,加倍的致力,认真虚心的学习,争取播种满满。谢谢您! 首先祝贺这位敌人,可能有机会进入 SAP 这家平凡的公司,开启本人职场生涯的第一站。这个问题我比拟有发言权,因为我2007年1月,也是以实习生的身份退出SAP成都研究院,并在当年年底顺利转正为FTE - Full Time Employee 即正式员工,并始终工作到当初。 集体认为,最重要的一点,就是 be honest and authentic. SAP 官方网站在介绍 SAP 企业文化时,有这样一句话: We build trust by being honest and authentic.咱们通过诚恳和真挚来建设信赖。 作为一个刚刚来到校园进入职场的 SAP 新人,团队的前辈们不会给你任何对于工作上的压力——你可能承受 SAP 各种标准的培训,从公司的流程制度,到你理论的工作内容都蕴含在内。当你在培训和随后的实习工作过程中,如果遇到各种艰难和问题,请及时真诚地向你身边的共事和你的 manager 提出来,始终和大家放弃顺畅的沟通。 其次,be proactive. 无论工作于哪个 SAP 产品,公司内网 Portal 上都有海量的学习材料,对于白纸一张的 SAP 新人,容易迷失在这些材料的陆地里。好在咱们都是在一个麻利开发团队中和其余共事一起工作,通常开发团队都有针对新共事工作上的 onboarding learning map 即学习路线图。在依据这些路线图学习时,多注意本人理论学习中遇到的问题,并积极主动地多和组内共事交换你在学习过程中遇到的问题,没准你的反馈,也能帮忙大家一起欠缺这些学习路线图,造福当前和你一样入职的新共事。 组内调配下来的工作肯定要全力以赴做好,这是你博得组内其余共事信赖的最好的开始。如果遇到难题,也不要本人闷着头搞,软件开发绝不提倡集体英雄主义。在你向其余共事求助时,讲清楚上面这些问题: 我遇到了一个问题,我想实现的成果 / 我想做的事件是 .....为了实现我的指标,我做了下列这些致力 / 尝试: ......然而在尝试过程中,我遇到了这些问题:...... 列出谬误音讯,或者谬误截屏我须要失去的帮忙是 ......这样能节俭其余共事的工夫,给你提出有针对性的倡议。 最初,be professional. 记住从第一天迈进公司大门起,你就不再是一名学生,而是一名职场人士了。一些点滴的细节问题,往往能决定共事们心中对你的评估。比方每个会议,比 outlook 上规定的工夫稍稍提前一两分钟,就在会议室门口期待,而不是到点之后才捷足先登。本人负责的工作工作如果和其余共事有依赖,并且遇到拦路虎不能马上解决时,肯定记得提前和组内其余共事探讨。 在软件开发公司,信赖是靠本人的实力和在团队的体现去博得的,既然在学校就是一位“自律勤奋好学”的学生,那么这曾经是胜利的一半了。无论进入 SAP 后在工作中应用的技术是否同学校里学到的一样,企业软件开发的复杂度都远远超过校园里做过的任何我的项目。但只有能充分利用 SAP 外部的各种学习和培训资源,多从组内其余共事身上学习,置信你肯定能实现本人的指标,成为一位优良的 SAP 实习生。 ...

July 10, 2021 · 1 min · jiezi

关于saprfc:SAP-Spartacus-中的依赖注入-Dependency-Injection-介绍

先理解 Angular 中的依赖注入 依赖项是指某个类执行其性能所需的服务或对象。依赖项注入(DI)是一种设计模式,在这种设计模式中,类会从内部源申请依赖项而不是让类本人来创立它们。Angular 的 DI 框架会在实例化某个类时为其提供依赖。你能够应用 Angular DI 来进步应用程序的灵活性和模块化水平。 如何创立一个新的能够被注入的 service ?命令行:ng generate service heroes/hero 主动生成的代码,留神注解 @Injectable: import { Injectable } from '@angular/core';@Injectable({ providedIn: 'root',})export class HeroService { constructor() { }}@Injectable() 装璜器会指定 Angular 能够在 DI 体系中应用此类。元数据 providedIn: 'root' 示意 HeroService 在整个应用程序中都是可见的。 配置提供者通过配置提供者,你能够把服务提供给那些须要它们的利用部件。 依赖提供者会应用 DI 令牌来配置注入器,注入器会用它来提供这个依赖值的具体的、运行时版本。 如果你把服务类指定为提供者令牌,那么注入器的默认行为是用 new 来实例化那个类。 在上面这个例子中,Logger 类提供了 Logger 的实例。 providers: [Logger]当应用提供者配置注入器时,会将该提供者与依赖项注入令牌(或叫 DI 令牌)关联起来。注入器容许 Angular 创立任何外部依赖项的映射。DI 令牌会充当该映射的键名。 当你应用 HeroService 类的类型来定义结构函数参数时,Angular 会注入与这个 HeroService 类令牌相关联的服务: constructor(heroService: HeroService)这里结构函数参数 heroService 实际上是一个令牌。 ...

July 10, 2021 · 2 min · jiezi

关于saprfc:如何在-SAP-BTP-上创建以及消费-Business-Rule-Service

官网链接:https://developers.sap.com/tu... Create a rule service interface for an application to invoke the decision logic by associating the rule to a ruleset of the rule service.创立 rule service interface 的目标:应用程序通过将规定与规定服务的规定集相关联来调用决策逻辑。 A rule service is an interface or an end point that enables an application to invoke a decision logic.rule service 能够看成一个接口或者 endpoint,应用程序通过调用 rule service,能够触发 decision logic. Rule set 是一系列 rule 的汇合,工作于某个特定的场景。 A rule set can be linked to a rule service so that the set of rules in the rule set gets executed when the rule service is deployed.规定集能够链接到规定服务,以便在部署规定服务时执行规定集内蕴含的所有规定。 ...

June 22, 2021 · 1 min · jiezi

关于saprfc:SAP-UI5-XML-视图里-label-和-text-控件文本对齐问题

如下图所示,我间接将 SAP UI5 Label 和 Text 控件放在一起,最初的后果不令人满意: <Label text="Refresh Count:" labelFor="counter" /> <Text id="counter"/>Label 和 Text 并未在同一行显示: 应用 HorizontalLayout 将Label 和 Text 包裹在一起,问题解决: <l:HorizontalLayout class="sapUiContentPadding" width="100%"> <Label text="Refresh Count:" labelFor="counter" /> <Text id="counter"/> </l:HorizontalLayout> 最初的成果: 更多Jerry的原创文章,尽在:"汪子熙":

June 5, 2021 · 1 min · jiezi

关于saprfc:使用SAP-CRM中间件从ERP下载具有层级结构的equipment

Requirement: in ERP there are two equipment created via tcode IE01, one is parent which holds the other child equipment. It is expected to replicate both to CRM, and the parent-children relationship still holds in CRM. (1) You should have already created two equipment as displayed in the screenshot above. How to specify equipment as parent:Open equipment via tcode IE02, In popup window, specify ID of parent equipment in “Superord.Equip.”: ...

September 8, 2020 · 2 min · jiezi

关于saprfc:SAP-Fiori-globalization实现原理之Amount显示的截断原理

You have observed the following behavior: the sales volume is displayed in detail view with1880 USD, while in master list, it is displayed as 2K for short. Why? The truncation behavior in master list is implemented by Fiori application to fulfill the product standard of Globalization requirement.The exact value for SalesVolume is 1880.00, And for the field in master list, there is a formatter to return the volume in short format: ...

September 4, 2020 · 2 min · jiezi

关于saprfc:使用ABAP代码消费SAP-Cloud-for-Customer的OData服务

In this blog, I will demonstrate how to create a new Opportunity by consuming C4C standard OData service via ABAP code.The related OData service for Opportunity with detailed explanation on its entity types could be found from SAP help: I will use a HTTP POST request to finish the creation. A example about how to organize post body could be found from C4C OData development guideline, where ServiceRequest is used for demonstration. I just make minor changes to make it also works on Opportunity.First I test it in postman to ensure the successful creation: ...

August 30, 2020 · 4 min · jiezi

关于saprfc:如何在SAP-C4C-AdvancedListPane上批量执行若干BO实例的action

My series of Cloud Application Studio BlogsHow to detect EditMode in an Embedded ComponentStep by step to enable your custom BO with attachment upload functionalityStep by step to create an Adobe Print form in Cloud application StudioHow to render PDF which displays picture from the image attachment of your custom BOHow to get current logged on business user’s employee information and assigned organization unit via ABSLHow to implement dynamic access control based on custom BO using OWLHow to make Code List Restriction work when control field and restricted field are not on the same BOHow to implement custom number range using custom business objectTwo approaches to create Code List in Cloud StudioCreate Dynamic Code List via Custom Business Object AssociationStep by step to develop Thing Type based navigation and BO Object based navigationPut Extension field into embedded component and make it visible in Standard UIOne possible cause that embedded component fails to display in UIStep by step to create HTML Mashup and make it visible in UIStep by step to enable Text Collection for your custom BOAutomatically send an Email notification to line manager via Workflow in Account applicationStep by step to create Object Value Selector in Cloud Application StudioTwo approaches to fill an UI field with dedicated logic implemented in Cloud Application StudioHow to execute BO action on multiple selected BO instances in AdvancedListPaneHow to add custom validation logic on mobile phone field in Contact TIRecently one partner asked me about this question. Suppose I have a custom BO with one Date field “CloseDate”, and one indicator field “IsOverDue”. ...

August 28, 2020 · 4 min · jiezi

关于saprfc:SAP-CRM-中间件遇到SAPPSPROSMATENHANCCOMM-错误的解决办法

SAP CRM 中间件Request download里,遇到/SAPPSPRO/S_MAT_ENHANC_COMM 谬误的解决办法 When I perform product request download, I found that the bapistructures sent from ERP only contains one entry with tabname = /SAPPSPRO/S_MAT_ENHANC_COMM without any actual material data. As a result no product is created in CRM. This issue could be analyzed in ERP: Check variable T_BAPISTRUCTURES content before CRM_FILTER_DOWNLOAD_DATA is called. Here I found the product specified in the download request in CRM via tcode R3AR2 has already been extracted successfully in ERP. As a result it must be filtered out in some part of subsequent processing. ...

August 27, 2020 · 1 min · jiezi

关于saprfc:SAP-WebClient-UI是如何维护表格选中状态的

I have been working as a Fiori application developer in SAP for almost two years, which means now I use Chrome development tool in my daily work for trouble shooting instead of ABAP debugger when I was working using CRM WebUI. Yesterday I was assigned with an incident about CRM Lead application in WebUI, and I am glad to figure out that Chrome development tool can also do me a great favor for my trouble shooting in WebUI issue. I share with my experience learned in this blog. ...

August 21, 2020 · 3 min · jiezi

关于saprfc:获得某个时间段内修改过的所有ABAP对象列表

Sometimes we need to get a list of changed objects by the given user at the given time period, there is a small tip to quickly get this list with little effort. approach1query the table VRSD with user name and date as query parameter: Each entry of list contains a corresponding transport request number ( in column KORRNUM ) However, this approach could not contain modifications on local objects.The version number (5) and transport request number(AG3K074711) could also be reviewed in class builder menu Utilities->Versions->Version management: ...

August 20, 2020 · 1 min · jiezi

一段让人瑟瑟发抖的ABAP代码

昨天11月1日是万圣节,Jerry在继续忙着调研SAP Commerce Cloud里的产品主数据管理。晚上回家到SAP国外的社交媒体上一看,好热闹啊。国外的SAP从业者们纷纷以各种各样的方式庆祝万圣节。 西方的万圣节也是一个历史悠久的节日了:早在两千多年前,欧洲基督教会就把每年的11月1日定为“天下圣徒之日”(All Hallows' Day)。这一天被看作是夏天正式结束之日,也就是新年伊始,严酷的冬天开始的第一天。当时的人们相信,故人的亡灵会在这一天回到故居地,在活人身上找寻生灵,借此再生。而活人则惧怕死人的魂灵来夺生,于是人们在这一天熄掉炉火和烛光,让死人的魂灵无法找到活人,同时又把自己打扮成妖魔鬼怪把死人的魂灵吓走。 所以,国外的ABAP开发者们在这天也不甘寂寞,一位老哥提出了用“Scare with ABAP”的主题来搞事情,为万圣节增添一些节日气氛。 这一提议得到了大家的纷纷响应。 对于这种ABAP字符串模板和字符串内嵌函数的使用,肯定不能够让ABAP老司机们瑟瑟发抖。 这种程度的ABAP代码显然也不足以让ABAP老司机们受到惊吓: 那么看看Jerry这段ABAP代码?没有任何语法错误,能够成功激活,成功执行。 源代码如下: REPORT 汪子熙的Report,吓死人了!!!!!. INCLUDE NOT. IF NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOT NOTNOT NOT NOT NOT NOT NOT NOT NOT NOT NOT !NOT OR NOTNOT NOT !NOT OR NOT NOT NOT NOT NOT=>NOT( NOT ) ANDNOT NOT NOT !NOT OR NOT NOT !NOT AND NOT !NOT ... NOT. ...

November 5, 2019 · 1 min · jiezi

利用ABAP-740的新关键字REDUCE完成一个实际工作任务

ABAP 740从2013年发布至今已经过去很长的时间了,下面这张图来自SAP社区博客: ABAP News for Release 7.40 – What is ABAP 7.40? 图中的ABAP 8.0, 即现在的SAP Cloud for Customer和Business By Design后台使用的ABAP版本NGAP - Next Generation ABAP Platform,里面存在不少只在8.0版本可用的关键字和语言特性。 因为C4C和BYD的ABAP后台,客户和partners们是无法访问的,所以咱们回到ABAP 740这个版本。从该版本开始,ABAP支持了很多新的关键字和语法特性,“看起来有点不像传统的ABAP编程语言了”。 本文咱们就来看一个具体的例子:ABAP 740里的一个新关键字REDUCE. 这个关键字的作用和在大规模数据集并行计算领域里广泛使用的"Map-Reduce"编程模型中的Reduce操作类似,可以按照字面意思理解为“归约”。 下图是Map Reduce框架的工作步骤,统计一个海量输入数据集(比如大于1TB)中的单词出现次数。作为ABAP开发人员,我们没必要了解Map Reduce框架的每个执行步骤,只需紧盯框架的输入,以及执行结果就行了。 回到Jerry接受的实际工作任务。德国同事让Jerry在某个CRM测试系统上做个统计,列出在数据库表CRM_JSTO里,OBTYP(Object Type)和STSMA(Status Schema)这两列拥有相同值的内表行的个数。大家可以把"OBTYP和STSMA两列具有相同值的内表行"类比成上图中重复出现的单词。 下图是CRM_JSTO的部分行: 下图是Jerry完成的任务: 测试系统上内表一共有55多万行,其中有90279行,只维护了OBTYP为TGP,而没有维护STSMA. 排名第二的是COH和CRMLEAD的组合,出现了78722次。 稍稍做过一些ABAP开发的朋友们,一定会立即写出下面的代码: 利用SELECT COUNT直接在数据库层完成统计工作。这也是SAP推荐的做法,所谓Code pusudown准则,即能放到HANA数据库层面进行的操作,就尽量放进去,以充分利用HANA强大的计算能力。在数据库能够完成计算逻辑的前提下,尽量避免把计算逻辑放到Netweaver ABAP应用层去做。 不过,我们也需要注意到这种方式的局限性。Jerry之前曾经引用过SAP CTO的名言: There is no future with ABAP aloneThere is no future in SAP without ABAP ...

November 4, 2019 · 1 min · jiezi

使用代码列出金庸小说中使用过的所有成语

去年的今天,金庸与世长辞,当时Jerry在成都地铁一号线下班的路上得知了这个消息,回到家立即写了一篇文章来悼念:金庸的武侠世界和SAP的江湖。 一年的时间转瞬即逝,大家都忙碌于各自的生活,很多人对金老的离世已经淡忘了,不过Jerry这种金庸的死忠粉,对于这个一周年忌日还是记得很清楚的。 因为Jerry手上事情很多,没时间在这个特殊的日子写文章纪念了,就发一小段代码吧。 需求:列出金庸任意一本小说里出现的所有成语。 实现:Jerry部署在Github上的一个web应用,链接如下: http://jerrywang-sap.cn/Fiori... 首先点击超链接“成语全集”: 点击之后,存储于该web应用本地存储的一个文本文件里的全部19830个成语,以树的形式加载到内存中,并显示在网页上: 然后复制一本金庸小说的内容,粘贴到网页的“内容”区域,点击按钮“测试”: 可以看到仅仅用了246毫秒,就将这部一百多万字的《倚天屠龙记》里出现的所有成语,以红色高亮的方式高亮出来。 这个功能咋实现的?Chrome打开Jerry的网页,F12开启开发者工具,就能看到JavaScript源代码,当然也可以从我的Github上获得. Jerry简单讲下实现原理。Web应用里有一个文本文件,里面维护了汉语里全部的成语,通过分号分隔。 运行时,这些内容会被加载到内存中,构建成一棵树,如下图所示: 其中叶节点以属性end为true区分。 成语检索的核心逻辑位于search函数里,让我们用《笑傲江湖》里一句响亮的口号“日月神教千秋万载,一统江湖”来单步调试,了解其实现逻辑。 进入165行的外层while循环,再进入173行的内层for循环,检测是否有测试字符串第一个字符“日”开头的成语。因为成语是由4个字符组成,所以需要用内层for循环逐一试探,如果遇到tblCur.end为true的元素,说明在测试字符串中发现了一个成语。 下图是内层for循环第一次执行后的tblCur内容: 内层循环执行第二次,此时tblCur指向一棵由所有“日月”开头的成语组成的树: 执行内层循环的第三次迭代,因为在树“日-月”这个分支下面没有“神”这个节点,所以结束当前的内层循环,通过break返回到外层的while循环,进行输入字符串第二个字符“月”的新一轮试探,以此类推。 最后从“千”这个字符出发,沿着内存中的树经过路径"秋-万",最后来到end属性为true的叶节点“载”,记下“千”在输入字符串中的偏移量,存到一个数组arrMatch中去。 待输入字符串全部试探完毕后,根据arrMatch中存放的偏移量,高亮显示对应的字符串,完成检索。 树这个数据结构在这个需求的实现里有着完美的表现。 金庸虽然离开了我们,但他笔下那些人物和发生的故事,将永远流传于这个世上。 更多阅读金庸的武侠世界和SAP的江湖金庸和古龙,Netweaver和微服务,以及SAP Hybris Revenue Cloud作为一名SAP从业人员,需要专门学习数学么要获取更多Jerry的原创文章,请关注公众号"汪子熙":

November 4, 2019 · 1 min · jiezi

如何在backoffice里创建Hybris-image-container以及分配给product

登录backoffice,在media container视图点击新建按钮: Catalog选择Product Catalog: 在Properties界面,可以选择media实例放入该container: 同步到online catalog: 同步之后,就可以把这个media container分配给product了: 在product的Administration标签页,Gallery images字段里分配media container: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

November 4, 2019 · 1 min · jiezi

hybris-backoffice创建product遇到的synchronization问题和解答

我从product DSC-H20_MD clone了一个新的product,code为DSC-H20_MD1 因为它的状态有个红灯: 所以我点了这个sync按钮: 结果报这个错: 之后这个clone出来的product就无法从backoffice里搜索到了。请教一下这种情况该如何解决呢? 后台这个clone出来的product也无法从product表里读取出来了: Jerry请教了兄弟团队的Hybris专家Kevin,得到了解答: 因为我直接clone的online版本,而stage版本里是没有这个product的,同步的意思是以stage为基准去更新online,所以我一同步就会把online里的删掉。所以我选择从一个stage版本的product clone就好了。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

November 4, 2019 · 1 min · jiezi

hybris-commerce-storefront的产品搜索功能

在Hybris Commerce Cloud的storefront的搜索栏键入一些字母,每次键入,会触发一个发送到后台的http请求实现live search的功能: http url如下:https://&lt;host>/electronics/en/search/autocomplete/SearchBox?term=DSC-H20_MD 注意我们键入的是产品名称,而非产品code,后者只能从Chrome开发者工具的http response里观察到: 这里能清楚地看到,DSC-H20_MD是产品的名称。 从backoffice也能清楚看到product code和name这两个字段的区分: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

November 4, 2019 · 1 min · jiezi

Hybris做增强的两种方式In-App-Extension和Side-by-Side-Extension

传统的扩展方式,即In-App增强方式,Hybris开发顾问通过Extensions的方式进行二次开发,生成的Custom Extensions同Hybris标准的Extensions一起参加构建,构建结束后新功能方可使用。在构架过程中,Hybris实例暂时无法访问(down time)。这种方式允许Hybris顾问以较高的灵活度在Custom Extensions里编写代码来实现增强需求。<img width="657" alt="clipboard" src="https://user-images.githubuse...;> 借助SAP Cloud Platform Extension Factory实现的Side-by-side增强,不需要修改Hybris实例(图二虽然标注的是Commerce Cloud,但对Hybris Commerce On-Premises版本仍然适用)本身的代码,而只需在Extension Factory上编写针对Hybris标准程序发布事件的响应处理函数。例如客户需求是当Hybris Storefront上有新用户注册,或者新订单生成时,实现一段自定义逻辑——这类事件驱动的增强需求,采用Extension Factory增强,开发效率较In-App增强更高,实现更轻量,但前提是Hybris标准应用在需要被增强的业务流程上对事件发布有完善的支持。<img width="791" alt="clipboard2" src="https://user-images.githubuse...;>

November 4, 2019 · 1 min · jiezi

我是怎么和SAP结缘的-Jerry的SAP校园招聘之路

2006年9月,结束了一年的北京中科院实习后,我回到了电子科技大学,此时已经是研三上学期了。有着“金九银十”之称的秋季校园招聘正式开始了。 准备好了简历后,Jerry也加入了浩浩荡荡的求职大军。十年前的计算机专业求职市场和今天有很大不同——我们的首选是微软,谷歌,思科,IBM等外企,包括在成都本地设有研发中心的诺基亚,摩托罗拉,阿尔卡特等通讯企业。而现在求职市场上炙手可热的BAT,十年前在我们学生心中的影响力还远远不是现在可以比的。 当时Jerry所在的电子科技大学计算机8020教研室也有很多师兄师姐在成都这些本土通信企业工作,Jerry平时听他们介绍里面的工作环境非常好,工资待遇在成都也非常有竞争力,在加上当时外企在学生心中普遍都具有光环,所以找工作时将这些通信企业作为首选。 不巧的是2006年秋季,这些通讯企业在成都本地几乎没有校园招聘,Jerry也曾打电话询问在里面工作的几位师兄师姐,得到的答复是只有社招,因此首选去通讯企业的计划没法实现了。 电子科技大学在当年和现在一样,是向华为和中兴这两家公司输送毕业生的大户。华为和中兴的笔试我至今记得很清楚,是在清水河校区的第二教学楼进行的,因为参加笔试的同学太多了,那规模好比某一学科的期末考试。笔试题过了这么多年已经印象很模糊了,并不是编程基础的技术题目,而是以逻辑思维题为主,有点像考公务员题目。这两家公司的笔试环节Jerry都顺利通过了,华为的面试第一轮是小组面试,考官出一道题目,同学们组成一个小组讨论,然后由一位同学汇报,完毕后考官发问,所有组员回答。据说华为的考官们喜欢通过这种方式考察应聘者能否承受压力。后来面试结束后,等了一段时间,接到了华为HR的电话,询问我是否接受因为工作原因而分配到不同的城市去工作,就是所谓的是否“接受调配”,我对这个是有些抗拒的,所以回答了否,也就没有下文了。 当时我们有一个不成文的传统,把华为和中兴的offer拿在手上保底,然后再寻找更好的。于是Jerry顺利的拿到了中兴的offer,然后继续参加仍在进行的各大公司秋季校园招聘。 让Jerry印象深刻的是,2006年的时候,深圳迅雷也曾经到电子科大来招聘过,当时的迅雷,应该只是一个一百多人的小公司,尽管当时几乎我们每一位同学的电脑里都装了这款下载软件。迅雷的技术人员对我们教研室同学的项目背景很感兴趣,因为我们在北京实习,做的就是一个P2SP的内容分发项目(顺便说一句,两千年初那段时间,BT和电驴这种P2P内容分发软件在国内真的很火啊)。当时Jerry通过了迅雷的比试和面试,然后在电子科大宾馆里参加了HR面试,HR是一位小伙子,当时他谈了很多对迅雷美好前景的憧憬。 Jerry满以为能拿到迅雷的offer了,没过多久,我的邮箱里收到了一封迅雷要求加试的笔试题目,要求完成后把源代码发到邮箱里。因为我当时还在准备其他公司的笔试,所以就没有理会。 后来2014年的时候,看到迅雷成功上市的消息,因为当时在SAP已经工作7年了,对这消息也没有任何感觉。 因为是大四上学期了,专业课和外出实习都已结束,除了找工作之外我们没有其他事情可以做,因为工作没落实,也没心思写论文,所以大家即使手上已经有了offer,也仍然继续参加其他公司的面试笔试。后来我又陆续拿了一些中小公司的offer,不过和现在的同学们动则互联网大厂可观的package相比不值一提,这里就略过了。 稍稍值得一提的就是深圳腾讯的offer,岗位和Jerry研究生所学非常对口:Linux后台开发工程师,进去之后应该是从事后台服务器端开发。Jerry所在的8020教研室从开创的祖师卢教授到众多在电子科大留校任教的师兄们一直都在和Unix系统打交道,所以我们教研室每位成员的Linux编程功底都非常扎实。 Jerry当初为什么要选择成都SAP而不是深圳腾讯?可能Oliver之前的演讲打动了我,也可能是因为2006年的腾讯,在学生中的影响力还远远不能和十三年后的今天相比。 2006年10月份下旬的时候,SAP来电子科技大学开宣讲会了,在科大的厦新厅开的。当时Jerry对SAP一无所知,不过我所在的教研室有两位很优秀的同学已经在里面实习一段时间了。他们告诉我,这家德国企业是世界上非常顶尖的企业管理软件公司,在成都软件园刚刚创建研发中心,现在招聘的正式员工都是在该行业摸爬滚打的精英。即使是实习生进去,如果表现优秀,也有可能被送往德国总部去培训。 有了这两位同教研室的同学提供的信息,我按时参加了SAP的招聘会。会上主讲的是Wang Oliver,也就是后来我老板的老板。Oliver拿起讲台前的一瓶矿泉水,告诉我们,这瓶水从采集到生产,再到最后出现在超市货架里,几乎每个步骤背后都离不开SAP软件的管理,这让我们觉得这家公司的软件如此神奇和伟大。 当时因为宣传的原因,SAP还不像今天这样,被广大学生所熟知。虽然Oliver的演讲里那句“The Best Run Businesses Run SAP”给我们学生留下了深刻的印象,但是和演讲的幻灯片里那些高大上的描述相比,我们还是不太清楚假设进入SAP后,我们具体的工作内容是什么。宣讲会结束,到了投递简历的时候,我在我简历上写下的应聘职位是“Associate Application Consultant”. 这是我在英文课本以外的地方第一次使用Consultant这个词。 等到11月份,Jerry在电子科大的物理电子学院的教学楼里参加了SAP成都的笔试。题目是纯英文的阅读理解和推理题。笔试通过后,Jerry在参加一家公司面试等待的间隙,接到了SAP HR的电话面试,时间不长,主要是HR用英文提问,我用英文作答。 接下来的第一轮现场面试,是到位于成都天府软件园B区6栋3楼的SAP成都研发服务中心参加小组群面。群面的形式和之前提到的华为群面类似,同学们分成人数相同的几个组,同时根据考官出的题目开始小组讨论,考官们在旁观察,等规定的时间结束之后,每个小组的每位组员需要用英语来汇报题目要求回答的各个维度的问题。 和Jerry当时一起参加小组面试的几位同学,她们流利的口语和超出一般学生的那份成熟,给当时的我留下了深刻的印象。有缘的是,这几位同学现在也都还留在成都SAP,而且早已成为各自团队的核心成员。时间过得真快,12年转瞬即逝。 小组面试结束后,是两轮的一对一面试,很有意思的是,这两轮的面试官都是Jerry后来的同事 :) 这一系列的面试结束后,等了两周,我终于收到了SAP成都的实习offer,此时已经是2006年12月底了。拿着SAP的offer,我度过了一个愉快的元旦。2007年1月,我以实习生的身份加入了SAP成都,领到了属于自己的第一台ThinkPad电脑,型号为经典的T60. 接下来就是大家熟悉的故事,我顺利通过了考核,结束了一年的实习生涯,在2007年底转正,成为一位SAP成都的正式员工。 这就是Jerry和SAP结缘的始末。各位SAP从业者,你们是怎样进入SAP这个行业的呢?欢迎留言,说出你的故事。感谢阅读。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

October 14, 2019 · 1 min · jiezi

如何在SAP云平台ABAP编程环境里创建自己的Z表

选中ABAP包,右键创建一个新的Database Table: 维护表名为ZBOOKING: 表实现的源代码: @EndUserText.label : 'Jerry''s booking'@AbapCatalog.enhancementCategory : #NOT_EXTENSIBLE@AbapCatalog.tableCategory : #TRANSPARENT@AbapCatalog.deliveryClass : #A@AbapCatalog.dataMaintenance : #LIMITEDdefine table zbooking { key client : abap.clnt not null; key booking : abap.int4 not null; customername : abap.char(50); numberofpassengers : abap.int2; emailaddress : abap.char(50); country : abap.char(50); dateofbooking : timestampl; dateoftravel : timestampl; @Semantics.amount.currencyCode : 'zbooking.currencycode' cost : abap.curr(15,2); currencycode : abap.cuky; lastchangedat : timestampl;}激活: 下一步,创建一个ABAP类,以代码的方式往Z表里插入数据。 这个ABAP类要实现if_oo_adt_classrun接口,类似Java里的console应用: ...

October 14, 2019 · 1 min · jiezi

如何在SAP云平台ABAP编程环境里把CDS-view暴露成OData服务

Jerry 2016年在学习SAP CDS view时,曾经写过一个CDS view的自学系列,其中有一篇提到了一个很方便的注解: @OData.publish: true 加上这个注解的CDS view,一旦激活后就会在ABAP Netweaver自动生成一个OData服务,在事务码/IWFND/MAINT_SERVICE里将其搜索出来并添加,就能够以OData服务的方式,消费这个view暴露出来的数据了。 当然@OData.publish这个注解为什么有这种神奇的魔力,在Jerry之前的博客里有详细介绍。 那么到了SAP云平台ABAP环境上,因为我们无法访问SAP GUI,所以要实现同样的效果,无法直接照搬上述步骤。幸运的是,在云上进行CDS view暴露的步骤依然简洁,整个过程5分钟就能搞定。 用ABAP Development Tools像登录On-Premises ABAP系统那样登录ABAP云环境,新建一个Service definition: 在Service的实现体里,使用关键字expose将ABAP环境里的标准view,I_Currency以Service的方式暴露出来。 这个Service需要以Service Binding的方式暴露成OData服务: 把第一步创建的Service分配给这个Service Binding: 注意下图右边的Service Details标签页里,此时是空的。点击Publish按钮: 发布成功后,我们看到了之前在Service实现里把I_Currency暴露成的名为Currency的实体: 对这个Currency Entity点右键,选择Open Fiori Elements App Preview,就能在预览模式下通过一个标准通用的Fiori Elements应用把当前系统上I_Currency里的数据显示出来: 点击这个Service URL超链接,也能直接打开对应OData服务的元数据(metadata)链接: 至此我们就可以用各种消费端来使用这个通过I_Currency暴露成的OData服务了,当然也可以开发一个SAP Fiori来消费,Jerry后续会介绍。 感谢阅读。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

October 14, 2019 · 1 min · jiezi

云端的ABAP-Restful服务开发

愉快的暑假结束了,今天是小朋友新学期开学后的第一个周日,不知道各位家长是否和小朋友们一起,已经适应了新学期的生活了么?Jerry从少的可怜的属于自己的周末时光挤了一小部分时间出来,写了这篇文章。 Jerry之前的一篇文章 从ABAP Netweaver的SICF到SAP Kyma的Lambda Function,我曾经提到过,如果想将ABAP Netweaver里的资源以Restful API的方式暴露出来,SICF这个事务码绝对是一大利器。 我们只需要在SICF里合适的路径下创建节点,为该节点创建一个ABAP类,就可以专注于实现接口定义的方法IF_HTTP_EXTENSION~HANDLE_REQUEST, 在里面编写应用逻辑了。应用开发人员无需关注和操心这些ABAP类什么时候被实例化和调用,可以把这个HANDLE_REQUEST方法看作是一个回调函数,当请求到来时,由Netweaver的ICF框架(Internet Communication Framework)负责把请求路由到对应的ICF节点并创建ABAP类,调用HANDLE_REQUEST方法。每个SICF节点会根据其路径被分配一个url, 如果是Corporate网络里,用浏览器或者编程语言直接访问该url,就能消费SICF暴露的资源了。如果想让这个位于Corporate网络内的url被Internet网络访问,就得借助SAP Cloud Connector: 具体步骤在我之前的文章使用Java+SAP云平台+SAP Cloud Connector调用ABAP On-Premise系统里的函数 里介绍过。 对于ABAP开发人员来说,一个好消息是,SAP Cloud Platform如今也支持ABAP运行环境了。现在我们通过在SAP云平台 ABAP运行环境里完成类似之前在On-Premises ABAP系统的SICF事务码里的开发任务,来感受ABAP到了云端之后,给ABAP开发者带来的巨大便利。 按照Jerry之前的文章在SAP云平台ABAP编程环境上编写第一段ABAP程序 里介绍的步骤,通过ABAP Development Tools连接SAP云平台 ABAP运行环境的一个实例,完成登录后,后续的操作步骤,同使用ABAP Development Tools连接一个On-Premises ABAP系统,几乎没有差别。 下图是在云上的ABAP环境里,允许我们创建的ABAP对象列表,既有ABAP开发人员感到亲切的ABAP字段对象,ABAP开发包,ABAP消息类等等,也有上了云端之后的新面孔,比如Cloud Communication Management和Cloud IAM等。为了完成在On-Premises的SICF事务码里的开发工作,现在我们要在云上的ABAP环境里创建一个新的HTTP Service: 新建一个名为ZHELLOWORLD的service,创建完毕之后界面如下: ABAP老司机们看到这界面,立即知道下一步怎么做了吧。点击Handler class,就可以进入ABAP类的编辑界面,实现这个HTTP服务的业务逻辑。而通过url字段里维护的值,我们可以在PC或移动设备里,浏览器或代码里访问这个服务。该服务实现类和On-Premises的区别,不过是接口名称从IF_HTTP_EXTENSION换成了IF_HTTP_SERVICE_EXTENSION. 当然,前者因为是直接在云端编写的ABAP代码,所以还要遵循Jerry之前的文章 在SAP云平台ABAP编程环境上编写第一段ABAP程序 里提到的那些限制。 上述的ABAP代码只是简单地返回给消费者一个Hello World的文本信息,保存激活之后,把url贴到浏览器里,就能看到期望的Hello World: 我们从url里,容易得出这样的结论,SAP Cloud Platform ABAP运行环境里支持创建的HTTP服务,其实现原理,其实就是在Netweaver服务器的SICF路径/sap/bc/http/sap/下面增加一个新的节点罢了,只是这个操作,在云端不再需要由ABAP开发人员手动完成,云端的ABAP环境,会自动创建这一底层设施。希望传统ABAP开发人员,能从这个最简单的Hello World级别的例子,体会到云端ABAP开发的便利之处。感谢阅读。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

October 14, 2019 · 1 min · jiezi

如何在Web应用里消费SAP-Leonardo的机器学习API

去年5月的时候,Jerry曾经写了一篇文章:使用Java程序消费SAP Leonardo的机器学习API,而最近另外做的一个项目,需要在Web应用里做同样的事情。 因为有了前一篇文章的铺垫,避免了很多重复的工作量。本文还是选择使用SAP Leonardo里的一个Product Image Classification API,即给定一张产品的图片,该API能识别出此产品的类别。 再回顾下这个API的功能:该API的模型是由SAP基于大约5万张Icecat图片训练而成,能区分29种不同的类别,这些类别具体罗列于官方文档上,比如电脑显示器,数码相机,外部存储设备,键盘,液晶电视,手机充电器,笔记本和其他外设等等。如果我们消费这个API时指定的图片代表的产品不属于这29种类别之一,API的表现如何?先卖个关子,文末解答。 关于如何在api.sap.com里找到这个API并且在API console里测试,请参考Jerry之前的文章:使用Java程序消费SAP Leonardo的机器学习API。 这里假定我们已经找到了该API,点击进入明细页面,将API Key复制下来,后续的UI5应用需要使用到。 然后进入SAP云平台的Neo环境。Jerry这个练习,使用免费的SAP Cloud Platform Neo测试环境即可。 在Service列表里找到WebIDE——我们将使用WebIDE进行UI5应用的开发。 Jerry已经开发好了一个UI5应用上传到我的Github上了:https://github.com/i042416/Ma... 大家可以直接在WebIDE里clone这个仓库,或者把仓库的内容以zip包的形式下载到本地,再使用WebIDE的本地Import功能导入。 我们要告诉UI5应用这个API的url,因此在Neo环境里创建一个Destination(作用和ABAP Netweaver事务码SM59里创建的Destination相同): 属性如上图所示,因为是Neo测试环境,所以url为对应的sandbox环境:https://sandbox.api.sap.com/ml 记下这个Destination名称sapui5ml-api, 因为稍后的UI5代码里需要使用。 记得维护额外的属性WebIDEnabled为true,这样该Destination才能在UI5应用里被使用。点击Check Connection确保看到绿灯。 打开WebIDE里UI5工程里的settings.json文件,将您之前从API console里拷贝的API Key粘贴到此处: 在项目根目录下的neo-app.json文件里,把类型为destination的target对象的名称维护成之前在SAP Cloud Platform Cockpit里创建的destination相同的名称。 运行这个UI5应用,能看到如下界面: 做一些简单的测试: SAP Leonardo的机器学习API,识别出这张图片有74.7%的可能性是一台笔记本电脑,13.8%的可能性是键盘,11.3%的可能性是Tablets。 点击按钮View JSON,能看到调用SAP Leonardo API返回的技术明细。 鼠标的图片也成功识别出来了: 本文开始曾经提到这个API能识别出29种不同的产品类别,现在换一种产品,如下图: 这是Jerry小时候就很痴迷的《终结者》系列的T800,我在2017年回复SAP社区上一篇博客时也引用到了这款经典的模型,和阿诺德 - 施瓦辛格那句激励无数中老年程序员的著名台词:I am old but I am NOT OBSOLETE ...

July 14, 2019 · 1 min · jiezi

如何把SAP-WebIDE里的Web项目同Github仓库连接起来

我们在SAP WebIDE里进行UI5应用开发时,当然也希望能将开发的代码纳入到github版本管理中去。 步骤其实非常简单。 右键点击WebIDE里UI5应用,git->Initialize Local Repository: 输入github上的用户名和密码,稍后WebIDE会用这个credential与Github建立连接。 在Github上新建一个空的代码仓库: 把生成的url复制下来,粘贴到SAP WebIDE的git repository配置对话框中: 然后再使用右键菜单创建一个远端branch,取名Master: 之后,利用右侧的git面板提供的各种命令,即可进行常规的commit,pull,push等操作。 在WebIDE里触发的Github操作成功施加到了Github的仓库里 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

July 14, 2019 · 1 min · jiezi

部署在SAP-Cloud-Platform-CloudFoundry环境的应用如何消费SAP-Leonardo机器学习API

Jerry的前一篇文章 如何在Web应用里消费SAP Leonardo的机器学习API 里介绍的例子是Neo测试环境的Web应用消费sandbox版本的机器学习API,url如下: https://sandbox.api.sap.com/ml 本文介绍一个部署在SAP Cloud Platform CloudFoundry环境下的应用,如何消费SAP Leonardo上的机器学习API。 登录SAP Cloud Platform Cockpit,进入CloudFoundry环境的Service Marketplace,找到SAP Leonardo机器学习的服务,单击该服务的超链接进入明细页面: 创建一个新的服务实例: Service Plan就选默认的standard: 给这个服务实例取个名字: 单击这个创建好的服务实例,然后创建一个新的Service Key: 给Service Key也取个名字。 我们通过创建Service instance进而创建Service Key的目的,是为了得到下图的clientid和clientsecret。 而我们拿到clientid和clientsecret,是为了用它们换取OAuth2.0协议里的access token. 关于更多clientid和clientsecret基于OAuth2.0换取access token 的细节,请参考Jerry的文章:OAuth 2.0协议在SAP产品中的应用。 除了clientid和clientsecret外,我们还能在service key里得到当前这个SAP Cloud Platform CloudFoundry环境上所有可用的机器学习API的url,它们全部维护在节点serviceurls里: 注意观察,此时的IMAGE_CLASSIFICATION这个API 的url,路径已经从上一篇文章的https://sandbox.api.sap.com/ml,变成了包含CloudFoundry环境信息的: https://mlftrial-image-classi... 接下来通过clientid和client secret换取access token,使用下面这个链接里的应用获得access Token: https://generate_ml_token.cfa... 把这个Bearer开头的access Token记录下来。 之前创建service key时,我们已经从创建结果里获得了基于产品图片识别类别的API url: https://mlftrial-image-classi... 浏览器里访问这个url,得到一个采用Swagger(一个采用RESTFUL接口,基于YAML和JSON语言的API文档在线自动生成工具)实现的API控制台: 点击try out,从本地选择一张图片,我还是选择的这张图片: ...

July 14, 2019 · 1 min · jiezi

当SAP云平台account的service-Marke-place里找不到Machine-Learning服务该怎么办

问题症状:我在CloudFoundry环境的Service Market place里根本找不到Leonardo ML foundation这组服务。 解决方案: 进入global Account->Entitlements->Subaccount Assignments, 点击Configure Entitlements: 再点击Add Service Plans按钮: 从Service Catalog的All Categories列表里,选中SAP Leonardo Machine Learning foundation: 之后这个Service就出现在Service Assignments里了: 现在,该account的Service Marketplace里终于能看见SAP Leonardo Machine Learning服务了。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

July 14, 2019 · 1 min · jiezi

使用CDS-view开发SAP-Marketing-contact的facet追溯工具

这篇SAP社区博客里,我的一位同事介绍了SAP Marketing里contact facet数据模型的存储表:https://blogs.sap.com/2016/07... 主要是这两张表: CUAND_CE_IC_ROOT CUAND_CE_IC_FCET 现在我的需求是:对系统里Contact的Origin Data数据来源渠道个数从高到低的顺序进行排序: 解决方案:开发两个CDS view zcontact_origin@AbapCatalog.sqlViewName: 'SQL_VIEW_NAME'@AbapCatalog.compiler.compareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'Contact Origin tool'define view zcontact_origin as select from cuand_ce_ic_root as a inner join cuand_ce_ic_fcet as b on a.db_key = b.parent_key { key a.db_key, a.name_text, a.smtp_addr, b.db_key as children_key, b.id_origin} zcontact_count@AbapCatalog.sqlViewName: 'ZCONCOUNT'@AbapCatalog.compiler.compareFilter: true@AbapCatalog.preserveKey: true@AccessControl.authorizationCheck: #CHECK@EndUserText.label: 'count aggregation'define view ZCONTACT_COUNT as select from zcontact_origin { key zcontact_origin.db_key, zcontact_origin.smtp_addr, count(*) as facet_count} group by db_key, smtp_addr最后的效果: ...

July 14, 2019 · 1 min · jiezi

如何在阿里云上运行SAP-UI5应用

本来Jerry觉得这个知识点太简单了完全不值得写成微信公众号文章,但转念一想,可能网络上有一些刚刚初学UI5的朋友们可能会问到,所以还是写了。 今天一个成都同事问我这个问题,因为SAP WebIDE可以非常方便地将开发好的UI5应用一键部属到SAP的其他系统,比如On-Premises环境的SAP gateway系统;但对于SAP Cloud Platform之外的其他云平台,比如AWS或者阿里云,SAP官方文档讲得不多。 其实如果已经在WebIDE里完成了UI5应用的开发,要让它运行在其他IaaS云平台上比如AWS或者阿里云上,步骤也是比较简单的。 Jerry已经做好了一个简单的SAP UI5 Hello World应用,上传到了我的github上: https://github.com/i042416/we... 这个UI5应用的源代码,在该Github仓库的webapp文件夹下面: 这里面全是标准的UI5应用开发资源。 在这个项目的根目录即webapp文件夹的外层,多了两个文件:server.js和package.json, 分别是nodejs应用的入口文件和项目描述文件。 server.js的实现很简单,用nodejs的express module起一个server,把来自url "/ui5"的请求路由到文件夹webapp里,最后监听在环境变量PORT指定的端口号或者3000这个端口上。 最后登录阿里云,git clone把这个仓库克隆到阿里云上,npm install安装package.json文件里描述的依赖: 然后使用命令行node server.js启动服务器, 就可以通过<阿里云服务器的IP地址>:3000这个url访问这个UI5应用了。 如果想以守护进程的方式启动server, 也可以用pm2, 一个开源的nodejs进程管理工具。 用命令pm2 start server.js启动服务器即可, 这样即使阿里云服务器的SSH终端关闭,该UI5应用依然可以通过url <阿里云服务器的IP地址>:3000访问。 其实啰嗦了这么多,用一句话概括就是,在IaaS级别的云平台上启动Web服务器(nodejs express, Tomcat, Nginx等都行),运行在上面的UI5应用就能通过云平台被各种终端访问到了。 感谢阅读。 Jerry原创的关于SAP Fiori和UI5的更多文章 SAP Fiori应用的三种部署方式Jerry的Fiori原创文章合集SAP Fiori + Vue = ?Jerry的UI5框架代码自学教程Jerry的碎碎念:SAPUI5, Angular, React和Vue在Kubernetes上运行SAP UI5应用(上)在Kubernetes上运行SAP UI5应用(下)要获取更多Jerry的原创文章,请关注公众号"汪子熙":

July 14, 2019 · 1 min · jiezi

在SAP云平台ABAP编程环境上编写第一段ABAP程序

距2017年秋季的SAP TechEd大会上一位大佬Björn Goerke,SAP’s Chief Technology Officer宣布了SAP Cloud Platform即将支持ABAP至今,已经过去了两年的时间。 目前国内的技术媒体平台上,已经有了部分概要性介绍SAP Cloud Platform ABAP编程环境的中文文章,但涉及到具体操作细节的文章比较少。 Jerry最近会做一系列关于如何在SAP Cloud Platform上的ABAP编程环境上做开发的分享。 其实对于一个已经能够熟练使用ABAP Development Tools连接On-Premises ABAP Netweaver服务器做开发的传统开发人员而言,迁移到从On-Premises迁移到SAP云平台上的难度不大,只是需要注意一些开发理念上的转变,这个转变我们在后续具体做开发时会提到。 这种相对平缓的迁移和学习曲线,对于SAP全球庞大生态圈的企业和开发人员来说,无疑是一个好消息——这意味着SAP正在进行中的向云端数字化转型的旅程里,这些企业和个人也能够加入其中,并且他们以前在On-Premises时代积累的宝贵的技术和业务领域知识,能够继续在云时代发光发热。 我曾经在网络上了解到,很多自学SAP ABAP的朋友们,面临的第一道关卡就是在自己本地搭一台Netweaver服务器出来。作为一个写了12年代码的老开发人员,Jerry也搭过各种本地开发环境,深知这里面的水有多深。我以前的老板,也给我们分享过他当年来SAP成都研究院面试的时候,自己本地也搭过Netweaver,并且短短几天啃完几百页的Netweaver英文文档的经历。 相信每一位在本地搭建Netweaver的ABAP学习者,当成功看到Hello World输出的那一刻,成就感一定爆棚。 然而,当Jerry第一次在SAP Cloud Platform的ABAP编程环境上看到Hello World时,却没有多少成就感,因为直接按照ABAP Development Tool里的项目创建向导一步步操作就可以了,过程比较简单易懂——这也体现了云时代到来后,对传统应用开发人员工作方式的影响:无需费神去关心底层硬件或者操作系统等资源,可以把精力集中于应用程序逻辑的编写上。换言之,SAP负责管理和维护底层HANA数据库和中层的ABAP runtime,用户只需管理顶层的ABAP应用代码。 使用ABAP Development Tools的项目创建向导:New->ABAP Cloud Project: Service Instance Connection,选择SAP Cloud Platform CloudFoundry environment: 选择Region,输入用户名密码,前提是你得在这个region下有一个global Account。 下图是我在SAP Cloud Platform的CloudFoundry环境里的Global Account: 这个Global Account所属的space下面我创建了一个ABAP系统实例,ID为ME1: 这个ABAP运行实例具有16GB运行内存,64GB的HANA内存。 再回到ABAP Development Tools, 在项目创建向导里使用Cockpit里维护的上述属性: 点Next,在ABAP Development Tools里会看到一个嵌入的登录窗口。因为Jerry使用的是SAP社区Mentor的账号,所以登录窗口显示的标题是:Welcome to Mentors! ...

July 4, 2019 · 1 min · jiezi

一个SAP开发人员的养蚕流水帐

Jerry打算以此文来给汪子熙全家进行了一个多月的养蚕经历画上一个圆满的句号。 南方长大的80后,对蚕应该不会太陌生。大家还记得你们小时候学过的课文《蚕姑娘》么?课文开头是这样的: 春天天气暖洋洋,蚕卵里钻出蚕姑娘。 又黑又小的蚕姑娘,吃了几天桑叶,就睡在蚕床上,不吃也不动,脱下黑衣裳。醒了,醒了,变成黄姑娘。 又黄又瘦的蚕姑娘,吃了几天桑叶,又睡在蚕床上,不吃也不动,脱下黄衣裳。醒了,醒了变成白姑娘。 又白又嫩的蚕姑娘,吃了几天桑叶,又睡在蚕床上,脱下旧衣裳,换上新衣裳。醒了,醒了,从此一天一天发胖。。。 Jerry小时候当然也学过这篇课文,也按照语文老师的吩咐,在家里养了十几只桑蚕,并且观察它们每天的生长情况。准确的说,我小时只负责观察,一切其他的后勤工作都由我父母完成。由于年龄太小,当时所有的细节我都淡忘了,只依稀记得每只蚕最后都在纸盒里结出了洁白的茧。 时光荏苒,现在Jerry成为了父亲,开始协助汪子熙完成他的语文老师布置的养蚕观察作业。 感谢现在科技水平的飞速发展,我手上30倍的放大镜和三星手机1600万像素的摄像头,让我能够比小时候更清晰地观察蚕们的一举一动。 知乎上有一些很有意思的问题,概括起来大致为:为什么很多人喜欢蚕,但是讨厌,甚至害怕毛毛虫? 我养了一个多月的蚕,我想对于这个问题我有一定的发言权。以下是Jerry对这个问题的看法。下文所说的蚕,如无特殊说明,都指大家为了完成学校作业所养的桑蚕里的大白蚕。 1. 作为一个长期以农业占主导地位的国家,蚕因为能出产具有极高经济价值的蚕丝,从而在我国悠久的农业历史中始终享有很高的地位。早在商周时期,古人们就已经开始在室内养蚕,这个传统延续了几千年一直到现在。 秦汉以后,咱们的养蚕技术通过举世闻名的丝绸之路传入到中亚、南亚及西亚地区,进而传播到欧洲。简单的说,因为蚕对人类有用,所以人类喜爱它们。再加上文人墨客从人类的视角出发,在观察了蚕吃桑叶吐丝的行为之后,发出了"春蚕到死丝方尽,留赠他人御风寒"这种极富褒义色彩的感叹,这使得蚕又经常和另一个具有崇高意义的名词——教师关联起来。在我们从小就接受这些对于蚕正面评价的教育下,我们很难对蚕讨厌得起来。 2. 从外观上看,虽然都是软体动物,蚕和毛毛虫的颜值可谓一个在天上,一个在地上。蚕的全身洁白,白色在我国一直是纯洁的象征,而毛毛虫的颜色往往都很非主流;蚕的全身很光滑,不像毛毛虫那样浑身长满了让人害怕的绒毛。 蚕的性情非常温顺,不会对人造成任何伤害,所以Jerry经常把它们放在自己手上让它们爬来爬去,近距离观察。有的毛毛虫,身上的绒毛蜇到人的皮肤后,会让人很不适,因此大家都不喜欢。 3. 养蚕的环境散发出来的气味很香,至少Jerry闻到的味道是如此。那些动辄饲养上万只蚕的场所发出的气味不在本文讨论之内。蚕吃的桑叶本身带着植物特有的芳香,Jerry也曾经把鼻子凑在自己手上爬来爬去的蚕附近使劲闻,也没有闻到任何味道。而一般的毛毛虫,看着就够恶心了,我实在没有勇气去闻闻它们是什么味道。 4. 蚕很萌。蚕吃得白白胖胖圆圆滚滚在桑叶上蠕动着身子一节节地爬来爬去的样子很萌。如果养了一大群蚕,那么你一定能观察到这种情况:有时在忙忙碌碌啃桑叶的蚕们中间,间杂着几只高昂着头“思考蚕生”的另类: 比如下图正中这只。 关于蚕为什么会昂着头一动不动,网上公认的说法是它们这是在休息,在睡觉。每当这时,我都会忍不住,用手指头轻轻去摸摸它们。有的时候它们被我揩油之后,没有任何反应;有的时候像是受惊了一样,昂起的上半身猛地一缩,很好笑。 5. 蚕的一身都是宝。除了蚕丝能用来做丝绸,蚕丝被,蚕沙(蚕的粪便)能入药,做枕头,蚕蛹能食用之外,很多心灵手巧的小朋友们还用蚕茧做成了各种各样的小工艺品: 透过这些纯天然纯绿色的小手工,我们能看到孩子们如水晶般纯洁的心灵。 前面说到我那30倍放大镜和1600万摄像头的三星手机(这配置在2019年来看应该很渣吧), 是时候让它们出来发挥作用了。 下面是一张蚕宝宝的靓照,最左边棕色的椭圆形部分就是蚕的头部,剩下的都是它的躯干,在靠近头部的胸部部分有三对足,其后每一节身躯的底部都有一对足,总共7对14只足;大家如果仔细看这张照片,会发现蚕的足上其实长了绒毛,而且足的底部还有洗盘,能使自己牢牢吸附在桑叶上,这样能保证蚕即使在桑叶背面爬动时,也不会因为重力原因落到地上。 在躯干的最末一节还有一根小小的向上凸起的尖刺,这是蚕的尾角,我们可以用来辨别蚕的雌雄:雌蚕尾角往前翘且有黑点;雄蚕尾角往上翘而无黑点。这根看似不起眼的尾角对蚕来说是非常重要的器官:其生理作用主要是平衡蚕体内的水压,使蚕前后水压保持相同。蚕的体壁内,肠部,气管和神经等组织都浸泡在血液之中,从蚕的照片我们一眼就能看出蚕的体型是前部稍大尾部稍小,因此需要借助尾角,确保蚕尾部承受液体的压力和胸部的一致。  蚕躯干的每一节都还有一个非常醒目的黑点,这是所有昆虫都具有的呼吸器官——气门,只是蚕的比较明显容易被观察罢了。当蚕周围的气温发生变化时,蚕会借助开关气门的方法来调节体温,让身体的体温适应周围的温度。 那么蚕的眼睛和嘴呢? 先来张头部的正面特写。这小脑袋是不是很萌? 我们很容易根据人类的五官,去揣度蚕的眼睛所在的部位,即头部正中那两个小黑点,事实并不是这样。下面这张图才是蚕的眼在头部的正确部位。是的,我们说眼而不是眼睛,因为蚕作为昆虫,眼部构造和人的眼睛相差太多太多。蚕不像苍蝇,蜻蜓那些昆虫一样具有复眼,蚕的眼是单眼,包含一些感光细胞,能够感觉到光线的强弱,但并没有视觉作用。实际上蚕是靠嗅觉和触觉来判断前方的物体和前进方向,而非视觉。 蚕的嘴也非常有意思。 准确地讲,蚕是用“咀嚼式口器”来进食桑叶的。咀嚼式口器是昆虫具备的另一个非常典型的器官,用来取食固体食物,和人的嘴巴一样有上唇、下唇、上颚(牙齿)和舌,但同时它还有下唇须、下颚和下颚须。蚕的口器上颚前端有锋利的齿,叫做切区,用来切断桑叶纤维。当然,这个锋利是从蚕的角度出发针对桑叶而言的,对人的手指皮肤没有一丁点的破坏力。蚕进食桑叶时,口器会上下蠕动,在桑叶上留下一道道半圆形的缺口。 大家请看下面这段Jerry拍摄的蚕们狼吞虎咽进食桑叶的视频,注意观察文中提到的半圆形缺口: https://v.qq.com/x/page/n08915ahnh1.html 蚕的一生会经历下图四个阶段,在我们小学语文课文《蚕姑娘》里已经阐述清楚了。 蚕蛾产下的卵: 这些卵逐渐变成褐色后,就意味着新的蚕即将来到这个世上了。刚刚破卵而出的蚕个头非常小,遍体黑色,因为很像小蚂蚁,我们称之为“蚁蚕”。 蚁蚕不停得啃桑叶,逐渐长成了大家印象中的蚕的白白胖胖的样子。 蚕一生中总共会蜕4次皮,和其他很多昆虫一样,蚕在生长发育过程中其表皮不能随着身体长大而长大,因此当蚕的身体长大受到限制时,蚕就要蜕皮。Jerry也不知道导演雷德利·斯科特(Ridley Scott)的《异形》系列里的异形蜕皮生长的设定,是否受到了蚕蜕皮的启发。 看一段Jerry拍摄的蚕蜕皮的视频(这种视频很不容易拍到): https://v.qq.com/x/page/t0891... 这是Jerry收集的蚕蜕下的皮,也是一种中药。 ...

July 4, 2019 · 1 min · jiezi

SAP-Marketing-Cloud的Contact导入配置和数据合并原理

SAP很多系统的主数据都支持从外部系统导入,SAP Marketing Cloud也是如此,contact主数据可以来自Hybris Commerce,CRM,ERP或者Twitter,Facebook等社交媒体。来自不同渠道的contact可能对应的是真实世界里同一个人,那么就存在一个过程,该过程的逻辑是将不同渠道的contact数据进行整合,拼凑出一个包含完整信息的contact主数据存储到Marketing Cloud系统里,这个拼凑的过程称之为合并(merge),拼凑后形成的完整Contact结构称为Golden record。 下面这张示意图里的蓝色圆环称为Main facet,代表每个contact数据在某个源系统上的ID,比如在ERP系统上的ID为123,在Twitter上的ID为456等等。而黄色圆环是contact在各自源系统里的属性,比如在Twitter网站上ID为456的一个contact,其name属性为jerrywang@sap。黄色圆环称之为additional facet. 通过在SAP Marketing Cloud里进行一系列配置,告诉系统,当检测到来自不同数据源的contact数据,存在至少一个相同属性的情况下,应该执行何种contact操作,也就是合并或者新建。 比如下图在ERP,Facebook和Web Shop上有三条contact数据,其Email地址的值都相同,那么进行数据导入时,基于预定义好的配置,Marketing Cloud认为这三条数据指向的是同一个人,所以最后merge出来生成唯一一条contact记录。 Marketing Cloud具体merge的过程,就是根据SAP Marketing Cloud系统里的customizing配置,将三条Email地址都相同的记录作为当前merge的输入,然后逐一将本记录内的属性“投影”到最终的Golden Record里。如果把Golden Record想象成最终完整的拼图,那么这个merge过程就有些类似于拼图操作——将散布在各个数据源中的零散信息合并成一个整体,存储在Marketing Cloud系统内以便进行后续处理。 Marketing Cloud里针对contact导入系统时的merge操作的相关customizing设置,在整个contact导入过程中起着至关重要的作用。 和SAP Cloud for Customer等很多云产品一样,SAP Marketing Cloud的customizing也是在浏览器里完成。 点击Fiori Launchpad里的Manage Your Solution这个tile, 进入Configure Your Solution,  根据关键字contact进行搜索,在搜索结果列表里找到Contacts and Profiles相关的配置: 其中第六步, OriginContactID-Configure这一步,就是合并时针对来自不同平台的contact数据,执行合并或新建操作的配置。 点击之后,能看到一个contact属性列表,从这些属性列表不难推断出SAP Marketing Cloud支持导入contact的数据源有S/4HANA,ERP,CRM,Hybris Commerce,SAP Cloud for Customer,Gigya,Qualtrics和社交媒体如Twitter,Facebook等等。 上图有两列,分别对应为每个属性指定One Per Contact和Shareable为true还是false的界面。前者顾名思义,如果设置为true,意味着一个contact在同一个数据源系统里只能拥有一个唯一值,比如一个人的护照号码,或者SAP系统里的Customer ID;反之像Email,座机号,传真号这种属性,一个contact在同一个数据源系统里如果允许存在多个值,则One Per Contact设置为false。而Shareable属性置为true,适合那些在同一个数据源系统里允许多个不同contact具有相同值的属性,比如一家人的contacts的座机号允许相同。 对每一个Contact属性,One Per Contact和Shareable的true/false状态排列组合共有四种,其中One Per Contact为true的两种情况,即使系统在检测到匹配的属性情况下,也可能会导致contact数据的创建,而不是merge,也就是下图中第二行和第四行标注了感叹号的情况。 ...

July 3, 2019 · 1 min · jiezi

一步步用ABAP-Development-Tools连接SAP云平台上的ABAP编程环境

使用ABAP Development Tools的项目创建向导: New->ABAP Cloud Project: Service Instance Connection,选择SAP Cloud Platform CloudFoundry environment: 选择Region,输入用户名密码,前提是你得在这个region下有一个global Account。 下图是我在欧洲法兰克福(Frankfurt)这个Region的Global Account: 这个Global Account所属的space下面我创建了一个ABAP系统实例,ID为ME1: 这个ABAP运行实例具有16GB运行内存,64GB的HANA内存。 再回到ABAP Development Tools, 在项目创建向导里使用Cockpit里维护的上述属性: 点Next,在ABAP Development Tools里会看到一个嵌入的登录窗口: 点Finish: Finish点了之后,在ABAP Development Tools左侧的项目列表里就能看见创建好的ABAP Cloud项目了,接下来在这个项目里编写ABAP代码进行开发的方式,和我们用ADT连接On-Premises系统基本一致。大家可以看到下图创建好的高亮的ABAP Cloud项目(系统ID为ME1), 和其他On-Premises上的ABAP项目外观上没有区别。 这两种ABAP项目的差异在于,ABAP Cloud项目里能够使用的ABAP语言特性,只是传统ABAP语言的一个子集,比如传统ABAP语言里和Dynpro相关的关键字,即只能工作在SAPGUI中的那些关键字,因为在Cloud环境下不再适用了,所以在ABAP Development Tools的ABAP Cloud项目里禁止使用。 至于上图ABAP Cloud项目里的Released Objects如何使用,等Jerry有时间再继续写。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

July 3, 2019 · 1 min · jiezi

2019年6月SAP发布的未来ABAP平台的发展方向

未来ABAP平台将始终是这些产品的技术平台: S/4HANA On-Premises和Cloud将基于一个统一的ABAP codeline: SAP云平台上的ABAP编程环境: 什么是SAP Cloud Platform上的ABAP编程环境?该编程环境使用基于云优化之后的ABAP编程语言,是传统ABAP编程语言的一个子集,有部分关键字和ABAP语言特性因为不适合云的使用场合,故在SAP Cloud Platform的ABAP环境上无法使用。 在SAP Cloud Platform的ABAP编程环境里推荐使用ABAP Restful编程模型,能方便地扩展云和On-Premises系统上的SAP解决方案。 使用基于Eclipse的ABAP Development Tool这个开发IDE,同时能充分利用SAP云平台上提供的各种服务。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

July 3, 2019 · 1 min · jiezi

CRM和C4C里的组织架构-Organizational-Structure

CRM(WebClient UI) CRM(SAP GUI,事务码PPOMA_CRM) C4C以列表方式显示: 以图形方式显示: UI模型:/SAP_BYD_APPLICATION_UI/mom/org/COD_OrgUnit_OWL.OWL.uicomponent 明细页面:/SAP_BYD_APPLICATION_UI/mom/org/COD_OrgUnit_TI BO name: OrganisationalUnit通过递归执行association ChildOrganisationalUnit就可以得到unit hierarchy: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

July 2, 2019 · 1 min · jiezi

SAP-Marketing-Cloud里的contact-main-facet是什么意思

界面如下: Basically, contact data for SAP Hybris Marketing can be loaded from various sources, such as an ERP system, a web shop, social media and many more.Contact数据源可以来自各个渠道,例如ERP系统,电商,社交媒体账号等等。每个渠道都可以成为Marketing Cloud系统里最终完整contact实例的一块拼图,这个完整的contact实例也称为Golden record。Each source may contribute to the building of the Golden Record, which represents the most valuable contact master data stored in one single record per contact.而数据源渠道自身也被称为Main facets,用于提供常规意义上的contact信息,以及额外信息,例如地址信息,电子邮箱地址,信用卡号,手机号等等。这些额外信息也称为additional facet。Therefore, the sources themselves are considered as Main Facets, which might provide general contact data, such as address data or data for customer-specific fields. A Main Facet might also have data, for example, a loyalty card number, an email address, a phone, a mobile or a fax number. Because of their identifyingnature, we consider these attributes as Additional Facets. ...

July 2, 2019 · 1 min · jiezi

一步步用ABAP-Development-Tools连接SAP云平台上的ABAP编程环境

使用ABAP Development Tools的项目创建向导: New->ABAP Cloud Project: Service Instance Connection,选择SAP Cloud Platform CloudFoundry environment: 选择Region,输入用户名密码,前提是你得在这个region下有一个global Account。 下图是我在欧洲法兰克福(Frankfurt)这个Region的Global Account: 这个Global Account所属的space下面我创建了一个ABAP系统实例,ID为ME1: 这个ABAP运行实例具有16GB运行内存,64GB的HANA内存。 再回到ABAP Development Tools, 在项目创建向导里使用Cockpit里维护的上述属性: 点Next,在ABAP Development Tools里会看到一个嵌入的登录窗口: 点Finish: Finish点了之后,在ABAP Development Tools左侧的项目列表里就能看见创建好的ABAP Cloud项目了,接下来在这个项目里编写ABAP代码进行开发的方式,和我们用ADT连接On-Premises系统基本一致。大家可以看到下图创建好的高亮的ABAP Cloud项目(系统ID为ME1), 和其他On-Premises上的ABAP项目外观上没有区别。 这两种ABAP项目的差异在于,ABAP Cloud项目里能够使用的ABAP语言特性,只是传统ABAP语言的一个子集,比如传统ABAP语言里和Dynpro相关的关键字,即只能工作在SAPGUI中的那些关键字,因为在Cloud环境下不再适用了,所以在ABAP Development Tools的ABAP Cloud项目里禁止使用。 至于上图ABAP Cloud项目里的Released Objects如何使用,等Jerry有时间再继续写。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

June 28, 2019 · 1 min · jiezi

有选择性的启用SAP-UI5调试版本的源代码

在低版本的SAP UI5应用中,我们一旦切换成调试模式,那么应用程序源代码和UI5框架程序的源代码的调试版本都会重新加载,耗时很长。 我最近发现UI5新版本1.66.1提供了选择性加载调试版本的源代码的选项,即下图中的Select Specific modules: 如果确认问题出在我们应用程序,只想调试自己编写的应用代码,那么我们可以只切换应用程序成为调试版本,这样速度大大提高。 此时浏览器地址栏里看到的参数为sap-ui-debug=dis/#, 意思是仅仅disnamespace下的所有资源加载成调试版本: 调试速度大大提高: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

June 28, 2019 · 1 min · jiezi

SAP-WebIDE里UI5应用的隐藏文件projectjson

在SAP WebIDE UI5应用编辑器里的菜单View->Show Hidden files点击后,即可发现项目文件夹下有一个隐藏文件project.json: 内容如下: 这也解释了为什么build之后,UI5应用文件夹下会多出一个dist的文件夹,内容和webapp里的代码几乎一致: databinding节点下罗列出了每个视图绑定的OData数据集的节点名称,非常实用: generation节点记录了应用创建的时间戳和基于的Fiori模板ID和版本号,translation包含了和翻译相关的资源名称。 basevalidator维护了SAP WebIDE提供的校验实现,当前有fioriXmlAnalysis和fioriJsValidator。 codeCheckingTriggers定义了校验出的错误是否会阻止UI5实际部署到SAP云平台上。hcpdeploy包含了和UI5应用部署相关的信息,比如SAP Cloud Platform的用户id,和部署到云平台之后的应用名称。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

June 27, 2019 · 1 min · jiezi

SAP-UI5的support-Assistant

SAP UI5的support Assistant给UI5刚入门的开发人员提供了一种极便利的快速熟悉UI5代码的途径。 召唤方式: ctrl+shift+alt+p四个键同时按,在弹出的对话框里点击按钮“activate Support Assistant即可。 之后屏幕下方会出现一个视图,视图左边包含了SAP预定义的检查条目,以及您当前的UI5应用基于这些检查条目校验出的结果。右边则是检查条目检查的具体内容,针对检查出来的问题给出的解决方案,以及具体的检查代码等等。 我觉得对我自己帮助最大的就是Code标签里每个检查条目的具体实现,能让我学习到很多SAP UI5的编程细节。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

June 27, 2019 · 1 min · jiezi

Marketing-Cloud-contact主数据的csv导入

使用这个mock数据生成器网站https://www.mockaroo.com/b679...,创建一个基于Marketing Cloud contact schema的csv文件。 如果偷懒的话,每个contact字段的值都可以选择随机生成。点Download Data下载到本地。 打开csv文件之后,还可以用文本编辑器对值进行微调。 进入Marketing Cloud,点Import进行导入: 在business administration这个catalog里的import monitor对导入过程进行监控: 导入成功: 导入的数据可以在Marketing Cloud里使用了: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

June 23, 2019 · 1 min · jiezi

Marketing-Cloud的contact-merge机制

Marketing Cloud的contact支持多种多样的数据源,如下图所示: SAP Hybris CommerceSAP ERPSAP Cloud for CustomerSAP Gigyaexternal social media 在系统的Origin data标签页里能看到一个merge后的contact的所有数据源: 看一些例子。初次从Hybris commerce里导入,Marketing Cloud系统里不存在ID为4711,mobile为12345的contact,所以自动创建一条主数据。 第二次从SAP Cloud for Customer里导入,因为待导入的contact和系统里已经存在的一条记录的mobile ID相同,故Marketing Cloud认为这是同一个人,因此做属性的merge: merge之后,来自Cloud for Customer的city和country字段被合并进了系统。 从这里出发进行Marketing Cloud里contact merge相关的配置customizing: 这里可以指定进行merge检测时基于的字段,这些字段既有SAP Marketing Cloud的标准字段,也允许用户自定义新的字段。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

June 23, 2019 · 1 min · jiezi

SAP-Cloud-Platform上Destination属性为odatagen的具体用途

今天工作发现,SAP Cloud Platform上创建Destination维护的WebIDEUsage属性很有讲究: 帮助文档:https://help.sap.com/viewer/8... 这个属性的枚举值: 看个例子。我维护的是odata_gen: 根据标准文档描述,拥有odata_abap属性的Destination指向的是一个gateway系统,将在SAP webIDE创建UI5应用的向导中的service catalog界面出现,如下图所示: 意思是终端用户可以通过Service Catalog界面,任意选择该Destination指向的gateway系统上激活的service。 odata_abap: 目标是个SAP gateway系统 而另一方面,如果把Destination的属性改成odata_gen: 此时该Destination不会出现在Service Catalog的下拉菜单里: 取而代之的是它会出现在service url里: 而我们必须手动维护某一个具体OData服务的地址:/sap/opu/odata/sap/CRM_OPPORTUNITY 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

June 23, 2019 · 1 min · jiezi

如何用SAP-WebIDE的Fiori创建向导基于ABAP-OData-service快速创建UI5应用

如果我们手上已经有可以正常工作的OData服务,无论位于ABAP on-premise系统还是public上的internet OData service,都可以用SAP WebIDE里的Fiori创建向导,几分钟之内轻松创建出可以持续开发的UI5应用。 打开SAP云平台上的WebIDE,New->Project from Template: 选择Master Detail风格的Fiori应用: 这里就要指定这个UI5应用消费的OData服务url了。下拉菜单里看到的是一个我在SAP云平台创建的Destination,指向on premise系统: url路径选择/sap/opu/odata/sap/CRM_OPPORTUNITY,做过CRM的朋友们会知道这个路径指向的是CRM ABAP里的OData服务CRM_OPPORTUNITY: 点击Test,会解析出OData服务的metadata,然后可以点Next按钮: 点了Next之后,需要指定Master list和detail视图里重要字段的绑定路径。这些字段的说明在上图右边的缩略图里有展示。 点finish后,应用成功创建。执行应用: 最后渲染的应用如下: 至此我们没有编写一行代码,就得到了一个可以工作的master-detail风格的Fiori应用。 压缩过后webIDE自动生成的JavaScript总共代码也不过500多行: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

June 23, 2019 · 1 min · jiezi

如何让某些用户对Marketing-Cloud的contact数据只能实施只读操作

打开maintain business role这个应用: 创建一个新的business role,然后添加下列这几个catalogs:SAP_CEC_BC_MKT_ADM_PC Marketing - Business AdministratorSAP_CEC_BC_MKT_DMB1_PC Marketing - Contacts and Profiles BaseSAP_CEC_BC_MKT_CFS1_PC Marketing - Contact ProfileSAP_CEC_BC_MKT_DST_PC Marketing - Data StewardshipSAP_CEC_BC_MKT_EXT_PC Extensibility and Adaptability - Marketing3 一个一个添加进去:SAP_CEC_BC_MKT_ADM_PC 此处把Write Access改成No Access,最后把这个business role分配给对应用户,该用户对于contact数据就只拥有读权限了。 要获取更多Jerry的原创文章,请关注公众号"汪子熙".

June 23, 2019 · 1 min · jiezi

基于SAML20的SAP云产品Identity-Authentication过程介绍

SAP官网的架构图https://cloudplatform.sap.com... 上图介绍了用户访问SAP云平台时经历的Authentication过程。本文使用的例子是用户访问SAP Marketing Cloud而非SAP云平台,但是原理一致。 步骤1:用户向Service provider发起服务请求。步骤2:Service provider把这个请求重定向到提供认证的租户上,在我这个例子是SAP ID service,即account.sap.com. 这里Marketing Cloud和SAP ID Service被配置为互相信任。 请求1响应头里的302重定向字段:https://let-me-in.hybris.com/...://hybris.com/sap/bc/ui5_ui5/ui2/ushell/shells/abap/FioriLaunchpad.html 被重定向到SAP云平台的account ID service(accounts.sap.com):https://accounts.sap.com/saml...:ydcHybris:spring:sp2&RelayState=https://hybris.com/sap/bc/ui5... 步骤3:IDP给用户发送一个html page,要求用户提供用户名和密码。 如果查看这个html的源代码,能发现除了用户名和密码两个输入字段外,还包含了一些隐含字段,如下图高亮所示,这些字段是IDP返回给用户时在服务器端生成的,用于步骤5的IDP服务器端认证处理: xsrfProtectionspIdspNameauthenticity_tokenidpSSOEndpoint步骤4:用户输入用户名和密码后,点击login按钮,这些信息通过HTML form发送到了SAP ID service的服务器端: sso请求的url:https://accounts.sap.com/saml... 第二个大写的SSO请求的url:https://let-me-in.demo.hybris... 步骤5:SAP ID service的服务器端完成验证,发送SAML assertions作为响应给用户。 这个SAML响应是XML格式的,结构如下: 步骤6也就是最后一步,拿到这个SAML assertion后,用户就能够访问service provider了。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

June 22, 2019 · 1 min · jiezi

Marketing-Cloud里取得系统contact数目的API

Marketing Cloud里的Contact标准tile(下图红色tile)上是没有当前系统contact数字显示的,请对比profile tile(下图黑色tile)。 客户有需求希望在Launchpad Contact tile上也显示这个数字,因此我新建了一个tile。 需要给这个tile配置一个OData API url: /sap/opu/odata/sap/CUAN_CONTACT_SRV/InteractionContacts/$count?$filter=YY1_FACEID_MPS%20ne%20%27%27postman里测试确保工作: 最终效果: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

June 1, 2019 · 1 min · jiezi

SAP分析云及协同计划

大家好, 我是SAP成都研究院S/4HANA Sales 团队的软件工程师Derek。四年前我从SAP Consulting团队转到SAP Labs从事Sales Analytics相关应用的开发,在加入S/4HANA Sales 团队之前是BI咨询顾问,主要工作经历集中在BI(BW&BO), EIM, BPC, ECC, S/4 HAHA相关产品。 之前我所在团队同事Zhang Sean已经在他的文章 S/4HANA中的销售计划管理 里给大家分享过了S/4HANA的销售计划管理,今天我给大家带来的是S/4HANA分析云的协同计划。 前言 当今是数字经济的时代,数字经济就是决策经济。企业做出的决策越明智、越及时,企业的业务增长能力就越强。拖延是破坏者和被破坏者之间的区别,公司要么适应这个规则要么等待灭亡。 如果说数据是数字经济世界的燃料,那么分析就是引擎。研究表明,要使数据驱动的决策处于数字引领者的前沿,采用数据驱动思维的分析能力至关重要。 目前市场上的大多分析解决方案只能提供下图中的一部分功能。 商务智能(Business Intelligence)技术通常依赖于历史数据或已发生的事情,但与未来的计划和结果无关。这些分散的缺乏整合的方案很难帮助企业快速准确地做出决定并采取行动。而SAP分析云(SAP Analytics Cloud,以下简称SAC)能很好地解决这些问题。 作为基于SAP云平台构建的新一代SaaS,SAC可以在一个解决方案中为所有用户提供企业商务智能,预测,协同计划等功能。 什么是SAP分析云 SAC是商务智能和协同计划相结合的解决方案,通过预测分析和机器学习技术的强大功能为企业决策提供实时支持。无论是在客户前线还是在董事会,都能让企业实体洞察到新的见解并采取行动。SAC通过在一个产品中为用户提供所有分析功能来重新定义云分析(Cloud Analytics)。作为一个部署在SAP Cloud Platform上的SaaS解决方案,SAP负责完成硬件和软件的管理,以便客户可以专注于分析其业务。 SAP分析云主要功能 SAC让员工能够自由分析企业的业务,模拟并预测接下来会发生什么,设计协同计划并采取行动,实施决策以获得即时价值。业务成功需要完整的分析功能,如商务智能,计划和预测等来支持战略、运营和战术决策,而SAC则能够授权用户在需要实时分析业务的场景下进行情景洞察,以帮助其做出决策。 SAC解决方案为每个负责制定智能决策以提高其成果的用户提供分析。 什么是SAP分析云协同计划(SAC Planning) SAC的核心优势在于其计划功能,除了计划功能之外,SAC还包括大量分析和报告功能,以及易于专业人员和其他计划人员使用的集成预测功能。例如,用户可以在输入数据或更改值后自动预测。商业智能,协同计划,以及基于机器学习的预测分析是SAC的三大核心功能。很多朋友认为SAC只是SAP Business Objects Business Intelligence的云版本而已,其实不然——SAC除了商业智能外, 协同计划和预测分析才是其核心部分。本文将重点介绍SAC的财务计划和分析功能。在探讨SAC Planning前我们需要理解计划,预算,预测等术语: 计划:提供公司启动方向和财务目标的整体流程(如战略计划,长期计划,年度计划等)预算:提供计划的执行路径。计划提供了什么是可能,预算提供了基于被批准计划的预期(如销售/毛利预算,资本支出预算,人数预算,运营开支预算等)预测:使用实际业绩数据来预测业绩的剩余未知部分(如滚动预测)SAC Planning提供了如下主要功能:条件模拟,数据输入,复杂分配,分解及数据转播,协同计划及评论,基于驱动程序的计划,工作流,替代层次结构的支持,版本管理(乐观版本、悲观版本、私有版本),内置财务功能等。 1. SAC为计划人员提供了强大的功能 为了支持计划用户,SAC表中使用的表组件提供了数据的交互式可视化功能。在网格中,存在许多可用的Microsoft Excel快捷方式,凭借新的自定义行和列功能,计划人员可以使用常见的Microsoft Excel类公式轻松地将其他信息添加到网格中。自定义单元格还支持单元格图表,计划用户可以很快地创建出符合IBCS(International Bussiness Communication Standard, 国际商业标准图表)的差异报告。 2. 与SAP Analysis for Microsoft Office无缝集成 新版本的SAP Analysis for Microsoft Office可以直接消费SAC Planning模型, 计划用户可以通过其熟悉的Microsoft Excel环境连接到SAC进行工作。简化的Excel样式允许用户通过强大的排序/过滤功能轻松访问各种维度。图形化的拖拽结构管理,创建报表公式以聚合值或在摘要表中执行简单分析,报表公式可用于汇总来自多个来源的信息。 ...

June 1, 2019 · 1 min · jiezi

如何用Java代码在SAP-Marketing-Cloud里创建contact数据

我们可以使用SAP Marketing Cloud提供的Contact create OData API在第三方应用里创建Contact主数据. API地址:/sap/opu/odata/sap/CUAN_CONTACT_SRV/InteractionContacts 示例代码只有100多行: import java.io.IOException;import java.io.UnsupportedEncodingException;import java.net.URI;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.StatusLine;import org.apache.http.client.ClientProtocolException;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpPost;import org.apache.http.entity.StringEntity;import org.apache.http.impl.client.HttpClientBuilder;import sun.misc.BASE64Encoder;public class SimpleContactCreator { private ConfigUtil mConfigUtil = new ConfigUtil(); HttpClient m_httpClient; private String getBasicAuth(){ final String text = mConfigUtil.getConfig("user") + ":" + mConfigUtil.getConfig("password"); BASE64Encoder encoder = new BASE64Encoder(); String credentials = "basic " + encoder.encode(text.getBytes()); return credentials; } private HttpClient getHttpClient() { if (this.m_httpClient == null) { this.m_httpClient = HttpClientBuilder.create().build(); } return this.m_httpClient; } private String getCSRFToken(){ String url = mConfigUtil.getConfig("tokenurl"); System.out.println("fetch CSRF token via url: " + url); final HttpGet get = new HttpGet(url); get.setHeader("Authorization", getBasicAuth()); get.setHeader("Cache-Control", "no-cache"); get.setHeader("content-type", "application/json"); get.setHeader("Accept", "application/json"); get.setHeader("x-csrf-token", "fetch"); HttpResponse response; String token = null; try { response = getHttpClient().execute(get); StatusLine statusLine = response.getStatusLine(); int code = statusLine.getStatusCode(); System.out.println("Status code: " + code); System.out.println("reason: " + statusLine.getReasonPhrase()); token = response.getFirstHeader("x-csrf-token").getValue(); System.out.println("token: " + token); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException | UnsupportedOperationException e) { e.printStackTrace(); } return token; } public void run(String body){ String token = getCSRFToken(); createContact(token, body); } private void createContact(String token, String body){ final HttpPost post = new HttpPost( URI.create(mConfigUtil.getConfig("contactcreateurl"))); post.setHeader("Authorization", getBasicAuth()); post.setHeader("Content-Type", "application/json"); post.setHeader("X-CSRF-Token", token); HttpEntity entity = null; try { entity = new StringEntity(body); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } post.setEntity(entity); HttpResponse response = null; try { response = getHttpClient().execute(post); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } System.out.println("Response statusCode for Batch => " + response.getStatusLine().getStatusCode()); } public static void main(String[] args) { SimpleContactCreator tool = new SimpleContactCreator(); String body = "{\"IsConsumer\":true," + "\"Filter\":{\"MarketingArea\":\"CXXGLOBAL\"}," + "\"__metadata\":{\"type\":\"CUAN_CONTACT_SRV.InteractionContact\"}," + "\"FirstName\":\"SAP Diablo\",\"LastName\":\"SAP Wang\",\"Country\":\"CN\"," + "\"EMailAddress\":\"seya@sap.com\",\"YY1_WECHATID_MPS\":\"i042416\"," + "\"YY1_FACEID_MPS\":\"d042416\"}"; tool.run(body); }} ...

May 25, 2019 · 2 min · jiezi

如何在调用Marketing-Cloud-contact创建API时增加对扩展字段的支持

需求:扩展字段“微信ID”是我创建出来的extension field,我想用Marketing Cloud提供的contact creation API,在创建contact时也能支持这个扩展字段。换言之,我希望在调用contact create API时,给Extension field维护值,contact创建成功后,Extension field会被调用API时传入的值填充。 首先在Chrome开发者工具里找到这个字段的技术名称technical name:YY1_WECHATID_MPS 在Contact创建页面上把扩展字段配置出来, 创建一个新的contact实例, 给这个扩展字段维护一个值,比如i042416, 通过chrome开发者工具的network标签页观察创建时的payload: 然后在nodejs代码里依法将扩展字段的名称和值维护进去即可: 完整源代码:https://github.com/i042416/we...要获取更多Jerry的原创文章,请关注公众号"汪子熙":

May 25, 2019 · 1 min · jiezi

如何使用Marketing-Cloud的扩展字段作为搜索条件进行搜索

需求:我在Marketing Cloud的contact模型上用custom field这个应用创建了一个Extension field,名称为微信ID。 现在客户的需求是使用这个字段作为过滤条件进行搜索。 首先在界面上执行一次搜索,在Chrome开发者工具network标签里将这次搜索中前端发给后台的HTTP请求明细记录下来: 然后在postman里照样维护一份: payload:--batch_bd03-9977-8095Content-Type: application/httpContent-Transfer-Encoding: binaryGET InteractionContacts?sap-client=100&$skip=0&$top=15&$filter=YY1_WECHATID_MPS%20eq%20%27i042410%27&$select=ImageURL%2cName%2cContactLevelName%2cCountryName%2cCity%2cEMailAddress%2cPhoneNumber%2cMobilePhoneNumber%2cCorporateAccountName%2cInteractionContactUUID%2cRelationship%2cType&$inlinecount=allpages HTTP/1.1sap-cancel-on-close: trueCache-Control: max-age=360sap-contextid-accept: headerAccept: application/jsonAccept-Language: enDataServiceVersion: 2.0MaxDataServiceVersion: 2.0x-csrf-token: fsZ87xxAy55LLhk56CCjCw== --batch_bd03-9977-8095-- 测试结果如下: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

May 25, 2019 · 1 min · jiezi

使用nodejs实现OData的batch操作在Marketing-Cloud里读取contact信息

我们先来看看Marketing Cloud系统里的contact信息:一共1218374条数据。 我们用如下的nodejs代码通过OData来获取这些数据: var request = require('request');var config = require("./mcConfig");var url = config.getContactBatchURL;var sBody = "--batch_c914-a60c-1877" + "\n" + "Content-Type: application/http" + "\n" + "Content-Transfer-Encoding: binary" + "\n" + "\n" + "GET InteractionContacts?sap-client=100&$skip=0&$top=2&$select=ImageURL%2cName%2cContactLevelName%2cCountryName%2cCity%2cEMailAddress%2cPhoneNumber%2cMobilePhoneNumber%2cCorporateAccountName%2cInteractionContactUUID%2cRelationship%2cType&$inlinecount=allpages HTTP/1.1" + "sap-cancel-on-close: true" + "\n" + "Cache-Control: max-age=360" + "\n" + "sap-contextid-accept: header" + "\n" + "Accept: application/json" + "\n" + "Accept-Language: en" + "\n" + "DataServiceVersion: 2.0" + "\n" + "MaxDataServiceVersion: 2.0" + "\n" + "\n" + "\n" + "--batch_c914-a60c-1877--";var getContactOptions = { url: url, method: "POST", json:false, headers: { "content-type": "multipart/mixed;boundary=batch_c914-a60c-1877", 'Authorization': 'Basic ' + new Buffer(config.user + ":" + config.password).toString('base64') }, body: sBody};function getContact() { return new Promise(function(resolve,reject){ var requestC = request.defaults({jar: true}); console.log("Step1: get contact via url: " + url ); requestC(getContactOptions,function(error,response,body){ if( error){ console.log("error occurred: " + error); reject(error); } console.log("response:" + body); var nStartIndex = body.indexOf("{"); var nLastIndex = body.lastIndexOf("}"); if( nStartIndex < 0 || nLastIndex < 0) return; var sPayload = body.substring(nStartIndex, ++nLastIndex); resolve(JSON.parse(sPayload)); }); });}function displayResult(oResult){ console.log(oResult);}getContact().then(displayResult);使用node命令直接执行这个.js文件: ...

May 25, 2019 · 1 min · jiezi

如何在Marketing-Cloud里创建extension-field扩展字段

首先在Marketing Cloud里找到创建扩展字段的tile入口,搜索关键字extension: 这会进入Fiori应用“Custom fields”,能看到系统里所有创建好的extension field。点击+加号按钮新建一个: 维护这个扩展字段的技术信息,比如标签,类型,长度等等。 创建好之后点击按钮Publish,确保字段处于publish状态。 接下来需要为特定的UI enable这个字段的显示。在标签页UIs and Reports里,在对应的UI记录后点击按钮"Enable Usage": 最后一步,在UI上这个扩展字段放出来。点击Adapt UI: 进入Contact UI,点击加号按钮: 选择刚才创建好的扩展字段: 保存并publish发布change,至此这个扩展字段创建成功。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

May 25, 2019 · 1 min · jiezi

使用nodejs创建Marketing-Cloud的contact数据

源代码如下: var config = require("./mcConfig");var request = require('request');var url = config.tokenURL;console.log("user: " + config.user + " password: " + config.password); var getTokenOptions = { url: url, method: "GET", json:true, headers: { 'Authorization': 'Basic ' + new Buffer(config.user + ":" + config.password).toString('base64'), "content-type": "application/json", "x-csrf-token" :"fetch" }};function getToken() { return new Promise(function(resolve,reject){ var requestC = request.defaults({jar: true}); console.log("Step1: get csrf token via url: " + url ); requestC(getTokenOptions,function(error,response,body){ var csrfToken = response.headers['x-csrf-token']; if(!csrfToken){ reject({message:"token fetch error: " + error}); return; } console.log("Step1: csrf token got: " + csrfToken); resolve(csrfToken); }); });}function createContact(token){ return new Promise(function(resolve, reject){ var oPostData = {"CountryCode":"CN", "City":"Chengdu", "FirstName":"Jerry4", "LastName":"Wang2", "PostalCode":"610093", "RegionCode":"", "Street":"天府软件园", "HouseNumber":"天府软件园", "DateofBirth":null, "ContactPersonFacets":[ {"Id":"jerry1@sap.com", "IdOrigin":"EMAIL", "Obsolete":false, "Invalid":false}, {"Id":"", "IdOrigin":"PHONE", "Obsolete":false, "Invalid":false}, {"Id":"", "IdOrigin":"MOBILE", "Obsolete":false, "Invalid":false}, {"Id":"", "IdOrigin":"FAX", "Obsolete":false, "Invalid":false} ], "IsConsumer":true, "Filter":{ "MarketingAreaId":"CXXGLOBAL" } }; var requestC = request.defaults({jar: true}); var createOptions = { url: config.createContactURL, method: "POST", json:true, headers: { "content-type": "application/json", 'x-csrf-token': token }, body:oPostData }; requestC(createOptions,function(error,response,data){ if(error){ reject(error.message); }else { var oCreatedContact = data; console.log("created contact ID: " + oCreatedContact.d.ContactPersonId); resolve(data); } }); });}getToken().then(createContact).catch((error) =>{ console.log("error: " + error.message);});这里我把创建的contact的名称字段硬编码成Jerry4: ...

May 25, 2019 · 1 min · jiezi

使用postman创建Marketing-Cloud的Contact

首先在Marketing Cloud的UI上创建一个contact: 观察Chrome开发者工具network标签页里的HTTP请求: https://jerry.gcdemo.hybris.c... 这个请求用于读取CSRF token: 点击保存,会发送一个新的HTTP post请求: 请求url:https://jerry.hybris.com/sap/...再看下重要的请求头部字段: 把第一步获得的CSRF token填到Postman里的header字段里,如图: body: {"CountryCode":"CN","City":"Chengdu","FirstName":"Jerry1","LastName":"Wang1","PostalCode":"610093","RegionCode":"","Street":"天府软件园","HouseNumber":"天府软件园","DateofBirth":null,"ContactPersonFacets":[{"Id":"jerry1@sap.com","IdOrigin":"EMAIL","Obsolete":false,"Invalid":false},{"Id":"","IdOrigin":"PHONE","Obsolete":false,"Invalid":false},{"Id":"","IdOrigin":"MOBILE","Obsolete":false,"Invalid":false},{"Id":"","IdOrigin":"FAX","Obsolete":false,"Invalid":false}],"IsConsumer":true,"Filter":{"MarketingAreaId":"CXXGLOBAL"}} 状态码201,证明创建成功了: 可以在前端看到创建成功的contact: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

May 25, 2019 · 1 min · jiezi

使用postman修改SAP-Marketing-Cloud-contact主数据

Marketing Cloud里的contact主数据,创建成功后也不是所有字段都能够被修改。在Personal data区域的字段是可以被修改的。 比如我在“客户属性”字段里维护了一些值: 然后点保存: 其中第二个batch操作是通过一个roundtrip读取contact模型下多个子节点的数据,和我们这个修改的场景没有关联。 使用postman进行修改: body字段维护以下内容:--batch_1f7d-bd35-caedContent-Type: multipart/mixed; boundary=changeset_8f9e-9a44-9f9e --changeset_8f9e-9a44-9f9eContent-Type: application/httpContent-Transfer-Encoding: binary MERGE Consumers('02000A21209F1EE99CDF1A1FC9AA8065')?sap-client=100 HTTP/1.1Cache-Control: max-age=360sap-contextid-accept: headerAccept: application/jsonAccept-Language: enDataServiceVersion: 2.0MaxDataServiceVersion: 2.0x-csrf-token: fQ2Pwfmf0K_LVYoKV9QYUw==Content-Type: application/jsonContent-Length: 215 {"__metadata":{"uri":"https://jerry.hybris.com/sap/opu/odata/sap/CUAN_CONTACT_SRV/Consumers('02000A21209F1EE99CDF1A1FC9AA8065')","type":"CUAN_CONTACT_SRV.Consumer"},"YY1_CustomerType_ENH":"Jerry测试2"}--changeset_8f9e-9a44-9f9e-- --batch_1f7d-bd35-caed-- 我想修改的字段的新的值为:Jerry测试2 执行postman后,发现值已经更新了,修改成功 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

May 25, 2019 · 1 min · jiezi

使用nodejs对Marketing-Cloud的contact主数据进行修改操作

假设在Marketing Cloud有这样一个contact主数据: 现在需求是使用编程语言比如nodejs修改这个contact实例的高亮属性。 代码如下: var config = require("./mcConfig");var request = require('request');var url = config.tokenURL;console.log("user: " + config.user + " password: " + config.password); var getTokenOptions = { url: url, method: "GET", json:true, headers: { 'Authorization': 'Basic ' + new Buffer(config.user + ":" + config.password).toString('base64'), "content-type": "application/json", "x-csrf-token" :"fetch" }};function getToken() { return new Promise(function(resolve,reject){ var requestC = request.defaults({jar: true}); console.log("Step1: get csrf token via url: " + url ); requestC(getTokenOptions,function(error,response,body){ var csrfToken = response.headers['x-csrf-token']; if(!csrfToken){ reject({message:"token fetch error: " + error}); return; } console.log("Step1: csrf token got: " + csrfToken); resolve(csrfToken); }); });}function updateContact(token){ return new Promise(function(resolve, reject){ var sPostData = "--batch_1f7d-bd35-caed" + "\n" + "Content-Type: multipart/mixed; boundary=changeset_8f9e-9a44-9f9e" + "\n" + "\n" + "--changeset_8f9e-9a44-9f9e" + "\n" + "Content-Type: application/http" + "\n" + "Content-Transfer-Encoding: binary" + "\n" + "\n" + "MERGE Consumers('02000A21209F1EE99CDF1A1FC9AA8065')?sap-client=100 HTTP/1.1" + "\n" + "Cache-Control: max-age=360" + "\n" + "sap-contextid-accept: header" + "\n" + "Accept: application/json" + "\n" + "Accept-Language: en" + "\n" + "DataServiceVersion: 2.0" + "\n" + "MaxDataServiceVersion: 2.0" + "\n" + "x-csrf-token: fQ2Pwfmf0K_LVYoKV9QYUw==" + "\n" + "Content-Type: application/json" + "\n" + //"Content-Length: 215" + "\n" + "\n" + "{\"YY1_CustomerType_ENH\":\"Jerry测试1\"}" + "\n" + "--changeset_8f9e-9a44-9f9e--" + "\n" + "\n" + "--batch_1f7d-bd35-caed--"; var requestC = request.defaults({jar: true}); var createOptions = { url: config.updateContactURL, method: "POST", json:false, headers: { "content-type": "multipart/mixed;boundary=batch_1f7d-bd35-caed", 'x-csrf-token': token }, body:sPostData }; requestC(createOptions,function(error,response,data){ if(error){ reject(error.message); }else { debugger; console.log("Contact updated successfully"); resolve(data); } }); });}getToken().then(updateContact).catch((error) =>{ console.log("error: " + error.message);});我在nodejs代码里把需要更改的字段值赋为"Jerry测试1”: ...

May 25, 2019 · 2 min · jiezi

如何使用Chrome开发者工具找到Marketing-Cloud某个contact的guid

我们使用nodejs对contact进行修改时,需要指定待修改contact实例的guid。 这个guid属于technical属性,在Marketing Cloud UI上默认情况下不可见。如何找到这个属性值呢? 其实就在浏览器地址栏的url里: 当然在Chrome开发者工具的network标签页里也能找到这个guid: 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

May 25, 2019 · 1 min · jiezi

Marketing-Cloud-demo环境和API使用方法说明

version 1.0作者:Wang Jerry更多问题请联系我 demo 系统url:https:/jerry.hybris.com/sap/b... 用户名/密码:Jerry1/Diablo1登录成功之后,可以在菜单"快速启动"->"Manage Contacts"里找到Marketing Cloud contact管理应用。单击: 这里就能看到该系统里所有的contact列表了。左边的1218377是系统contact总个数,正下方Create就是新建按钮,可以通过这个按钮打开contact创建页面。右边的search bar就是一个Google风格的模糊搜索入口。 这个界面第一次使用的话需要注意一些小技巧。 上图高亮的四个控件实际上是四个过滤器,例如当前系统里并不存在状态为For Review的contact,数字为0,因此单击这个过滤器后: 表格会显示0条数据。这是用户期望的行为,因此大家如果看到表格是空的,不要觉得奇怪。 当单击某条contact数据的超链接后, 会跳转到contact明细页面. 下图url里高亮的guid就是这条contact在SAP数据库里的主键值。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

May 25, 2019 · 1 min · jiezi

最不合格的SAP应聘者-从大学生到SAP成都研究院开发工程师

让我们把时光之轮倒拨回2006年,SAP成都研究院刚刚成立的时候,有一位年轻的电子科技大学研究生,网名雷米兰(这名字一看就是AC米兰铁杆粉丝),加入了SAP成都研究院并被派遣到SAP德国总部进行实习。雷米兰将自己的实习和成长经历写成了一个系列的博客,这个系列的名称就叫做《一个SAP全球研发服务中心(成都)新进工程师日记》,在当时全国各大本科生和研究生求职网站和论坛上引起了强烈的反响, 也给当时刚刚成立不久的SAP成都研究院在网络上吸引了很多人气。 Jerry当时也拜读了米兰君的每一篇文章,确实对当时同为实习生的我有着非常大的启发作用。 感兴趣的朋友们,可以点击下面的链接,读一读来自这几篇来自13年前,这位优秀的SAP成都研究院实习生雷米兰的文章: 一个SAP全球研发服务中心(成都)新进工程师日记 http://blog.sina.com.cn/s/blo... 历史总是惊人的相似,SAP成都研究院成立13年之后,又有一位年轻的小伙子,和他的前辈雷米兰当前一样,以"最不合格“的应聘者身份成功加入SAP成都研究院,并沿着前辈当年相同的足迹一路前行。 这位小伙子就是Jerry同组的同事,SAP成都研究院数字创新空间的Xu Haytham,在办公室里就坐我对面。这是他的工位: 关于Haytham生活中的兴趣爱好,已经在Jerry之前公众号的这两篇文章提到了,这里不再赘述。 SAP成都研究院数字创新空间沟通S/4HANA和C/4HANA的智能服务演示视频和Coresystems分享预告SAP成都研究院许聚龙:Hello, Coresystems!虽然Haytham今年7月份大学毕业后才会结束实习期,以正式员工的身份加入SAP成都研究院,但在Jerry心中,早已把他当作团队的正式成员了:Haytham在Jerry目前参与的开发项目中,早已成为一位合格的前端开发人员。他用Vue开发的前端界面,会和Jerry用nodejs开发的微服务进行对接。 值得一提的是,Haytham在进入这个项目之前,没有接触过Vue,进入项目后,也没有其他同事和他共同用Vue开发,所有前端Vue开发的技术问题都由他自己想办法解决。这种如此年轻就能独立工作的能力,远远超过当时的Jerry——我2007年加入SAP成都研究院开始实习后,很长一段时间都无法独立工作,遇到解决不了的难题都只好求助身边的资深同事。 下面是Haytham的正文。 *从2018年6月正式加入SAP成都研究院开始实习至今,已经过去了10个月有余,这10个月对我来说是异常独特且难忘的。从一开始的“最不合格”的应聘者,到后来的最早拿到offer,再到现在的SAP德国总部实习,以及中间各种独特小插曲,共同构成了这让我难忘的10个月,也因此让我十分想将这一切付诸文字,记录和分享我参与的VT项目(Vocational Training)、我所在的团队、以及我眼中的SAP。 截至动笔前已在德国生活了近2个月,所见所闻甚多,如果时间允许的话,我想把这些经历都陆续分享给大家。在正式开始前,我想说明一点:SAP是一家伟大的公司,我仅仅只是管中窥豹;如同电影《两杆大烟枪》中的角色一样,我只能做到个体视角下的复述。 在很久以前的时候,我听说过一个“传说”,当时正在读高中,记不清缘由的在和朋友开始吹牛聊国外的IT公司,我们列举了微软、IBM、因特尔等等,进行了一番“高谈阔论”,然后突然有人提到一家叫“思爱普”的奇特公司,据说这家公司非常精通企业管理和运行,每次帮一家公司开发一套系统,都会派人过去帮助他们梳理和规范流程,而且每套系统价格都比较昂贵。当时聊天的其他细节都已经记不清楚了,但是这个“传说”却深深的印在了我的脑子里。 再一次听到SAP是2017年的7月份,当时正在IBM实习,于北京驻场开发,项目的产品经理正是一个和SAP有很深交集的人,期间他偶尔会向我讲起他在SAP的经历。4个月后实习结束,我也返校继续学业,并且次年春季开始投递简历,确定最后的入职公司。在这期间,之前这位产品经理把SAP实习生招聘的信息发给了我,我和SAP的交集,也从此开始。 文章标题我用“最不合格”一词来形容我自己,主要因为当时的我是非常不符合SAP的招聘标准的,因为招聘主要面向研究生,岗位是软件工程师。首先我是一个本科生,其次虽然我的专业是计算机,但是在校期间除了课程内的编码作业外,几乎没有任何其他的代码经验。虽然在上学期间加入了以web技术为主的技术工作室,但做过的事情基本和技术不相关,主要集中在沟通协调、绘制原型、测试等方面,因此除了大量的和技术相关的名词,我的脑子里并没有留下其他和技术相关的东西,也因此常常的被其他成员“鄙视”,给我留下了深深的“阴影”,以至于到了现在我会很谨慎的用“程序员”称呼自己。总结一下就是,我有很大的信心应聘项目助理,但是SAP的软件工程师,我觉得自己是不合格的。 我很清楚自己是喜欢技术的,很想将技术岗作为自己将来的职业发展方向,但是当时的自己确实技术水平是“不合格”的,所以即便没有抱太大的希望,但还是投递了简历,而且出乎意料的,简历通过了初筛,我收到了面试邀请。这是一场我至今难忘的面试经历。实习生面试共分为两轮,第一轮群面、第二轮小组面。群面是常规的无领导讨论,小组面考察的方面比较广,包括计算机的基础知识:数据库、数据结构、算法、操作系统、软件工程等;除此之外还有智力题和个人履历询问等。 第一轮的小组面是让我比较惊讶的。对于参与过项目助理面试的我当然是不陌生的,但是大部分互联网公司对技术岗是不设群面环节的,因为这不是程序员的长项。正如此,群面是我认为自己表现的最好的环节。第二轮的小组面3人一组,有书写作答也有抢答,和我同组的是两个具有开发经验的研究生,这轮面试是非常有戏剧性的,至今回忆起来我都觉得非常有趣,面试过程呈现了严重的两级分化情况,凡是涉及计算机技术相关的题目,我回答的都很糟糕,甚至交过一次白卷,而两位同组的研究生却基本都能答上;但提问到软件工程和智力题时,情况完全翻转了,我能够非常快速的给出答案,但是两位同伴却出现了卡壳的情况。就这样几轮问答之后,面试官根据面试过程得到的信息,分别再询问了我们的个人履历后,面试结束了。 离开时我的心态是非常放松的,因为我认为自己交了一份本末倒置的答卷,唯一能和其他面试者横向对比的只有难以定性的“潜力”,我觉得自己获得实习offer的机会微乎其微。但是通过这次面试,SAP VT项目却给我留下了深刻的印象。因为在当时互联网公司的招聘氛围下,”面试造火箭,实习拧螺丝“是普遍现象,没有刷过面经和题库的面试者都很难在笔试环节存活下来。而在这种氛围下,SAP VT的面试内容却聚焦在学科基础知识,而且着重考察面试者的综合素质,是完全出乎我这个大学生的意料的。正因如此,当我再通过第三轮电话面试,接到实习offer时,内心的激动是真的难以言表。 就这样,我这个“最不合格”的应聘者神奇的拿到了SAP成都研究院的实习offer,时至今日我都没有特别明白当初面试官是认可了我哪一点,以至于给我发了offer,又或者我只是运气好,在那个入围名单的最后一位。就像开头说的,我就像《两杆大烟枪》中的戏中一角,没有全知的上帝视角,具体原因我也无从而知。但是很高兴自己获得这个在实习中证明自己对得起这个实习offer的机会。在后来多次和工作室的学弟们提到SAP,讲到VT项目时,我都会提到我的面试经过,让他们知道在当下的应届生招聘环境下,还是有像SAP这样的公司会注重一个人的“潜力”,并愿意投入资源助其成长的。 希望我这段SAP成都研究院的求职经历能对广大应届毕业生们有些启发。如果您对SAP成都研究院优秀的职场人士们的工作生活感兴趣,欢迎阅读下面这些文章: SAP成都研究院35岁以上的开发人员都去哪儿了?从程序猿到SAP产品经理,我是如何转型的?SAP成都研究院马洪波:提升学习力,增强竞争力,收获一生乐趣汶川大地震中的SAP成都研究院SAP成都研究院的体育故事一个SAP顾问在美国的这些年SAP成都研究院飞机哥:程序猿和飞机的不解之缘ABAP vs Java, 蛙泳 vs 自由泳一个SAP开发人员的双截棍之路SAP成都研究院Sunshine: 我的C4C实习感受和保研之路金庸的武侠世界和SAP的江湖SAP成都研究院2018年总共87篇技术文章合集Jerry的2017, 编程与游泳一个SAP开发人员的2018年终总结要获取更多Jerry的原创文章,请关注公众号"汪子熙":

May 11, 2019 · 1 min · jiezi

S4HANA中的销售计划管理

大家好,我所在的S/4HANA Sales(SD)成都研发团队,主要负责S/4HANA里销售模块相关的标准产品研发。 作为产品研发团队,我们遵循SCRUM迭代式增量软件开发过程,以两个星期为一个迭代,并且以一个季度一次发布新版本。通常在新版本的开发之初,研发团队会有计划和统筹,而在开发后期会有一个完整的回顾。团队回顾的目的,主要是总结和对未来进行准备和展望,回顾的形式有时比较正式,有时会多样一些。 上一次我们团队的回顾总结发生在黑龙湖湖畔: 有没有感受到大家的无限爆发力????? S/4HANA Sales(SD) 成都招新啦! 借Jerry的地盘打一广告:我所在的S/4HANA SD成都研发团队最近再次迎来增长的机会,我们将组建两个全新的SCRUM开发团队,渴求多元化角色:研发经理,产品经理,架构师,质量管理,各级别开发人员,用户体验设计师,文档人员等等。 欢迎有兴趣的朋友自荐或推荐。SAP内部的同事可以直接在招聘网站搜“SAP S/4HANA Sales (SD)”申请。如果有任何问题,请联系Zhang Sean(成都)。外部的朋友请直接在链接中申请,请关注 S/4HANA Sales(SD)开头的,另外部分职位目前外部不能直接申请,如果有兴趣请联系认识的朋友转递: https://jobs.sap.com/search/?... 前言 回到本文话题,就像我们的产品在每个新版本和每个迭代前都会有计划一样,每个企业的销售团队也需要有计划。所以今天跟大家一起探讨S/4HANA里的销售计划应用如何帮助企业实现销售计划的灵活管理。 在SAP的产品中,针对不同的业务有不同的计划或规划的解决方案,比如供应链管理领域的集成业务计划, Integrated Business Planning(IBP),其提供了端到端的供应链计划业务流程,支持对数据实时分析以及与合作伙伴的快速协同;财务相关领域的全面预算及合并Business Planning and Consolidation(BPC);以及SAP分析云Analytics Cloud(SAC)上也能实现通用的规划,后续我的同事会单独就后者进行分享。 当然也有今天这篇文章的主角,S/4HANA 销售领域的销售计划管理应用,其主要是帮助销售相关人员对销售团队的计划和绩效进行管理。 销售经理业务角色 上一篇 S/4HANA业务角色概览之订单到收款篇 中,我们介绍了销售经理的主要职责: 负责监控和优化销售流程和销售计划,并分析销售特定的关键性能指标 (KPI),例如销售量和利润率。对于每个企业的销售,没有销售计划就谈不上科学的销售管理,而销售经理的管理过程就是销售计划的制订、实施、监控和评价的过程。因此,销售经理的活动会从订单到付款的整个过程贯穿始终,而监控和优化销售流程和销售计划作为销售管理的首要任务。 在S/4HANA里销售经理模板是SAP_BR_SALES_MANAGER,包括了多个业务目录,这些业务目录跟最佳实践范围项目(Scope Item)关联,每个企业可以根据自己的实际业务选择激活对应的范围项目,从而可以使用对应业务目录里的应用。如需了解每个范围项目的详情,可以访问其对应的最佳实践网站链接。 这里列举销售经理的三个典型业务目录: ·       SAP_SD_BC_SALES_ANALYTICS 分析目录:利用此业务目录,您可以通过查看各种维度的分析报表了解实时的销售绩效和 KPI。 https://rapid.sap.com/bp/scop... ·       SAP_SD_BC_SP_PROC_PC 销售计划目录:利用此业务目录,您可以创建、更改、审批和显示销售计划。此外,可实时将计划数据与实际数据进行比较。 https://rapid.sap.com/bp/scop... ·       SAP_SD_BC_SALES_PREDICTION_PC 销售预测目录:利用此业务目录,您可以按不同维度查看实际和预测值,对销售绩效进行监控。您还可以选择现有销售计划,以便对实际值、预测值和计划值进行比较。 https://rapid.sap.com/bp/scop... 销售分析的相关应用主要来自于SAP_SD_BC_SALES_ANALYTICS,如下图中的应用。 销售计划的相关应用主要是在业务目录SAP_SD_BC_SP_PROC_PC中。图中的两个应用都是在S/4HANA里的Fiori应用。 管理销售计划 作为销售经理,您可以通过此应用创建、更改、审批和显示销售计划。此外,为了与团队的其他用户共享销售计划,您可以将销售计划分配至团队。通过该操作,团队中的每个成员都可以访问您的销售计划,并使用您的计划数据进行分析。如果未将您的销售计划分配到任何团队,则销售计划仅对您可见。 在销售计划中,针对计划期间的不同维度设置销售目标。根据您为销售计划定义的属性,系统会自动为您生成计划布局。将此计划布局下载至本地另存成Microsoft Excel的XLSX格式文件,此后可以在本地输入计划数据,并重新上传导入至S/4HANA销售计划应用中。 应用使用了ABAP DRAFT 框架(能支持数据更改的自动草稿存储,类似于Excel或Word的自动保存,但是这里实现的是草稿保存, 即随时可以取消,并且在用户显式点击保存后,会转移到永久存储区域),同时,该应用使用事务操作的CDS(Core Data Service)建模继而通过BOPF框架实现业务对象管理,并通过OData将后台数据服务发布,最终通过前端的Fiori应用进行呈现。 下图是该应用的概略架构图。 Fiori应用的技术实现,可分为基于模板(Smart Element)和自由式(Freestyle)实现两类。 ...

May 11, 2019 · 1 min · jiezi

一个SAP顾问的回忆我过去很胖

去年也是这个时候,SAP成都研究院体育界大神邓阳,曾经赏脸在Jerry这个公众号上赐文一篇,介绍了他和围绕在他身边的一群小伙伴们的体育故事:SAP成都研究院的体育故事 而今天文章的主角则是SAP成都研究院一位低调的女顾问,因为低调,所以这位同事不愿意透露自己的姓名和工作部门。尽管如此,Jerry对她仍然非常钦佩,因为我感觉她自从坚持锻炼之后,从外观上仿佛完全变了一个人。 2011年夏天,Jerry参与了对一位应聘SAP成都研究院开发岗位的女求职者的面试。见面之后,我心里嘀咕: 这位姑娘长得好“健壮”啊。不过这位姑娘还是凭着自己过硬的SAP专业技能顺利通过了面试,并和我们一起愉快地工作至今。不过Jerry心中认为,我们程序员这个工作职位,每天都得久坐,如果没有超乎常人的毅力,这位女同事的身材恐怕很难改变了。 2016年的时候,因为工作岗位的变动,Jerry和这位女同事不再工作于同一层楼,因此几乎没再碰过面。前段时间Jerry走在地铁里,有人在背后叫我,转身一看愣住了,那个身材一直壮壮的这位女同事,像变魔术一般地一下子苗条了很多,让我觉得不可思议。 好奇的Jerry几番询问之后,对她不是通过节食,而是通过坚持运动达到瘦身这个过程非常钦佩,于是就有了今天这篇文章。下面是这位女同事的正文。 *我,一直是一个很自卑的人,习惯做一棵小草,默默地在角落里生长。 高中开始,我就一直在微胖和胖的交界处游离。大学前三年,一个北方妞到四川,由于饮食的不适应,一日三餐都吃得不多,再加上爱打羽毛球,身材还是有一段光辉岁月。 大学毕业工作后,开始吃得多动的少,体重也一发不可收拾,终于在生完娃哺乳期间达到顶峰。曾经在乘坐公共交通的时候,一度有人把我当孕妇,好心给我让座。有一次118公交车司机看没有人给我让座,专门停下车让人给我个位置。公交车师傅是个好心人,只是我的肚子欺骗了大家。商场导购员不为我提供服务也就算了,还要补刀一句:” 姐姐对不起,我们的衣服没有你的size。”  这个社会对偏胖的人是“不友好”的,但是击垮自己的不是别人的评价,而是自我认可。膝盖不能承受超标的体重,轻微运动后就会感觉非常不适,隔段时间就需要去找中医针灸消炎。 每天拖着多余的几十斤肉,无论做什么都散发着臃肿,笨拙和油腻的气息,这一切让我抗拒拍照。 跟女儿的合照很少,不想让女儿的回忆里有太多“这样”的自己。 人的一生中总会遇到一些重要的节点,重要的人和事,给你的生活工作带来很大的变化,真的要感恩那些为我带来正能量的小伙伴儿们,也感谢SAP成都研究院给员工提供的福利——健身房。 2016年,我从职业发展上想做一次尝试和挑战,工作岗位发生了变化。作为一枚Chloe的资深迷妹儿(Jerry: SAP成都研究院的Chloe无论从外貌,气质和内在各方面,确实配得上女神二字),追随着女神的脚步,从方方面面开始调整自己。新的团队有一批自律而充满活力的小伙伴儿,我从开始对他们的单纯敬仰和佩服,到观察他们的作息和工作时间安排,再一步步加入他们。到现在,已经历时两年半了。 刚开始走入SAP成都研究院健身房的时候,在跑步机上快走,看其他同事做Infinity,30分钟下来一个个汗流浃背,特别羡慕。自己不敢尝试,认为自己做不到,也担心膝盖承受不了。Alex鼓励我跟着一起做,从低配版开始,那段时间的感受很痛苦,从肌肉的酸痛到剧烈的心跳,全身上下的细胞被虐了个遍,但是连续几天过后明显感觉到自己越来越能坚持,动作的幅度也能做得更大,更标准。这样一来,就有了继续下去的动力。 环境会悄悄的影响你的思维,你的习惯,甚至你的价值观。身边这些充满正能量的同事们对我的影响特别大。 “一件事情之所以你还在坚持,肯定是你从中受益了”。 2017年10月到2018年年底,是我坚持锻炼最好的一段时间,除了工作原因和身体特殊情况,每周坚持保持了4-5天的锻炼。最大的变化是精神状态,锻炼之前,感觉整个人状态是萎靡的,含胸驼背。锻炼之后,身体变得轻松灵活,头顶有股向上的力量,哪怕周末白天被孩子溜一天,晚上还能跑个10公里。在我没有坚持锻炼之前,绝对是妥妥的瘫在床上。以前工作压力大了,心情不好的时候会选择吃吃吃来释放压力,还要美其名曰 “过劳肥” ,现在会习惯性地选择跑步。一顿烧烤能排解的压力和不开心,一场跑步绝对能够达到更好的效果,而且让身体和心情没有额外的负担。小感冒也可以被一场跑步解决掉,胜过 “多喝热水”的经典操作。锻炼带来的不光是身体的变化,更是生活习惯的变化。 2017年5月20日,我第一次假装参加了马拉松,兴隆湖半马,我报名5.2公里的欢乐跑。参加的人都激情满满,被感染得热血沸腾。 2018年底报名温江半马,报半马的主要目的是激励自己去积极准备,准备的过程就是自律的过程。可是越临近比赛的日子,越觉得自己脑袋一定是被门挤了才冲动报名半马。等到了参赛的日子2019年4月21日,早晨坐地铁的路上,在起跑区的时候,都还一直怀疑自己能不能完成。等开始跑了,就没有任何杂念了,唯一的执念就是跑下去完成它,给自己一个勋章。有时候,就是push自己去做,去挑战,才会遇到更多精彩的人和他们的故事,同时也丰富了自己的人生阅历。 跑完这次半马,定了个小目标:在时间和地点允许的情况下,争取每年能跑一次半马。 马拉松,只有跑了才能够理解它的魅力。 在前进的路上肯定会遇到各种各样的人,他们发出不同的声音,有激励的,有诋毁的,也有肯定鼓励的。最重要的还是自己把坚持演变成一种习惯。 曾经有人跟我说过:“胖子可以变瘦,丑和气质就是难题了“。也有人说过:“额,颜值那么低,你老板好意思带出去见客户吗?” 最可怕的不是别人说什么,而是自己放弃了自己。 权且以此文章为励志铭,当想多吃一口少动一点的时候,想到这篇文章能管住嘴迈开腿。 美好的东西,总不会轻易获得。真正去坚持一件事,时间会给你一份自然而然的答案。感谢阅读。 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

May 11, 2019 · 1 min · jiezi

Jerry-Wang在SAP社区上获得的徽章

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

May 11, 2019 · 1 min · jiezi

ABAP很厉害是怎么一种体验?

知乎上偶然看到这个问题,觉得很有意思,我也来回答一发。我本科和研究生学的是计算机专业,做项目用C/C++,研究生三年项目的代码量大概在三到四万行左右。2007年大学毕业加入SAP成都研究院一直工作到现在,工作中用的最熟练的编程语言是ABAP,Java和JavaScript。当然做SAP Cloud application Studio这个工具开发时,也用过一段时间的C#。做一个SAP内部的大数据项目也用过一阵子Scala,Python和Go语言在做Hyperledge Fabric on SAP Cloud Platform时也学了一些皮毛。我没有把自己定位成“ABAP开发人员”或是“Java开发人员”,而是“SAP应用开发人员”。也就是说组织给我分配一个开发任务,我自己就得去琢磨,选择合适的编程语言来完成。ABAP,Java和JavaScript这三门我工作中用的最多的编程语言,在我眼中没有优劣之分,就是不同的编程工具,有各自的适用场合,如此而已。我曾经写过一篇文章:Jerry的ABAP, Java和JavaScript乱炖百度即可找到,里面包含了我对这三门语言一些特性的横向比较。文章链接:https://www.cnblogs.com/sap-j…回到ABAP语言本身,我认识SAP总部Walldorf很多资深的ABAP应用开发人员,当然也包括ABAP编程语言本身的开发人员,即用C语言开发ABAP虚拟机和运行时的那些同事,称呼他们为计算机科学家更合适。我想任何资深的ABAP应用开发人员,在他们面前也没有资格说自己“ABAP如何如何厉害”,因为这些计算机科学家们才是ABAP世界的创世主和维护者。C和ABAP的关系,可以参考我这篇文章:聊聊C语言和ABAP文章链接:https://www.jianshu.com/p/a99…至于一些网络上老生常谈的问题,诸如:做ABAP开发有前/钱途吗?为什么ABAP开发的收入比Java开发高/低?我已经在一些文章里表明了我的个人意见:上图文章的链接:https://blogs.sap.com/2017/01…中文版:ABAP开发人员未来应该学些什么文章链接:https://www.jianshu.com/p/b74…我写过的其他一些关于ABAP的文章:Jerry 2017年的五一小长假:8种经典排序算法的ABAP实现:https://www.jianshu.com/p/ceb…Jerry的ABAP原创技术文章合集:https://www.jianshu.com/p/020…300行ABAP代码实现一个最简单的区块链原型:https://www.jianshu.com/p/844…ABAP vs Java, 蛙泳 vs 自由泳:https://www.jianshu.com/p/4a0…动手使用ABAP Channel开发一些小工具,提升日常工作效率:https://www.jianshu.com/p/1cb…我用ABAP做过的那些无聊的事情:https://www.jianshu.com/p/688…使用Visual Studio Code编写和激活ABAP代码 (上):https://www.jianshu.com/p/0db…你的ABAP程序给佛祖开过光么?来试试Jerry这个小技巧:https://www.jianshu.com/p/97c…关注Jerry的公众号“汪子熙”,轻松获得所有SAP文章:要获取更多Jerry的原创文章,请关注公众号"汪子熙":

April 13, 2019 · 1 min · jiezi

我做SAP CRM One Order redesign的一些心得体会

框架开发和应用程序的开发完全不一样。举个具体的最近折腾我的例子: 创建新的service order,维护header的shipping data,此时order和shipping data的mode 都是creation,然后创建line item,添加product,header的shipping data带到line item,然后在line shipping data做修改,item的mode变成了change,此时不存盘,直接删除该item,然后马上另外创建一个item,继续编辑,此时第二个item的mode是creation,前一个item的change mode变为deletion,然后再删除第二次加的line item,不存盘,再创建第三个project,维护一些数据,存盘。此时我代码里的buffer处理会出问题,存到DB确实有一条item数据,但是已经corrupt掉了。 由于我buffer 处理logic有bug, 我花了很大功夫最后发现是第二次被删除的那条数据的内容被错误存到了DB里: 我甚至花了大量的时间来找重现这个错误的办法,因为最初我是偶然的机会发现这个错误,但是没留意我的操作,最后才找到能稳定复现问题的步骤,赶紧记录下来: 这个buffer处理的bug直接导致了今天三个新bug: 这就是框架开发的难度。如果是做应用,可以和PO商量,哪个客户吃饱了做这种操作?不支持。但是这些操作从Oneorder框架的角度来看,无非就是create, update和delete三个local buffer的处理罢了,没有任何理由不支持这种sequence的操作。反过来说,当developer经过一段时间努力之后能够自如地应对这些挑战,从这些bug中抽丝剥茧定位问题,给出correction,他的开发能力一定能得到很大提升。Developer对于自己编程能力的提升是没有止境的,我来之前本早已对自己的编程能力非常自信,但是经过这21天的开发,我还是造了一共40个bug出来。但我最终都fix了他们,每解决一个bug就像以前Wuji老师用游戏打比方一样,获得一定经验值。bug越难经验值越高。我做这个POC确实是全神贯注拿出全部精力去做,就这样都还生产了这么多bug,确实很烧脑。我每踩一个坑,都会用Jerry : timestamp这种格式写下注释. 如果用Jerry做关键字搜索,能发现34处坑:每一处坑趟过之后都增加了我对one order的理解,我把这些bug当作我的一笔财富。比如看这个"this code is ugly"的注释,点进去看: 确实很ugly,这恰恰就是fix注1里提到那个buffer更新bug的correction的一部分,加了注释估计没接触过one order的人也看不懂。我们拿成都现在已经完成一部分的product harmonization为例来看:7531行代码。而这个POC,做到今天是第21天,代码量已经超过product harmonization一半了。请看其中我highlight的这个class,是我的搭档IMS写的,他从2010年开始做One order。这个class 到现在写了921行,就为了实现一个功能:把partner的数据从新表里读出来,放到对应的buffer里去。为什么有921行?因为buffer的插入很有讲究。我每天吃饭,骑车的时候都在想这些buffer的东西。这个redesign的关键用三个词来概括的话,就是buffer, buffer, buffer.2017-05-15 9:45PMModel redesign targetOne order model redesign主要发生在下图我画的黑色方框内的模块, 下列是需要完全重新开发, 而非harmonization的内容新的数据库表。每个object type一张表,比如BUS2000116是Service process,有且仅有一张header 表,BUS2000131是sales item,有且仅有一张item表围绕这些数据库表的CRUD API.简单的说,就是这两件事。当然和One order 框架的复杂程度相关。Scope其中有9个component是硬骨头,当前POC已经done了两个,我用黄色标记。现有的POC,整体框架已经搭起来了,one order在新的model下已能正常工作,productive实现除了上述提到的7个硬骨头之外,不存在做不出来的东西和Feature. 当然,根据大家这么多年的开发经验,POC不可能100%暴露productive开发的所有问题。概括起来说,就是我们不需要从头空想一套东西来实现,一切以现有的POC为基础,这也是Carsten现在对这个POC非常重视的原因,每个方法,每行代码,在他力所能及可以抽出时间review的时候,他都不放过。开发这个事情并不是说工作认真负责就能deliver高质量的代码。打个不恰当的例子,我和Oliver工作都很认真,但我们还是生产了38个bug.和Carsten一起工作一个月,我对他工作风格的体会:一方面,他review你东西的时候非常仔细,非常注重细节,包括我之前举的例子,比如某方法是在LOOP里call还是外面call好,method的参数设置等等。另一方面,对于什么才是正确的design,他往往只给出大方向,overall的思路,但不会具体到可以直接拿来实现那么细的粒度,比如他不会告诉你为了实现他的思路,需要几个class,每个class几个方法,每个方法参数如何定义。他这种工作方式make sense,因为Chief Architect不需要把事情拆分这么细。这样就造成我最近按照我自己的理解去实现他那些思路,所以经常返工,refact. 要获取更多Jerry的原创文章,请关注公众号"汪子熙":

March 10, 2019 · 1 min · jiezi

Fiori Fundamentals和SAP UI5 Web Components

这周有位同事邀请我给团队讲一讲SAP技术的演进历史,所以我准备了下面几个主题来介绍。其中SAP的技术回顾和演进,我的思路就是从前后台两方面分别介绍。我画了一张非常简单的图:去年5月我写过一篇文章:SAP UI和Salesforce UI开发漫谈,简要回顾了SAPUI技术的发展,从最古老的SAP GUI绘制界面,到Webdynpro / WebUI再到现在广泛使用的Fiori UX。当时这篇文章介绍到Fiori(UI5)就嘎然而止了,如今大半年过去了,我们继续聊聊Fiori的发展动向。根据Jerry从SAP社区上已经发布的信息来看,Fiori的两个发展方向,我个人概括为:1. 兼容并蓄,即通过Fiori Fundamentals,让使用非UI5开发框架的前端开发人员,用其喜爱的技术,也能开发出符合Fiori UX的应用。2. 轻装上阵,即通过SAP UI5 Web Components,既能继续提供像之前UI5控件库那些开箱即用的众多UI控件,又避免了前端应用对UI5框架的依赖。我们来分别了解一下这两个新概念。Fiori Fundamentals看看SAP官网上的权威定义:https://experience.sap.com/ne…Jerry在上图把最关键的信息都用红色高亮出来了。重点:1. Fiori Fundamentals在前端应用里扮演着一个轻量级展现层的角色,可配合Angular, React和Vue等前端框架一起使用。2. Fiori Fundamentals不是一项新的UI技术,更不会取代UI5,而是一个CSS和HTML标签的集合,使得开发人员能使用其偏爱的UI框架去开发具有Fiori UX风格的应用。同样,Jerry去年年底写的另一篇文章 SAP Fiori + Vue = ?,介绍的其实就是Fiori Fundamentals针对于Vue的实现。刚刚提到的重点2,Fiori Fundamentals是一系列CSS和HTML标签页的集合,那么我们到Jerry的这篇文章里介绍的例子去找找。这是例子里引用的CSS:这是SAP Fiori Fundamentals帮助文档里提到的绘制表格的标签:在我的Vue应用里如何消费这些标签:至于为这个标签绘制而成的表格添加事件处理机制,其方法和纯粹的Vue应用完全一致,因此一个传统的Vue开发人员,借助Fiori Fundamentals的帮助,几乎不需要任何额外的学习就能够进行SAP Fiori应用的前台界面开发。SAP UI5 Web ComponentsSAP德国的UI5开发人员Peter Muessig最近在SAP社区上发表了一篇博客:UI5 Web Components - the Beta is there,大家可以通过本文末尾的"阅读原文"来阅读他的原文。如Peter文章题目所说,SAP最近发布了UI5 Web Components的Beta版本,并邀请广大SAP生态圈的开发人员试用并提出意见。Peter的文章不长,但是为了方便不喜欢读英文的朋友们也能快速了解这个UI5 Web Components是个什么东东,Jerry还是把里面一些要点用我自己的语言表述出来。下面的部分并非Peter文章内容的简单翻译,而是Jerry阅读了之后,基于自己的理解再加上自己的扩充。大家如果对我文章的内容有质疑,欢迎留言讨论。SAP UI5 Web Components,是SAP将之前SAP UI5控件库里的控件,按照Web Components标准规范重新实现后的产物。相信了解SAP UI5的朋友们,看了我上面这句描述,脑子里会冒出这些问题:1. 什么是Web Components标准?2. SAP为什么要做这个重新实现的事情?3. 重新实现后的产物到底是个什么东东?关于第一个问题,直接访问Web Components的官网即可找到答案。程序猿们都懂的,org结尾的网站最喜欢定义各种几百页甚至上千页的技术规范,Web Components也不例外:https://www.webcomponents.org…前端组件化一直是前端生态圈很火热的讨论话题之一,像前端三驾马车Angular,React和Vue都有自己的组件化实现,而webcomponents.org上定义的规范,其实就是给出了一个标准,只有满足这个标准里的实现,才能算是一个通用的组件化实现,才能被所有现代浏览器支持。这个规范的内容也托管在github上的:https://github.com/w3c/webcom…里面包含四大标准Shadow DOM,Custom Elements,HTML Templates和CSS changes,SAP UI5 Web Components的实现当然也满足这些标准。第二个问题,SAP开发UI5 Web Components的动机。Jerry个人的看法:给客户和Partners提供一种更灵活的使用UI5控件的方式,避免对UI5框架的依赖。举个例子,如果我们想使用UI5控件库里提供的button控件,就算只在XML视图里写简单的一行定义,最后运行时的UI5框架也会执行许多很复杂的逻辑,Jerry在四年前写的UI5框架自学教程里曾详细描述过:https://blogs.sap.com/2015/10…而借助SAP UI5 Web Components,开发人员根本不需要导入UI5框架,就能直接使用UI5里的控件。按照Peter文章的描述,SAP UI5 Web Components能用于任何前端框架中,即下图中高亮的最后一句话。此时自然需要回答第三个问题了。SAP UI5 Web Components到底是个什么东东?上图传达的重点:1. SAP UI5 Web Components并不是基于UI5框架的。换句话说,和UI5框架没有任何依赖关系,可以独立使用。2. SAP UI5 Web Components并不是SAP UI5框架的接替者,而应看作后者的一种补充。3. 将UI5控件库提供的控件在HTML层级暴露给消费者,而非传统方式下的API层面暴露方式。如此一来,UI5 Web Components可以不依赖于UI5框架,能直接用于其他的前端框架。看个具体的例子:在浏览器里打开下面的HTML页面,会看到一个UI5按钮。点击后弹出这个按钮实例的innerHTML属性的值。这是一个最简单的SAP UI5 Web Components的Hello World例子。例子里我们使用了SAP UI5 Web Components自定义的标签<ui5-button>。对于前端应用开发人员来说,这个自定义的标签和W3C里的button标签没有任何不同,至少从消费方式上来说完全一致。关于UI5 Web Components里诸如<ui5-button>这类自定义标签的详细说明,可以查看SAP帮助文档:https://sap.github.io/ui5-web…运行时,和在UI5框架里使用控件一样,仍然有一个专门的ButtonRenderer负责生成按钮原生的HTML代码:从运行时生成的HTML源代码我们不难发现,UI5 Web Components自定义的HTML标签只是起着占位符(place holder)的作用,真正承载运行时用户可以与之交互的实际按钮,还是通过上图ButtonRenderer生成的HTML原生button标签。需要强调的是,通过上述ButtonRenderer生成的运行时按钮实例,仍然满足使用UI5框架的传统方式绘制的控件一样的特性,比如传统方式下SAP保证的所有产品标准,像Accessibility,Internationalization这些,在SAP UI5 Web Components里仍然继续支持,无需应用开发人员额外的编程实现。本地用npm install @ui5/webcomponents命令安装UI5 Web Components之后,就可以找出里面最简单的组件实现,Button.js, 来学习SAP是如何基于Web Components标准,采用ES6支持的mobule和class等特性实现一个自定义标签的。将来Jerry或许可以邀请SAP成都研究院的一些专职做前端开发的同事来分享这里面的技术细节。最后,SAP UI5 Web Components的使用场景是什么?以上是照搬Peter的文字。适用场景有二:1. 在没有使用前端框架开发而成的简单静态页面里,如果想添加一些能够提供用户交互的控件,可以考虑SAP UI5 Web Components。2. 在已有的基于其他前端开发框架的Web应用里,如果需要一些能与用户交互的控件而又不想重复造轮子,那么可以到SAP UI5 Web Component官网上去找找。另一方面,SAP UI5框架仍然是SAP推荐的开发具有企业级复杂度和响应式前端应用的方案。最后,有朋友可能会有疑问,Jerry前一篇文章 SAP Fiori + Vue = ?里介绍的fundamental-vue,里面不是也存在SAP自定义的用于Vue应用的HTML标签吗?https://github.com/SAP/fundam…那么fundamental-vue到底算Fiori Fundamentals还是Web Component?一张图来回答:关于这两个概念大家如果有疑问,请直接留言给我,或者点击“阅读原文”,跳转到SAP社区上给Peter留言,感谢阅读。相关阅读SAP UI5和微信小程序对比之我见当我用UI5诊断工具时我用些什么在Kubernetes上运行SAP UI5应用(上)在Kubernetes上运行SAP UI5应用(下)SAP Fiori + Vue = ?SAP Fiori应用的三种部署方式Jerry的Fiori原创文章合集SAP成都C4C小李探花:浅谈Fiori Design GuidelinesJerry和您聊聊Chrome开发者工具Jerry的UI5框架代码自学教程Jerry的碎碎念:SAPUI5, Angular, React和VueSAP Cloud for Customer 使用SAP UI5的独特之处要获取更多Jerry的原创文章,请关注公众号"汪子熙": ...

February 24, 2019 · 1 min · jiezi

SAP CX Upscale Commerce : SAP全新推出的电商云平台

大家好,我是Andy Chen,是SAP成都研究院年轻的SAP CX Upscale Commerce (后面将会以Upscale简称)开发团队的一名产品经理。CX的全称是Customer Experience。今天很高兴能够从一个产品经理的视角,给大家初步介绍一下这个SAP全新推出的面向中端市场的电商云平台。SAP CX Upscale Commerce是SAP专为零售商,B2C品牌商,CPG(快速消费品)和Direct-to-Consumer(直接面向消费者)行业而设计的下一代中端市场电商SaaS云平台。当前目标市场是美国(未来会逐步推向全球其他区域),目标客户主要包含以下特征:目标公司的软件采购和实施预算低于25万美元总收入(total revenues)低于10亿美元的General Business公司大型公司(包括SAP Enterprise Commerce Platform和SAP Commerce Cloud客户)寻求快速部署上线某些子品牌的快闪店(popo-upstore),小型的online或者in-store应用商店。在选择Upscale方案之前,这些公司通常会选择部署在其他电商平台上,比如Shopify Plus或Magento2018年10月,SAP的两位大佬, CX总裁Alex Atzberge以及SAP Upscale Commerce的高级副总裁Charles Nicholls,在巴塞罗那CX Live会议上宣布 SAP CX Upscale Commerce上线。2019年1月,SAP Upscale Commerce被评选为SAP Labs China 2018最佳产品之一,本人也很荣幸代表成都Upscale团队上台领取该奖项。Upscale研发部门分布在全球多个城市,波士顿主要负责前端应用研发,成都、蒙特利尔、慕尼黑和伦敦主要负责后端微服务交付。接下来开始我们分三个大的章节进行的产品介绍,首先介绍目前美国零售行业数字化转型的挑战,接下来是Upscale产品概念与部分特征,最后介绍如何通过Upscale在30分钟内快速部署一个iOS移动原生电商应用。如果大家有任何关于Upscale产品以及技术架构的问题,可以留言讨论。零售行业数字化转型面临的挑战(以美国为例)1. 电商移动用户体验的提升势在必行根据comScore关于移动端的统计报告,尽管占据了全网约70%的流量,但是只有20%的交易发生在移动端。这份报告的详细地址:https://www.comscore.com/Insi…市场主流的在线商店应用都是为PC桌面为出发点设计的,而移动设备应用只是PC端购物体验的延伸和扩展,用户体验没有针对移动应用进行深度定制,体验较差。2. 品牌就是体验用户体验越来越成为用户是否下单的关键要素,个性化服务体验是其中非常关键的因素之一。大规模的个性化功能实现是非常挑战和困难的:今天大多数终端个性化呈现都是商家手动配置的。弊端非常明显 – 人工工作量大、效果差、伪个性化、无法及时响应用户需求。3. Channel-less vs Cross Channel消费者希望在线上、线下渠道都可以购买该品牌的同一个商品,并且能够享受高度一致的用户体验和服务。为了给消费者提供一致性的良好体验,构建强大的分布式订单管理系统是许多品牌的首要任务。4. 敏捷性品牌商和零售商需要能够快速投放商品进入市场试错。新产品如何才能快速同步线上线下推向市场,并且响应市场需求变化?传统电商方案的平台搭建是一项艰巨的任务,需要大量的自定义代码,花费数月时间(甚至更长)和巨大的财务支出来实施。即便如此,有时也很难满足业务快速部署和调整的需求。面对以上挑战,我们需要一个全新的零售策略和支持这个策略的电商云解决方案 - SAP Upscale!SAP Upscale和传统本地部署的电商解决方案相比,有哪些优势?1. Upscale极大地简化了传统电商的数字化转型之路,开启了基于速度和敏捷的新时代。从商家tenant的创建到上线,只需要几天到几周的配置时间。2. Upscale专为移动消费者量身定做,包含移动端原生iOS、Android应用和PWA应用(Progressive Web App, 渐进性网页应用, 一种新的网页开发技术)。Upscale模糊了渠道之间的界限,使线上或者门店购物变得轻松有趣。3. Upscale内嵌的AI功能可以自动帮助商家为每个用户提供个性化服务,真正做到“千人千面”。4. 通过提供优秀的用户体验和个性化、线上线下一致性服务,商家将会从中得到最大化的收入和利润。快速部署 & 灵活响应市场动态Upscale深深刻着零售DNA的烙印,团队主要成员拥有数十年的零售行业领域知识的深厚沉淀。通过将传统的零售产品(Product)、品类(Category)管理经验和深度学习、人工智能的高效结合,Upscale模糊了传统意义上的三个独立学科:商品推销(Merchandising),个性化(Personalization)和分布式订单管理(Distributed Order Management)之间的界限。通过实时记录和分析用户在App上的每次点击、浏览、收藏等事件,结合历史销售订单、商品数据为每个客户提供最佳购物体验,同时为每个商家自动优化销售利润和收入。另外与大多数传统商务平台不同,Upscale使用最先进的微服务构建,一切都是API优先。商家可以根据自己业务和数字化转型的需求,灵活订阅和部署需要的前端应用和后端服务。在获得灵活快速的市场响应能力的同时,TCO(总体拥有成本)将会明显下降。The MobigramMobigrams是基于AI的1对1个性化商店应用。我们的目标是:1. 为每一个终端用户提供自动化的个性化服务,真正做到“千人千面”;2. 为每一个零售商或者品牌商自动化地优化收入和利润。每个消费者打开App都有自己独特的Mobigram,在消费者整个浏览商品和下单购物的过程中,App会通过后端AI实时计算的结果,为每个用户动态组装个性化的产品集合、品类、内容等模块。AI实时计算考虑的变量包括但不限于零售商想要销售的产品,产品库存位置,库存可用性等。使用AI和深度学习技术来平衡零售商的需求(出售库存,利润率,产品周转速度和曝光度)与客户的体验(访问速度,便利性,产品相关性,购物愿望),从而推动能为零售商或品牌商带来最大利润的客户体验。目前Upscale在3个领域已经上线的AI功能:Continuity CommerceSAP Upscale Commerce具有内置的AI预测订单连续性引擎,可自动甄别潜在可能从单次商品购买转换为连续性订单的客户。比如,用户以相对固定的周期购买某一品牌洗发露,那么系统可以识别此类购物行为。Upscale会向此类客户自动发送邀请,用户只需要在邀请里面点击一下购买,那么就可以立刻加入Continuity Program。商家将会在未来按照用户喜好的周期,定期的自动递送该商品给客户)。 对于客户而言,这意味着他/她们“永远不会买不到”喜欢的产品,也不会因为疏忽而遗忘购买某些商品。在这个过程中,用户自然也成为了该品牌最忠实的会员。对于商家而言,科学和准确的预测潜在购买需求有了有效的输入, 从而可以进一步研究和实现库存自动管理优化。延伸阅读:Getting Started with Continuity Ecommerce, Part 1: Approaches, Expectationshttps://www.practicalecommerc…30分钟快速搭建一个SAP Upscale移动原生iOS应用本章节将会为大家简单介绍如何在30分钟快速搭建一个移动原生iOS应用。1. Upscale tenant订阅SAP Upscale为商家提供一键on-boarding tenant的工具,只需要提供tenant的名称、subDomain信息以及需要创建tenant的系统环境,后台就会为用户订阅专属的tenant。2. 移动零售应用配置完成了tenant的订阅,商家即可配置自己的电商移动原生应用。SAP Upscale Commerce为商家提供了工作台作为配置的界面,几乎所有跟搭建一个电商网店的相关工作都可以在这个界面完成,其中:Configuration该部分包括一个电商应用所需的最基本配置,比如库存(仓库或者门店)、收款、税务、发货、用户账号管理、客户服务、订单管理(取消、退货)等。产品、产品与品类的关联关系,库存初始化信息等相关工作我们都是通过后台作业来执行。商家准备好产品CSV文件,可以配置周期性或者一次性作业来导入主数据。Upscale提供非常灵活的字段匹配、自定义属性的功能来帮助客户完成主数据集成。另外一个基本配置是App,商家可以在这里配置原生App(iOS,Android)以及PWA等应用,并且可以按照商家的策略,关联同样或者不一样的用户体验配置。Inventory作为Channel-less的电商解决方案,线上线下库存透明化是基础。在该配置目录下,商家可以看到全局库存、单品库存以及库存调拨等功能。EditionEdition是一组对象组合,包括产品品类(Category)、单品(product)以及AI自动推荐的Trend category。这些对象在一段时间内可用并在特定渠道上供消费者购买,例如2017年秋季Edition。商家可以灵活的配置多个Editions,并按照自身策略激活发布其中一个,关联到一个渠道然后开放给消费者。Experience用于定义一个App的布局、模块和模板。Upscale提供基于模板的一键生成功能,商家只需要按照自己业务需求一键生成默认的experience,所见即所得。然后根据自己品牌的风格,变更配色、logo等主题,即可关联edition来搭建原生应用。3. 全渠道用户体验完成以上配置后,商家即可部署App到应用商店供用户或者门店使用。全渠道的用户体验让客户能够在任何地方购物,并且真正得到全渠道个性化体验。下图是通过Xcode 模拟iPhone应用的一个截图:我们可以看到,每个客户拥有自己量身定制的个性化界面,系统会动态清除客户不喜欢的内容和产品,改变商品推销的内容和方式,引导客户进入跟自身最贴切并且最容易下单购买的类别。用户得到最佳体验的同时,Upscale也能最大限度地提高零售商的收入和利润。Upscale支持的应用平台有:Mobile App – iOS & AndroidMobile Web (PWA)Tablet (PWA)Desktop (PWA)Kiosk & In Store通过本文对SAP Upscale Commerce的基本介绍,相信大家应该对于这款SAP全新的SaaS电商云解决方案有了初步的了解。限于篇幅,如果有任何问题和更多的兴趣,欢迎讨论,感谢阅读。要获取更多Jerry的原创文章,请关注公众号"汪子熙": ...

February 24, 2019 · 1 min · jiezi

SAP 前端技术的演化史简介

Jerry之前曾经写过一篇微信公众号文章,题目叫<<SAP UI和Salesforce UI开发漫谈>>关注我的公号“汪子熙”后,在历史菜单“前端开发相关”里即可找到这篇文章:该文章简单回顾了SAP UI技术的发展历史,然后提了下Salesforce的Apex和Lighting Component等技术和框架。目录SAP UISAP GUI + DynproWeb DynproBSP/CRM WebClient UISAP UI5/FioriUI5 in SAP Cloud for CustomerHybris Enterprise Commerce PlatformSalesforce UIApexLightning ExperienceAura FrameworkLightning Component FrameworkVisualforce我也画了张简单的图:R1和针对于大型机的R2对我们来说实在太古老了,对我们来说,只能通过SAPGUI里的复古主题,即Classical Theme来体验一下这些老古董的外观风采。到了1992年出现了类似JSP技术的BSP(business server page),能够借助在服务器端执行的ABAP语言实现动态网页效果。在运行时,每个BSP页面会自动生成一个临时的ABAP类,执行这些BSP页面上嵌入的ABAP代码,执行的结果再渲染成原生的HTML代码。值得一提的是,BSP技术兼容普通的HTML/JavaScript应用,换句话说,几乎所有能运行在除Netweaver以为的web服务器上的基于HTML/JavaScript的web应用,也能以BSP为载体,运行在Netweaver上。因此,即使是如今SAP的旗舰级产品S/4HANA里的很多Fiori UI应用,也是以BSP应用为载体存储在Netweaver上的。比如S/4HANA物料主数据管理的Fiori应用,其名称在Chrome开发者工具里能看到:这个BSP应用在Netweaver上能找到:诞生于1992年的BSP技术到了今天还在服役,这本身就是一个奇迹了。当然它本身由于历史原因也有一些局限:开发效率不够高,没有类似后来UI5里控件库的概念,导致开发人员需要重复造很多轮子。SAP后来自己也发布了一些BSP Extension,类似JSP里的tag,以此来弥补开发效率的缺陷。另外BSP的开发工具在SAPGUI里只有事务码SE80,这个工具在做HTML和JavaScript开发时显得不够友好。因此后期SAP Fiori开发也采取了在本地现代IDE比如Eclipse里做开发,完毕后再上传到Netweaver自动生成BSP的方式。没有MVC的概念,在大型企业级应用开发中显得力不从心。正是由于暴露了这两个缺陷,促成了WebUI和Webdynpro的问世。对这两种前端技术的详细介绍,请参考Jerry之前提到的微信文章:SAP UI和Salesforce UI开发漫谈,这里不再重复,只是聊聊一些该文章中没有提过的内容。ABAP Webdynpro的亮点就是能够以所见即所得的方式进行UI界面开发,缺点是不再支持类似BSP那样兼容传统的HTML/JavaScript,因此无法实现某些对界面复杂度和交互性要求较高的需求。而WebUI在继承了BSP所有优点的同时,在BSP基础上提供了对MVC的封装,使得开发效率大大提高,同时开发出来的Web应用结构清晰,不再会出现一个视图页面几千行代码的情况。下图是一个典型的WebUI模型,MVC三层在workbench里有清晰的界定。WebUI和ABAP Webdynpro至今仍广泛应用于SAP产品中。在S/4HANA的CRM模块里,WebUI继续扮演着非常重要的角色,详情请阅读我下面这篇文章:Hello World, S/4HANA for Customer Management 1.0而Webdynpro,是SAP SRM UI开发的主流技术。搜索公网上所有使用了SAP BSP技术的网站:https://www.google.com/search…:/sap/bc/bsp/&gws_rd=ssl使用了Webdynpro的:随着时间的推移,用户对移动设备上访问网页的体验要求越来越高,因此有了SAP从业者现在很熟悉的前端技术:SAP UI5。关于UI5最新的技术发展方向,请关注我的公众号“汪子熙”,阅读我写的这篇文章:Fiori Fundamentals和SAP UI5 Web Components要获取更多Jerry的原创文章,请关注公众号"汪子熙":

February 24, 2019 · 1 min · jiezi

用ABAP代码读取S/4HANA生产订单工序明细

在S/4HANA事务码CO03显示的Production Order里,我希望用ABAP代码显示出该订单的operation(工序)ID,描述和状态Status,如下图所示:很简单的几行ABAP代码:DATA: lt_operation TYPE TABLE OF afvgd.CALL FUNCTION ‘PM_ORDER_DATA_READ’ EXPORTING order_number = ‘000001000381’ TABLES iafvgd = lt_operation EXCEPTIONS order_not_found = 1.IF sy-subrc <> 0. WRITE:/ ’not exist’. RETURN.ENDIF.需要读取的数据都在这里:要获取更多Jerry的原创文章,请关注公众号"汪子熙":

February 24, 2019 · 1 min · jiezi

使用Visual Studio Code编写和激活ABAP代码 (上)

猪年春节后的第一篇,Jerry祝各位猪年大吉!2019年的六分之一马上就快过完了,不知道大家在新的一年是否给自己定了新的小目标呢?这里Jerry先预祝大家到2019年年底的时候,在年初制定的小目标都能实现。2018年4月之前,Jerry一半时间为SAP S4CRM团队工作,剩下的一半时间为SAP C4C团队工作,所以那段时间大家能发现,Jerry公众号的文章主要是围绕着这两个SAP产品来写的。4月之后,Jerry换组,到了新的部门,工作内容也发生了变化,不再专注于某个特定的SAP产品,而是项目需要我熟悉什么产品,我就得熟悉什么产品,所以之后我的公众号文章,主题也逐渐多种多样起来。言归正传,Jerry之前的文章 那些年我用过的SAP IDE 曾经介绍过除了SAPGUI之外的其他ABAP开发工具和ABAP代码浏览工具。得益于Netweaver职责清晰的三层架构,提供了ABAP开发环境和运行环境的应用服务器层(下图中间的Application server layer)作为ABAP应用的核心, 其上可以灵活适配不同的展现层(Presentation layer), 比如WebIDE, Eclipse,和今天要介绍的Visual Studio Code。上图中应用服务器层的底层是数据库服务器层,Netweaver也支持多种主流数据库提供商的服务。例如下图是Jerry使用的一个Netweaver系统,支持包括SAP HANA在内的十种数据库管理系统(DBMS)。我们简单回顾下之前Jerry介绍过的不同的ABAP开发工具。首先是ABAP Development Tool(简称ADT), 对ABAP程序提供增删查改和激活操作的函数,通过位于路径sap/bc/下面的SICF服务节点adt暴露给外部消费者。ABAP Development Tool的Java端实现就是Eclipse的一个扩展,使用JCO(Java Connector)连接ABAP后台的adt服务,实现对ABAP程序的操作。关于ABAP Development Tool的细节,Jerry以前已经做过详细介绍,这里不再赘述,可以参考我这些文章:不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧Jerry在SAP Community上写给老外看的文章:https://blogs.sap.com/2014/08…而在浏览器里编写ABAP,即通常意义上的ABAP WebIDE,实现方式有两种。一种是通过传统的ITS(Internet Trasaction Server),通过这种方式在浏览器里显示的ABAP代码缺乏语法高亮:Jerry写过的相关博客:Open your SAP GUI transaction in Fiori launchpadhttps://blogs.sap.com/2016/12…How is old SAP GUI transaction embedded into Fiori launchpadhttps://blogs.sap.com/2016/12…另一种技术就是S/4HANA某些应用,比如Custom Logic采用的,支持语法高亮。当然这个语法高亮的支持不是天上掉下来的,详细实现参考我的博客:How ABAP syntax highlight is implemented in WebIDE launched via browserhttps://blogs.sap.com/2018/03…再回到今天聊的Visual Studio Code。SAP成都研究院很多前端开发的同事都向我推荐过这个IDE。Jerry试用过之后,印象最深的就是它那超快的启动速度,一流的扩展性和繁荣的生态圈。其扩展应用的丰富程度不亚于Sublime Text和Eclipse这些老牌开发工具。和SAP自研的ABAP Development Tool思路一样,本文介绍的Visual Studio Code扩展应用,ABAP Remote File System,也是通过另一种编程语言TypeScript去远程消费ABAP后台程序的增删查改服务。该扩展应用的作者叫Marcello,一位居住在伦敦的程序猿(Jerry想起了西甲皇家马德里足球队昔日的队宠)。这个Visual Studio Code的扩展是开源的,github仓库地址:https://github.com/marcellour…安装和配置的步骤在仓库的readme里有详细说明,最简单的方式就是在Visual Studio Code里直接用abap作为关键字搜索Market place,然后点Install安装。这个扩展的配置文件settings.json的内容可以参考下图:配置完成后,在Visual Studio Code的命令栏里能看到连接ABAP系统的指令和settings.json里配置的两条记录,任选一个后登入系统,显示该系统下的ABAP程序资源。操作它们的方式和基于Eclipse的ABAP Development Tool大同小异。当然也有一些Visual Studio Code提供的特色功能,比如下图这种类Google的即时搜索。这个扩展本身是不提供ABAP代码语法高亮的,需要安装另一个来自Lars Hvam贡献的语法高亮扩展。安装完毕后,ABAP的语法高亮也能顺利在Visual Studio Code里工作了。下面这张动图来自Marcello,演示了通过Visual Studio Code的这个扩展实现ABAP代码的基本编辑。作者在他的readme也明确注明,这个扩展还处于Beta测试阶段,使用者需自己承担风险。在Jerry看来,Visual Studio Code的这个扩展,如果用来做ABAP开发的话,功能还相对局限,但是如果对SAPGUI或者ABAP Development Tool产生了审美疲劳,想换一种工具来阅读ABAP源代码,那么它和下图的Sublime Text一样,都是不错的选择。将来如果Jerry有空,会在这篇文章的下半部分简单介绍下这个扩展的TypeScript实现细节。另外,今年Jerry也会争取能分享一些SAP云平台上ABAP编程环境的相关内容,敬请期待。感谢阅读。更多阅读动手使用ABAP Channel开发一些小工具,提升日常工作效率聊聊C语言和ABAPABAP vs Java, 蛙泳 vs 自由泳300行ABAP代码实现一个最简单的区块链原型Jerry的ABAP原创技术文章合集ABAP开发人员未来应该学些什么Jerry的ABAP, Java和JavaScript乱炖我用ABAP做过的那些无聊的事情不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧那些年我用过的SAP IDE要获取更多Jerry的原创文章,请关注公众号"汪子熙": ...

February 24, 2019 · 1 min · jiezi

Salesforce的多态存储和SAP C4C的元数据存储仓库

SalesforceForce.com integrates and optimizes several different data persistence technologies to deliver transparent polyglot persistence for all your applications and devices. With Force.com, you don’t have to deal with the complexity of trying to integrate, manage, test, and support several systems, and you only have to code to a single API, no matter which type of persistence is optimal for a given situation. The following figure is an overview of a sampling of Force.com’s persistence technology.Salesforce存在一个Polyglot Persistence多态存储的概念。应用程序可以通过Polyglot persistence暴露出的统一接口去访问平台上的数据,而无需关心这些数据背后具体的存储技术到底是Transaction Engine, 还是由常驻内存提供,亦或是由支持全文本查找的搜索引擎提供。SAP C4C(Cloud for Customer)作为SAP提供的一款SaaS CRM解决方案,C4C也存在类似Salesforce Polyglot Persistence的设计,我们称之为元数据仓库存储。我们在cloud application studio的package下面能看到许许多多的开发对象:可以想象,这二三十种开发对象后台的存储逻辑和技术都各不相同。每次用户登录Cloud application studio,打开自己工作的package后,都会从后台将自己创建的类型各异的开发对象取出然后显示在studio里。为了给Cloud application studio工具端和其他消费者(比如C4C前端UI)提供一个统一高效的API去C4C后台读取这些模型的数据,C4C设计了一个元数据存储仓库,该仓库提供了一个优化过后的API,相当于设计模式里的Facade(外观模式/门面模式)。该API会根据具体被访问的对象,将请求转发到该对象对应的存储服务提供者(Access service provider)上去。对于API的消费者来说,这些对象具体的存储技术是完全透明的,不需要知道。要获取更多Jerry的原创文章,请关注公众号"汪子熙": ...

February 15, 2019 · 1 min · jiezi

Salesforce和SAP Netweaver里数据库表的元数据设计

从Salesforce官网可以了解到Salesforce的force.com平台里数据库表的设计:https://developer.salesforce….Every logical database object that Force.com exposes is internally managed using metadata. Objects, (tables in traditional relational database parlance), fields, stored procedures, and database triggers are all abstract constructs that exist merely as metadata in Force.com’s Universal Data Dictionary (UDD). 每个force.com暴露出来的逻辑数据库对象在内部都被metadata元数据管理。数据库表,表的字段,存储过程和数据库触发器,在force.com里只不过都是抽象的实体,以元数据的方式存在于force.com的UDD数据字段中。而SAP Netweaver也有类似salesforce force.com的UDD概念,在Netweaver ABAP里成为ABAP Data Dictionary - DDIC,事务码SE11打开。SAP的数据库表有design time和runtime运行时的概念。也支持在ABAP程序运行时动态生成新的数据库表,以及运行时根据数据库表对应的实例,反方向得到其design time信息的方法,类似其他编程语言比如Java中的反射,不过在ABAP里我们不习惯这样叫,而是称之为ABAP Run Time Type Identification, 简称RTTI。以上图显示的数据库表TADIR为例,其字段的元数据都存储在另一张表DD03L里。通过查询条件TABNAME = TADIR, 即可从数据库表DD03L里找到TADIR所有字段的元数据,包括字段名,字段的ABAP data element名称,内部数据类型和字段长度等等。当然大多数时候我们如果需要获取这些元数据,不需要通过查表的方式,ABAP DDIC给我们提供了丰富的API,这些函数的命名有规律:DD*GET:而一张表的运行时信息,通过菜单Utilities->Runtime Object->Display查看:不过这些信息一般来说和ABAP应用开发人员关系不大,所以很少留意。要获取更多Jerry的原创文章,请关注公众号"汪子熙":

February 14, 2019 · 1 min · jiezi

Salesforce平台支持多租户Multi tenant的核心设计思路

Multitenancy is the fundamental technology that clouds use to share IT resources cost-efficiently and securely.多租户支持是所有云服务提供商都需要着力实现的一种技术,用于云基础设施上在成本可控和保证安全性的前提下进行IT资源分享。多租户支持面临的四大挑战:how to keep tenant-specific data secure in a shared database so that one tenant can’t see another tenant’s data?如何保证共享数据库内不同租户间的数据隔离,通俗的说,一个租户不应该看到其他租户的数据。当一个租户对其拥有的schema对象或者应用编程接口进行调整时,不应影响到其他租户的功能和整个系统的可用性。How can one tenant customize various schema objects and an application’s user interface in real time without affecting the functionality or availability of the system for all other tenants?How can the system’s code base be patched or upgraded without breaking tenant-specific schemas?系统基层实现发生变动,比如代码版本升级,或者新的补丁进来时,不应该破坏每个租户私有的对象。And how will the system’s response time scale as tens of thousands of tenants use the service?随着系统租户数量的增加,整个系统的响应时间不应该急剧下降。Force.com’s core technology uses a runtime engine that materializes all application data from metadata—data about the data itself. In Force.com’s well-defined metadata-driven architecture, there is a clear separation of the compiled runtime database engine (kernel), tenant data, and the metadata that describes each application. These distinct boundaries make it possible to independently update the system kernel and tenant-specific applications and schemas, with virtually no risk of one affecting the others.Salesforce应对这些挑战的设计是,采取了一种运行时引擎的思路,所有的应用数据都通过元数据生成,即所谓元数据驱动的架构(metadata driven architecture)。这样一来,模型的元数据作为输入,交给运行时引擎加工,生成运行时使用的模型和数据,三者各司其职,有严格的区分,实现了一种高度动态的内核。注:本文的英文文字和图片来自Salesforce官网:https://developer.salesforce….中文文字为本文作者原创内容。要获取更多Jerry的原创文章,请关注公众号"汪子熙": ...

February 14, 2019 · 1 min · jiezi

SAP ABAP里数据库表的Storage Parameters从哪里来的

如何查看ABAP数据库表的storage parameter?事务码SE11,utilities->Database Object->Database Utility:点这个Storage Parameters:上面SAPGUI里显示的数据实际来自HANA数据库里的System view:TABLES, 使用如下的SQL语句就能查询到COMM_PORODUCT的storage parameters(存储参数了):SELECT *FROM “SYS”.“TABLES"WHERE SCHEMA_NAME = ‘SAPAG3’ AND TABLE_NAME = ‘COMM_PRODUCT’要获取更多Jerry的原创文章,请关注公众号"汪子熙”:

February 14, 2019 · 1 min · jiezi

Salesforce和SAP HANA的元数据访问加速

Salesforce在Jerry的其他文章曾经提到,Salesforce里运行时对象均是通过静态存储的元数据,经过Runtime engine加工而成的。Because metadata is a key ingredient of Force.com applications, the system’s runtime engine must optimize access to metadata; otherwise, frequent metadata access would prevent the service from scaling. 既然元数据在salesforce平台中扮演了如此重要的角色,那么运行时引擎对元数据的高效访问就成为一个重中之重的话题,如果达不到这个目标,频繁的元数据低效访问将无法保证平台上提供服务的高扩展性 high scalability。With this potential bottleneck in mind, Force.com uses massive and sophisticated metadata caches to maintain the most recently used metadata in memory, avoid performance-sapping disk I/O and code recompilations, and improve application response times.Salesforce平台设计了很多复杂的元数据缓存机制,确保最近访问过的元数据驻留在内存里,避免了磁盘IO的开销和代码的重编译,从而确保整个应用的响应时间不会影响元数据访问受到影响。SAPABAP Netweaver也有类似的设计,把很多需要高效访问的数据特别是应用程序的元数据存储到应用服务器的shared memory共享内存里。使用事务码SHMM查看shared memory内容:SAP HANA里还能通过系统视图system view M_METADATA_CACHE_STATISTICS来对元数据的缓存访问进行分析:要获取更多Jerry的原创文章,请关注公众号"汪子熙": ...

February 14, 2019 · 1 min · jiezi

S/4HANA服务订单Service Order的批量创建

我工作中接到一个任务,需要在性能测试系统里创建一亿条服务订单service order来做性能测试。这么大规模的数据量,当然只能用代码来创建了。本文提到的所有ABAP代码,我均已上传到我的Github上了:https://github.com/i042416/KnowlegeRepository/tree/master/ABAP/S4This document provides guide about how to generate a large volume of service order ( confirmation ) and service request test data in S4CRM performance test system for performance measurement purpose.The data is generated based on a series of ABAP reports. ZCRMS4_CREATE_MATERIAL_OPTPattern for material number: prefix for generated material ID. Take above screenshot for example, once executed, you will get a series of materials with the following material ID:Pattern for short text: for example if you specify “Android phone S”, you will get the following description pattern:ZCRMS4_HOME_CREATE_BPSZCRMS4_HOME_CREATE_ORDER_LOOPThis report is used to create a large number of Service Orders.Order description: define the description pattern of created service orders.For example, the input parameter in the above screenshot will lead to the created orders with the following description patterns:Max number of created items: if you specify an integer N, a random number among 1 ~ N of line items will be created for each Service order.Max item quantity value: if you specify an integer N, the line item quantity value will be assigned with a random integer among 1 ~ N.Material Number Range:Let’s say you have first created 10000 materials with ID prefix as “ANDROID”, which means now in table MARA you already have 10000 records with ID starting from ANDROID00000000001 and ending with ANDROID00000010000.Now in this report, you specify Material Number Range as ANDROID00000000001 and ANDROID00000010000, so that when this report create a new line item, it will randomly pick up a material among this material repository and assigned to created line item.Sold-to party range: behaves the same as Material Number Range. You have to first create a series of business partners and write down their ID prefix, for example you create 100 BP with prefix BCP. Then maintain Sold-to party range as BCP0000000001 to BCP0000000100. This report will randomly pick one among the 100 BP and assigned it as the Sold to party in Service Order’s header level.ZCRMS4_HOME_CREATE_SR_LOOPUsed for Service Request mass data generation. The input parameter behaves the same as ZCRMS4_HOME_CREATE_ORDER_LOOP.During the period that those reports are running, you can use report ZTABLESIZE to check the number of created records currently. This report will list table name, table record number and table storage size accordingly.You are supposed to run these reports via background job to avoid TIME OUT issue.Please do not occupy ALL Background work processors so that the normal system operation like TR import are not hindered.要获取更多Jerry的原创文章,请关注公众号"汪子熙": ...

February 14, 2019 · 2 min · jiezi

S/4HANA生产订单的标准状态和透明工厂原型状态的映射

事务码CO03查看生产订单的状态:从下面的界面能看出S/4HANA里生产订单在任意时刻可能存在多个状态:生产订单的ID和状态ID的关系是1:N,维护在数据库表VSAUFK里:如何把上述SAP系统标准状态映射到透明工厂原型的5个状态去呢?目前的映射实现采取的是“关键状态法”:只要生产订单的状态里包含I0048 - distributed to MES, 就认为该订单处于组装状态只要生产订单的状态里包含I0012 - distributed to MES, 就认为该订单处于已交货状态如果C4C创建的销售订单还未同步到S/4HANA,或者虽然同步到S/4HANA,但是S/4HANA的生产订单尚未创建完成,即下图右边灰色区域的时间窗口所示,此时如果查询生产订单状态,API会返回状态排队中.也就是说,app里尚存在两个状态,“加工”和“检测”,在S/4HANA生产订单里找不到对应可映射的标准状态。要获取更多Jerry的原创文章,请关注公众号"汪子熙":

February 14, 2019 · 1 min · jiezi

SAPGUI系统登录页面配置的SAProuter有什么用

大家在安装完SAPGUI后,准备添加系统列表进行登录时,注意过这个SAProuter字段么?从SAP的帮助文档上可以找到SAProuter的定义:https://help.sap.com/saphelp_…SAProuter is an SAP program that acts as an intermediate station (proxy) in a network connection between SAP systems, or between SAP systems and external networks. SAProuter controls the access to your network, and, as such, is a useful enhancement to an existing firewall system (port filter).Figuratively, the firewall forms an impenetrable “wall”around your network. However, since particular types of connections need to penetrate this wall, a “gate”has to be made in the firewall. SAProuter assumes control of this gate.In short, SAProuter provides you with the means of controlling access to your SAP system.SAProuter是一个SAP发布的应用,在SAP系统与系统之间,SAP系统与外部网络之间扮演着代理的角色。SAProuter能实现对SAP系统的访问控制,是企业防火墙的有效补充。如下图所示,部署于企业局域网的客户端SAPGUI进行系统登录,登录请求通过局域网内的SAP router转发到Internet网络上的另一台SAP Router,再转发给部署于企业内网的ERP服务器。上述描述的场景里,形象的说好比在ERP服务器所在的企业内网和SAPGUI的客户端所在的内网打了两个洞,在洞里部署两台SAP router确保只有受限的网络请求能够进出这两个被防火墙保护的安全网络。这种“打洞”的思路在SAP另一款解决方案:SAP cloud connector里有类似的用法:详情参考我的文章:使用Java+SAP云平台+SAP Cloud Connector调用ABAP On-Premise系统里的函数:https://www.jianshu.com/p/3f2…我们可以把用SAPGUI登录系统的快捷方式保存到本地,下次双击即可直接用SAPGUI登入系统:用记事本打开,发现这些.sap文件的内容如下:我们主要观看红色高亮部分。H表示主机名,S表示服务Service。要获取更多Jerry的原创文章,请关注公众号"汪子熙": ...

February 14, 2019 · 1 min · jiezi

SAP云平台对Kubernetes的支持

截至本文发稿(2019-2-10, 农历大年初六)时为止,访问SAP云平台的官方网站:https://cloudplatform.sap.com…能看到下面的网页:SAP云平台上的Kubernetes环境,Coming Soon(即将推出)Build powerful container-native applications and deploy them on a cloud or infrastructure of your choice without worrying about the creation and management of the underlying container clusters.我来翻译一下:SAP云平台的Kubernetes编程环境能让编程人员开发功能强大的容器原生应用并顺利部署在云上,而不用担心底层容器集群的创建和管理。为什么SAP云平台要选择支持Kubernetes?Containers are rapidly becoming a popular development paradigm for cloud-native applications in the industry – with Kubernetes as the dominant container orchestrations technology. The SAP Cloud Platform Kubernetes environment reduces pain points associated with the creation and management of Kubernetes clusters by offering an easy to use, secure and open standards-based Cluster-as-a-Service running on top of a variety of underlying infrastructure choices, deployment options of cloud vs. on-premise, etc. SAP is making this innovation accessible to the entire developer community via an open-source project called Gardener.SAP给出的答案是:基于Kubernetes的容器编排技术近年来已经成为行业里最流行的云原生应用开发范式之一。SAP云平台的Kubernetes编程环境提供了一种简易,安全,基于业界标准的方式提供了对Kubernetes集群的创建和管理,这种方式基于Cluster-as-a-Service(集群即服务)的方式运作,能运行在多种底层云技术设施上,解决了开发人员需要花大量时间学习Kubernetes底层细节的痛点。这种Cluster-as-a-Service的服务,SAP通过开源项目Gardener提供访问:https://gardener.cloud/更多Gardener的使用方式和截图,请参考我的文章:站在巨人肩膀上的牛顿:Kubernetes和SAP Kymahttps://www.jianshu.com/p/c85…使用SAP云平台的Kubernetes编程环境能享受哪些收益Customers can rely upon the SAP Cloud Platform to create, manage, secure and maintain the container clusters for them.客户可以直接使用SAP云平台创建和管理容器集群Leverage the Gardener open-source project to easily access a variety of community innovations.借助Gardener这个开源项目享受到开源社区的种种创新Use container-native development to build and operate complex, stateful cloud applications that require greater freedom over underlying infrastructure.通常情况下开发复杂的云原生应用和有状态的云应用,需要对底层云的基础设施具有很高的自由度。而SAP云平台通过Gardener提供的Cluster-as-a-Service, 给使用者提供了这种自由度。要获取更多Jerry的原创文章,请关注公众号"汪子熙": ...

February 14, 2019 · 1 min · jiezi

为什么S/4HANA的生产订单创建后会自动release

在S/4HANA系统里我们观察到通过函数CO_61_ORDER_EDIT创建的生产订单会自动释放Release:通过第86行的IF语句的条件检测不难找到原因。变量PROFILE_TMP的类型为TCO43:这个scheduling profile的配置在路径Production->Shop Floor Control->Master Data->Define Production Scheduling Profile里:如下图所示:Automatic Actions标签页里的On Creation->Release勾选中,意思就是Production Order创建后自动释放。要获取更多Jerry的原创文章,请关注公众号"汪子熙":

February 14, 2019 · 1 min · jiezi

为什么S/4HANA的销售订单创建会触发生产订单的创建

调用S/4HANA销售订单创建函数SD_SALES_DOCU_MAINTAIN创建一个销售订单时,会触发生产订单的创建。销售订单的每个行项目对应一个独立的生产订单,SD_SALES_DOCU_MAINTAIN相当于CRM里的CRM_ORDER_MAINTAIN,在LOOP里处理每一个行项目:观察这个函数内部的调用栈,发现一个subroutine EIGENFERTIGUNG_BEARBEITEN.:EIGENFERTIGUNG的意思是Own production:BEARBEITEN的意思是TO EDIT:在这个增强里,硬编码了通过Production order maintain的函数CO_61_ORDER_EDIT去创建production order的逻辑:要获取更多Jerry的原创文章,请关注公众号"汪子熙":

February 14, 2019 · 1 min · jiezi

如何给SAP C4C的产品主数据division配置出新的下拉选项

如图:C4C产品主数据division字段默认的下拉菜单选项:切换成调试模式,找到UI这个字段绑定的模型字段名称:/Root/MaterialDivision:再找到这个UI模型字段绑定到的core BO字段:Material.Common.MaterialDivisionCode: 进入Business Configuration的Activity List,找到Division的配置:在这里添加一行新纪录:03-沈阳自动所产品线要获取更多Jerry的原创文章,请关注公众号"汪子熙":

February 14, 2019 · 1 min · jiezi