乐趣区

关于crm:SAP-CRM-One-Order函数CRMObjectFILLOW的设计原理

题目:SAP CRM One Order 函数 CRM_<Object>_FILL_OW 的设计原理
There are totally 60 function modules in One order with naming convention CRM_<Object>_FILL_OW:

They are NOT used in read scenario but in modify scenario. For example once you change the Closing Date of a given opportunity in WebUI (from 2017-02-15 to 2017-02-16)

The function module for Opportunity header extension, CRM_ORDERADM_H_FILL_OW, is called with the following callstack:

As its name FILL_OW indicates, it is responsible to FILL the latest input by consumer into so called object work area(OW) for later use.
In order to make the research life easier I write the following report to trigger this FILL_OW function module call from backend:

REPORT zoneorder_modify.

CONSTANTS: gv_guid TYPE crmt_object_guid VALUE '6C0B84B759DF1ED6BDF05763B3DC8841'.

DATA: lt_opport_h TYPE crmt_opport_h_comt,
      ls_opport_h LIKE LINE OF lt_opport_h,
      lt_change   TYPE crmt_input_field_tab,
      ls_change   LIKE LINE OF lt_change.

ls_opport_h-ref_guid = gv_guid.
ls_opport_h-expect_end = '20170216'.

ls_change = VALUE #(ref_guid = gv_guid ref_kind = 'A' objectname = 'OPPORT_H').
APPEND 'EXPECT_END' TO ls_change-field_names.
APPEND ls_change TO lt_change.
APPEND ls_opport_h TO lt_opport_h.
CALL FUNCTION 'CRM_ORDER_MAINTAIN'
  EXPORTING
    it_opport_h       = lt_opport_h
  CHANGING
    ct_input_fields   = lt_change
  EXCEPTIONS
    error_occurred    = 1
    document_locked   = 2
    no_change_allowed = 3
    no_authority      = 4.

WRITE: / sy-subrc.

It’s very clear now the logic of this FILL_OW consists of four main parts:

(1) field check done in FM CRM_OPPORT_H_FIELDCHECK_FC

This check function module further calls two function modules:
a. CRM_ORDER_GENERAL_CHECKS_FC
This check could be switched off by function module CRM_ORDER_SET_ACTIVE_OW.
A customer exit if_ex_crm_order_fieldcheck and a new BAdI definition crm_order_fieldcheck_new is allowed for customer to implement their own check logic and called within this check function module.
b. CRM_FIELDCHECK_CALL
This FM will call dedicated check function module for a given field registered in system table CRMC_FIELDCHECK:

(2) CRM_OPPORT_H_READ_OB
The logic of this FM is already explained in blog: Buffer logic in One Order header extension Read.

(3) CRM_ORDER_INPUT_DATA

This FM is responsible to move the latest value entered by consumer (is_opport_h_com in line 65) to object work area (postfix WRK in variable ls_opport_h_wrk in line 68). You can observe in the debugger that before this FM is executed, object work area still contains the old value 2017-02-15 read from FM CRM_OPPORT_H_READ_OB in step 2.

Inside this FM there is a check to avoid the field is being changed unnecessarily (specified new value = old value) or by mistake (the field validation fails).
This is a screenshot how ls_opport_h_wrk looks like after this third step is executed:

(4) CRM_OPPORT_H_MERGE_OW

Opportunity header extension specific fields are filled in this FM.
The following fields are populated in this FM with related business logic.

  • probability
  • phase_since
  • assistant_phase
  • exp_weighted_revenue
  • salescycle

Once all these four steps are done successfully, CRM_OPPORT_H_FILL_OW has now generated a consistent object work area and stored in ls_opport_h_wrk.

This object work area will be put to object buffer for later save usage via FM CRM_OPPORT_H_PUT_OB.

Further reading

I have written a series of blogs to explain how One Order API works. The blogs are written based on a simple scenario: read, change and save field“Closing Date”in Opportunity header level.

Buffer logic in One Order header extension Read

Change Scenario

CRM_ORDER_MAINTAIN

|- CRM_ORDER_MAINTAIN_MULTI_OW

|- CRM_ORDER_MAINTAIN_SINGLE_OW

|- CRM_ORDER_H_MAINTAIN_OW

|- CRM_OPPORT_H_MAINTAIN_OW

|- CRM_OPPORT_H_CHANGE_OW

|- CRM_OPPORT_H_READ_OB

|- CRM_OPPORT_H_FILL_OW

|- CRM_OPPORT_H_CHECK_OW

|- CRM_OPPORT_H_PUT_OB

|- CRM_OPPORT_H_PUBLISH_OW

Save Scenario

CRM_ORDER_SAVE

|- CRM_ORDER_SAVE_OW

|- CRM_EVENT_SET_EXETIME_MULTI_OW

|- CRM_OPPORT_H_SAVE_EC

|- CRM_ORDER_TABLE_SAVE

|- CRM_OBJECT_NAMES_DETERMINE

|- CRM_ORDER_UPDATE_TABLES_DETERM

|- CRM_ORDER_SET_OBJECTS_TO_SAVE

CRM_OPPORT_H_UPDATE_DU

Create Scenario

CRM_ORDER_MAINTAIN

|- CRM_ORDER_MAINTAIN_MULTI_OW

|- CRM_ORDER_MAINTAIN_SINGLE_OW

|- CRM_ORDER_H_MAINTAIN_OW

|- CRM_ORDERADM_H_MAINTAIN_OW

|- CRM_ORDERADM_H_CREATE_OW

|- CRM_OPPORT_H_MAINTAIN_OW

|- CRM_OPPORT_H_READ_OB

|- CRM_OPPORT_H_CREATE_OW

|- CRM_OPPORT_H_CHANGE_OW

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

退出移动版