matinal:SAP ABAP 关于SAP系统中如何集成HTTPS的若干功能总结篇【第三篇】

🚀欢迎来到本文🚀
🍉个人简介:matinal,目前职业是IT行业,一个正在慢慢前行的普通人。
🏀系列专栏:涵盖SAP各模块,Python,Excel,人工智能等
💡 其他专栏:一些平时学习的技术,感兴趣的小伙伴可以看看。

🍔公众号:matinal
🎁希望各位→点赞👍 + 收藏⭐️ + 留言📝 ​
⛱️万物从心起,心动则万物动🏄‍♂️


前言:SAP ABAP 关于SAP系统中如何集成HTTPS的若干功能总结篇,这是第三篇。本篇主要介绍SAP中集成http服务,所以,如果你了解并熟知,请略过本篇。

🦙(工作遇到傻逼,千万要远离。道路千万条,远离傻逼第一条)


1990年互联网诞生之初,就已经开始用超文本传输协议 HTTP 传输数据,这也是为什么现在网页地址都是以 http 开头的原因。但是HTTP协议传输数据是明文传输,任意的人抓包就能看到传输的数据,这显然不安全。1994年,Netscape 公司用加密协议增加了 HTTP,开始在 HTTP 的基础上加入 SSL 即安全套接层(Secure Socket Layer)。称为 "HTTP over SSL" 或者 "HTTP Secure",也就是我们现在熟知的 HTTPS。

HTTPS 其实是一个“非常简单”的协议,RFC 文档很小,只有短短的 7 页,里面规定了新的协议名“https”,默认端口号 443,至于其他的什么请求 - 应答模式、报文结构、请求方法、URI、头字段、连接管理等等都完全沿用 HTTP,没有任何新的东西。

也就是说,除了协议名“http”和端口号 80 这两点不同,HTTPS 协议在语法、语义上和 HTTP 完全一样,优缺点也“照单全收”(当然要除去“明文”和“不安全”)。 

HTTP 协议一般指 HTTP(超文本传输协议)。

超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是因特网上应用最为广泛的一种网络传输协议,所有的 WWW 文件都必须遵守这个标准。

HTTP 是为 Web 浏览器与 Web 服务器之间的通信而设计的,但也可以用于其他目的。

HTTP 是一个基于 TCP/IP 通信协议来传递数据的(HTML 文件、图片文件、查询结果等)。

下面进入正文


前言

1、 钉钉API文档说明: https://dingdoc.dingtalk.com/doc#/serverapi2/ul33mm.

2、请求地址: https://oapi.dingtalk.com/attendance/listRecordaccess_token=ACCESS_TOKEN.


一、准备工作

1.获取AppKey&AppSecret(每家供应商可能不一样)
2.获取token(拼接成url)
3.根据URL生成HTTP代理
4.设置 HTTP 版本
5.将HTTP代理设置GET方法
6.发送HTTP请求
7.获取返回的数据
8.关闭HTTP链接
9.将字符串转为abap结构类型变量中


二、检查安全证书

在调用钉钉API前 有次SSL检查,若SAP没有证书则会报错

检查客户GUI,发现

这个没有创建,图中是我创建的

然后重启ICM

三、获取安全证书

在重启ICM之前,需要获取钉钉的证书,导入到sap.
证书获取:
到钉钉的网站按F12
F12打开Chrome开发者工具,Security标签页,View certificate,点击view detais,选择Copy to file.

*&---------------------------------------------------------------------*
*& Report ZMATINAL
*&---------------------------------------------------------------------*
*&
*&---------------------------------------------------------------------*
REPORT zmatinal.

TABLES: pernr.",zthrpt006_log,zthrpt006_2_log.  mark @20201013
INFOTYPES: 0000,0001,0105,0007.

PARAMETERS: p_job TYPE char1 DEFAULT 'X' NO-DISPLAY.

TYPES: BEGIN OF ty_department,"部门列表
         id   TYPE string,
         name TYPE string,
       END OF ty_department.
DATA: gt_department TYPE TABLE OF ty_department,
      gs_department TYPE ty_department.

TYPES: BEGIN OF ty_userlist, "部门成员详细信息
         userid TYPE string,
         name   TYPE string,
         email  TYPE string,
       END OF ty_userlist.
DATA: gt_userlist TYPE TABLE OF ty_userlist,
      gs_userlist TYPE ty_userlist.

