From d5797dccd60f82b6cadbafcf33a11a32b1539c76 Mon Sep 17 00:00:00 2001
From: danrega <16720986+danrega@users.noreply.github.com>
Date: Fri, 20 Jun 2025 15:44:46 +0200
Subject: [PATCH] Update
---
02_Structures.md | 120 ++++++++++++++++++------------------
06_Dynamic_Programming.md | 91 ++++++++++++++++++++++++---
07_String_Processing.md | 2 +
08_EML_ABAP_for_RAP.md | 32 +++++++++-
12_AMDP.md | 8 +--
14_ABAP_Unit_Tests.md | 2 +-
22_Released_ABAP_Classes.md | 10 +--
7 files changed, 181 insertions(+), 84 deletions(-)
diff --git a/02_Structures.md b/02_Structures.md
index f4e7f93..d08d1c0 100644
--- a/02_Structures.md
+++ b/02_Structures.md
@@ -25,9 +25,9 @@
- [Structures in ABAP SQL Statements](#structures-in-abap-sql-statements)
- [Structures in Statements for Processing Internal Tables](#structures-in-statements-for-processing-internal-tables)
- [Including Structures](#including-structures)
- - [Getting Structured Type Information and Creating Structures at Runtime](#getting-structured-type-information-and-creating-structures-at-runtime)
- [Excursions](#excursions)
- [sy Structure](#sy-structure)
+ - [Getting Structured Type Information and Creating Structures at Runtime](#getting-structured-type-information-and-creating-structures-at-runtime)
- [Boxed Components](#boxed-components)
- [Executable Example](#executable-example)
@@ -1110,65 +1110,6 @@ TYPES BEGIN OF address_type.
TYPES END OF address_type.
```
-
⬆️ back to top
-
-## Getting Structured Type Information and Creating Structures at Runtime
-
-Using [Runtime Type Services (RTTS)](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenrun_time_type_services_glosry.htm "Glossary Entry")
-you can ...
-- get type information on data objects, data types or [instances](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abeninstance_glosry.htm "Glossary Entry") at runtime ([Runtime Type Identification (RTTI)](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenrun_time_type_identific_glosry.htm "Glossary Entry")).
-- define and create new data types as [type description objects](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abentype_object_glosry.htm) at runtime ([Runtime Type Creation (RTTC)](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenrun_time_type_creation_glosry.htm "Glossary Entry")).
-
-For more information, see the [Dynamic Programming](06_Dynamic_Programming.md) cheat sheet.
-
-RTTI example:
-```abap
-TYPES: BEGIN OF demo_struc_type,
- comp1 TYPE c LENGTH 3,
- comp2 TYPE i,
- comp3 TYPE string,
- END OF demo_struc_type.
-DATA demo_struc TYPE demo_struc_type.
-
-DATA(tdo_c) = cl_abap_typedescr=>describe_by_data( demo_struc ).
-"DATA(tdo_c) = cl_abap_typedescr=>describe_by_name( 'DEMO_STRUC_TYPE' ).
-
-"Cast to get more specific information
-DATA(tdo_struc) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_data( demo_struc ) ).
-"DATA(tdo_struc) = CAST cl_abap_structdescr( tdo_c ).
-
-DATA(type_category_struc) = tdo_struc->kind.
-DATA(relative_name_struc) = tdo_struc->get_relative_name( ).
-... "Explore more options by positioning the cursor behind -> and choosing CTRL + Space
-DATA(type_of_struc) = tdo_struc->struct_kind.
-DATA(struc_comps) = tdo_struc->components.
-DATA(struc_comps_more_details) = tdo_struc->get_components( ).
-DATA(struc_has_include) = tdo_struc->has_include.
-DATA(struc_incl_view) = tdo_struc->get_included_view( ).
-DATA(applies_to_data_struc) = tdo_struc->applies_to_data( `some string` ).
-
-"Example: "Looping" across a structure
-"For example, this may also be done using a DO loop and dynamic assignments.
-"Demo structure, all components are convertible to type string
-TYPES: BEGIN OF ty_struc,
- comp1 TYPE c LENGTH 3,
- comp2 TYPE string,
- comp3 TYPE i,
- comp4 TYPE n LENGTH 4,
- END OF ty_struc.
-DATA(struct) = VALUE ty_struc( comp1 = 'abc' comp2 = `ABAP` comp3 = 123 comp4 = '9876' ).
-DATA looped_struc TYPE string.
-
-"In the loop, a string is populated, component by component.
-LOOP AT CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_data( struct ) )->components INTO DATA(comp).
- looped_struc = |{ looped_struc }{ COND #( WHEN sy-tabix <> 1 THEN ` / ` ) }Name: "{ CONV string( comp-name ) }", Value: "{ struct-(comp-name) }"|.
-ENDLOOP.
-
-"Result:
-"Name: "COMP1", Value: "abc" / Name: "COMP2", Value: "ABAP" / Name: "COMP3", Value: "123" / Name: "COMP4", Value: "9876"
-```
-
-
⬆️ back to top
## Excursions
@@ -1447,6 +1388,65 @@ CLASS zcl_demo_abap IMPLEMENTATION.
ENDCLASS.
```
+⬆️ back to top
+
+### Getting Structured Type Information and Creating Structures at Runtime
+
+Using [Runtime Type Services (RTTS)](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenrun_time_type_services_glosry.htm "Glossary Entry")
+you can ...
+- get type information on data objects, data types or [instances](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abeninstance_glosry.htm "Glossary Entry") at runtime ([Runtime Type Identification (RTTI)](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenrun_time_type_identific_glosry.htm "Glossary Entry")).
+- define and create new data types as [type description objects](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abentype_object_glosry.htm) at runtime ([Runtime Type Creation (RTTC)](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenrun_time_type_creation_glosry.htm "Glossary Entry")).
+
+For more information, see the [Dynamic Programming](06_Dynamic_Programming.md) cheat sheet.
+
+RTTI example:
+```abap
+TYPES: BEGIN OF demo_struc_type,
+ comp1 TYPE c LENGTH 3,
+ comp2 TYPE i,
+ comp3 TYPE string,
+ END OF demo_struc_type.
+DATA demo_struc TYPE demo_struc_type.
+
+DATA(tdo_c) = cl_abap_typedescr=>describe_by_data( demo_struc ).
+"DATA(tdo_c) = cl_abap_typedescr=>describe_by_name( 'DEMO_STRUC_TYPE' ).
+
+"Cast to get more specific information
+DATA(tdo_struc) = CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_data( demo_struc ) ).
+"DATA(tdo_struc) = CAST cl_abap_structdescr( tdo_c ).
+
+DATA(type_category_struc) = tdo_struc->kind.
+DATA(relative_name_struc) = tdo_struc->get_relative_name( ).
+... "Explore more options by positioning the cursor behind -> and choosing CTRL + Space
+DATA(type_of_struc) = tdo_struc->struct_kind.
+DATA(struc_comps) = tdo_struc->components.
+DATA(struc_comps_more_details) = tdo_struc->get_components( ).
+DATA(struc_has_include) = tdo_struc->has_include.
+DATA(struc_incl_view) = tdo_struc->get_included_view( ).
+DATA(applies_to_data_struc) = tdo_struc->applies_to_data( `some string` ).
+
+"Example: "Looping" across a structure
+"For example, this may also be done using a DO loop and dynamic assignments.
+"Demo structure, all components are convertible to type string
+TYPES: BEGIN OF ty_struc,
+ comp1 TYPE c LENGTH 3,
+ comp2 TYPE string,
+ comp3 TYPE i,
+ comp4 TYPE n LENGTH 4,
+ END OF ty_struc.
+DATA(struct) = VALUE ty_struc( comp1 = 'abc' comp2 = `ABAP` comp3 = 123 comp4 = '9876' ).
+DATA looped_struc TYPE string.
+
+"In the loop, a string is populated, component by component.
+LOOP AT CAST cl_abap_structdescr( cl_abap_typedescr=>describe_by_data( struct ) )->components INTO DATA(comp).
+ looped_struc = |{ looped_struc }{ COND #( WHEN sy-tabix <> 1 THEN ` / ` ) }Name: "{ CONV string( comp-name ) }", Value: "{ struct-(comp-name) }"|.
+ENDLOOP.
+
+"Result:
+"Name: "COMP1", Value: "abc" / Name: "COMP2", Value: "ABAP" / Name: "COMP3", Value: "123" / Name: "COMP4", Value: "9876"
+```
+
+
⬆️ back to top
diff --git a/06_Dynamic_Programming.md b/06_Dynamic_Programming.md
index 8f37c34..2115e81 100644
--- a/06_Dynamic_Programming.md
+++ b/06_Dynamic_Programming.md
@@ -88,7 +88,7 @@
## Excursion: Field Symbols and Data References
[Field symbols](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenfield_symbol_glosry.htm "Glossary Entry")
-and [data references](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abendata_reference_glosry.htm "Glossary Entry") are covered here since they are supporting elements for dynamic programming.
+and [data references](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abendata_reference_glosry.htm "Glossary Entry") are supporting elements for dynamic programming.
### Field Symbols
@@ -133,7 +133,12 @@ ENDLOOP.
```
> **💡 Note**
->- After its declaration, a field symbol is initial, i. e. a memory area is not (yet) assigned to it (apart from the inline declaration). If you use an unassigned field symbol, an exception is raised.
+>- After its declaration, a field symbol is initial, i. e. a memory area is not (yet) assigned to it (apart from the inline declaration). If you use an unassigned field symbol, a runtime error occurs.
+> ```abap
+> FIELD-SYMBOLS TYPE string.
+> "As the field symbol is unassigned, the following statement causes a runtime error.
+> = `hello`.
+> ```
>- There are plenty of options for generic ABAP types. A prominent one
is `data` that stands for any data type. See more information in the
topic [Generic ABAP
@@ -463,9 +468,13 @@ ASSIGN CAST zdemo_abap_objects_interface( oref )->in_str TO FIELD-SYMBOL( **💡 Note**
+> As covered further down, in dynamic assignments of field symbols, `sy-subrc` is set, unlike in static assignments. You can use the `ELSE UNASSIGN` addition in dynamic assignments. While `ELSE UNASSIGN` can't be explicitly specified in static assignments, it is used implicitly. Note a potential pitfall when checking field symbol assignments with `IS ASSIGNED` in dynamic assignments. An example in the dynamic assignment section illustrates the pitfall.
+
+
```abap
FIELD-SYMBOLS TYPE string.
DATA(some_string) = `hello`.
@@ -474,16 +483,25 @@ ASSIGN some_string TO .
IF IS ASSIGNED.
DATA(fs_assigned) = `is assigned`.
ELSE.
- ref_bound = `is not assigned`.
+ fs_assigned = `is not assigned`.
ENDIF.
DATA(fs_assigned_w_cond) = COND #( WHEN IS ASSIGNED THEN `is assigned` ELSE `is not assigned` ).
UNASSIGN .
-FIELD-SYMBOLS TYPE i.
-
ASSERT IS NOT ASSIGNED.
+
+FIELD-SYMBOLS TYPE i.
+DATA num TYPE i VALUE 1.
ASSERT IS NOT ASSIGNED.
+ASSIGN num TO .
+ASSERT IS ASSIGNED.
+"The following statement only initializes the value and does
+"not remove the assignment.
+CLEAR .
+ASSERT IS ASSIGNED.
+ASSERT = 0.
+ASSERT num = 0.
```
⬆️ back to top
@@ -1599,9 +1617,13 @@ ASSIGN NEW zcl_demo_abap_objects( )->('PUBLIC_STRING') TO .
"Note: For the static variant of the ASSIGN statement, i.e. if the memory area
"to be assigned following the ASSIGN keyword is statically specified, the addition
"ELSE UNASSIGN is implicitly set and cannot be used explicitly.
-DATA(hallo) = `Hallo world`.
-ASSIGN ('HALLO') TO FIELD-SYMBOL() ELSE UNASSIGN.
+DATA(hello) = `Hello world`.
+ASSIGN ('HELLO') TO FIELD-SYMBOL() ELSE UNASSIGN.
ASSERT sy-subrc = 0 AND IS ASSIGNED.
+"ASSIGN without ELSE UNASSIGN
+ASSIGN ('DOES_NOT_EXIST') TO .
+ASSERT sy-subrc = 4 AND IS ASSIGNED AND = `Hello world`.
+"ASSIGN with ELSE UNASSIGN
ASSIGN ('DOES_NOT_EXIST') TO ELSE UNASSIGN.
ASSERT sy-subrc = 4 AND IS NOT ASSIGNED.
@@ -1665,9 +1687,48 @@ ASSIGN dobj_c10 TO CASTING TYPE HANDLE tdo_elem. "1234
```
> **💡 Note**
-> - The following `ASSIGN` statements set the `sy-subrc` value: dynamic assignments, dynamic component assignment, dynamic method calls, assignments of table expressions.
+> - The following `ASSIGN` statements set the `sy-subrc` value: dynamic assignments, dynamic component assignment, dynamic method calls, assignments of table expressions. See an example below.
> - The return code is not set for a static assignment and an assignment of the constructor operator `CAST`.
+The following example:
+- Highlights the setting of `sy-subrc` after a dynamic assignment and the `ELSE UNASSIGN` addition, only for dynamic assignments.
+- Points out a potential issue when checking field symbol assignment using `IS ASSIGNED` in dynamic assignments.
+- Demonstrates dynamic access to structure components sequentially (the `sy-index` value indicates the processed field from left to right in the structure). The number of loop iterations exceeds the number of structure components. The second loop uses the `ELSE UNASSIGN` addition. You can compare the results of the two internal tables.
+
+```abap
+DATA: BEGIN OF demo_struc,
+ comp1 TYPE c LENGTH 1 VALUE 'a',
+ comp2 TYPE c LENGTH 1 VALUE 'b',
+ comp3 TYPE c LENGTH 1 VALUE 'c',
+ comp4 TYPE c LENGTH 1 VALUE 'd',
+ comp5 TYPE c LENGTH 1 VALUE 'e',
+ END OF demo_struc.
+
+FIELD-SYMBOLS TYPE data.
+DATA fs_assignment_check_1 TYPE string_table.
+DATA fs_assignment_check_2 TYPE string_table.
+
+DO 7 TIMES.
+ APPEND |****** Loop pass no. { sy-index } ******************************************| TO fs_assignment_check_1.
+ APPEND |{ COND #( WHEN IS ASSIGNED THEN |Before dynamic assignment: is assigned, value "{ }"| ELSE `Check before dynamic assignment: is not assigned` ) }| TO fs_assignment_check_1.
+
+ ASSIGN demo_struc-(sy-index) TO .
+
+ APPEND |{ COND #( WHEN sy-subrc = 0 THEN | was successfully assigned, value "{ }"| ELSE ` was not assigned` ) }| TO fs_assignment_check_1.
+ APPEND |{ COND #( WHEN IS ASSIGNED THEN | is assigned, value "{ }"| ELSE ` is not assigned` ) }| TO fs_assignment_check_1.
+ENDDO.
+
+DO 7 TIMES.
+ APPEND |****** Loop pass no. { sy-index } ******************************************| TO fs_assignment_check_2.
+ APPEND |{ COND #( WHEN IS ASSIGNED THEN |Before dynamic assignment: is assigned, value "{ }"| ELSE `Check before dynamic assignment: is not assigned` ) }| TO fs_assignment_check_2.
+
+ ASSIGN demo_struc-(sy-index) TO ELSE UNASSIGN.
+
+ APPEND |{ COND #( WHEN sy-subrc = 0 THEN | was successfully assigned, value "{ }"| ELSE ` was not assigned` ) }| TO fs_assignment_check_2.
+ APPEND |{ COND #( WHEN IS ASSIGNED THEN | is assigned, value "{ }"| ELSE ` is not assigned` ) }| TO fs_assignment_check_2.
+ENDDO.
+```
+
⬆️ back to top
### Creating Anonymous Data Objects by Specifying the Type Dynamically
@@ -3906,6 +3967,16 @@ CLASS zcl_demo_abap IMPLEMENTATION.
DATA(interfaces_cl) = tdo_cl->interfaces.
DATA(events_cl) = tdo_cl->events.
DATA(methods_cl) = tdo_cl->methods.
+ "Accessing Method/parameter information
+ LOOP AT methods_cl INTO DATA(meth_wa).
+ DATA(meth_name) = meth_wa-name.
+ LOOP AT meth_wa-parameters INTO DATA(param_wa).
+ "Getting type description object of method parameters
+ DATA(meth_param_type) = tdo_cl->get_method_parameter_type(
+ p_method_name = meth_name
+ p_parameter_name = param_wa-name ).
+ ENDLOOP.
+ ENDLOOP.
DATA(super_class_cl) = tdo_cl->get_super_class_type( ).
DATA(super_class_name_cl) = super_class_cl->absolute_name.
DATA(is_instantiable_cl) = tdo_cl->is_instantiatable( ).
@@ -4783,7 +4854,7 @@ The following examples show snippets that have already been covered in several s
They use the following methods to get type description objects:
- `cl_abap_typedescr=>describe_by_name` (based on an existing type name)
- `cl_abap_typedescr=>describe_by_data` (based on an existing data object)
-- `...=>get*` (getting type description objects for elementary and other types; other get* methods are shown further down)
+- `...=>get*` (getting type description objects for elementary and other types; other `get*` methods are shown further down)
```abap
*&---------------------------------------------------------------------*
diff --git a/07_String_Processing.md b/07_String_Processing.md
index 1baa0e8..0f61e73 100644
--- a/07_String_Processing.md
+++ b/07_String_Processing.md
@@ -395,6 +395,8 @@ tz = |{ utclong_current( ) TIMEZONE = 'EST' COUNTRY = 'US ' }|. "12/30/2024 09:4
*&---------------------------------------------------------------------*
"Lowercase and uppercase
+DATA s1 TYPE string.
+DATA s2 TYPE string.
s1 = `AbCdEfG`.
s2 = |{ s1 CASE = LOWER }|. "abcdefg
s2 = |{ s1 CASE = UPPER }|. "ABCDEFG
diff --git a/08_EML_ABAP_for_RAP.md b/08_EML_ABAP_for_RAP.md
index d10e13c..dca763d 100644
--- a/08_EML_ABAP_for_RAP.md
+++ b/08_EML_ABAP_for_RAP.md
@@ -34,7 +34,9 @@
- [ROLLBACK ENTITIES](#rollback-entities)
- [GET PERMISSIONS: Retrieving Information about RAP BO Permissions](#get-permissions-retrieving-information-about-rap-bo-permissions)
- [Raising RAP Business Events](#raising-rap-business-events)
- - [IN LOCAL MODE Addition to ABAP EML Statements in ABAP Behavior Pools](#in-local-mode-addition-to-abap-eml-statements-in-abap-behavior-pools)
+ - [Additions to ABAP EML Statements in ABAP Behavior Pools](#additions-to-abap-eml-statements-in-abap-behavior-pools)
+ - [IN LOCAL MODE Addition](#in-local-mode-addition)
+ - [AUGMENTING Addition to ABAP EML MODIFY Statements](#augmenting-addition-to-abap-eml-modify-statements)
- [RAP Excursions](#rap-excursions)
- [Using Keys and Identifying RAP BO Instances in a Nutshell](#using-keys-and-identifying-rap-bo-instances-in-a-nutshell)
- [Assignment of Key Component Groups](#assignment-of-key-component-groups)
@@ -2436,7 +2438,7 @@ GET PERMISSIONS ONLY GLOBAL ENTITY zdemo_abap_rap_ro_m
- [RAP business events](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenrap_entity_event_glosry.htm) can be raised in ABAP behavior pools with [`RAISE ENTITY EVENT`](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abapraise_entity_event.htm) statements.
- The focus of the snippets is on the local consumption of RAP business events. Prerequisites:
- - `event` specifications are available in the BDEF (e.g. `... event some_evt; ...`). For more details, refer to the [BDL documentation](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenbdl_event.htm)
+ - `event` specifications are available in the BDEF (e.g. `... event some_evt; ...`). For more details, refer to the [BDL documentation](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenbdl_event.htm).
- A [RAP event handler class](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenrap_event_handler_class_glosry.htm) is available that is used to implement [RAP event handler methods](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenrap_event_handler_meth_glosry.htm).
- Note that these methods are called asynchronously.
- Similar to RAP handler and saver methods, RAP event handler methods are implemented in the CCIMP include (*Local Types* tab in ADT) of the RAP event handler class.
@@ -2507,7 +2509,9 @@ ENDCLASS.
⬆️ back to top
-### IN LOCAL MODE Addition to ABAP EML Statements in ABAP Behavior Pools
+### Additions to ABAP EML Statements in ABAP Behavior Pools
+
+#### IN LOCAL MODE Addition
- There are a [special additions when using EML in behavior
pools](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abeneml_in_abp.htm).
@@ -2534,6 +2538,28 @@ MODIFY ENTITIES OF root_ent IN LOCAL MODE
...
```
+⬆️ back to top
+
+#### AUGMENTING Addition to ABAP EML MODIFY Statements
+
+- ABAP EML `MODIFY` statements include a special syntax variant used only in the context of projections: `MODIFY AUGMENTING ENTITY|ENTITIES`.
+ - RAP projection business objects prepare a business object for specific services, allowing flexible service consumption and role-based service design. Find more details in the [Development guide for the ABAP RESTful Application Programming Model](https://help.sap.com/docs/abap-cloud/abap-rap/business-object-projection).
+- Purpose: Modify and enrich requests from the base BO at the projection layer before storing the data in the transactional buffer. All standard operations and actions are supported.
+- You can use the statement with the `AUGMENTING` addition only in RAP BO providers.
+- Response parameters are not supported with these statements.
+- Note the `RELATING` addition in this context. This is relevant if the augmented request contains instances not in the original request. It establishes a relationship between the new instances and the original ones in a relationship table to associate potential responses.
+
+
+```abap
+MODIFY AUGMENTING ENTITY some_bdef
+ UPDATE FROM ...
+
+"relates_tab is of type abp_behv_relating_tab
+MODIFY AUGMENTING ENTITY some_bdef
+ UPDATE FROM ... RELATING TO some_instances BY relates_tab.
+```
+
+
⬆️ back to top
## RAP Excursions
diff --git a/12_AMDP.md b/12_AMDP.md
index 1b9905a..1d325fe 100644
--- a/12_AMDP.md
+++ b/12_AMDP.md
@@ -82,10 +82,8 @@ in the ABAP Keyword Documentation.
## AMDP Classes
-- As mentioned above, an [AMDP
- class](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenamdp_class_glosry.htm "Glossary Entry")
- is an [ABAP
- Repository](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenabap_repository_glosry.htm "Glossary Entry")
+- An [AMDP class](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenamdp_class_glosry.htm "Glossary Entry")
+ is an [ABAP repository](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenabap_repository_glosry.htm "Glossary Entry")
object like other global classes.
- However, an AMDP class includes the specification of the interface
`IF_AMDP_MARKER_HDB` for the SAP HANA
@@ -238,7 +236,7 @@ Note:
## AMDP Functions
[Scalar](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenamdp_scalar_function_glosry.htm "Glossary Entry") and [table functions](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abentable_function_glosry.htm "Glossary Entry") can be managed as [AMDP functions](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenamdp_function_glosry.htm "Glossary Entry").
-[AMDP table functions](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenamdp_table_function_glosry.htm "Glossary Entry"), as the name suggests, have a tabular [return value](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenreturn_value_glosry.htm "Glossary Entry"), while AMDP scalar functions have a scalar or elementary return value. These functions allow complex custom calculations to be executed directly on the SAP HANA database to boost performance, enhancing performance and enabling reuse.
+[AMDP table functions](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenamdp_table_function_glosry.htm "Glossary Entry"), as the name suggests, have a tabular [return value](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenreturn_value_glosry.htm "Glossary Entry"), while AMDP scalar functions have a scalar (i.e. an elementary) return value. These functions allow complex custom calculations to be executed directly on the SAP HANA database to boost performance, enhancing performance and enabling reuse.
⬆️ back to top
diff --git a/14_ABAP_Unit_Tests.md b/14_ABAP_Unit_Tests.md
index 0c542bb..2ecef4c 100644
--- a/14_ABAP_Unit_Tests.md
+++ b/14_ABAP_Unit_Tests.md
@@ -604,7 +604,7 @@ For more information about evaluating ABAP unit test results, see [here](https:/
> - The executable examples contain comments in the code for more information.
> - The examples are designed to display output in the console when they are run using `F9`. However, the focus is on ABAP Unit tests. Choose `Ctrl/Cmd + Shift + F10` to run the unit tests.
> - The example classes are intentionally simplified and nonsemantic, designed to highlight basic unit tests and explore framework classes and methods.
-> - They are not meant to serve as a model for proper unit test design. Always devise your own solutions for each unique case.
+> - They are not meant to serve as a best practices and model for proper unit test design. The primary focus is on syntax, additions, and their basic functionality. Always devise your own solutions for each unique case.
> - Refer to the code comments, SAP Help Portal and class documentation for additional information.
> - The steps to import and run the code are outlined [here](README.md#-getting-started-with-the-examples).
> - [Disclaimer](./README.md#%EF%B8%8F-disclaimer)
\ No newline at end of file
diff --git a/22_Released_ABAP_Classes.md b/22_Released_ABAP_Classes.md
index 0236327..a254882 100644
--- a/22_Released_ABAP_Classes.md
+++ b/22_Released_ABAP_Classes.md
@@ -331,7 +331,7 @@ ENDCLASS.
> - The examples are simplified and not meant to represent best practices for IDE action implementation. They are only intended for exploration purposes to get a high-level idea.
> - All examples use `CL_DEMO_OUTPUT_CLOUD` to retrieve HTML output of data objects. Note that this class is intended for demo purposes only.
> - **NOTE**: The use of IDE actions is your responsibility. Development and use are up to you. Refer to [this repository's disclaimer](./README.md#%EF%B8%8F-disclaimer) and the [disclaimer in the IDE action documentation](https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/working-with-ide-actions).
-> - Be particularly mindful of the potential security risks when importing external content, which the simplified example code below does not address. The example code also uses dynmamic programming techniques. They can pose a security risk. Refer to the [Dynamic Programming cheat sheet](06_Dynamic_Programming.md) and the ABAP Keyword Documentation.
+> - Be particularly mindful of the potential security risks when importing external content, which the simplified example code below does not address. The example code also uses dynamic programming techniques. They can pose a security risk. Refer to the [Dynamic Programming cheat sheet](06_Dynamic_Programming.md) and the ABAP Keyword Documentation.
**Demo IDE Actions Using `CL_DEMO_OUTPUT_CLOUD`**
@@ -834,7 +834,7 @@ ENDCLASS.
- This demo IDE action lets you select usable and instantiable classes, select one of their public instance or static methods, and provide the input parameters (if any) with character-like actual parameters.
- For example, a calculator method may require three inputs: two numbers and an operator. The example focuses on basic cases and does not perform input validation at runtime.
- When you run the IDE action, the method is executed.
-- As a result, the parameter table (refer to the Dynamic Programming cheat sheet) is displayed as HTML in the IDE action result dialog using `CL_DEMO_OUTPUT_CLOUD`, including any the input and output parameters and their values (if any).
+- As a result, the parameter table (refer to the Dynamic Programming cheat sheet) is displayed as HTML in the IDE action result dialog using `CL_DEMO_OUTPUT_CLOUD`, including any of the input and output parameters and their values (if any).
**Steps**
@@ -862,7 +862,7 @@ ENDCLASS.
- An IDE action dialog is displayed prompting you to provide a class.
- Once you have provided the class name, you can choose *Browse* for *Public Method*. Select the method you want to call.
- If the selected method has input parameters, they are displayed in the *Method Input Parameters* section.
- - To provide actual parameters for the formal parameters, select the line and choose *Edit*. You can then provide input for *Valule*.
+ - To provide actual parameters for the formal parameters, select the line and choose *Edit*. You can then provide input for *Value*.
- Choose *Run*.
- The IDE action result dialog is displayed showing the HTML output of the parameter table (if any), i.e. also possible output parameters and their content.
@@ -1935,7 +1935,7 @@ Example XLSX content and demo execution steps
**First Example**
- The following table shows content you can use for demonstration purposes.
-- You can copy the content of the entire table to the clipboard, go to your worksheet program and paste the content in the first worksheet, first cell, first column. Depending on your program, you may require to past the clipboard content into the worksheet without any formatting (or with a special pasting option) so that the content is properly inserted line by line.
+- You can copy the content of the entire table to the clipboard, go to your worksheet program and paste the content in the first worksheet, first cell, first column. Depending on your program, you may require to pass the clipboard content into the worksheet without any formatting (or with a special pasting option) so that the content is properly inserted line by line.
- Save the XLSX file and proceed with the IDE action execution as described above.
- On the selection IDE action dialog, just provide the path to the file and leave the other values unchanged. Run the IDE action.
@@ -5923,7 +5923,7 @@ ENDCLASS.
The XCO library offers classes such as `XCO_CP_XLSX` and methods for reading and writing XLSX content. You can find more information [here](https://help.sap.com/docs/btp/sap-business-technology-platform/xlsx). The following example demonstrates a selection of methods.
-Expand the following collapsible section for further information and example code.
+Expand the following collapsible sections for further information and example code.
🟢 Click to expand for more information and example code