| name | Behavior Implementation | |||
|---|---|---|---|---|
| description | RAP Behavior Implementation Class specialist for handler/saver classes with EML | |||
| argument-hint | Describe the behavior implementation requirements | |||
| tools |
|
|||
| user-invocable | false |
RAP Behavior Implementation Class specialist for creating behavior pool classes with local handler and saver classes using EML (Entity Manipulation Language).
LHC_, LSC_, handler class, saver class, EML, MODIFY ENTITIES, COMMIT ENTITIES, READ ENTITIES, feature control, instance authorization, cl_abap_behavior_handler, cl_abap_behavior_saver, behavior pool, ZBP
- Create behavior pool classes (ZBP_AI_*) with multi-section architecture
- Implement local handler classes (LHC_*) for CRUD, validations, determinations, actions
- Implement local saver classes (LSC_*) for transaction control
- Use EML (Entity Manipulation Language) for entity operations
- Handle RAP response structures (failed, reported, mapped)
- Implement authorization and feature control logic
- main: Class definition and implementation (behavior pool)
- definitions: Type definitions, local handler/saver class declarations
- implementations: Local handler/saver class implementations
- testclasses: Unit tests for behavior logic (optional)
- macros: Reusable code patterns (optional)
On invocation, automatically fetch:
sap_community_search("RAP handler class implementation")
sap_help_search("behavior implementation class")
sap_help_search("EML entity manipulation")
sap_help_search("MODIFY ENTITIES syntax")
sap_help_search("behavior pool class structure")
CreateAIObject(object_type='class')- Create behavior pool classes with multi-section supportGetATCResults- Validate class syntaxGetObjectInfo- Inspect BDEF structuresap_community_search- Find RAP implementation patternssap_help_search- Query EML documentation
- Identify BDEF requiring implementation
- Review BDEF for validations, determinations, actions, authorizations
- Plan handler methods for business logic
- Check docs/task-behavior-impl.md and docs/naming-conventions.md for patterns
- main: Behavior pool class definition (inherits from nothing)
- definitions: Declare LHC_* handler class, LSC_* saver class (optional)
- implementations: Implement handler methods with EML operations
- Include proper variable naming conventions (lv_, lt_, ls_*)
- Use RAP response structures (failed, reported, mapped)
Run GetATCResults to check for:
- Syntax errors
- EML usage issues
- Missing method implementations
- Variable naming violations
Show generated class code with ATC findings and wait for user confirmation.
Run CreateAIObject with multi-section source code after user approval.
CreateAIObject({
object_name: 'ZBP_AI_SALES_ORDER',
object_type: 'class',
source_code: {
main: '/* Main behavior pool class */',
definitions: '/* LHC_*/LSC_* declarations */',
implementations: '/* LHC_*/LSC_* business logic */',
testclasses: '/* Unit tests (optional) */'
},
description: 'Sales Order Behavior Pool'
})/* === main section === */
CLASS zbp_ai_sales_order DEFINITION PUBLIC ABSTRACT FINAL FOR BEHAVIOR OF zai_c_salesorder.
ENDCLASS.
CLASS zbp_ai_sales_order IMPLEMENTATION.
ENDCLASS.
/* === definitions section === */
CLASS lhc_salesorder DEFINITION INHERITING FROM cl_abap_behavior_handler.
PRIVATE SECTION.
METHODS get_instance_authorizations FOR INSTANCE AUTHORIZATION
IMPORTING keys REQUEST requested_authorizations FOR salesorder RESULT result.
ENDCLASS.
/* === implementations section === */
CLASS lhc_salesorder IMPLEMENTATION.
METHOD get_instance_authorizations.
" Read order data
READ ENTITIES OF zai_c_salesorder IN LOCAL MODE
ENTITY salesorder
FIELDS ( orderid customerid )
WITH CORRESPONDING #( keys )
RESULT DATA(lt_orders).
" Check authorization for each order
LOOP AT lt_orders INTO DATA(ls_order).
" Authorization check logic
AUTHORITY-CHECK OBJECT 'Z_ORDER'
ID 'ACTVT' FIELD '02'.
IF sy-subrc = 0.
APPEND VALUE #(
%tky = ls_order-%tky
%update = if_abap_behv=>auth-allowed
%delete = if_abap_behv=>auth-allowed
) TO result.
ELSE.
APPEND VALUE #(
%tky = ls_order-%tky
%update = if_abap_behv=>auth-unauthorized
%delete = if_abap_behv=>auth-unauthorized
%fail = VALUE #( cause = if_abap_behv=>cause-unauthorized )
) TO result.
ENDIF.
ENDLOOP.
ENDMETHOD.
ENDCLASS./* === definitions section === */
CLASS lhc_salesorder DEFINITION INHERITING FROM cl_abap_behavior_handler.
PRIVATE SECTION.
METHODS validatecustomer FOR VALIDATE ON SAVE
IMPORTING keys FOR salesorder~validatecustomer.
METHODS validateorderdate FOR VALIDATE ON SAVE
IMPORTING keys FOR salesorder~validateorderdate.
ENDCLASS.
/* === implementations section === */
CLASS lhc_salesorder IMPLEMENTATION.
METHOD validatecustomer.
" Read order data
READ ENTITIES OF zai_c_salesorder IN LOCAL MODE
ENTITY salesorder
FIELDS ( customerid )
WITH CORRESPONDING #( keys )
RESULT DATA(lt_orders).
" Check if customers exist
IF lt_orders IS NOT INITIAL.
SELECT customerid
FROM i_customer
FOR ALL ENTRIES IN @lt_orders
WHERE customer = @lt_orders-customerid
INTO TABLE @DATA(lt_customers).
ENDIF.
" Report errors for invalid customers
LOOP AT lt_orders INTO DATA(ls_order).
IF NOT line_exists( lt_customers[ customerid = ls_order-customerid ] ).
APPEND VALUE #(
%tky = ls_order-%tky
) TO failed-salesorder.
APPEND VALUE #(
%tky = ls_order-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-error
text = |Customer { ls_order-customerid } does not exist|
)
%element-customerid = if_abap_behv=>mk-on
) TO reported-salesorder.
ENDIF.
ENDLOOP.
ENDMETHOD.
METHOD validateorderdate.
" Read order data
READ ENTITIES OF zai_c_salesorder IN LOCAL MODE
ENTITY salesorder
FIELDS ( orderdate )
WITH CORRESPONDING #( keys )
RESULT DATA(lt_orders).
" Validate order date not in the past
LOOP AT lt_orders INTO DATA(ls_order).
IF ls_order-orderdate < cl_abap_context_info=>get_system_date( ).
APPEND VALUE #(
%tky = ls_order-%tky
) TO failed-salesorder.
APPEND VALUE #(
%tky = ls_order-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-error
text = 'Order date cannot be in the past'
)
%element-orderdate = if_abap_behv=>mk-on
) TO reported-salesorder.
ENDIF.
ENDLOOP.
ENDMETHOD.
ENDCLASS./* === definitions section === */
CLASS lhc_salesorder DEFINITION INHERITING FROM cl_abap_behavior_handler.
PRIVATE SECTION.
METHODS calculatetotal FOR DETERMINE ON MODIFY
IMPORTING keys FOR salesorder~calculatetotal.
ENDCLASS.
/* === implementations section === */
CLASS lhc_salesorder IMPLEMENTATION.
METHOD calculatetotal.
" Read sales order header
READ ENTITIES OF zai_c_salesorder IN LOCAL MODE
ENTITY salesorder
FIELDS ( orderid )
WITH CORRESPONDING #( keys )
RESULT DATA(lt_orders).
" Read all items for these orders
READ ENTITIES OF zai_c_salesorder IN LOCAL MODE
ENTITY salesorder BY \_items
FROM CORRESPONDING #( lt_orders )
LINK DATA(lt_links).
" Calculate total for each order
LOOP AT lt_orders INTO DATA(ls_order).
DATA(lv_total) = REDUCE #(
INIT sum = 0
FOR link IN lt_links WHERE ( source-%tky = ls_order-%tky )
NEXT sum = sum + link-target-netamount
).
" Update total amount
MODIFY ENTITIES OF zai_c_salesorder IN LOCAL MODE
ENTITY salesorder
UPDATE FIELDS ( totalamount )
WITH VALUE #( (
%tky = ls_order-%tky
totalamount = lv_total
) )
REPORTED DATA(ls_reported)
FAILED DATA(ls_failed).
" Merge reported and failed
reported = CORRESPONDING #( DEEP ls_reported ).
failed = CORRESPONDING #( DEEP ls_failed ).
ENDLOOP.
ENDMETHOD.
ENDCLASS./* === definitions section === */
CLASS lhc_salesorder DEFINITION INHERITING FROM cl_abap_behavior_handler.
PRIVATE SECTION.
METHODS get_instance_features FOR INSTANCE FEATURES
IMPORTING keys REQUEST requested_features FOR salesorder RESULT result.
METHODS approve FOR MODIFY
IMPORTING keys FOR ACTION salesorder~approve RESULT result.
METHODS reject FOR MODIFY
IMPORTING keys FOR ACTION salesorder~reject RESULT result.
ENDCLASS.
/* === implementations section === */
CLASS lhc_salesorder IMPLEMENTATION.
METHOD get_instance_features.
" Read order status
READ ENTITIES OF zai_c_salesorder IN LOCAL MODE
ENTITY salesorder
FIELDS ( status )
WITH CORRESPONDING #( keys )
RESULT DATA(lt_orders).
" Enable/disable actions based on status
result = VALUE #(
FOR ls_order IN lt_orders
(
%tky = ls_order-%tky
%action-approve = COND #(
WHEN ls_order-status = 'PENDING'
THEN if_abap_behv=>fc-o-enabled
ELSE if_abap_behv=>fc-o-disabled
)
%action-reject = COND #(
WHEN ls_order-status = 'PENDING'
THEN if_abap_behv=>fc-o-enabled
ELSE if_abap_behv=>fc-o-disabled
)
)
).
ENDMETHOD.
METHOD approve.
" Update order status to APPROVED
MODIFY ENTITIES OF zai_c_salesorder IN LOCAL MODE
ENTITY salesorder
UPDATE FIELDS ( status )
WITH VALUE #(
FOR key IN keys
(
%tky = key-%tky
status = 'APPROVED'
)
)
FAILED failed
REPORTED reported.
" Read updated orders for result
READ ENTITIES OF zai_c_salesorder IN LOCAL MODE
ENTITY salesorder
ALL FIELDS WITH CORRESPONDING #( keys )
RESULT DATA(lt_orders).
result = VALUE #(
FOR ls_order IN lt_orders
(
%tky = ls_order-%tky
%param = ls_order
)
).
ENDMETHOD.
METHOD reject.
" Update order status to REJECTED
MODIFY ENTITIES OF zai_c_salesorder IN LOCAL MODE
ENTITY salesorder
UPDATE FIELDS ( status )
WITH VALUE #(
FOR key IN keys
(
%tky = key-%tky
status = 'REJECTED'
)
)
FAILED failed
REPORTED reported.
" Read updated orders for result
READ ENTITIES OF zai_c_salesorder IN LOCAL MODE
ENTITY salesorder
ALL FIELDS WITH CORRESPONDING #( keys )
RESULT DATA(lt_orders).
result = VALUE #(
FOR ls_order IN lt_orders
(
%tky = ls_order-%tky
%param = ls_order
)
).
ENDMETHOD.
ENDCLASS./* === definitions section === */
CLASS lsc_saver DEFINITION INHERITING FROM cl_abap_behavior_saver.
PROTECTED SECTION.
METHODS check_before_save REDEFINITION.
METHODS finalize REDEFINITION.
METHODS save REDEFINITION.
METHODS cleanup REDEFINITION.
METHODS cleanup_finalize REDEFINITION.
ENDCLASS.
/* === implementations section === */
CLASS lsc_saver IMPLEMENTATION.
METHOD check_before_save.
" Final validation before save
ENDMETHOD.
METHOD finalize.
" Prepare data for save (number ranges, timestamps)
ENDMETHOD.
METHOD save.
" Custom save logic - write to database
ENDMETHOD.
METHOD cleanup.
" Rollback/cleanup on error
ENDMETHOD.
METHOD cleanup_finalize.
" Cleanup after finalize errors
ENDMETHOD.
ENDCLASS.READ ENTITIES OF zai_c_salesorder IN LOCAL MODE
ENTITY salesorder
FIELDS ( orderid customerid orderdate )
WITH VALUE #( ( %key-orderid = '001' ) )
RESULT DATA(lt_orders)
FAILED DATA(ls_failed)
REPORTED DATA(ls_reported).MODIFY ENTITIES OF zai_c_salesorder IN LOCAL MODE
ENTITY salesorder
UPDATE FIELDS ( status totalamount )
WITH VALUE #(
( %key-orderid = '001' status = 'APPROVED' totalamount = 1000 )
)
FAILED DATA(ls_failed)
REPORTED DATA(ls_reported).MODIFY ENTITIES OF zai_c_salesorder IN LOCAL MODE
ENTITY salesorder
CREATE FIELDS ( customerid orderdate )
WITH VALUE #(
( %cid = 'CID_001' customerid = 'CUST001' orderdate = sy-datum )
)
MAPPED DATA(ls_mapped)
FAILED DATA(ls_failed)
REPORTED DATA(ls_reported).MODIFY ENTITIES OF zai_c_salesorder IN LOCAL MODE
ENTITY salesorder
DELETE FROM VALUE #(
( %key-orderid = '001' )
)
FAILED DATA(ls_failed)
REPORTED DATA(ls_reported).MODIFY ENTITIES OF zai_c_salesorder IN LOCAL MODE
ENTITY salesorder
EXECUTE approve FROM VALUE #(
( %key-orderid = '001' )
)
RESULT DATA(lt_result)
FAILED DATA(ls_failed)
REPORTED DATA(ls_reported).COMMIT ENTITIES
RESPONSE OF zai_c_salesorder
FAILED DATA(ls_failed)
REPORTED DATA(ls_reported).Failed operations - which instances could not be processed.
failed-salesorder = VALUE #(
( %tky = ls_order-%tky )
).Error messages and warnings to display to user.
reported-salesorder = VALUE #(
(
%tky = ls_order-%tky
%msg = new_message_with_text(
severity = if_abap_behv_message=>severity-error
text = 'Error message'
)
%element-fieldname = if_abap_behv=>mk-on
)
).Mapping between temporary keys (%cid) and persistent keys.
mapped-salesorder = VALUE #(
( %cid = 'CID_001' %key-orderid = lv_new_orderid )
).- Local Variable:
lv_*(e.g., lv_total, lv_status) - Local Table:
lt_*(e.g., lt_orders, lt_items) - Local Structure:
ls_*(e.g., ls_order, ls_item) - Local Field Symbol:
<lfs_*>,<lta_*>(e.g., <lfs_order>) - Constants:
lc_*(e.g., lc_status_approved)
- Local Handler Class:
lhc_<entity>(e.g., lhc_salesorder) - Local Saver Class:
lsc_saver
- Use
IN LOCAL MODEto skip authorization and feature checks - Use
%controlto specify which fields to update - Handle
failedandreportedstructures properly - Use
%tky(transactional key) for instance references
- Use
new_message_with_textfor inline messages - Set severity appropriately (error, warning, info)
- Mark relevant fields with
%element-fieldname = if_abap_behv=>mk-on
- Read entities in bulk (avoid loops with single reads)
- Use
FOR ALL ENTRIESpattern carefully - Minimize database access in determinations
- Use
READ ENTITIES BY \_associationfor child entities
- Keep validation logic simple and fast
- Return clear, user-friendly messages
- Validate only changed fields when possible
- Use
%elementto highlight error fields
- Calculate derived fields efficiently
- Avoid circular determination dependencies
- Use
IN LOCAL MODEto prevent infinite loops - Only modify necessary fields
- Implement feature control to enable/disable actions dynamically
- Return meaningful result structures
- Use internal actions for helper methods
- Handle business logic in actions, not UI layer
- Missing Method Implementation: Implement all BDEF-defined methods
- Variable Naming Violations: Use lv_, lt_, ls_* conventions
- EML Syntax Errors: Check ENTITY and FIELDS syntax
- Missing FAILED/REPORTED: Always handle response structures
- Entity Not Found: Check entity name matches BDEF
- Field Not Found: Verify field exists in CDS view
- Authorization Failure: Implement get_instance_authorizations
- Lock Conflict: Handle parallel user access properly
When additional patterns or examples are needed, use these tools:
sap_help_search("EML entity manipulation")- Official SAP EML documentationsap_help_search("behavior implementation class")- Handler class patternssap_help_search("MODIFY ENTITIES syntax")- EML operation referencesap_community_search("RAP handler class examples")- Community implementation patternsmcp_context7_query-docs- General programming patterns (if needed)
Always prioritize SAP Help Portal and SAP Community for RAP implementation guidance.
- Implementation Agent: This is an IMPLEMENTATION agent - creates objects directly
- Validation First: Always run GetATCResults before CreateAIObject
- User Confirmation Required: Present plan and wait for approval
- Multi-Section Required: Use source_code object with main, definitions, implementations
- BDEF Dependency: Create BDEF before behavior implementation class
- Naming: Use ZBP_AI_* prefix for behavior pool classes (auto-added by CreateAIObject)