*DATA:gt_zdepfromding_log TYPE TABLE OF zdepfromding_log,     mark @20201013
*     gs_zdepfromding_log TYPE zdepfromding_log.

TYPES: BEGIN OF ty_ptresult, "员工考勤数据
         index          TYPE i,
         pernr          TYPE pernr_d, "员工号
         ename          TYPE p0001-ename,  "姓名
         userid         TYPE string, "钉钉用户ID
         email          TYPE p0105-usrid, "邮箱

         plantime       TYPE uzeit,
         createtime     TYPE uzeit,
         modifytime     TYPE uzeit,

         islegal        TYPE char1, "是否合法
         locationresult TYPE string, "位置结果

         begda          TYPE begda,
         endda          TYPE endda,
         workdatum      TYPE datum,         "工作日
         zdklx          TYPE retyp,     "打卡类型
         zbase          TYPE uzeit,   "基准时间
         zdktime        TYPE uzeit, "实际打卡时间
         zresult(40)    TYPE c, "时间结果
         zmins(40)      TYPE c,   "迟到分钟数

************************钉钉原始数据*****************************
         id             TYPE string, "钉钉考勤结果唯一标识ID
         workdate       TYPE string, "工作日
         checktype      TYPE string, "考勤类型(OnDuty:上班,OffDuty:下班)
         timeresult     TYPE string, "时间结果(Normal:正常;Early:早退; Late:迟到;SeriousLate:严重迟到;NotSigned:未打卡)
         basechecktime  TYPE string, "计算迟到和早退,基准时间
         planchecktime  TYPE string, "排班打卡时间
         userchecktime  TYPE string, "实际打卡时间
         gmtcreate      TYPE string, "创建时间
         gmtmodified    TYPE string, "修改时间
       END OF ty_ptresult.
DATA: gt_ptresult TYPE TABLE OF ty_ptresult,
      gs_ptresult TYPE ty_ptresult.

DATA: gt_ptresult1 TYPE TABLE OF ty_ptresult,
      gs_ptresult1 TYPE ty_ptresult.
DATA: gt_ptresult2 TYPE TABLE OF ty_ptresult,
      gs_ptresult2 TYPE ty_ptresult.

TYPES: BEGIN OF ty_person, "员工基础公共信息
         index  TYPE i,
         pernr  TYPE pernr_d,
         ename  TYPE p0001-ename,
         userid TYPE string,    "钉钉用户ID
         email  TYPE p0105-usrid, "邮箱
       END OF ty_person.
DATA: gt_person TYPE TABLE OF ty_person,
      gs_person TYPE ty_person.

TYPES: BEGIN OF ty_post, "post结构体信息
         post TYPE string,
       END OF ty_post.
DATA: gt_post TYPE TABLE OF ty_post,
      gs_post TYPE ty_post.

DATA: gv_begda TYPE sy-datum,
      gv_endda TYPE sy-datum.
DATA: gv_post TYPE string.
DATA: gv_index TYPE i.
*DATA: gt_log TYPE TABLE OF zthrpt006_log,      "MARK 20201013
*      gs_log TYPE zthrpt006_log.
DATA: gv_token TYPE string.

CONSTANTS:
  cns_corpid     TYPE string VALUE 'dingXXXXXXXXXXXXXXXXX',    "corpid
  cns_corpsecret TYPE string VALUE 'bKXXXXXXXXXXXXXXXXX'.  

INITIALIZATION.
  pnpbegda = sy-datum - 1.
  pnpendda = pnpbegda.


START-OF-SELECTION.
  PERFORM f_init.

GET pernr.
  PERFORM f_get_data.

END-OF-SELECTION.
  PERFORM f_pro_data.
  PERFORM f_ptrecord_from_ding TABLES gt_ptresult
                                   USING gv_token.
  PERFORM f_pro_detail_data.
  IF p_job = 'X'.
*    PERFORM f_ins_9401.    mark 20201013
  ENDIF.
*&---------------------------------------------------------------------*
*& Form F_INIT
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& -->  p1        text
*& <--  p2        text
*&---------------------------------------------------------------------*
FORM f_init .
  DATA: lt_department TYPE TABLE OF ty_department,
        ls_department TYPE ty_department,
        lt_userlist   TYPE TABLE OF ty_userlist,
        ls_userlist   TYPE ty_userlist.

  gv_begda = pn-begda.
  gv_endda = pn-endda.

  DATA ddate TYPE datum.

  ddate = pn-begda - 10.


  "获取CIFI-token
  CLEAR gv_token.
  PERFORM f_token_from_ding USING cns_corpid cns_corpsecret
                                          CHANGING gv_token.
  IF gv_token IS INITIAL.
    MESSAGE '获取token失败' TYPE 'E'.
  ENDIF.

  "获取部门列表
  REFRESH lt_department[].
  PERFORM f_department_from_ding TABLES gt_department
                                     USING gv_token.
  IF gt
