SAP CRM One Order header extension的缓存机制设计原理
In one of my previous blog A small tip to analyze code by code and export to markdown format it is introduced that the following header extension are supported in One order read function module CRM_ORDER_READ.
When the given header extension is read via CRM_ORDER_READ, take OPPORT_H for example:
DATA: lt_header_guid TYPE crmt_object_guid_tab,
lv_guid TYPE crmt_object_guid,
lv_object_id TYPE CRMT_OBJECT_ID_DB value '21',
lt_oppt TYPE CRMT_OPPORT_H_WRKT,
lt_partner TYPE crmt_partner_external_wrkt.
START-OF-SELECTION.
CALL FUNCTION 'CONVERSION_EXIT_ALPHA_INPUT'
EXPORTING
input = lv_object_id
IMPORTING
output = lv_object_id.
SELECT SINGLE guid INTO lv_guid FROM crmd_orderadm_h
WHERE object_id = lv_object_id AND process_type = 'CXOP'.
CHECK sy-subrc = 0.
APPEND lv_guid TO lt_header_guid.
CALL FUNCTION 'CRM_ORDER_READ'
EXPORTING
it_header_guid = lt_header_guid
IMPORTING
* et_partner = lt_partner
et_opport_h = lt_oppt.
The calling hierarchy could be found from below:
Every header extension has one corresponding read function module acting as entry point for read which will be called by CRM_ORDER_READ_OW with naming convention CRM_READ_OB. In OB ( object buffer ) read function module, the corresponding object buffer is evaluated. If object buffer is not hit for current read, another DB read function module ( CRM_READ_DB is called. Within this DB read function module, another internal table which represents Database buffer is evaluated again. The real read access on database table is only performed when this second fold buffer check fails.
Take OPPORT_H read for example, I draw a picture to demonstrate this two-fold buffer evaluation logic:
In the runtime, OPPORT_H object buffer could be monitored in the context of CRM_OPPORT_H_READ_OB,
and database buffer in CRM_OPPORT_H_READ_DB accordingly.
The object buffer is declared in function group CRM_OPPORT_H_OB:
and database buffer is defined in function group CRM_OPPORT_H_DB:
- 用了Docker,妈妈再也不担心我的软件安装了 - 基础篇
- 适配器模式(Adapter)
- 敞开的地狱之门:Kerberos协议的滥用
- CY7C68013A的一点总结
- RxJava2 实战(1) - 后台执行耗时操作,实时通知 UI 更新
- AutoIt木马又一发:暗藏神秘照片
- css3动画从入门到精通
- ReactJs和React Native的那些事
- Linux学习-文件排序和FASTA文件操作
- Bash漏洞再次演进:缓冲区溢出导致远程任意命令执行
- Pandas,让Python像R一样处理数据,但快
- ViewPager 实现 Galler 效果, 中间大图显示,两边小图展示
- 最小生成树-Prim算法和Kruskal算法
- Bash漏洞批量检测工具与修复方案
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法