This commit is contained in:
danrega
2024-07-19 14:41:34 +02:00
parent 63097a0e04
commit 4c0fd846e5
5 changed files with 156 additions and 62 deletions

View File

@@ -14,8 +14,11 @@
- [SQL Operands](#sql-operands) - [SQL Operands](#sql-operands)
- [SQL Expressions](#sql-expressions) - [SQL Expressions](#sql-expressions)
- [Elementary Expressions](#elementary-expressions) - [Elementary Expressions](#elementary-expressions)
- [SQL Functions](#sql-functions) - [Numeric Functions](#numeric-functions)
- [More SQL Expressions](#more-sql-expressions) - [String Functions](#string-functions)
- [Special Functions](#special-functions)
- [Aggregate Expressions](#aggregate-expressions)
- [Arithmetic, Cast, String Expressions, and Case Distinctions](#arithmetic-cast-string-expressions-and-case-distinctions)
- [Window Expressions](#window-expressions) - [Window Expressions](#window-expressions)
- [SQL Conditions](#sql-conditions) - [SQL Conditions](#sql-conditions)
- [Selecting Data by Evaluating the Content of Other Tables](#selecting-data-by-evaluating-the-content-of-other-tables) - [Selecting Data by Evaluating the Content of Other Tables](#selecting-data-by-evaluating-the-content-of-other-tables)
@@ -623,6 +626,7 @@ SELECT FROM zdemo_abap_flsch
on SQL expressions on SQL expressions
[here](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abapsql_expr.htm) [here](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abapsql_expr.htm)
and the subtopics there. and the subtopics there.
- Built-in functions are available in ABAP SQL. The result is a value with the associated dictionary type. The arguments of the functions can cover one or more SQL expressions. Find more information [here](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenabap_sql_builtin_functions.htm).
##### Elementary Expressions ##### Elementary Expressions
@@ -634,15 +638,10 @@ SELECT FROM zdemo_abap_flsch
- See more information - See more information
[here](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abensql_elem.htm). [here](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abensql_elem.htm).
##### SQL Functions ##### Numeric Functions
- You can use built-in functions in ABAP SQL. [Numeric functions](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abensql_arith_func.htm)
- Result: Value with the associated dictionary type.
- Arguments of the functions: Cover one or more SQL expressions.
- See more information
[here](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenabap_sql_builtin_functions.htm).
Example: [Numeric functions](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abensql_arith_func.htm)
``` abap ``` abap
SELECT SINGLE SELECT SINGLE
carrname, carrname,
@@ -683,7 +682,9 @@ SELECT SINGLE
<p align="right"><a href="#top">⬆️ back to top</a></p> <p align="right"><a href="#top">⬆️ back to top</a></p>
Example: [String functions](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abensql_string_func.htm) ##### String Functions
[String functions](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abensql_string_func.htm)
``` abap ``` abap
SELECT SINGLE SELECT SINGLE
@@ -804,7 +805,9 @@ SELECT SINGLE
<p align="right"><a href="#top">⬆️ back to top</a></p> <p align="right"><a href="#top">⬆️ back to top</a></p>
Example: [Special functions](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenabap_sql_special_functions.htm) ##### Special Functions
[Special functions](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenabap_sql_special_functions.htm)
``` abap ``` abap
SELECT SINGLE SELECT SINGLE
@@ -855,6 +858,8 @@ INTO @DATA(special_functions).
<p align="right"><a href="#top">⬆️ back to top</a></p> <p align="right"><a href="#top">⬆️ back to top</a></p>
##### Aggregate Expressions
[Aggregate expressions](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abapselect_aggregate.htm) [Aggregate expressions](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abapselect_aggregate.htm)
- Consist of [aggregate - Consist of [aggregate
@@ -903,7 +908,7 @@ SELECT
<p align="right"><a href="#top">⬆️ back to top</a></p> <p align="right"><a href="#top">⬆️ back to top</a></p>
##### More SQL Expressions ##### Arithmetic, Cast, String Expressions, and Case Distinctions
- [Arithmetic - [Arithmetic
expressions](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abensql_arith.htm) expressions](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abensql_arith.htm)

View File

@@ -582,13 +582,13 @@ is required to access objects and their components. That means objects are not d
- Using [`CREATE OBJECT`](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abapcreate_object.htm) statements, you can create an object as an instance of a class and assign the reference to the object to an [object reference variable](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenobject_refer_variable_glosry.htm). - Using [`CREATE OBJECT`](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abapcreate_object.htm) statements, you can create an object as an instance of a class and assign the reference to the object to an [object reference variable](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenobject_refer_variable_glosry.htm).
- The instance operator [`NEW`](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenconstructor_expression_new.htm) basically replaces `CREATE OBJECT` statements. - The instance operator [`NEW`](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenconstructor_expression_new.htm) basically replaces `CREATE OBJECT` statements.
- However, `CREATE OBJECT` statements are still required and they are the only option for creating objects dynamically (`NEW` is not possible in that context) as shown further down. - However, `CREATE OBJECT` statements are still required and they are the only option for creating objects dynamically (`NEW` is not possible in that context) as shown further down.
- Note the use of the built-in generic ABAP type `object` (`TYPE REF TO object`) that is used for the generic typing of object references. It is for any object type. `object` stands for the root class of the inheritance hierarchy. More information: [Generic ABAP Types](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenbuilt_in_types_generic.htm) - In the example, note the the built-in generic ABAP type `object` (`TYPE REF TO object`) that is used for the generic typing of object references. It is for any object type. `object` stands for the root class of the inheritance hierarchy. More information: [Generic ABAP Types](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenbuilt_in_types_generic.htm)
- Find more information in the [ABAP Keyword Documentation](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abapcreate_object.htm) and the [ABAP Object Orientation](04_ABAP_Object_Orientation.md) cheat sheet - Find more information in the [ABAP Keyword Documentation](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abapcreate_object.htm) and the [ABAP Object Orientation](04_ABAP_Object_Orientation.md) cheat sheet
```abap ```abap
DATA oref_a TYPE REF TO zcl_some_class. DATA oref_a TYPE REF TO zcl_some_class.
oref_a = NEW #( ). oref_a = NEW #( ).
"Using Inline declaration "Using inline declaration
DATA(oref_b) = NEW zcl_some_class( ). DATA(oref_b) = NEW zcl_some_class( ).
"Generic type "Generic type
DATA oref_c TYPE REF TO object. DATA oref_c TYPE REF TO object.

View File

@@ -43,11 +43,14 @@ The following links take you to the source code of the cheat sheet artifacts to
## More Information ## More Information
- [ABAP Data Models Guide](https://help.sap.com/docs/abap-cloud/abap-data-models/abap-data-models)
- [ABAP Core Data Services in the ABAP Keyword Documentation](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abencds.htm)
- [ABAP CDS Development Tools: User Guide](https://help.sap.com/docs/abap-cloud/abap-cds-tools-user-guide/about-abap-cds-development-tools-user-guide?version=sap_btp)
- [ABAP CDS Feature Tables](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abencds_language_elements.htm)
- [ABAP CDS Glossary](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abencds_glossary.htm)
- Blogs: - Blogs:
- [Feature Matrix: Data Modeling with ABAP Core Data Services](https://blogs.sap.com/2022/10/24/feature-matrix-data-modeling-with-abap-core-data-services/) - [Feature Matrix: Data Modeling with ABAP Core Data Services](https://blogs.sap.com/2022/10/24/feature-matrix-data-modeling-with-abap-core-data-services/)
- [ABAP CDS Cheat Sheet: Amounts and Quantities in ABAP CDS](https://blogs.sap.com/2022/07/07/abap-cds-cheat-sheet-amounts-and-quantities-in-abap-cds/) - [ABAP CDS Cheat Sheet: Amounts and Quantities in ABAP CDS](https://blogs.sap.com/2022/07/07/abap-cds-cheat-sheet-amounts-and-quantities-in-abap-cds/)
- [ABAP Data Models Guide](https://blogs.sap.com/2023/05/09/abap-data-models-guide/) (includes a link to the guide on the SAP Help Portal)
- ABAP Keyword Documentation: [ABAP - Core Data Services (ABAP CDS)](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abencds.htm)
## Executable Example ## Executable Example

View File

@@ -11,7 +11,7 @@
- [CALL TRANSFORMATION Syntax](#call-transformation-syntax) - [CALL TRANSFORMATION Syntax](#call-transformation-syntax)
- [Working with JSON](#working-with-json) - [Working with JSON](#working-with-json)
- [Excursions](#excursions) - [Excursions](#excursions)
- [Serializing and Deserializing Instances of Classes](#serializing-and-deserializing-instances-of-classes) - [Serializing and Deserializing Objects](#serializing-and-deserializing-objects)
- [Converting string \<-\> xstring](#converting-string---xstring) - [Converting string \<-\> xstring](#converting-string---xstring)
- [Compressing and Decompressing Binary Data](#compressing-and-decompressing-binary-data) - [Compressing and Decompressing Binary Data](#compressing-and-decompressing-binary-data)
- [More Information](#more-information) - [More Information](#more-information)
@@ -676,19 +676,110 @@ xco_cp_json=>data->from_string( json_created_xco )->apply( VALUE #(
## Excursions ## Excursions
### Serializing and Deserializing Instances of Classes ### Serializing and Deserializing Objects
For serializing instances of classes, find more information [here](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenasxml_class_instances.htm) in the ABAP Keyword Documentation. The classes must implement the `IF_SERIALIZABLE_OBJECT` interface. - To serialize and deserialize objects (i.e. instances of classes), you can use `CALL TRANSFORMATION` statements. As a prerequisite, the classes must implement the `IF_SERIALIZABLE_OBJECT` interface.
- Find more information and examples [here](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenasxml_class_instances.htm) in the ABAP Keyword Documentation.
Expand the following collapsible section to view the code of an example. To try it out, create a demo class named `zcl_some_class` and paste the code into it. After activation, choose *F9* in ADT to execute the class. This example is set up to display the results in the console.
Expand the following collapsible section to view the code of two simplified examples. To try them out, create a demo class named `zcl_some_class` and paste the code into it. After activation, choose *F9* in ADT to execute the class. The examples are set up to display output in the console.
<details> <details>
<summary>Expand to view the details</summary> <summary>Expand to view the details</summary>
<!-- --> <!-- -->
When running the class, three instances of this class are created, and two instance attributes are assigned values for output purposes. The current UTC timestamp - When the class runs, it creates three instances, and three instance attributes are assigned values for each instance: the current UTC timestamp, a random number, and a UUID.
and a random number are retrieved and assigned. Then, the instances are serialized. - These instances are then serialized and subsequently deserialized.
The instances are deserialized again, and the instance attributes are accessed. Their values are stored in an internal table, which is then displayed. - The instance attributes are accessed, and their values are stored in an internal table and displayed.
**Example 1:**
- The example class implements the `IF_SERIALIZABLE_OBJECT` interface, using the standard behavior to serialize and deserialize all instance attributes (i.e. the helper methods mentioned below are not implemented).
- The values of of all deserialized instance attributes are displayed.
```abap
CLASS zcl_some_class DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES: if_oo_adt_classrun,
if_serializable_object.
PROTECTED SECTION.
PRIVATE SECTION.
DATA timestamp TYPE utclong.
DATA random_number TYPE i.
DATA uuid TYPE sysuuid_x16.
ENDCLASS.
CLASS zcl_some_class IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
DATA serialized_obj_tab TYPE string_table.
TYPES: BEGIN OF deserialized_obj_struc,
timestamp TYPE utclong,
random_number TYPE i,
uuid TYPE sysuuid_x16,
END OF deserialized_obj_struc.
DATA deserialized_obj_tab TYPE TABLE OF deserialized_obj_struc WITH EMPTY KEY.
"Creating objects, assigning values to instance attributes, and serializing objects
DO 3 TIMES.
DATA(oref) = NEW zcl_some_class( ).
oref->timestamp = utclong_current( ).
oref->random_number = cl_abap_random_int=>create( seed = cl_abap_random=>seed( )
min = 1
max = 100 )->get_next( ).
TRY.
oref->uuid = cl_system_uuid=>create_uuid_x16_static( ) .
CATCH cx_uuid_error.
ENDTRY.
DATA serialized_obj TYPE string.
CALL TRANSFORMATION id SOURCE obj = oref
RESULT XML serialized_obj.
APPEND serialized_obj TO serialized_obj_tab.
ENDDO.
"Deserializing objects
LOOP AT serialized_obj_tab INTO DATA(wa).
DATA deserialized_obj TYPE REF TO zcl_some_class.
CALL TRANSFORMATION id SOURCE XML wa
RESULT obj = deserialized_obj.
"Addressing instance attributes after deserialization
DATA(deserialized_timestamp) = deserialized_obj->timestamp.
DATA(deserialized_random_number) = deserialized_obj->random_number.
DATA(deserialized_uuid) = deserialized_obj->uuid.
"Adding deserialized instance attribute values to an internal table
APPEND VALUE #( timestamp = deserialized_timestamp
random_number = deserialized_random_number
uuid = deserialized_uuid
) TO deserialized_obj_tab.
ENDLOOP.
out->write( deserialized_obj_tab ).
ENDMETHOD.
ENDCLASS.
```
**Example 2:**
- The example class implements the `IF_SERIALIZABLE_OBJECT` interface, along with the `SERIALIZE_HELPER` and `DESERIALIZE_HELPER` methods.
- These methods allow you to modify the standard behavior. Both methods must be implemented together, or not at all. If neither is implemented, the standard behavior applies.
- The methods must be declared as private instance methods. The `SERIALIZE_HELPER` method only has output parameters, while `DESERIALIZE_HELPER` only has input parameters. Any parameter specified for the `SERIALIZE_HELPER` method must have an identically named and typed parameter in the `DESERIALIZE_HELPER` method.
- For example, you can implement these methods if you want to exclude certain attributes from (de)serialization.
- In the given example, one of the instance attributes is excluded from (de)serialization. As a result, the output only includes initial values for one of the attributes.
```abap ```abap
@@ -699,32 +790,19 @@ CLASS zcl_some_class DEFINITION
PUBLIC SECTION. PUBLIC SECTION.
INTERFACES: if_oo_adt_classrun, INTERFACES: if_oo_adt_classrun,
if_serializable_object. if_serializable_object.
PROTECTED SECTION. PROTECTED SECTION.
PRIVATE SECTION. PRIVATE SECTION.
DATA timestamp TYPE utclong. DATA timestamp TYPE utclong.
DATA random_number TYPE i. DATA random_number TYPE i.
DATA serialized_obj_tab TYPE TABLE OF xstring WITH EMPTY KEY. DATA uuid TYPE sysuuid_x16.
TYPES: BEGIN OF deserialized_obj_struc,
timestamp TYPE utclong,
random_number TYPE i,
END OF deserialized_obj_struc.
DATA deserialized_obj_tab TYPE TABLE OF deserialized_obj_struc WITH EMPTY KEY.
METHODS: METHODS:
"The following method can only have output parameters.
"For each output parameter of the serialize_helper method, you must specify
"an identically named input parameter of the deserialize_helper method
"with the same type.
"The example uses two instance attributes that are specified in the private
"visibility section.
serialize_helper EXPORTING timestamp TYPE utclong serialize_helper EXPORTING timestamp TYPE utclong
random_number TYPE i, random_number TYPE i,
"This method can only have input parameters.
deserialize_helper IMPORTING timestamp TYPE utclong deserialize_helper IMPORTING timestamp TYPE utclong
random_number TYPE i. random_number TYPE i.
ENDCLASS. ENDCLASS.
@@ -733,11 +811,15 @@ CLASS zcl_some_class IMPLEMENTATION.
METHOD if_oo_adt_classrun~main. METHOD if_oo_adt_classrun~main.
"For demonstration purposes, 3 instances of the class are created and serialized. DATA serialized_obj_tab TYPE string_table.
"Two instance attributes are assigned values for output purposes (the current UTC timestamp TYPES: BEGIN OF deserialized_obj_struc,
"and a random number are retrieved and assigned). The assigned values are also serialized and timestamp TYPE utclong,
"can be addressed after deserialization. The serialized instances of the class are added to an random_number TYPE i,
"internal table which is processed below. uuid TYPE sysuuid_x16,
END OF deserialized_obj_struc.
DATA deserialized_obj_tab TYPE TABLE OF deserialized_obj_struc WITH EMPTY KEY.
"Creating objects, assigning values to instance attributes, and serializing objects
DO 3 TIMES. DO 3 TIMES.
DATA(oref) = NEW zcl_some_class( ). DATA(oref) = NEW zcl_some_class( ).
oref->timestamp = utclong_current( ). oref->timestamp = utclong_current( ).
@@ -745,47 +827,51 @@ CLASS zcl_some_class IMPLEMENTATION.
min = 1 min = 1
max = 100 )->get_next( ). max = 100 )->get_next( ).
DATA serialized_obj TYPE xstring. TRY.
oref->uuid = cl_system_uuid=>create_uuid_x16_static( ) .
CATCH cx_uuid_error.
ENDTRY.
DATA serialized_obj TYPE string.
CALL TRANSFORMATION id SOURCE obj = oref CALL TRANSFORMATION id SOURCE obj = oref
RESULT XML serialized_obj. RESULT XML serialized_obj.
APPEND serialized_obj TO serialized_obj_tab. APPEND serialized_obj TO serialized_obj_tab.
ENDDO. ENDDO.
"Deserializing instances of classes from above "Deserializing objects
"For output purposes, the values of the instance attributes are added to an
"internal table.
LOOP AT serialized_obj_tab INTO DATA(wa). LOOP AT serialized_obj_tab INTO DATA(wa).
DATA deserialized_oref TYPE REF TO zcl_some_class. DATA deserialized_obj TYPE REF TO zcl_some_class.
CALL TRANSFORMATION id SOURCE XML wa CALL TRANSFORMATION id SOURCE XML wa
RESULT obj = deserialized_oref. RESULT obj = deserialized_obj.
"Addressing instance attributes after deserialization "Addressing instance attributes after deserialization
DATA(deserialized_timestamp) = deserialized_oref->timestamp. DATA(deserialized_timestamp) = deserialized_obj->timestamp.
DATA(deserialized_random_number) = deserialized_oref->random_number. DATA(deserialized_random_number) = deserialized_obj->random_number.
DATA(deserialized_uuid) = deserialized_obj->uuid.
"Adding deserialized instance attribute values to an internal table
APPEND VALUE #( timestamp = deserialized_timestamp APPEND VALUE #( timestamp = deserialized_timestamp
random_number = deserialized_random_number random_number = deserialized_random_number
uuid = deserialized_uuid
) TO deserialized_obj_tab. ) TO deserialized_obj_tab.
ENDLOOP. ENDLOOP.
"The output is intended to visualize the deserialized instance of a class
"and the values of its instance attributes that should differ from line to
"line.
out->write( deserialized_obj_tab ). out->write( deserialized_obj_tab ).
ENDMETHOD. ENDMETHOD.
METHOD serialize_helper.
timestamp = me->timestamp.
random_number = me->random_number.
ENDMETHOD.
METHOD deserialize_helper. METHOD deserialize_helper.
me->timestamp = timestamp. me->timestamp = timestamp.
me->random_number = random_number. me->random_number = random_number.
ENDMETHOD. ENDMETHOD.
METHOD serialize_helper.
timestamp = me->timestamp.
random_number = me->random_number.
ENDMETHOD.
ENDCLASS. ENDCLASS.
``` ```
</details> </details>

View File

@@ -841,7 +841,7 @@ ENDIF.
## Time and Date ## Time and Date
> **💡 Note**<br> > **💡 Note**<br>
> In [ABAP for Cloud Development](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenabap_for_cloud_dev_glosry.htm), do not use the date and time-related system fields such as `sy-datum` and `sy-uzeit`, and others. User-related time and date values (such as `sy-timlo` and `sy-datlo`) can be retrieved using the XCO library. For code snippets, see the [Date, Time, and Time Stamp](23_Date_and_Time.md) cheat sheet. > In [ABAP for Cloud Development](https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/index.htm?file=abenabap_for_cloud_dev_glosry.htm), do not use the date and time-related system fields such as `sy-datum` and `sy-uzeit`, and others. User-related time and date values can be retrieved using the XCO library. For code snippets, see the [Date, Time, and Time Stamp](23_Date_and_Time.md) cheat sheet.
<table> <table>
<tr> <tr>
@@ -1363,7 +1363,7 @@ CLASS zcl_demo_test IMPLEMENTATION.
out->write( comp_res3 ). out->write( comp_res3 ).
ENDIF. ENDIF.
CATCH cx_abap_diff INTO DATA(error3). CATCH cx_abap_diff INTO DATA(error3).
out->write( error2->get_text( ) ). out->write( error3->get_text( ) ).
ENDTRY. ENDTRY.
ENDMETHOD. ENDMETHOD.
ENDCLASS. ENDCLASS.