<think> 我们正在解决SAP RAP List Report中Filter字段的检索帮助出现重复值的问题。检索帮助(Value Help)在Fiori Elements List Report中通常通过CDS视图的注解来定义。重复值可能源于以下几个原因: 1. **数据源本身存在重复**:如果检索帮助直接关联的CDS视图或实体返回了重复的值,那么下拉列表中自然会显示重复项。 2. **注解配置不当**:在定义`@Consumption.valueHelpDefinition`或`@UI.selectionField`时,如果没有正确设置去重属性,可能导致重复。 3. **多个值帮助叠加**:可能为同一个字段配置了多个值帮助,且这些值帮助返回的结果合并时未去重。 4. **模型设计问题**:在自定义实体的计算字段中,如果逻辑未去重,也会导致重复。 ### 解决方法 #### 方法1:确保数据源去重 检查为检索帮助提供数据源的CDS视图或自定义实体。在定义该数据源时,使用`DISTINCT`关键字或分组确保返回唯一值。 例如,在定义值帮助的CDS视图中: ```sql @AbapCatalog.sqlViewName: 'ZVDH_MATERIAL' @AbapCatalog.compiler.compareFilter: true @AccessControl.authorizationCheck: #NOT_REQUIRED @EndUserText.label: 'Material Value Help' define view ZVDH_MATERIAL as select distinct from matinal { key matnr as Material, maktx as MaterialText } ``` #### 方法2:在注解中指定去重 在字段的`@UI.selectionField`或`@Consumption.valueHelpDefinition`注解中,确保指定了正确的去重属性。 例如,在CDS视图的字段上: ```abap @UI.selectionField: [ { position: 10, mandatory: true, valueHelp: '_MATERIAL' // 指向一个去重的值帮助实体 } ] Matnr; ``` 然后,在值帮助实体定义中,确保数据是唯一的。 #### 方法3:使用自定义值帮助 如果标准值帮助无法满足去重需求,可以创建自定义值帮助。在自定义值帮助的实现中,可以控制返回的数据,包括去重。 在ABAP RAP中,可以通过实现一个自定义的`DETERMINE_VALUE_HELP`方法来实现。具体步骤: 1. **在行为定义中声明值帮助方法**: ```abap define behavior for ZCE_MyEntity { value help Material for _Material on action valueHelp; } ``` 2. **在行为实现类中编写方法**: ```abap CLASS lhc_entity IMPLEMENTATION. METHOD valueHelp. " 在这里编写获取值帮助并去重的逻辑 DATA: lt_values TYPE TABLE OF zsh_material. SELECT DISTINCT matnr, maktx INTO TABLE @lt_values FROM matinal. " 将lt_values填充到返回参数中 ENDMETHOD. ENDCLASS. ``` #### 方法4:检查是否多个值帮助叠加 如果为同一个字段配置了多个值帮助,需要检查并移除多余的配置。通常,一个字段应该只关联一个值帮助。 ### 总结步骤 1. **检查数据源**:确保提供值帮助的CDS视图或自定义实体返回的数据是唯一的(使用`DISTINCT`或`GROUP BY`)。 2. **检查注解配置**:确保在`@UI.selectionField`中正确引用了值帮助实体,并且该实体已去重。 3. **考虑自定义值帮助**:如果上述方法无效,实现自定义值帮助并在其中控制返回唯一值。 4. **调试**:使用SAP Gateway Client或Fiori应用测试值帮助,查看返回的数据,确认重复值的来源。 ### 额外提示 在Fiori Elements应用中,还可以通过前端扩展来调整值帮助,但建议优先在后端解决数据重复问题,确保数据一致性。 ### 相关问题 1. 在SAP RAP中如何为List Report的过滤器字段添加自定义值帮助? 2. 如何调试SAP Fiori Elements应用中的值帮助问题? 3. 在CDS视图中使用`DISTINCT`关键字有哪些性能影响?如何优化? 4. 如何为SAP RAP自定义实体中的字段添加值帮助? 通过以上方法,应该能够解决List Report过滤器字段检索帮助中的重复值问题。 [^1]: [SAP Help Portal: Value Help in Fiori Elements](https://help.sap.com) [^2]: [SAP Community: How to avoid duplicate values in Value Help](https://community.sap.com) </think> ### SAP RAP List Report 过滤器检索帮助重复值问题解决方案 在 SAP RAP List Report 中,过滤器字段检索帮助出现重复值通常由以下原因导致: --- ### 根本原因分析 1. **数据源重复** - CDS 视图或底层数据库表本身包含重复记录 - 未使用 `DISTINCT` 或 `GROUP BY` 去重处理 ```sql -- 问题示例:未去重的CDS视图 define view ZMY_VIEW { select from matnr -- 可能返回重复物料号 } ``` 2. **注解配置错误** - `@UI.selectionField` 注解未正确关联值帮助实体 - 值帮助实体未配置去重逻辑([引用3]) 3. **自定义逻辑缺陷** - 自定义值帮助的 ABAP 实现类未处理重复值 - 多个值帮助源合并时未去重 --- ### 解决方案步骤 #### 方案1:CDS 源头去重(推荐) ```sql -- 修正后的CDS视图 (ABAP CDS) @AbapCatalog.sqlViewName: 'ZMAT_DISTINCT' define view ZMATERIAL_DISTINCT as select distinct _mat.matnr as Material, _text.maktx as Description from mara as _mat left join makt as _text on _mat.matnr = _text.matnr and _text.spras = $session.system_language ``` #### 方案2:值帮助注解显式去重 ```abap // 在目标CDS视图中配置值帮助注解 @UI: { selectionField: [ { position: 10, valueHelp: 'ZMATERIAL_DISTINCT', // 指向去重视图 valueListParameter: 'Material' // 指定关联字段 } ] } entity ZMY_ENTITY { key Material : matnr; ... } ``` #### 方案3:自定义值帮助类实现去重 ```abap CLASS zcl_my_value_help IMPLEMENTATION. METHOD get_value_help_items. SELECT DISTINCT matnr, maktx INTO TABLE @DATA(lt_items) FROM makt WHERE spras = @sy-langu. " 填充结果集 result = VALUE #( FOR ls IN lt_items ( key = ls-matnr, description = ls-maktx ) ). ENDMETHOD. ENDCLASS. ``` #### 方案4:前端过滤器配置调整([引用1]) ```json // 在manifest.json中配置过滤器去重 "filterFields": { "Material": { "valueHelp": "ZMATERIAL_DISTINCT", "distinctValues": true, // 显式启用去重 "displayMode": "DescriptionValue" } } ``` --- ### 验证与调试技巧 1. **检查值帮助实体数据** 使用事务 `SE16N` 直接查询值帮助实体 `ZMATERIAL_DISTINCT`,确认数据是否去重 2. **注解一致性检查** 使用 ADT 的 **Annotation Propagation** 功能确保注解正确传播到 OData 元数据 3. **Fiori 调试工具** - 浏览器开发者工具查看 `/sap/opu/odata4/sap/zmy_srv/$metadata` 响应 - 检查 `ValueList` 注解指向的实体: ```xml <Annotation Term="UI.ValueList"> <Record><PropertyValue Property="CollectionPath" String="ZMATERIAL_DISTINCT"/></Record> </Annotation> ``` 4. **清除缓存** 删除浏览器缓存并重启 `/IWFND/MAINT_SERVICE` 中的 OData 服务 --- ### 最佳实践 1. **始终在值帮助源头去重** 优先使用 CDS 视图的 `DISTINCT` 而非前端处理([引用3]) 2. **统一值帮助复用** 为常用字段(如物料、公司代码)创建共享去重视图 3. **性能优化** 对大数据量表添加 `@EndUserText.label: 'MANDT'` 客户端过滤条件 4. **测试规范** 使用 `CL_OSQL_REPLACE` 工具模拟测试数据重复场景 > **关键原则**:值帮助数据管理责任链 > ```mermaid > graph LR > A[数据库表] --> B(CDS值帮助视图) > B --> C(注解关联) > C --> D(UI渲染) > style B stroke:#ff9900,stroke-width:3px -- 去重核心节点 > ``` --- ### 配置效果验证 成功修复后,过滤器下拉列表将显示: ``` | Material | Description | |----------|------------------| | MAT001 | Raw Material A | | MAT002 | Component B | | MAT003 | Packaging C | ``` 替代原先可能出现的重复条目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值