You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何扩展基于CDS创建的BOPF的Fiori标准CRUD操作?

Great to hear your BOPF + CDS integration is running smoothly for core CRUD operations! Adding custom logic like sending emails on create/update is a super common requirement, and BOPF has clean built-in hooks to make this happen without hacking the standard flow. Let’s walk through how to implement this step by step:

How to Add Email Notifications to BOPF CRUD Actions

The best way to inject automatic custom logic (like emails) into BOPF operations is using determinations—these are BOPF components that trigger automatically when specific events (create/update/delete) occur on your business object.

1. Update Your CDS Business Object Definition

First, extend your existing CDS BO to declare a determination that fires on create and update events. Modify your code like this:

@Metadata.allowExtensions: true
@ObjectModel:{
  modelCategory: #BUSINESS_OBJECT,
  compositionRoot: true,
  transactionalProcessingEnabled: true,
  createEnabled: true,
  updateEnabled: true,
  deleteEnabled: true,
  writeActivePersistence: 'ZGUT_TEST_UI5',
  // Add determination for email logic
  determinations: [
    {
      name: 'SendNotificationEmail',
      entity: 'ZGUT_TEST_UI5',
      determinationMode: #AUTOMATIC,
      trigger: [
        { event: #CREATE },
        { event: #UPDATE }
      ],
      // Optional: Only trigger on update if specific fields change (e.g., status)
      // fieldTrigger: ['Status']
    }
  ]
}
define entity ZGUT_TEST_UI5 {
  // Your existing entity fields here
  key ID : Integer;
  Name   : String(100);
  // ... add other fields as needed
}

2. Build the ABAP Determination Class

Next, you’ll need an ABAP class that implements the BOPF determination interface to handle the actual email sending logic.

Step 2.1: Create the Class

Use transaction SE24 to create a new class (e.g., ZCL_DET_SEND_NOTIFICATION_EMAIL) and implement the interface /BOBF/IF_FRW_DETERMINATION.

Step 2.2: Write the Email Logic in the EXECUTE Method

Here’s a sample implementation using ABAP’s standard BCS framework for email:

METHOD /bobf/if_frw_determination~execute.
  DATA:
    ls_data       TYPE zgut_test_ui5,
    lv_subject    TYPE string,
    lv_body       TYPE string,
    lv_recipient  TYPE adr6-smtp_addr.

  " Loop through all changed entities in the current transaction
  LOOP AT ct_change INTO DATA(ls_change).
    " Fetch the latest data for the modified entity
    CALL METHOD io_read->retrieve
      EXPORTING
        iv_node           = is_ctx-node_key
        it_key            = VALUE #( ( ls_change-key ) )
      IMPORTING
        et_data           = DATA(lt_data).

    READ TABLE lt_data INTO ls_data INDEX 1.
    IF sy-subrc = 0.
      " Customize email details to your needs
      lv_recipient = 'your-user@example.com'." Replace with dynamic recipient (e.g., from BO field)
      lv_subject = COND #( 
        WHEN ls_change-change_kind = /bobf/if_frw_c=>sc_change_kind-create 
        THEN 'New Entry Created in Your App' 
        ELSE 'Entry Updated in Your App' 
      ).
      lv_body = |{ lv_subject }:\n\nEntry ID: { ls_data-id }\nName: { ls_data-name }|." Add more fields as needed

      " Use BCS to send the email
      DATA(lo_bcs) = cl_bcs=>create_persistent( ).
      DATA(lo_document) = cl_document_bcs=>create_document(
        i_type = 'RAW'
        i_text = VALUE #( ( lv_body ) )
        i_subject = lv_subject
      ).
      lo_bcs->set_document( lo_document ).

      DATA(lo_recipient) = cl_cam_address_bcs=>create_internet_address( lv_recipient ).
      lo_bcs->add_recipient( lo_recipient ).

      " Send the email (with error handling)
      DATA(lv_sent) = lo_bcs->send( i_with_error_screen = abap_false ).
      COMMIT WORK AND WAIT.

      IF lv_sent = abap_true.
        " Optional: Log success or update a status field in your BO
        WRITE: / 'Notification email sent for ID:', ls_data-id.
      ELSE.
        " Handle failure without breaking the CRUD operation (adjust as needed)
        MESSAGE 'Failed to send notification email' TYPE 'W'.
      ENDIF.
    ENDIF.
  ENDLOOP.
ENDMETHOD.

Now you need to connect your new determination class to the business object:

  1. Open transaction /BOBF/BO_CONF (BOPF Business Object Configuration).
  2. Search for your BO (it should match your CDS entity name, e.g., ZGUT_TEST_UI5).
  3. Navigate to the Determinations tab, find your SendNotificationEmail entry, and assign your ABAP class (ZCL_DET_SEND_NOTIFICATION_EMAIL) to it.
  4. Activate the configuration.

4. Test and Troubleshoot

  • Run your Master-Detail app, create or update an entry, and check if the email arrives.
  • If emails aren’t sending, verify your system’s SMTP settings in transaction SCOT.
  • For conditional triggers (e.g., only send emails when a status field changes), uncomment and configure the fieldTrigger property in your CDS determination.

内容的提问来源于stack exchange,提问作者tanto39

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 14:22:31