SAP ABAP Development Skill Related Skills - sap-abap-cds : Use when developing CDS views for ABAP-backed Fiori applications or defining data models with annotations - sap-btp-cloud-platform : Use when working with ABAP Environment on BTP or deploying ABAP applications to the cloud - sap-cap-capire : Use when connecting ABAP systems with CAP applications or integrating with OData services - sap-fiori-tools : Use when building Fiori applications with ABAP backends or consuming OData services from ABAP systems - sap-api-style : Use when documenting ABAP APIs or following SAP API documentation st…

).\n \" Matches pattern\nENDIF.\n```\n\n### Extraction Functions\n\n```abap\n\" Extract substring by position\nDATA(sub) = substring( val = text off = 5 len = 10 ).\n\n\" Extract after/before delimiter\nDATA(after) = substring_after( val = text sub = ':' ).\nDATA(before) = substring_before( val = text sub = ':' ).\n\n\" Extract from/to (inclusive)\nDATA(from) = substring_from( val = text sub = 'start' ).\nDATA(to) = substring_to( val = text sub = 'end' ).\n\n\" Extract segment by delimiter\nDATA(seg) = segment( val = 'a,b,c,d' index = 2 sep = ',' ). \" Result: b\n```\n\n### Transformation Functions\n\n```abap\n\" Case conversion\nDATA(upper) = to_upper( text ).\nDATA(lower) = to_lower( text ).\n\n\" Camelcase conversion\nDATA(mixed) = to_mixed( val = 'HELLO_WORLD' sep = '_' ). \" HelloWorld\nDATA(under) = from_mixed( val = 'HelloWorld' sep = '_' ). \" hello_world\n\n\" Reverse string\nDATA(rev) = reverse( text ).\n\n\" Character substitution\nDATA(trans) = translate( val = text from = 'abc' to = 'xyz' ).\n```\n\n### Replacement Functions\n\n```abap\n\" Replace substring\nDATA(rep) = replace( val = text sub = 'old' with = 'new' ).\n\n\" Replace all occurrences\nDATA(rep_all) = replace( val = text sub = 'old' with = 'new' occ = 0 ).\n\n\" Replace with regex\nDATA(rep_regex) = replace( val = text pcre = '[0-9]+' with = '#' ).\n\n\" Insert at position\nDATA(ins) = insert( val = text sub = 'INSERT' off = 5 ).\n```\n\n### Escape Function\n\n```abap\n\" Escape for URL\nDATA(url_esc) = escape( val = text format = cl_abap_format=>e_url ).\n\n\" Escape for JSON\nDATA(json_esc) = escape( val = text format = cl_abap_format=>e_json_string ).\n\n\" Escape for string template\nDATA(tmpl_esc) = escape( val = text format = cl_abap_format=>e_string_tpl ).\n```\n\n### Other String Functions\n\n```abap\n\" Repeat string\nDATA(repeated) = repeat( val = 'ab' occ = 3 ). \" ababab\n\n\" Condense blanks\nDATA(condensed) = condense( val = ' a b c ' ). \" a b c\nDATA(no_blanks) = condense( val = ' a b c ' del = ' ' ). \" abc\n\n\" Shift characters\nDATA(left) = shift_left( val = text sub = ' ' ).\nDATA(right) = shift_right( val = text places = 3 ).\n\n\" Join table lines\nDATA(joined) = concat_lines_of( table = string_tab sep = ',' ).\n\n\" Levenshtein distance\nDATA(dist) = distance( val1 = 'kitten' val2 = 'sitting' ).\n\n\" Count occurrences\nDATA(cnt) = count( val = text sub = 'a' ).\nDATA(cnt_any) = count_any_of( val = text sub = 'aeiou' ).\n```\n\n---\n\n## Numeric Functions\n\n### Basic Math Functions\n\n```abap\n\" Absolute value\nDATA(abs_val) = abs( -5 ). \" 5\n\n\" Sign (-1, 0, or 1)\nDATA(sign_val) = sign( -5 ). \" -1\n\n\" Rounding\nDATA(ceil_val) = ceil( CONV decfloat34( '3.2' ) ). \" 4\nDATA(floor_val) = floor( CONV decfloat34( '3.8' ) ). \" 3\nDATA(trunc_val) = trunc( CONV decfloat34( '3.8' ) ). \" 3\nDATA(frac_val) = frac( CONV decfloat34( '3.8' ) ). \" 0.8\n\n\" Round with precision\nDATA(rounded) = round( val = CONV decfloat34( '3.14159' ) dec = 2 ). \" 3.14\nDATA(rescaled) = rescale( val = amount prec = 2 ).\n```\n\n### Power and Root Functions\n\n```abap\n\" Integer power\nDATA(pow) = ipow( base = 2 exp = 10 ). \" 1024\n\n\" Square root\nDATA(sqrt_val) = sqrt( 16 ). \" 4\n```\n\n### Min/Max Functions\n\n```abap\n\" Multiple arguments\nDATA(min_val) = nmin( val1 = a val2 = b val3 = c ).\nDATA(max_val) = nmax( val1 = a val2 = b val3 = c ).\n```\n\n### Trigonometric Functions\n\n```abap\n\" Standard trigonometric\nDATA(sin_val) = sin( angle ).\nDATA(cos_val) = cos( angle ).\nDATA(tan_val) = tan( angle ).\n\n\" Inverse trigonometric\nDATA(asin_val) = asin( value ).\nDATA(acos_val) = acos( value ).\nDATA(atan_val) = atan( value ).\n\n\" Hyperbolic\nDATA(sinh_val) = sinh( value ).\nDATA(cosh_val) = cosh( value ).\nDATA(tanh_val) = tanh( value ).\n```\n\n### Logarithmic and Exponential\n\n```abap\n\" Natural logarithm\nDATA(log_val) = log( value ).\n\n\" Base 10 logarithm\nDATA(log10_val) = log10( value ).\n\n\" Exponential (e^x)\nDATA(exp_val) = exp( value ).\n```\n\n### Special Math Functions\n\n```abap\n\" Factorial\nDATA(fact) = factorial( n ).\n\n\" Binomial coefficient\nDATA(binom) = binomial( n = 10 k = 3 ).\n```\n\n---\n\n## Table Functions\n\n```abap\n\" Count table lines\nDATA(line_count) = lines( itab ).\n\n\" Check if line exists\nIF line_exists( itab[ key = value ] ).\n \" Line found\nENDIF.\n\n\" Get line index\nDATA(idx) = line_index( itab[ key = value ] ).\n```\n\n---\n\n## Logical Functions\n\n```abap\n\" Returns 'X' or '' (string type)\nDATA(bool_str) = boolc( condition ).\n\n\" Returns 'X' or '' (type c length 1) - use with abap_true/abap_false\nDATA(bool_c) = xsdbool( condition ).\n\nIF xsdbool( a > b ) = abap_true.\n \" Condition is true\nENDIF.\n```\n\n---\n\n## Timestamp Functions\n\n```abap\n\" Get current UTC timestamp\nDATA(ts) = utclong_current( ).\n\n\" Add time to timestamp\nDATA(ts_add) = utclong_add(\n val = ts\n days = 1\n hours = 2\n minutes = 30\n seconds = 0\n).\n\n\" Calculate difference (returns seconds as decfloat34)\nDATA(diff) = utclong_diff( high = ts2 low = ts1 ).\n```\n\n---\n\n## ABAP SQL Functions\n\nAvailable in SELECT statements:\n\n### Numeric SQL Functions\n\n```abap\nSELECT\n div( field1, 10 ) AS int_division,\n division( field1, field2, 2 ) AS dec_division,\n mod( field1, 10 ) AS modulo,\n abs( field1 ) AS absolute,\n ceil( field1 ) AS ceiling,\n floor( field1 ) AS floor_val,\n round( field1, 2 ) AS rounded\nFROM dbtab\nINTO TABLE @DATA(result).\n```\n\n### String SQL Functions\n\n```abap\nSELECT\n initcap( name ) AS proper_case,\n instr( text, 'search' ) AS position,\n locate( text, 'search' ) AS locate_pos,\n locate_regexpr( pcre = '[0-9]+' IN text ) AS regex_pos,\n length( text ) AS len,\n left( text, 5 ) AS left_chars,\n right( text, 5 ) AS right_chars,\n ltrim( text, ' ' ) AS left_trimmed,\n rtrim( text, ' ' ) AS right_trimmed,\n upper( text ) AS upper_case,\n lower( text ) AS lower_case,\n concat( field1, field2 ) AS concatenated,\n replace( text, 'old', 'new' ) AS replaced,\n substring( text, 1, 5 ) AS sub_str\nFROM dbtab\nINTO TABLE @DATA(result).\n```\n\n### Date/Time SQL Functions\n\n```abap\nSELECT\n extract_year( date_field ) AS year,\n extract_month( date_field ) AS month,\n extract_day( date_field ) AS day,\n dayname( date_field ) AS day_name,\n monthname( date_field ) AS month_name,\n weekday( date_field ) AS week_day,\n days_between( date1, date2 ) AS days_diff,\n add_days( date_field, 30 ) AS future_date,\n add_months( date_field, 3 ) AS future_month,\n utcl_current( ) AS current_ts,\n utcl_add_seconds( ts_field, 3600 ) AS ts_plus_hour\nFROM dbtab\nINTO TABLE @DATA(result).\n```\n\n### Conversion SQL Functions\n\n```abap\nSELECT\n unit_conversion( quantity = qty, source_unit = uom, target_unit = 'KG' ) AS converted,\n currency_conversion( amount = amt, source_currency = curr, target_currency = 'USD' ) AS usd_amt,\n uuid( ) AS new_uuid\nFROM dbtab\nINTO TABLE @DATA(result).\n```\n\n---\n\n## Best Practices\n\n1. **Use built-in functions** instead of custom implementations\n2. **Prefer SQL functions** for database operations (pushdown)\n3. **Use xsdbool( )** for comparisons with abap_true/abap_false\n4. **Use lines( )** instead of DESCRIBE TABLE for count\n5. **Use line_exists( )** for existence checks instead of READ TABLE\n6. **Combine functions** for complex string operations\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":8548,"content_sha256":"7d8e2250bdd33f8d55a29891730ea85a634be208795d1e97c3a2353ecf590308"},{"filename":"references/cds-views.md","content":"# CDS View Entities - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/15_CDS_View_Entities.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/15_CDS_View_Entities.md)\n\n---\n\n## Basic Syntax\n\n```cds\[email protected]: 'ZSQL_VIEW'\[email protected]: true\[email protected]: true\[email protected]: #NOT_REQUIRED\[email protected]: 'Demo CDS View'\n\ndefine view entity ZDemo_CDS_View\n as select from zdemo_table as Source\n{\n key Source.key_field as KeyField,\n Source.field1 as Field1,\n Source.field2 as Field2\n}\n```\n\n---\n\n## Field Selection\n\n```cds\ndefine view entity ZDemo_Fields\n as select from zdemo_table\n{\n key key_field, // Direct field\n field1 as AliasName, // With alias\n 'Literal' as LiteralField, // Literal value\n 123 as NumericLiteral, // Numeric literal\n abap.dats'20240101' as DateLiteral, // Date literal\n $session.user as CurrentUser, // Session variable\n $session.client as Client\n}\n```\n\n---\n\n## Expressions\n\n### Cast Expressions\n\n```cds\ncast( amount as abap.dec(15,2) ) as CastedAmount,\ncast( quantity as abap.int4 ) as CastedQuantity,\ncast( text as abap.char(100) ) as CastedText\n```\n\n### Arithmetic Expressions\n\n```cds\nprice * quantity as TotalAmount,\namount / 100 as AmountPercentage,\nvalue1 + value2 as Sum,\nvalue1 - value2 as Difference\n```\n\n### Case Expressions\n\n```cds\n// Simple CASE\ncase status\n when 'A' then 'Active'\n when 'I' then 'Inactive'\n else 'Unknown'\nend as StatusText,\n\n// Searched CASE\ncase\n when amount > 1000 then 'High'\n when amount > 100 then 'Medium'\n else 'Low'\nend as AmountCategory\n```\n\n### Coalesce\n\n```cds\ncoalesce( nullable_field, 'Default' ) as FieldWithDefault,\ncoalesce( amount, 0 ) as AmountOrZero\n```\n\n---\n\n## Built-in Functions\n\n### String Functions\n\n```cds\nconcat( first_name, last_name ) as FullName,\nconcat_with_space( first_name, last_name, 1 ) as SpacedName,\nsubstring( text, 1, 10 ) as Excerpt,\nlength( description ) as DescLength,\nleft( code, 2 ) as Prefix,\nright( code, 2 ) as Suffix,\nupper( name ) as UpperName,\nlower( name ) as LowerName,\nltrim( text, ' ' ) as LeftTrimmed,\nrtrim( text, ' ' ) as RightTrimmed,\nreplace( text, 'old', 'new' ) as ReplacedText,\ninstr( text, 'pattern' ) as PatternPosition\n```\n\n### Numeric Functions\n\n```cds\nabs( amount ) as AbsoluteAmount,\nceil( value ) as Ceiling,\nfloor( value ) as FloorValue,\nround( price, 2 ) as RoundedPrice,\ndiv( total, count ) as IntegerDivision,\nmod( number, 10 ) as Remainder,\ndivision( amount, 3, 2 ) as PreciseDivision\n```\n\n### Date/Time Functions\n\n```cds\ndats_is_valid( date_field ) as IsValidDate,\ndats_days_between( date1, date2 ) as DaysDiff,\ndats_add_days( date_field, 7 ) as DatePlusWeek,\ndats_add_months( date_field, 1 ) as DatePlusMonth,\n$session.system_date as Today\n```\n\n### Type Conversion\n\n```cds\ncast( char_field as abap.numc(10) ) as NumericString,\ncast( amount as abap.fltp ) as FloatingPoint\n```\n\n---\n\n## Aggregate Functions\n\n```cds\ndefine view entity ZDemo_Aggregates\n as select from zdemo_table\n{\n key category,\n count(*) as TotalCount,\n count( distinct status ) as UniqueStatuses,\n sum( amount ) as TotalAmount,\n avg( price ) as AveragePrice,\n min( date_field ) as FirstDate,\n max( date_field ) as LastDate\n}\ngroup by category\n```\n\n---\n\n## Joins\n\n### Inner Join\n\n```cds\ndefine view entity ZDemo_InnerJoin\n as select from zdemo_header as Header\n inner join zdemo_item as Item\n on Header.header_id = Item.header_id\n{\n key Header.header_id,\n key Item.item_id,\n Header.description,\n Item.quantity\n}\n```\n\n### Left Outer Join\n\n```cds\ndefine view entity ZDemo_LeftJoin\n as select from zdemo_header as Header\n left outer join zdemo_item as Item\n on Header.header_id = Item.header_id\n{\n key Header.header_id,\n Header.description,\n Item.item_id,\n Item.quantity\n}\n```\n\n### Multiple Joins\n\n```cds\ndefine view entity ZDemo_MultiJoin\n as select from zdemo_header as Header\n inner join zdemo_item as Item\n on Header.header_id = Item.header_id\n left outer join zdemo_text as Text\n on Item.item_id = Text.item_id\n{\n // fields\n}\n```\n\n---\n\n## Associations\n\n### Definition\n\n```cds\ndefine view entity ZDemo_Associations\n as select from zdemo_header as Header\n association [1..*] to zdemo_item as _Items\n on Header.header_id = _Items.header_id\n association [0..1] to zdemo_status as _Status\n on Header.status = _Status.status_code\n{\n key Header.header_id,\n Header.description,\n Header.status,\n\n // Expose associations\n _Items,\n _Status\n}\n```\n\n### Cardinalities\n\n```cds\nassociation [0..1] to Target // Optional, single\nassociation [1] to Target // Mandatory, single\nassociation [1..*] to Target // One or more\nassociation [0..*] to Target // Zero or more (default)\nassociation [*] to Target // Same as [0..*]\n```\n\n### Path Expressions\n\n```cds\n// Access associated fields\n_Status.description as StatusDescription,\n_Items.quantity as ItemQuantity\n```\n\n---\n\n## Annotations\n\n### CDS Annotations\n\n```cds\[email protected]: 'ZSQLVIEW'\[email protected]: true\[email protected]: true\n\[email protected]: #NOT_REQUIRED\n// or #CHECK, #PRIVILEGED_ONLY\n\[email protected]: 'Human readable name'\n```\n\n### Element Annotations\n\n```cds\ndefine view entity ZDemo_Annotations\n as select from zdemo_table\n{\n @EndUserText.label: 'Customer ID'\n @EndUserText.quickInfo: 'Unique customer identifier'\n key customer_id as CustomerId,\n\n @Semantics.amount.currencyCode: 'CurrencyCode'\n amount as Amount,\n\n @Semantics.currencyCode: true\n currency as CurrencyCode,\n\n @Semantics.unitOfMeasure: true\n unit as Unit,\n\n @Semantics.quantity.unitOfMeasure: 'Unit'\n quantity as Quantity\n}\n```\n\n### UI Annotations\n\n```cds\n@UI: {\n headerInfo: {\n typeName: 'Order',\n typeNamePlural: 'Orders',\n title: { value: 'OrderId' }\n }\n}\n\[email protected]: [{ position: 10 }]\[email protected]: [{ position: 10 }]\nkey order_id as OrderId\n```\n\n---\n\n## Input Parameters\n\n```cds\ndefine view entity ZDemo_Parameters\n with parameters\n p_date : abap.dats,\n p_category : abap.char(10)\n as select from zdemo_table\n{\n key id,\n description,\n $parameters.p_date as ParameterDate,\n $parameters.p_category as ParameterCategory\n}\nwhere category = $parameters.p_category\n and date_field >= $parameters.p_date\n```\n\n### Calling with Parameters\n\n```abap\nSELECT * FROM zdemo_parameters( p_date = '20240101', p_category = 'A' )\n INTO TABLE @DATA(result).\n```\n\n---\n\n## Composition and Hierarchy\n\n```cds\n// Root entity\ndefine root view entity ZDemo_Root\n as select from zdemo_root\n composition [0..*] of ZDemo_Child as _Children\n{\n key root_id,\n description,\n _Children\n}\n\n// Child entity\ndefine view entity ZDemo_Child\n as select from zdemo_child\n association to parent ZDemo_Root as _Root\n on $projection.root_id = _Root.root_id\n{\n key root_id,\n key child_id,\n description,\n _Root\n}\n```\n\n---\n\n## Extension Views\n\n```cds\n// Extend existing view\nextend view entity ZExisting_View with\n{\n Source.additional_field as AdditionalField,\n 'Literal' as NewLiteral\n}\n```\n\n---\n\n## ABAP Consumption\n\n### SELECT\n\n```abap\n\" Direct select\nSELECT * FROM zdemo_cds_view INTO TABLE @DATA(result).\n\n\" With association path\nSELECT *, \\_Items-quantity FROM zdemo_header\n INTO TABLE @DATA(with_items).\n\n\" With parameters\nSELECT * FROM zdemo_params( p_date = @lv_date )\n INTO TABLE @DATA(parameterized).\n```\n\n### Association Access\n\n```abap\n\" Follow association\nSELECT * FROM zdemo_header\n ASSOCIATION \\_Items\n INTO TABLE @DATA(items).\n```\n\n---\n\n## Best Practices\n\n1. **Use view entities** over classic CDS views\n2. **Define meaningful aliases** for all fields\n3. **Expose associations** for flexibility\n4. **Add semantic annotations** for Fiori integration\n5. **Use parameters** for flexible filtering\n6. **Document with @EndUserText** annotations\n7. **Set appropriate authorization checks**\n8. **Keep views focused** and composable\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":8112,"content_sha256":"28459bdd31970cc356da2667b63407502019a00be176bfd09d612fc97a9be7d1"},{"filename":"references/cloud-development.md","content":"# ABAP Cloud Development - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/19_ABAP_for_Cloud_Development.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/19_ABAP_for_Cloud_Development.md)\n\n---\n\n## Core Concepts\n\n**ABAP Cloud**: Programming paradigm for cloud-ready, upgrade-stable solutions using restricted ABAP technology.\n\n**Key Restrictions**:\n- Limited to ABAP for Cloud Development language version\n- Access restricted to released SAP APIs only\n- ADT (ABAP Development Tools for Eclipse) is the only supported IDE\n- RAP is the transactional programming model\n\n---\n\n## Prohibited Syntax\n\n```abap\n\" NOT allowed in ABAP Cloud\n\n\" Classic statements\nMOVE source TO target. \" Use: target = source.\nDESCRIBE TABLE itab LINES count. \" Use: count = lines( itab ).\nGET REFERENCE OF var INTO dref. \" Use: dref = REF #( var ).\n\n\" Classic UI\nWRITE 'text'.\nSELECTION-SCREEN ...\nSTART-OF-SELECTION.\n\n\" Reports\nREPORT ...\n\n\" Classic debugging\nBREAK-POINT.\n\n\" Client handling\nSELECT ... USING CLIENT ...\n\n\" Some sy-fields\nDATA(date) = sy-datum. \" Use XCO library\nDATA(time) = sy-uzeit.\nDATA(timestamp) = sy-timlo.\n```\n\n---\n\n## Released APIs\n\n### Date and Time (XCO Library)\n\n```abap\n\" Current date\nDATA(date) = xco_cp=>sy->date( )->as( xco_cp_time=>format->iso_8601_extended )->value.\n\n\" Current time\nDATA(time) = xco_cp=>sy->time( )->as( xco_cp_time=>format->iso_8601_extended )->value.\n\n\" Date calculations\nDATA(tomorrow) = xco_cp=>sy->date( )->add( iv_day = 1 )->value.\nDATA(next_month) = xco_cp=>sy->date( )->add( iv_month = 1 )->value.\n```\n\n### UUID Generation\n\n```abap\n\" Generate UUID\nDATA(uuid) = cl_system_uuid=>create_uuid_x16_static( ).\n\n\" As string format\nTRY.\n DATA(uuid_str) = cl_system_uuid=>convert_uuid_x16_static(\n uuid = uuid ).\n CATCH cx_uuid_error.\nENDTRY.\n```\n\n### Random Numbers\n\n```abap\n\" Random integer\nDATA(random) = cl_abap_random_int=>create(\n seed = CONV i( sy-uzeit )\n min = 1\n max = 100 ).\nDATA(number) = random->get_next( ).\n\n\" Probability distributions\nDATA(prob) = cl_abap_prob_distribution=>get_instance( ).\nDATA(normal) = prob->normal( mean = 50 stdev = 10 ).\n```\n\n### Output (if_oo_adt_classrun)\n\n```abap\nCLASS zcl_demo DEFINITION PUBLIC FINAL CREATE PUBLIC.\n PUBLIC SECTION.\n INTERFACES if_oo_adt_classrun.\nENDCLASS.\n\nCLASS zcl_demo IMPLEMENTATION.\n METHOD if_oo_adt_classrun~main.\n out->write( 'Hello from ABAP Cloud!' ).\n out->write( data_object ).\n out->write( itab ).\n ENDMETHOD.\nENDCLASS.\n```\n\n### String Processing\n\n```abap\n\" Available string functions\nDATA(upper) = to_upper( text ).\nDATA(lower) = to_lower( text ).\nDATA(len) = strlen( text ).\nDATA(found) = find( val = text sub = 'pattern' ).\nDATA(result) = replace( val = text sub = 'old' with = 'new' occ = 0 ).\n\n\" String templates\nDATA(formatted) = |Date: { xco_cp=>sy->date( )->value DATE = ISO }|.\n```\n\n---\n\n## Released Table Types\n\n```abap\n\" Available system types\nDATA itab TYPE string_table.\nDATA hash_tab TYPE string_hashed_table.\nDATA xstr_tab TYPE xstring_table.\n```\n\n---\n\n## Released Data Elements\n\n```abap\n\" Available DDIC elements\nDATA ts TYPE timestampl.\nDATA country TYPE land1.\nDATA bool TYPE abap_boolean.\nDATA true_val TYPE abap_bool VALUE abap_true.\n```\n\n---\n\n## RAP as Programming Model\n\n```abap\n\" EML for data access\nMODIFY ENTITIES OF zroot_entity\n ENTITY root\n CREATE FROM ...\n MAPPED DATA(mapped)\n FAILED DATA(failed)\n REPORTED DATA(reported).\n\nREAD ENTITIES OF zroot_entity\n ENTITY root\n ALL FIELDS WITH VALUE #( ( key = 1 ) )\n RESULT DATA(result).\n\nCOMMIT ENTITIES.\n```\n\n---\n\n## Checking Cloud Readiness\n\n### In ADT\n\n1. Right-click on class/object\n2. Select \"Run As\" → \"ABAP Test Cockpit\"\n3. Use check variant `ABAP_CLOUD_READINESS`\n4. Review findings\n\n### Change Language Version\n\n1. Open object properties\n2. Go to \"General\" tab\n3. Edit \"ABAP Language Version\"\n4. Select \"ABAP for Cloud Development\"\n5. Check for syntax errors\n\n---\n\n## Migration Patterns\n\n### Date/Time\n\n```abap\n\" Classic (not allowed)\nDATA(date) = sy-datum.\nDATA(time) = sy-uzeit.\n\n\" Cloud (use XCO)\nDATA(date) = xco_cp=>sy->date( )->value.\nDATA(time) = xco_cp=>sy->time( )->value.\n```\n\n### Table Line Count\n\n```abap\n\" Classic (not allowed)\nDESCRIBE TABLE itab LINES count.\n\n\" Cloud\nDATA(count) = lines( itab ).\n```\n\n### Reference Creation\n\n```abap\n\" Classic (not allowed)\nGET REFERENCE OF var INTO dref.\n\n\" Cloud\ndref = REF #( var ).\n```\n\n### Assignment\n\n```abap\n\" Classic (not allowed)\nMOVE source TO target.\n\n\" Cloud\ntarget = source.\n```\n\n### Output\n\n```abap\n\" Classic (not allowed)\nWRITE 'text'.\n\n\" Cloud (in if_oo_adt_classrun)\nout->write( 'text' ).\n```\n\n---\n\n## Available CDS Objects\n\n```abap\n\" Released CDS views\nDATA tz TYPE i_timezone.\n\n\" Access via ABAP SQL\nSELECT * FROM i_country INTO TABLE @DATA(countries).\n```\n\n---\n\n## Release Contracts\n\n| Contract | Meaning |\n|----------|---------|\n| C0 | Not released |\n| C1 | Released for key user extensibility |\n| C2 | Released for partner development |\n| C3 | Released for SAP internal |\n\nUse only C1 or higher in ABAP Cloud.\n\n---\n\n## Best Practices\n\n1. **Use released APIs only** - check release status before using\n2. **Use RAP** for transactional scenarios\n3. **Use XCO library** for date/time operations\n4. **Implement if_oo_adt_classrun** for console output\n5. **Run ATC checks** regularly with cloud readiness variant\n6. **Avoid sy-datum/sy-uzeit** - use XCO alternatives\n7. **Use constructor expressions** over obsolete syntax\n8. **Test in cloud environment** before deployment\n\n---\n\n## Supported Environments\n\n- SAP BTP ABAP Environment\n- SAP S/4HANA Cloud, public edition\n- SAP S/4HANA Cloud, private edition\n- SAP S/4HANA (on-premise) - opt-in\n\n---\n\n## Documentation Links\n\n- [ABAP Language Versions](https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm)\n- [Released APIs](https://api.sap.com/)\n- [XCO Library](https://help.sap.com/docs/btp/sap-business-technology-platform/xco-library)\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":5982,"content_sha256":"68fddfd7029a366616c111574f68e8499613ec6f4e2023c493090d5cf66d35d4"},{"filename":"references/constructor-expressions.md","content":"# ABAP Constructor Expressions - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/05_Constructor_Expressions.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/05_Constructor_Expressions.md)\n\n> **Version Note**: All constructor operators (VALUE, NEW, CONV, COND, SWITCH, REF, EXACT,\n> CAST, CORRESPONDING) are available since **7.40 SP02**. REDUCE and FILTER require\n> **7.40 SP08**. The `FINAL` inline declaration requires **7.50+** — use `DATA` on 7.40.\n> LET expressions require **7.40 SP05+**. BASE, LINES OF, OPTIONAL/DEFAULT require **7.40 SP08+**.\n\n## Table of Contents\n\n1. [VALUE Operator](#value-operator)\n2. [NEW Operator](#new-operator)\n3. [CONV Operator](#conv-operator)\n4. [CORRESPONDING Operator](#corresponding-operator)\n5. [COND Operator](#cond-operator)\n6. [SWITCH Operator](#switch-operator)\n7. [REDUCE Operator](#reduce-operator)\n8. [FILTER Operator](#filter-operator)\n9. [LET Expressions](#let-expressions)\n10. [CAST Operator](#cast-operator)\n11. [REF Operator](#ref-operator)\n12. [ALPHA Conversion](#alpha-conversion)\n13. [EXACT Operator](#exact-operator)\n\n---\n\n## VALUE Operator\n\n### Structures\n\n```abap\n\" Create structure with values\nDATA(struc) = VALUE zdemo_struc( id = 1 name = 'Test' ).\n\n\" With type inference\nDATA struc TYPE zdemo_struc.\nstruc = VALUE #( id = 1 name = 'Test' ).\n\n\" Partial assignment (other fields initial)\nstruc = VALUE #( id = 1 ).\n\n\" Clear to initial\nstruc = VALUE #( ).\n```\n\n### Internal Tables\n\n```abap\n\" Create populated table\nDATA(itab) = VALUE zdemo_tab(\n ( id = 1 name = 'First' )\n ( id = 2 name = 'Second' )\n ( id = 3 name = 'Third' ) ).\n\n\" With BASE (append to existing)\nitab = VALUE #( BASE itab\n ( id = 4 name = 'Fourth' ) ).\n\n\" LINES OF (copy from other table)\nitab = VALUE #( BASE itab ( LINES OF other_tab ) ).\n\n\" From range (UNTIL/WHILE)\nDATA(nums) = VALUE int_table(\n FOR i = 1 UNTIL i > 10\n ( i ) ).\n\n\" With FOR from table\nDATA(new_tab) = VALUE target_tab(\n FOR wa IN source_tab\n ( id = wa-key name = wa-description ) ).\n\n\" FOR with WHERE\nDATA(filtered) = VALUE target_tab(\n FOR wa IN source WHERE ( active = abap_true )\n ( wa ) ).\n\n\" FOR with INDEX INTO\nDATA(numbered) = VALUE target_tab(\n FOR wa IN source INDEX INTO idx\n ( line_no = idx data = wa ) ).\n\n\" Nested FOR\nDATA(product) = VALUE result_tab(\n FOR a IN tab_a\n FOR b IN tab_b\n ( a = a b = b ) ).\n```\n\n### Deep Structures\n\n```abap\n\" Nested structure\nDATA(deep) = VALUE deep_struc(\n header = VALUE #( id = 1 name = 'Header' )\n items = VALUE #(\n ( item_id = 10 desc = 'Item 1' )\n ( item_id = 20 desc = 'Item 2' ) ) ).\n```\n\n### OPTIONAL and DEFAULT\n\n```abap\n\" OPTIONAL - return initial if not found\nDATA(line) = VALUE #( itab[ id = 999 ] OPTIONAL ).\n\n\" DEFAULT - return specific value if not found\nDATA(line) = VALUE #( itab[ id = 999 ] DEFAULT VALUE #( id = 0 name = 'Not found' ) ).\n```\n\n---\n\n## NEW Operator\n\n### Create Objects\n\n```abap\n\" Create instance\nDATA(oref) = NEW zcl_my_class( ).\n\n\" With constructor parameters\nDATA(oref) = NEW zcl_my_class( iv_name = 'Test' iv_value = 100 ).\n\n\" Anonymous instance in expression\nIF NEW zcl_validator( )->is_valid( input ).\n ...\nENDIF.\n```\n\n### Create Data References\n\n```abap\n\" Elementary types\nDATA(dref_int) = NEW i( 42 ).\nDATA(dref_str) = NEW string( 'Hello' ).\n\n\" Structures\nDATA(dref_struc) = NEW zdemo_struc( id = 1 name = 'Test' ).\n\n\" Tables\nDATA(dref_tab) = NEW zdemo_tab( ( id = 1 ) ( id = 2 ) ).\n```\n\n---\n\n## CONV Operator\n\n```abap\n\" Convert to specific type\nDATA(str) = CONV string( some_char ).\nDATA(int) = CONV i( '123' ).\nDATA(dec) = CONV decfloat34( 1 / 3 ).\n\n\" With type inference\nDATA result TYPE decfloat34.\nresult = CONV #( num1 / num2 ).\n\n\" Inline type conversion\nprocess( CONV string( number ) ).\n```\n\n---\n\n## CORRESPONDING Operator\n\n### Basic Mapping\n\n```abap\n\" Map matching components\ntarget = CORRESPONDING #( source ).\n\n\" With BASE (keep existing values)\ntarget = CORRESPONDING #( BASE ( target ) source ).\n```\n\n### Field Mapping\n\n```abap\n\" Explicit field mapping\ntarget = CORRESPONDING #( source MAPPING\n target_field = source_field\n other_field = another_field ).\n\n\" EXCEPT - exclude fields\ntarget = CORRESPONDING #( source EXCEPT field1 field2 ).\n```\n\n### Table Operations\n\n```abap\n\" Map tables\ntarget_tab = CORRESPONDING #( source_tab ).\n\n\" With DISCARDING DUPLICATES (for unique keys)\ntarget_sorted = CORRESPONDING #( source_tab DISCARDING DUPLICATES ).\n```\n\n### DEEP and BASE Options\n\n```abap\n\" DEEP - handle nested structures/tables\ntarget = CORRESPONDING #( DEEP source ).\n\n\" DEEP BASE - keep existing nested data\ntarget = CORRESPONDING #( DEEP BASE ( target ) source ).\n```\n\n### MAPPING FROM ENTITY / TO ENTITY\n\n```abap\n\" RAP-specific mapping\nstruct = CORRESPONDING #( bdef_type MAPPING FROM ENTITY ).\nbdef_type = CORRESPONDING #( struct MAPPING TO ENTITY ).\n\n\" USING CONTROL - respect %control flags\ntarget = CORRESPONDING #( source USING CONTROL ).\n\n\" CHANGING CONTROL - populate %control\ntarget = CORRESPONDING #( source CHANGING CONTROL ).\n```\n\n---\n\n## COND Operator\n\n```abap\n\" Simple condition\nDATA(text) = COND string( WHEN flag = abap_true THEN 'Yes' ELSE 'No' ).\n\n\" Multiple conditions\nDATA(grade) = COND string(\n WHEN score >= 90 THEN 'A'\n WHEN score >= 80 THEN 'B'\n WHEN score >= 70 THEN 'C'\n WHEN score >= 60 THEN 'D'\n ELSE 'F' ).\n\n\" With complex expressions\nDATA(result) = COND #(\n WHEN table IS INITIAL THEN 'Empty'\n WHEN lines( table ) = 1 THEN 'Single'\n ELSE |{ lines( table ) } items| ).\n\n\" With THROW\nDATA(value) = COND #(\n WHEN valid THEN result\n ELSE THROW zcx_validation_error( ) ).\n\n\" With LET (local variables)\nDATA(msg) = COND #(\n LET len = strlen( text ) IN\n WHEN len > 100 THEN 'Long'\n WHEN len > 50 THEN 'Medium'\n ELSE 'Short' ).\n```\n\n---\n\n## SWITCH Operator\n\n```abap\n\" Value-based switch\nDATA(text) = SWITCH string( code\n WHEN 'A' THEN 'Active'\n WHEN 'I' THEN 'Inactive'\n WHEN 'D' THEN 'Deleted'\n ELSE 'Unknown' ).\n\n\" With type inference\nDATA result TYPE string.\nresult = SWITCH #( status\n WHEN 1 THEN 'Open'\n WHEN 2 THEN 'Closed'\n ELSE 'Unknown' ).\n\n\" With THROW\nDATA(value) = SWITCH #( code\n WHEN 1 THEN 'One'\n WHEN 2 THEN 'Two'\n ELSE THROW zcx_invalid_code( ) ).\n```\n\n---\n\n## CAST Operator\n\n```abap\n\" Cast to subclass\nDATA(subclass) = CAST zcl_subclass( super_ref ).\n\n\" Cast to interface\nDATA(intf) = CAST zif_my_interface( oref ).\n\n\" For RTTI\nDATA(class_desc) = CAST cl_abap_classdescr(\n cl_abap_typedescr=>describe_by_object_ref( oref ) ).\n\n\" With TRY for safe casting\nTRY.\n DATA(specific) = CAST zcl_specific( general_ref ).\n CATCH cx_sy_move_cast_error.\n \" Handle cast failure\nENDTRY.\n```\n\n---\n\n## REF Operator\n\n```abap\n\" Create reference to existing data\nDATA text TYPE string VALUE 'Hello'.\nDATA(dref) = REF #( text ).\n\n\" Inline creation\nprocess( REF #( some_structure ) ).\n\n\" With explicit type\nDATA(typed_ref) = REF string( text ).\n```\n\n---\n\n## EXACT Operator\n\n```abap\n\" Lossless conversion (raises exception on loss)\nTRY.\n DATA(exact_int) = EXACT i( decimal_value ).\n CATCH cx_sy_conversion_lost.\n \" Precision would be lost\nENDTRY.\n\n\" With rounding\nDATA(rounded) = EXACT decfloat34( value ) ##NEEDED.\n```\n\n---\n\n## REDUCE Operator\n\n### Aggregation\n\n```abap\n\" Sum\nDATA(sum) = REDUCE i( INIT s = 0\n FOR wa IN itab\n NEXT s = s + wa-amount ).\n\n\" Concatenation\nDATA(concat) = REDUCE string( INIT str = ``\n FOR wa IN itab\n NEXT str = str && wa-name && `, ` ).\n\n\" Maximum\nDATA(max) = REDUCE i( INIT m = 0\n FOR wa IN itab\n NEXT m = COND #( WHEN wa-value > m THEN wa-value ELSE m ) ).\n\n\" Count with condition\nDATA(count) = REDUCE i( INIT c = 0\n FOR wa IN itab WHERE ( active = abap_true )\n NEXT c = c + 1 ).\n```\n\n### Multiple Accumulators\n\n```abap\nDATA(stats) = REDUCE #(\n INIT sum = 0 count = 0\n FOR wa IN itab\n NEXT sum = sum + wa-amount\n count = count + 1 ).\n\" stats-sum and stats-count available\n```\n\n### Building Tables\n\n```abap\n\" Filter and transform\nDATA(filtered) = REDUCE string_table(\n INIT result = VALUE string_table( )\n FOR wa IN source WHERE ( status = 'A' )\n NEXT result = VALUE #( BASE result ( wa-name ) ) ).\n```\n\n---\n\n## FILTER Operator\n\n```abap\n\" Filter by condition\nDATA(active) = FILTER #( itab WHERE status = 'A' ).\n\n\" Using secondary key (more efficient)\nDATA(filtered) = FILTER #( itab USING KEY by_status WHERE status = 'A' ).\n\n\" EXCEPT - exclude matching\nDATA(non_active) = FILTER #( itab EXCEPT WHERE status = 'A' ).\n\n\" With filter table (IN)\nDATA filter_vals TYPE SORTED TABLE OF string WITH UNIQUE KEY table_line.\nfilter_vals = VALUE #( ( `A` ) ( `B` ) ).\nDATA(matched) = FILTER #( itab IN filter_vals WHERE status = table_line ).\n\n\" With EXCEPT and filter table\nDATA(not_matched) = FILTER #( itab EXCEPT IN filter_vals WHERE status = table_line ).\n```\n\n---\n\n## LET Expressions\n\n```abap\n\" Define local variables in expressions\nDATA(result) = LET a = 10\n b = 20\n IN a + b.\n\n\" With COND\nDATA(category) = COND #(\n LET len = strlen( text )\n upper = to_upper( text ) IN\n WHEN len > 100 AND upper CS 'ERROR' THEN 'Critical'\n WHEN len > 50 THEN 'Warning'\n ELSE 'Info' ).\n\n\" In VALUE\nDATA(items) = VALUE itab_type(\n LET base_id = 100 IN\n ( id = base_id + 1 name = 'First' )\n ( id = base_id + 2 name = 'Second' ) ).\n```\n\n---\n\n## ALPHA Conversion\n\n```abap\n\" In string templates\n\" Add leading zeros\nDATA(with_zeros) = |{ '1234' ALPHA = IN WIDTH = 10 }|. \" 0000001234\n\n\" Remove leading zeros\nDATA(no_zeros) = |{ '00001234' ALPHA = OUT }|. \" 1234\n```\n\n---\n\n## Best Practices\n\n1. **Use VALUE #( )** with type inference when target type is clear\n2. **Use OPTIONAL/DEFAULT** for safe table access\n3. **Prefer CORRESPONDING** over manual field-by-field copy\n4. **Use REDUCE** for functional aggregation\n5. **Use FILTER** for table filtering (with secondary keys when possible)\n6. **LET expressions** improve readability for complex conditions\n7. **NEW** for object creation, **REF #( )** for references to existing data\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":9959,"content_sha256":"d8da85b8e38b972177a475f61dc43dc0ce3f3e1bbd77d8be0b69ed043b27c43a"},{"filename":"references/date-time.md","content":"# Date and Time Processing - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/23_Date_and_Time.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/23_Date_and_Time.md)\n\n> **Version Note**: The `utclong` type and its associated functions (`utclong_current()`,\n> `utclong_add()`, `utclong_diff()`) require **7.54+**. On earlier releases, use\n> `TIMESTAMP`/`TIMESTAMPL` types with `GET TIME STAMP` and `cl_abap_tstmp` methods.\n> Types `d` and `t` and their operations are available in all releases.\n\n---\n\n## Core Data Types\n\n### Type d (Date)\n\n8-character date in `yyyymmdd` format.\n\n```abap\nDATA date TYPE d VALUE '20240101'.\nDATA(date2) = CONV d( '20240202' ).\n\n\" Character-like access\nDATA(year) = substring( val = date off = 0 len = 4 ).\nDATA(month) = date+4(2).\nDATA(day) = date+6(2).\n\n\" Modify components\ndate+4(2) = '10'. \" Change month to October\n```\n\n### Type t (Time)\n\n6-character time in `hhmmss` format (24-hour clock).\n\n```abap\nDATA time TYPE t VALUE '123456'.\nDATA(hour) = time+0(2). \" 12\nDATA(minute) = time+2(2). \" 34\nDATA(second) = time+4(2). \" 56\n```\n\n### Type utclong (UTC Timestamp)\n\nModern 8-byte UTC timestamp with 100 nanosecond precision. **Recommended for ABAP Cloud**.\n\n```abap\nDATA ts TYPE utclong VALUE '2024-01-01 15:30:00'.\nDATA(current_ts) = utclong_current( ).\n```\n\n### Legacy Packed Timestamps\n\n```abap\nDATA ts_short TYPE timestamp. \" yyyymmddhhmmss\nDATA ts_long TYPE timestampl. \" yyyymmddhhmmss.sssssss\nGET TIME STAMP FIELD ts_short.\n```\n\n---\n\n## Retrieving Current Values\n\n### ABAP Cloud Compatible\n\n```abap\n\" Current date (UTC)\nDATA(utc_date) = cl_abap_context_info=>get_system_date( ).\n\n\" Current time (UTC)\nDATA(utc_time) = cl_abap_context_info=>get_system_time( ).\n\n\" Current timestamp\nDATA(ts) = utclong_current( ).\n```\n\n### Using XCO Library\n\n```abap\n\" Date with formatting\nDATA(xco_date) = xco_cp=>sy->date( )->as( xco_cp_time=>format->iso_8601_extended )->value.\n\n\" Time with formatting\nDATA(xco_time) = xco_cp=>sy->time( )->as( xco_cp_time=>format->iso_8601_basic )->value.\n```\n\n---\n\n## Date Calculations\n\n### Basic Arithmetic\n\n```abap\nDATA date1 TYPE d VALUE '20240101'.\nDATA date2 TYPE d VALUE '20231227'.\n\n\" Difference in days\nDATA(days_diff) = date1 - date2. \" Result: 5\n\n\" Add days\ndate1 = date1 + 30.\n```\n\n### XCO Date Operations\n\n```abap\n\" Add to current date\nDATA(future_date) = xco_cp=>sy->date( )->add(\n iv_day = 5\n iv_month = 1\n iv_year = 0\n)->as( xco_cp_time=>format->iso_8601_extended )->value.\n\n\" Subtract from current date\nDATA(past_date) = xco_cp=>sy->date( )->subtract(\n iv_day = 1\n iv_month = 1\n iv_year = 1\n)->as( xco_cp_time=>format->iso_8601_extended )->value.\n\n\" Create specific date\nDATA(specific) = xco_cp_time=>date(\n iv_year = 2024\n iv_month = 3\n iv_day = 15\n).\n```\n\n---\n\n## Time Calculations\n\n### Basic Arithmetic\n\n```abap\nDATA time1 TYPE t VALUE '210000'.\nDATA time2 TYPE t VALUE '040000'.\n\n\" Difference in seconds\nDATA(time_diff) = time2 - time1.\n```\n\n### XCO Time Operations\n\n```abap\nDATA(time_plus) = xco_cp=>sy->time( )->add(\n iv_hour = 1\n iv_minute = 30\n iv_second = 0\n)->as( xco_cp_time=>format->iso_8601_extended )->value.\n```\n\n---\n\n## UTC Timestamp Operations\n\n### Arithmetic with Built-in Functions\n\n```abap\nDATA ts TYPE utclong VALUE '2024-01-01 15:30:00'.\n\n\" Add time components\nDATA(ts_add) = utclong_add( val = ts hours = 1 ).\nDATA(ts_sub) = utclong_add( val = ts hours = -2 ).\nDATA(ts_complex) = utclong_add(\n val = ts\n days = 1\n hours = 2\n minutes = 13\n seconds = 53.12\n).\n```\n\n### Calculating Differences\n\n```abap\n\" Get difference in seconds (decfloat34)\nDATA(diff_seconds) = utclong_diff( high = ts_high low = ts_low ).\n\n\" Get structured difference\ncl_abap_utclong=>diff(\n EXPORTING\n high = ts_high\n low = ts_low\n IMPORTING\n days = DATA(d)\n hours = DATA(h)\n minutes = DATA(m)\n seconds = DATA(s)\n).\n```\n\n### XCO Timestamp Operations\n\n```abap\nDATA(ts_ref) = xco_cp_time=>moment(\n iv_year = '2024'\n iv_month = '01'\n iv_day = '01'\n iv_hour = '12'\n iv_minute = '00'\n iv_second = '00'\n).\n\nDATA(ts_add) = ts_ref->add(\n iv_day = 1\n iv_month = 2\n iv_year = 0\n)->as( xco_cp_time=>format->iso_8601_extended )->value.\n\nDATA(ts_sub) = ts_ref->subtract(\n iv_hour = 1\n iv_minute = 30\n iv_second = 0\n)->as( xco_cp_time=>format->iso_8601_extended )->value.\n```\n\n---\n\n## Time Zone Handling\n\n### Get User Time Zone\n\n```abap\nTRY.\n DATA(tz) = cl_abap_context_info=>get_user_time_zone( ).\n CATCH cx_abap_context_info_error.\nENDTRY.\n\n\" XCO approach\nDATA(tz_user) = xco_cp_time=>time_zone->user->value.\nDATA(tz_utc) = xco_cp_time=>time_zone->utc->value.\n```\n\n### Convert Between UTC and Local\n\n```abap\n\" UTC to local date/time\nDATA ts_utc TYPE utclong VALUE '2024-11-03 05:30:00'.\nCONVERT UTCLONG ts_utc\n INTO DATE DATA(date_local)\n TIME DATA(time_local)\n TIME ZONE 'EST'.\n\n\" Local date/time to UTC\nDATA date_local TYPE d VALUE '20240101'.\nDATA time_local TYPE t VALUE '112458'.\nCONVERT DATE date_local\n TIME time_local\n TIME ZONE 'EST'\n INTO UTCLONG DATA(utc_ts).\n```\n\n### Packed Timestamp Conversions\n\n```abap\n\" Timestamp to date/time\nDATA ts_short TYPE timestamp.\nGET TIME STAMP FIELD ts_short.\nCONVERT TIME STAMP ts_short TIME ZONE 'EST'\n INTO DATE DATA(dat) TIME DATA(tim).\n\n\" Date/time to timestamp\nDATA ts_conv TYPE timestamp.\nCONVERT DATE dat TIME tim\n INTO TIME STAMP ts_conv TIME ZONE 'EST'.\n```\n\n---\n\n## CL_ABAP_TSTMP Class\n\n```abap\nGET TIME STAMP FIELD DATA(tsa).\n\n\" Add seconds\nDATA(tsb) = cl_abap_tstmp=>add( tstmp = tsa secs = 3600 ).\n\n\" Convert between types\nDATA(ts_utclong) = cl_abap_tstmp=>tstmp2utclong( tsa ).\nDATA(ts_from_utc) = cl_abap_tstmp=>utclong2tstmp_short( ts_utclong ).\n```\n\n---\n\n## Unix Timestamps\n\n```abap\n\" Get current Unix timestamp\nDATA(unix_ts) = xco_cp=>sy->unix_timestamp( )->value.\n\n\" Create from specific moment\nDATA(unix_custom) = xco_cp_time=>moment(\n iv_year = '2024'\n iv_month = '11'\n iv_day = '03'\n iv_hour = '07'\n iv_minute = '12'\n iv_second = '30'\n)->get_unix_timestamp( )->value.\n\n\" Convert Unix timestamp to utclong\nDATA(ts_from_unix) = utclong_add(\n val = CONV utclong( '1970-01-01 00:00:00' )\n seconds = 1730617950\n).\n```\n\n---\n\n## Date/Time in SQL\n\n```abap\nSELECT SINGLE FROM i_timezone\nFIELDS\n is_valid( @ti ) AS isvalid,\n extract_year( @utc ) AS extr_year,\n extract_month( @da ) AS extr_month,\n extract_day( @utc ) AS extr_day,\n dayname( @da ) AS day_name,\n monthname( @utc ) AS month_name,\n weekday( @utc ) AS week_day,\n days_between( @utc, utclong`2024-02-25 08:14:26` ) AS days_bw,\n add_days( @da, 2 ) AS add_days,\n add_months( @utc, 3 ) AS add_months,\n utcl_current( ) AS utcl_current,\n utcl_add_seconds( @utc, 5 ) AS sec_add_utc\nWHERE TimeZoneID = 'EST'\nINTO @DATA(wa).\n```\n\n---\n\n## String Templates\n\n```abap\n\" Date formatting\nDATA(d_str) = |Date: { cl_abap_context_info=>get_system_date( ) DATE = ISO }|.\n\n\" Time formatting\nDATA(tm_str) = |Time: { cl_abap_context_info=>get_system_time( ) TIME = ISO }|.\n\n\" Timestamp formatting\nDATA(ts_str) = |Timestamp: { utclong_current( ) TIMESTAMP = ISO }|.\n\n\" With timezone\nDATA(tz_str) = |{ utclong_current( ) TIMEZONE = 'EST' COUNTRY = 'US ' }|.\n```\n\n---\n\n## Format Conversions\n\n### Date Format (CL_ABAP_DATFM)\n\n```abap\ncl_abap_datfm=>conv_date_int_to_ext(\n EXPORTING\n im_datint = '20240202'\n im_datfmdes = '6' \" ISO 8601 format\n IMPORTING\n ex_datext = conv_date_str\n).\n```\n\n### Time Format (CL_ABAP_TIMEFM)\n\n```abap\ncl_abap_timefm=>conv_time_int_to_ext(\n EXPORTING\n time_int = '123456'\n format_according_to = cl_abap_timefm=>iso\n IMPORTING\n time_ext = conv_time_str \" Result: 12:34:56\n).\n```\n\n---\n\n## Validation\n\n```abap\nTRY.\n DATA(valid_date) = EXACT d( '20240231' ). \" Feb 31 - invalid\n CATCH cx_sy_conversion_no_date.\n \" Handle invalid date\nENDTRY.\n```\n\n---\n\n## ABAP Cloud Restrictions\n\n**Avoid these system fields in ABAP Cloud:**\n- `sy-datum`, `sy-uzeit`\n- `sy-timlo`, `sy-datlo`\n- Other system-specific temporal fields\n\n**Use instead:**\n- `cl_abap_context_info=>get_system_date( )`\n- `cl_abap_context_info=>get_system_time( )`\n- `utclong_current( )`\n- XCO library methods\n\n**Note**: In SAP BTP ABAP Environment, time zone defaults to UTC.\n\n---\n\n## Best Practices\n\n1. **Use utclong** for modern timestamp handling\n2. **Use XCO library** for fluent date/time APIs\n3. **Validate temporal data** before calculations\n4. **Use CONVERT statements** for timezone conversions\n5. **Avoid sy-datum/sy-uzeit** in ABAP Cloud\n6. **Store timestamps in UTC** and convert for display\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":8533,"content_sha256":"5815b8f58449c94af1fab8cb244c6b932706aa0d4bf35bec1e1ed19a79aa0ee3"},{"filename":"references/design-patterns.md","content":"# OO Design Patterns - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/34_OO_Design_Patterns.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/34_OO_Design_Patterns.md)\n\n---\n\n## Factory Method Pattern\n\nCreates objects through a factory method instead of direct instantiation.\n\n### Interface Definition\n\n```abap\nINTERFACE lif_hello.\n TYPES enum_langu TYPE i.\n CONSTANTS: en TYPE enum_langu VALUE 1,\n fr TYPE enum_langu VALUE 2.\n METHODS say_hello RETURNING VALUE(hi) TYPE string.\nENDINTERFACE.\n```\n\n### Concrete Implementations\n\n```abap\nCLASS lcl_en DEFINITION FINAL CREATE PUBLIC.\n PUBLIC SECTION.\n INTERFACES lif_hello.\nENDCLASS.\n\nCLASS lcl_en IMPLEMENTATION.\n METHOD lif_hello~say_hello.\n hi = `Hi`.\n ENDMETHOD.\nENDCLASS.\n\nCLASS lcl_fr DEFINITION FINAL CREATE PUBLIC.\n PUBLIC SECTION.\n INTERFACES lif_hello.\nENDCLASS.\n\nCLASS lcl_fr IMPLEMENTATION.\n METHOD lif_hello~say_hello.\n hi = `Bonjour`.\n ENDMETHOD.\nENDCLASS.\n```\n\n### Factory Class\n\n```abap\nCLASS lcl_hello_factory DEFINITION FINAL CREATE PRIVATE.\n PUBLIC SECTION.\n CLASS-METHODS create_hello\n IMPORTING language TYPE lif_hello=>enum_langu\n RETURNING VALUE(hello) TYPE REF TO lif_hello.\nENDCLASS.\n\nCLASS lcl_hello_factory IMPLEMENTATION.\n METHOD create_hello.\n hello = SWITCH #( language\n WHEN lif_hello=>en THEN NEW lcl_en( )\n WHEN lif_hello=>fr THEN NEW lcl_fr( )\n ELSE NEW lcl_en( ) ).\n ENDMETHOD.\nENDCLASS.\n```\n\n### Usage\n\n```abap\nDATA(oref_en) = lcl_hello_factory=>create_hello( lif_hello=>en ).\nDATA(hello_en) = oref_en->say_hello( ). \" 'Hi'\n\nDATA(oref_fr) = lcl_hello_factory=>create_hello( lif_hello=>fr ).\nDATA(hello_fr) = oref_fr->say_hello( ). \" 'Bonjour'\n```\n\n---\n\n## Singleton Pattern\n\nEnsures only one instance of a class exists.\n\n```abap\nCLASS zcl_singleton DEFINITION\n PUBLIC FINAL CREATE PRIVATE.\n\n PUBLIC SECTION.\n CLASS-METHODS get_instance\n RETURNING VALUE(ro_instance) TYPE REF TO zcl_singleton.\n\n METHODS do_something.\n\n PRIVATE SECTION.\n CLASS-DATA go_instance TYPE REF TO zcl_singleton.\n DATA mv_data TYPE string.\n\nENDCLASS.\n\nCLASS zcl_singleton IMPLEMENTATION.\n\n METHOD get_instance.\n IF go_instance IS NOT BOUND.\n go_instance = NEW #( ).\n ENDIF.\n ro_instance = go_instance.\n ENDMETHOD.\n\n METHOD do_something.\n \" Implementation\n ENDMETHOD.\n\nENDCLASS.\n```\n\n### Usage\n\n```abap\nDATA(singleton1) = zcl_singleton=>get_instance( ).\nDATA(singleton2) = zcl_singleton=>get_instance( ).\n\" singleton1 and singleton2 reference the same instance\n```\n\n---\n\n## Strategy Pattern\n\nEncapsulates interchangeable algorithms.\n\n### Strategy Interface\n\n```abap\nINTERFACE lif_sort_strategy.\n METHODS sort\n CHANGING ct_data TYPE STANDARD TABLE.\nENDINTERFACE.\n```\n\n### Concrete Strategies\n\n```abap\nCLASS lcl_bubble_sort DEFINITION.\n PUBLIC SECTION.\n INTERFACES lif_sort_strategy.\nENDCLASS.\n\nCLASS lcl_bubble_sort IMPLEMENTATION.\n METHOD lif_sort_strategy~sort.\n \" Bubble sort implementation\n ENDMETHOD.\nENDCLASS.\n\nCLASS lcl_quick_sort DEFINITION.\n PUBLIC SECTION.\n INTERFACES lif_sort_strategy.\nENDCLASS.\n\nCLASS lcl_quick_sort IMPLEMENTATION.\n METHOD lif_sort_strategy~sort.\n \" Quick sort implementation\n ENDMETHOD.\nENDCLASS.\n```\n\n### Context Class\n\n```abap\nCLASS lcl_sorter DEFINITION.\n PUBLIC SECTION.\n METHODS constructor\n IMPORTING io_strategy TYPE REF TO lif_sort_strategy.\n\n METHODS set_strategy\n IMPORTING io_strategy TYPE REF TO lif_sort_strategy.\n\n METHODS execute_sort\n CHANGING ct_data TYPE STANDARD TABLE.\n\n PRIVATE SECTION.\n DATA mo_strategy TYPE REF TO lif_sort_strategy.\nENDCLASS.\n\nCLASS lcl_sorter IMPLEMENTATION.\n METHOD constructor.\n mo_strategy = io_strategy.\n ENDMETHOD.\n\n METHOD set_strategy.\n mo_strategy = io_strategy.\n ENDMETHOD.\n\n METHOD execute_sort.\n mo_strategy->sort( CHANGING ct_data = ct_data ).\n ENDMETHOD.\nENDCLASS.\n```\n\n### Usage\n\n```abap\nDATA(sorter) = NEW lcl_sorter( NEW lcl_bubble_sort( ) ).\nsorter->execute_sort( CHANGING ct_data = my_table ).\n\n\" Switch strategy at runtime\nsorter->set_strategy( NEW lcl_quick_sort( ) ).\nsorter->execute_sort( CHANGING ct_data = my_table ).\n```\n\n---\n\n## Template Method Pattern\n\nDefines algorithm skeleton, subclasses customize steps.\n\n### Abstract Base Class\n\n```abap\nCLASS lcl_data_processor DEFINITION ABSTRACT.\n PUBLIC SECTION.\n METHODS process FINAL. \" Template method\n\n PROTECTED SECTION.\n METHODS: load_data ABSTRACT,\n validate_data ABSTRACT,\n transform_data ABSTRACT,\n save_data ABSTRACT.\nENDCLASS.\n\nCLASS lcl_data_processor IMPLEMENTATION.\n METHOD process.\n \" Template method defines the algorithm structure\n load_data( ).\n validate_data( ).\n transform_data( ).\n save_data( ).\n ENDMETHOD.\nENDCLASS.\n```\n\n### Concrete Implementation\n\n```abap\nCLASS lcl_csv_processor DEFINITION\n INHERITING FROM lcl_data_processor.\n\n PROTECTED SECTION.\n METHODS: load_data REDEFINITION,\n validate_data REDEFINITION,\n transform_data REDEFINITION,\n save_data REDEFINITION.\nENDCLASS.\n\nCLASS lcl_csv_processor IMPLEMENTATION.\n METHOD load_data.\n \" Load CSV-specific data\n ENDMETHOD.\n\n METHOD validate_data.\n \" CSV-specific validation\n ENDMETHOD.\n\n METHOD transform_data.\n \" CSV-specific transformation\n ENDMETHOD.\n\n METHOD save_data.\n \" CSV-specific save\n ENDMETHOD.\nENDCLASS.\n```\n\n---\n\n## Pattern Comparison\n\n| Pattern | Purpose | Key Mechanism |\n|---------|---------|---------------|\n| **Factory Method** | Object creation abstraction | Factory method returns interface |\n| **Singleton** | Single instance guarantee | Private constructor, static accessor |\n| **Strategy** | Interchangeable algorithms | Runtime strategy selection |\n| **Template Method** | Algorithm skeleton | Abstract methods for steps |\n\n---\n\n## Best Practices\n\n1. **Factory Method**: Use for complex object creation, multiple implementations\n2. **Singleton**: Use sparingly, consider dependency injection\n3. **Strategy**: Prefer over switch/case for behavior selection\n4. **Template Method**: Use for algorithms with variable steps\n5. **Program to interfaces** for flexibility\n6. **Favor composition** over inheritance where appropriate\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":6281,"content_sha256":"f742dcf4f9e7e5fd9c76baf020fc081d39512c0ce7d964d22cdf736fa8d71f75"},{"filename":"references/dynamic-programming.md","content":"# ABAP Dynamic Programming - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/06_Dynamic_Programming.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/06_Dynamic_Programming.md)\n\n---\n\n## Field Symbols\n\n### Declaration and Assignment\n\n```abap\n\" Typed field symbol\nFIELD-SYMBOLS \u003cfs> TYPE string.\nASSIGN text TO \u003cfs>.\n\n\" Generic field symbols\nFIELD-SYMBOLS \u003cany> TYPE any.\nFIELD-SYMBOLS \u003cdata> TYPE data.\nFIELD-SYMBOLS \u003ctable> TYPE ANY TABLE.\nFIELD-SYMBOLS \u003cstruct> TYPE any.\n\n\" Inline declaration\nASSIGN text TO FIELD-SYMBOL(\u003cinline_fs>).\n```\n\n### Static Assignment\n\n```abap\n\" Assign data object\nFIELD-SYMBOLS \u003cfs> TYPE i.\nDATA num TYPE i VALUE 100.\nASSIGN num TO \u003cfs>.\n\u003cfs> = 200. \" Modifies num\n\n\" Assign structure component\nFIELD-SYMBOLS \u003ccomp> TYPE any.\nASSIGN struc-field TO \u003ccomp>.\n\n\" Assign internal table line\nLOOP AT itab ASSIGNING FIELD-SYMBOL(\u003cline>).\n \u003cline>-field = 'modified'.\nENDLOOP.\n\nREAD TABLE itab ASSIGNING \u003cline> INDEX 1.\n```\n\n### Dynamic Assignment\n\n```abap\n\" Dynamic component access\nDATA(comp_name) = 'FIELD1'.\nASSIGN struc-(comp_name) TO FIELD-SYMBOL(\u003cdynamic>).\n\n\" Fully dynamic\nDATA: obj_name TYPE string VALUE 'STRUC',\n fld_name TYPE string VALUE 'FIELD1'.\nASSIGN (obj_name)-(fld_name) TO \u003cdynamic>.\n\n\" Dynamic table field\nLOOP AT itab ASSIGNING \u003cline>.\n ASSIGN COMPONENT comp_name OF STRUCTURE \u003cline> TO FIELD-SYMBOL(\u003cvalue>).\n IF sy-subrc = 0.\n \" Component found\n ENDIF.\nENDLOOP.\n\n\" By index\nASSIGN COMPONENT 3 OF STRUCTURE struc TO \u003ccomp>.\n```\n\n### Checking Assignment\n\n```abap\nIF \u003cfs> IS ASSIGNED.\n \" Field symbol points to data\nENDIF.\n\nIF \u003cfs> IS NOT ASSIGNED.\n \" Not assigned\nENDIF.\n\n\" Unassign\nUNASSIGN \u003cfs>.\n```\n\n### Casting\n\n```abap\n\" Cast to specific type\nASSIGN dref->* TO \u003cfs> CASTING TYPE string.\n\n\" Cast with type object\nDATA(type) = cl_abap_typedescr=>describe_by_name( 'STRING' ).\nASSIGN dref->* TO \u003cfs> CASTING TYPE HANDLE type.\n```\n\n---\n\n## Data References\n\n### Declaration and Creation\n\n```abap\n\" Typed reference\nDATA dref TYPE REF TO string.\n\n\" Generic reference\nDATA dref TYPE REF TO data.\n\n\" REF operator\nDATA text TYPE string VALUE 'hello'.\ndref = REF #( text ).\n\n\" NEW operator\ndref = NEW string( 'created' ).\ndref = NEW i( 42 ).\n\n\" CREATE DATA\nCREATE DATA dref TYPE string.\nCREATE DATA dref TYPE TABLE OF string.\nCREATE DATA dref TYPE zdemo_struc.\n\n\" Dynamic type\nCREATE DATA dref TYPE (type_name).\nCREATE DATA dref TYPE TABLE OF (type_name).\n```\n\n### Dereferencing\n\n```abap\n\" Direct access\nDATA(value) = dref->*.\n\n\" Modification\ndref->* = 'new value'.\n\n\" With field symbol\nASSIGN dref->* TO FIELD-SYMBOL(\u003cfs>).\n\u003cfs> = 'modified'.\n\n\" Component access (structures)\nDATA(comp_value) = dref->*-component.\ndref->*-component = 'value'.\n```\n\n### Checking References\n\n```abap\nIF dref IS BOUND.\n \" Reference points to data\nENDIF.\n\nIF dref IS NOT BOUND.\n \" Reference is initial\nENDIF.\n\nIF dref IS INITIAL.\n \" Same as NOT BOUND\nENDIF.\n\n\" Clear reference\nCLEAR dref.\nFREE dref.\n```\n\n---\n\n## RTTI (Run-Time Type Information)\n\n### Type Description Classes\n\n```abap\n\" Get type descriptor\nDATA(tdo) = cl_abap_typedescr=>describe_by_data( data_object ).\nDATA(tdo) = cl_abap_typedescr=>describe_by_name( 'ZDEMO_STRUC' ).\nDATA(tdo) = cl_abap_typedescr=>describe_by_data_ref( dref ).\nDATA(tdo) = cl_abap_typedescr=>describe_by_object_ref( oref ).\n\n\" Type kind\nDATA(kind) = tdo->kind.\n\" C = Class, E = Elementary, S = Structure, T = Table\n\n\" Type name\nDATA(name) = tdo->get_relative_name( ).\nDATA(abs_name) = tdo->absolute_name.\n```\n\n### Elementary Types (CL_ABAP_ELEMDESCR)\n\n```abap\nDATA(elem) = CAST cl_abap_elemdescr(\n cl_abap_typedescr=>describe_by_data( some_var ) ).\n\nDATA(type_kind) = elem->type_kind. \" I, C, N, D, T, STRING, etc.\nDATA(length) = elem->length.\nDATA(decimals) = elem->decimals.\nDATA(output_length) = elem->output_length.\n```\n\n### Structure Types (CL_ABAP_STRUCTDESCR)\n\n```abap\nDATA(struct_desc) = CAST cl_abap_structdescr(\n cl_abap_typedescr=>describe_by_data( some_struct ) ).\n\n\" Get components\nDATA(components) = struct_desc->components.\n\" Returns: name, type_kind, length, decimals, etc.\n\n\" Get component names\nDATA(comp_names) = struct_desc->get_component_names( ).\n\n\" Get component type\nDATA(comp_type) = struct_desc->get_component_type( 'FIELD1' ).\n```\n\n### Table Types (CL_ABAP_TABLEDESCR)\n\n```abap\nDATA(table_desc) = CAST cl_abap_tabledescr(\n cl_abap_typedescr=>describe_by_data( some_itab ) ).\n\nDATA(table_kind) = table_desc->table_kind.\n\" STANDARD, SORTED, HASHED\n\nDATA(line_type) = table_desc->get_table_line_type( ).\nDATA(key_info) = table_desc->get_keys( ).\nDATA(key_components) = table_desc->key.\n```\n\n### Class Types (CL_ABAP_CLASSDESCR)\n\n```abap\nDATA(class_desc) = CAST cl_abap_classdescr(\n cl_abap_typedescr=>describe_by_object_ref( oref ) ).\n\nDATA(class_name) = class_desc->get_relative_name( ).\nDATA(methods) = class_desc->methods.\nDATA(attributes) = class_desc->attributes.\nDATA(interfaces) = class_desc->interfaces.\nDATA(superclass) = class_desc->get_super_class_type( ).\n```\n\n### Interface Types (CL_ABAP_INTFDESCR)\n\n```abap\nDATA(intf_desc) = CAST cl_abap_intfdescr(\n cl_abap_typedescr=>describe_by_name( 'ZIF_MY_INTERFACE' ) ).\n\nDATA(methods) = intf_desc->methods.\nDATA(attributes) = intf_desc->attributes.\n```\n\n---\n\n## RTTC (Run-Time Type Creation)\n\n### Create Elementary Types\n\n```abap\n\" Built-in types\nDATA(string_type) = cl_abap_elemdescr=>get_string( ).\nDATA(int_type) = cl_abap_elemdescr=>get_i( ).\nDATA(char_type) = cl_abap_elemdescr=>get_c( p_length = 10 ).\nDATA(numc_type) = cl_abap_elemdescr=>get_n( p_length = 8 ).\nDATA(packed_type) = cl_abap_elemdescr=>get_p( p_length = 8 p_decimals = 2 ).\n\n\" Create data with type handle\nCREATE DATA dref TYPE HANDLE string_type.\n```\n\n### Create Structure Types\n\n```abap\n\" Define components\nDATA(components) = VALUE cl_abap_structdescr=>component_table(\n ( name = 'ID' type = cl_abap_elemdescr=>get_i( ) )\n ( name = 'NAME' type = cl_abap_elemdescr=>get_string( ) )\n ( name = 'AMOUNT' type = cl_abap_elemdescr=>get_p( p_length = 8 p_decimals = 2 ) ) ).\n\n\" Create structure type\nDATA(struct_type) = cl_abap_structdescr=>create( components ).\n\n\" Create data\nCREATE DATA dref TYPE HANDLE struct_type.\nASSIGN dref->* TO FIELD-SYMBOL(\u003cstruct>).\n\n\" Access components dynamically\nASSIGN COMPONENT 'NAME' OF STRUCTURE \u003cstruct> TO FIELD-SYMBOL(\u003cname>).\n\u003cname> = 'Test'.\n```\n\n### Create Table Types\n\n```abap\n\" From structure type\nDATA(table_type) = cl_abap_tabledescr=>create(\n p_line_type = struct_type\n p_table_kind = cl_abap_tabledescr=>tablekind_std\n p_unique = abap_false ).\n\n\" With key\nDATA(sorted_table) = cl_abap_tabledescr=>create(\n p_line_type = struct_type\n p_table_kind = cl_abap_tabledescr=>tablekind_sorted\n p_unique = abap_true\n p_key = VALUE #( ( name = 'ID' ) ) ).\n\n\" Create table data\nCREATE DATA dref TYPE HANDLE table_type.\nASSIGN dref->* TO FIELD-SYMBOL(\u003ctable>).\n```\n\n---\n\n## Dynamic SQL\n\n```abap\n\" Dynamic table name\nDATA table_name TYPE string VALUE 'ZDEMO_TABLE'.\nSELECT * FROM (table_name) INTO TABLE @DATA(result).\n\n\" Dynamic field list\nDATA field_list TYPE string VALUE 'CARRID, CONNID, FLDATE'.\nSELECT (field_list) FROM zdemo_fli INTO TABLE @DATA(fields).\n\n\" Dynamic WHERE clause\nDATA where_clause TYPE string VALUE `CARRID = 'LH'`.\nSELECT * FROM zdemo_fli WHERE (where_clause) INTO TABLE @DATA(filtered).\n\n\" Dynamic ORDER BY\nDATA order_by TYPE string VALUE 'FLDATE DESCENDING'.\nSELECT * FROM zdemo_fli ORDER BY (order_by) INTO TABLE @DATA(sorted).\n\n\" Fully dynamic\nSELECT (field_list)\n FROM (table_name)\n WHERE (where_clause)\n ORDER BY (order_by)\n INTO TABLE @DATA(dynamic_result).\n```\n\n---\n\n## Dynamic Method Calls\n\n```abap\n\" Dynamic method name\nDATA method_name TYPE string VALUE 'PROCESS'.\nCALL METHOD oref->(method_name).\n\n\" With parameters\nDATA(ptab) = VALUE abap_parmbind_tab(\n ( name = 'IV_INPUT' kind = cl_abap_objectdescr=>exporting value = REF #( input ) )\n ( name = 'RV_RESULT' kind = cl_abap_objectdescr=>returning value = REF #( result ) ) ).\n\nCALL METHOD oref->(method_name) PARAMETER-TABLE ptab.\n\n\" Dynamic class instantiation\nDATA class_name TYPE string VALUE 'ZCL_MY_CLASS'.\nCREATE OBJECT oref TYPE (class_name).\n\n\" With constructor parameters\nDATA(ctab) = VALUE abap_parmbind_tab(\n ( name = 'IV_PARAM' kind = cl_abap_objectdescr=>exporting value = REF #( param ) ) ).\n\nCREATE OBJECT oref TYPE (class_name) PARAMETER-TABLE ctab.\n```\n\n---\n\n## Dynamic Function Calls\n\n```abap\nDATA func_name TYPE string VALUE 'Z_MY_FUNCTION'.\n\nDATA(ptab) = VALUE abap_func_parmbind_tab(\n ( name = 'IV_INPUT' kind = abap_func_exporting value = REF #( input ) )\n ( name = 'EV_OUTPUT' kind = abap_func_importing value = REF #( output ) )\n ( name = 'CT_TABLE' kind = abap_func_tables value = REF #( table ) ) ).\n\nDATA(etab) = VALUE abap_func_excpbind_tab(\n ( name = 'NOT_FOUND' value = 1 )\n ( name = 'OTHERS' value = 99 ) ).\n\nCALL FUNCTION func_name\n PARAMETER-TABLE ptab\n EXCEPTION-TABLE etab.\n\nIF sy-subrc \u003c> 0.\n \" Handle exception\nENDIF.\n```\n\n---\n\n## Generic Types Reference\n\n| Type | Description |\n|------|-------------|\n| `any` | Any data type |\n| `data` | Any non-generic data type |\n| `any table` | Any internal table |\n| `standard table` | Standard table |\n| `sorted table` | Sorted table |\n| `hashed table` | Hashed table |\n| `index table` | Standard or sorted table |\n| `clike` | Character-like types |\n| `csequence` | Character sequence (c, string) |\n| `numeric` | Numeric types |\n| `xsequence` | Byte sequence (x, xstring) |\n| `simple` | Elementary non-deep types |\n| `decfloat` | Decimal floating point |\n\n---\n\n## Best Practices\n\n1. **Check assignments** before using field symbols\n2. **Check references** before dereferencing\n3. **Use RTTI** for type inspection\n4. **Use RTTC** for dynamic type creation\n5. **Handle sy-subrc** after dynamic operations\n6. **Validate dynamic names** to prevent injection\n7. **Prefer static typing** when possible for performance\n8. **Document dynamic code** thoroughly\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":9960,"content_sha256":"053dd6311d850d5bca3932d80dfbdeca100764d50851db7d88df093395570853"},{"filename":"references/exceptions.md","content":"# ABAP Exception Handling - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/27_Exceptions.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/27_Exceptions.md)\n\n---\n\n## Exception Class Hierarchy\n\nAll exception classes inherit from one of three abstract superclasses, all derived from `CX_ROOT`:\n\n### CX_STATIC_CHECK\n- Must be handled locally or declared in procedure interface\n- Compile-time static checks enforce handling\n- Example: `CX_UUID_ERROR`\n\n```abap\n\" Declaration in method signature\nMETHODS get_uuid\n RETURNING VALUE(uuid) TYPE sysuuid_x16\n RAISING cx_uuid_error.\n\n\" Calling code must handle\nTRY.\n DATA(uuid) = get_uuid( ).\n CATCH cx_uuid_error.\n \" Handle exception\nENDTRY.\n```\n\n### CX_DYNAMIC_CHECK\n- For exceptions preventable through preconditions\n- No compile-time enforcement\n- Runtime checks only when exception is raised\n- Example: `CX_SY_ZERODIVIDE`\n\n```abap\n\" Declaration (optional but recommended)\nMETHODS divide\n IMPORTING num1 TYPE i num2 TYPE i\n RETURNING VALUE(result) TYPE decfloat34\n RAISING cx_sy_zerodivide.\n```\n\n### CX_NO_CHECK\n- For errors that can occur anytime\n- Always implicitly declared in all interfaces\n- Cannot be prevented by checks\n- Example: Memory shortage\n\n---\n\n## Exception Class Components\n\n### Inherited Methods (from CX_ROOT)\n\n```abap\n\" Get exception text\nDATA(text) = exception->get_text( ).\n\n\" Get source position\nexception->get_source_position(\n IMPORTING\n program_name = DATA(program)\n include_name = DATA(include)\n source_line = DATA(line) ).\n```\n\n### Common Attributes\n\n- `textid`: Key for exception text in T100 table\n- `previous`: Reference to previous exception (chaining)\n- `is_resumable`: Flag for resumable exceptions\n\n---\n\n## TRY-CATCH Structure\n\n### Basic Syntax\n\n```abap\nTRY.\n \" Risky code\n DATA(result) = 1 / 0.\n CATCH cx_sy_zerodivide.\n \" Handle division by zero\nENDTRY.\n```\n\n### Multiple Exception Types\n\n```abap\nTRY.\n \" Code that might raise various exceptions\n CATCH cx_sy_zerodivide cx_sy_arithmetic_overflow.\n \" Handle arithmetic errors\n CATCH cx_sy_conversion_error.\n \" Handle conversion errors\n CATCH cx_root.\n \" Handle any exception\nENDTRY.\n```\n\n### CATCH INTO (Get Exception Object)\n\n```abap\nTRY.\n DATA(line) = itab[ 999 ].\n CATCH cx_sy_itab_line_not_found INTO DATA(exc).\n DATA(msg) = exc->get_text( ).\n exc->get_source_position(\n IMPORTING\n program_name = DATA(prog)\n source_line = DATA(line_no) ).\nENDTRY.\n```\n\n### Exception Hierarchy\n\n```abap\n\" Use parent class to catch multiple child exceptions\nTRY.\n DATA(result) = 1 / 0.\n CATCH cx_sy_arithmetic_error.\n \" Catches both CX_SY_ZERODIVIDE and CX_SY_ARITHMETIC_OVERFLOW\nENDTRY.\n```\n\n---\n\n## Raising Exceptions\n\n### RAISE EXCEPTION TYPE\n\n```abap\nRAISE EXCEPTION TYPE cx_sy_zerodivide.\n```\n\n### With Exception Object\n\n```abap\nDATA(exc) = NEW cx_sy_zerodivide( ).\nRAISE EXCEPTION exc.\n\n\" Inline\nRAISE EXCEPTION NEW cx_sy_zerodivide( ).\n```\n\n### With Parameters\n\n```abap\nRAISE EXCEPTION TYPE zcx_my_error\n EXPORTING\n textid = zcx_my_error=>specific_error\n param1 = 'value1'\n param2 = 'value2'.\n```\n\n### In COND/SWITCH\n\n```abap\nDATA(result) = COND string(\n WHEN valid THEN process( )\n ELSE THROW zcx_validation_error( ) ).\n\nDATA(value) = SWITCH #( code\n WHEN 1 THEN 'A'\n WHEN 2 THEN 'B'\n ELSE THROW zcx_invalid_code( ) ).\n```\n\n---\n\n## CLEANUP Block\n\nExecutes when exception raised but handled externally:\n\n```abap\nTRY.\n TRY.\n \" Inner TRY\n process_data( ).\n CATCH cx_sy_zerodivide.\n \" Handle locally\n CLEANUP.\n \" Cleanup when exception propagates out\n cleanup_resources( ).\n ENDTRY.\n CATCH cx_sy_itab_line_not_found.\n \" Handle external exception\nENDTRY.\n```\n\n### CLEANUP INTO\n\n```abap\nCLEANUP INTO DATA(cleanup_exc).\n DATA(exc_class) = cl_abap_classdescr=>get_class_name( cleanup_exc ).\n \" Perform cleanup based on exception type\n```\n\n---\n\n## RETRY Statement\n\nExits CATCH block and restarts TRY block:\n\n```abap\nDATA retry_count TYPE i.\nTRY.\n result = risky_operation( ).\n CATCH cx_sy_zerodivide.\n retry_count += 1.\n IF retry_count \u003c 3.\n RETRY. \" Restart TRY block\n ENDIF.\nENDTRY.\n```\n\n---\n\n## Resumable Exceptions\n\n### Declaration\n\n```abap\nMETHODS process\n RAISING RESUMABLE(zcx_my_resumable_error).\n```\n\n### Raising Resumable\n\n```abap\nMETHOD process.\n IF error_condition.\n RAISE RESUMABLE EXCEPTION TYPE zcx_my_resumable_error.\n \" Execution continues here if RESUME called\n result = fallback_value.\n ENDIF.\nENDMETHOD.\n```\n\n### CATCH BEFORE UNWIND\n\n```abap\nTRY.\n process( ).\n CATCH BEFORE UNWIND zcx_my_resumable_error INTO DATA(exc).\n IF exc->is_resumable = abap_true.\n log_warning( exc->get_text( ) ).\n RESUME. \" Continue after RAISE statement\n ENDIF.\nENDTRY.\n```\n\n### In COND/SWITCH\n\n```abap\nDATA(value) = COND #(\n WHEN condition THEN result\n ELSE THROW RESUMABLE zcx_my_error( ) ).\n```\n\n---\n\n## Exception Chaining (PREVIOUS)\n\n```abap\nTRY.\n TRY.\n RAISE EXCEPTION TYPE cx_sy_zerodivide.\n CATCH cx_sy_zerodivide INTO DATA(inner).\n RAISE EXCEPTION TYPE cx_sy_arithmetic_overflow\n EXPORTING previous = inner.\n ENDTRY.\n CATCH cx_sy_arithmetic_overflow INTO DATA(outer).\n \" Access chain\n DATA(current) = CAST cx_root( outer ).\n WHILE current IS BOUND.\n out->write( current->get_text( ) ).\n current = current->previous.\n ENDWHILE.\nENDTRY.\n```\n\n---\n\n## Using Messages as Exception Texts\n\n### IF_T100_MESSAGE Interface\n\n```abap\n\" Exception class with T100 messages\nCLASS zcx_my_error DEFINITION INHERITING FROM cx_static_check.\n PUBLIC SECTION.\n INTERFACES if_t100_message.\n\n CONSTANTS:\n BEGIN OF error_001,\n msgid TYPE symsgid VALUE 'ZMSG',\n msgno TYPE symsgno VALUE '001',\n attr1 TYPE scx_attrname VALUE '',\n attr2 TYPE scx_attrname VALUE '',\n attr3 TYPE scx_attrname VALUE '',\n attr4 TYPE scx_attrname VALUE '',\n END OF error_001.\nENDCLASS.\n```\n\n### IF_T100_DYN_MSG Interface (Recommended)\n\n> **[7.50+]** `IF_T100_DYN_MSG` and the `MESSAGE` addition to `RAISE EXCEPTION`/`THROW`\n> require ABAP 7.50 or higher. On 7.40, use `IF_T100_MESSAGE` with explicit `textid` instead.\n\n```abap\n\" With MESSAGE addition\nRAISE EXCEPTION TYPE zcx_error\n MESSAGE e002(zmsg).\n\n\" With placeholder values\nRAISE EXCEPTION TYPE zcx_error\n MESSAGE e003(zmsg) WITH 'value1' 'value2'.\n\n\" MESSAGE ID TYPE NUMBER WITH\nRAISE EXCEPTION TYPE zcx_error\n MESSAGE ID 'ZMSG' TYPE 'E' NUMBER '004'\n WITH value1 value2.\n\n\" USING MESSAGE (from sy-msg* fields)\nMESSAGE e005(zmsg) WITH 'param' INTO DATA(msg).\nRAISE EXCEPTION TYPE zcx_error USING MESSAGE.\n```\n\n### In COND/SWITCH\n\n```abap\nDATA(result) = COND #(\n WHEN valid THEN value\n ELSE THROW zcx_error( MESSAGE e001(zmsg) ) ).\n\nDATA(result) = SWITCH #( code\n WHEN 1 THEN 'A'\n ELSE THROW zcx_error(\n MESSAGE ID 'ZMSG' TYPE 'E' NUMBER '002'\n WITH code ) ).\n```\n\n---\n\n## Runtime Errors\n\n### RAISE SHORTDUMP\n\n```abap\n\" Force runtime error\nRAISE SHORTDUMP TYPE cx_sy_zerodivide.\n```\n\n### In COND/SWITCH\n\n```abap\nDATA(result) = COND #(\n WHEN valid THEN value\n ELSE THROW SHORTDUMP zcx_critical_error( ) ).\n```\n\n---\n\n## Assertions\n\n```abap\n\" Assert condition - fails = runtime error ASSERTION_FAILED\nASSERT count > 0.\nASSERT table IS NOT INITIAL.\nASSERT ref IS BOUND.\n```\n\n---\n\n## Common Exception Classes\n\n| Exception | Cause | Prevention |\n|-----------|-------|------------|\n| `CX_SY_ZERODIVIDE` | Division by zero | Check divisor |\n| `CX_SY_ARITHMETIC_OVERFLOW` | Numeric overflow | Use larger type |\n| `CX_SY_ITAB_LINE_NOT_FOUND` | Table line not found | Use OPTIONAL/DEFAULT |\n| `CX_SY_RANGE_OUT_OF_BOUNDS` | Invalid index/offset | Validate bounds |\n| `CX_SY_CONVERSION_NO_NUMBER` | Invalid number string | Validate input |\n| `CX_SY_REF_IS_INITIAL` | Dereference initial ref | Check IS BOUND |\n| `CX_SY_CONVERSION_CODEPAGE` | Character encoding error | Check encoding |\n| `CX_SY_DYN_CALL_ILLEGAL_TYPE` | Wrong parameter type | Check types |\n| `CX_SY_MOVE_CAST_ERROR` | Invalid CAST | Check type compatibility |\n| `CX_UUID_ERROR` | UUID generation failed | Handle appropriately |\n\n---\n\n## RAP Messages (%msg)\n\n```abap\n\" In RAP handler methods\nreported-root = VALUE #( (\n %tky = entity-%tky\n %msg = new_message_with_text(\n severity = if_abap_behv_message=>severity-error\n text = 'Validation failed!' ) ) ).\n\n\" Severity levels\n\" if_abap_behv_message=>severity-error\n\" if_abap_behv_message=>severity-warning\n\" if_abap_behv_message=>severity-information\n\" if_abap_behv_message=>severity-success\n```\n\n---\n\n## Best Practices\n\n1. **Choose appropriate exception category**\n - `CX_STATIC_CHECK`: Must be handled explicitly\n - `CX_DYNAMIC_CHECK`: Preventable errors\n - `CX_NO_CHECK`: System errors\n\n2. **Use specific exception classes** rather than `CX_ROOT`\n\n3. **Include meaningful information** in exception text\n\n4. **Use PREVIOUS** for exception chaining\n\n5. **Custom attributes** should be `READ-ONLY`\n\n6. **Document exceptions** in method signatures\n\n7. **Handle exceptions at appropriate level** - not too early, not too late\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":9166,"content_sha256":"3784d4cacec7909981b67dc091fdc2ee67f988fb7a3a5dbb2418252926623c7d"},{"filename":"references/generative-ai.md","content":"# Generative AI in ABAP - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/30_Generative_AI.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/30_Generative_AI.md)\n\n> **Version Note**: The ABAP AI SDK requires **ABAP Cloud** (SAP BTP ABAP Environment or\n> S/4HANA Cloud). Not available on 7.40 on-premise systems. `FINAL(...)` in examples\n> requires **7.50+** — replace with `DATA(...)` on earlier releases.\n\n---\n\n## Overview\n\nThe ABAP AI SDK enables integration of large language models into ABAP applications through the Intelligent Scenario Lifecycle Management (ISLM) framework.\n\n### Prerequisites\n\n- Administrative setup via ISLM documentation\n- Creation of intelligent scenarios (ABAP repository objects)\n- Definition of LLM and prompt templates\n\n---\n\n## Basic Usage\n\n### Simple Execution\n\n```abap\nTRY.\n FINAL(ai_api) = cl_aic_islm_compl_api_factory=>get(\n )->create_instance( 'ZDEMO_ABAP_INT_SCEN' ).\n\n FINAL(result) = ai_api->execute_for_string( `Tell me a joke.` ).\n FINAL(completion) = result->get_completion( ).\n\n CATCH cx_aic_api_factory cx_aic_completion_api INTO FINAL(error).\n FINAL(error_text) = error->get_text( ).\nENDTRY.\n```\n\n---\n\n## Parameter Configuration\n\n```abap\nFINAL(params) = ai_api->get_parameter_setter( ).\nparams->set_maximum_tokens( 500 ).\nparams->set_temperature( '0.5' ).\n```\n\n---\n\n## Message-Based Prompting\n\n```abap\nFINAL(message_container) = ai_api->create_message_container( ).\n\n\" Set system role\nmessage_container->set_system_role( `You are a professional translator` ).\n\n\" Add user message\nmessage_container->add_user_message( `Can you translate German into English?` ).\n\n\" Execute with messages\nFINAL(llm_answer) = ai_api->execute_for_messages( message_container\n )->get_completion( ).\n```\n\n---\n\n## Prompt Templates\n\n```abap\nFINAL(prompt_temp) = cl_aic_islm_prompt_tpl_factory=>get(\n )->create_instance(\n islm_scenario = islm_scenario\n template_id = prompt_template ).\n\nFINAL(prompt) = prompt_temp->get_prompt( ).\n```\n\n---\n\n## Result Analytics\n\n```abap\nFINAL(llm_result) = ai_api->execute_for_string( prompt ).\n\n\" Token usage\nFINAL(completion_tokens) = llm_result->get_completion_token_count( ).\nFINAL(prompt_tokens) = llm_result->get_prompt_token_count( ).\n\n\" Runtime\nFINAL(runtime_ms) = llm_result->get_runtime_ms( ).\n\n\" Get completion text\nFINAL(completion) = llm_result->get_completion( ).\n```\n\n---\n\n## Exception Handling\n\n```abap\nTRY.\n \" AI operations\n CATCH cx_aic_api_factory INTO DATA(factory_error).\n \" Factory creation error\n CATCH cx_aic_completion_api INTO DATA(completion_error).\n \" API execution error\n CATCH cx_aic_prompt_template INTO DATA(template_error).\n \" Prompt template error\nENDTRY.\n```\n\n---\n\n## Complete Example\n\n```abap\nCLASS zcl_ai_demo DEFINITION\n PUBLIC FINAL CREATE PUBLIC.\n\n PUBLIC SECTION.\n INTERFACES if_oo_adt_classrun.\nENDCLASS.\n\nCLASS zcl_ai_demo IMPLEMENTATION.\n\n METHOD if_oo_adt_classrun~main.\n TRY.\n \" Create AI API instance\n DATA(ai_api) = cl_aic_islm_compl_api_factory=>get(\n )->create_instance( 'ZDEMO_AI_SCENARIO' ).\n\n \" Configure parameters\n DATA(params) = ai_api->get_parameter_setter( ).\n params->set_maximum_tokens( 1000 ).\n params->set_temperature( '0.7' ).\n\n \" Create message container\n DATA(messages) = ai_api->create_message_container( ).\n messages->set_system_role( `You are a helpful assistant.` ).\n messages->add_user_message( `Explain ABAP in one paragraph.` ).\n\n \" Execute and get result\n DATA(result) = ai_api->execute_for_messages( messages ).\n\n \" Output results\n out->write( result->get_completion( ) ).\n out->write( |Tokens used: { result->get_completion_token_count( ) }| ).\n out->write( |Runtime: { result->get_runtime_ms( ) }ms| ).\n\n CATCH cx_aic_api_factory\n cx_aic_completion_api INTO DATA(error).\n out->write( |Error: { error->get_text( ) }| ).\n ENDTRY.\n ENDMETHOD.\n\nENDCLASS.\n```\n\n---\n\n## Key Classes\n\n| Class | Purpose |\n|-------|---------|\n| `CL_AIC_ISLM_COMPL_API_FACTORY` | Factory for AI API instances |\n| `CL_AIC_ISLM_PROMPT_TPL_FACTORY` | Factory for prompt templates |\n| `CX_AIC_API_FACTORY` | Factory exception |\n| `CX_AIC_COMPLETION_API` | API execution exception |\n| `CX_AIC_PROMPT_TEMPLATE` | Template exception |\n\n---\n\n## Documentation Links\n\n- SAP Help: Joule for Developers, ABAP AI Capabilities\n- SAP Help: Generative AI in ABAP Cloud\n- GitHub: RAP120 - Build SAP Fiori Apps with ABAP Cloud and Joule\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":4580,"content_sha256":"e94c9d7b2afe92b962c06daa827a06648dc76c11b4d7f7585c9399a114e43441"},{"filename":"references/internal-tables.md","content":"# ABAP Internal Tables - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/01_Internal_Tables.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/01_Internal_Tables.md)\n\n## Table of Contents\n\n1. [Table Type Categories](#table-type-categories)\n2. [Declaration Syntax](#declaration-syntax)\n3. [Table Keys](#table-keys)\n4. [Creating and Populating Tables](#creating-and-populating-tables)\n5. [Reading Table Entries](#reading-table-entries)\n6. [Modifying Table Entries](#modifying-table-entries)\n7. [Deleting Table Entries](#deleting-table-entries)\n8. [Looping and Iteration](#looping-and-iteration)\n9. [Sorting Tables](#sorting-tables)\n10. [Table Functions](#table-functions)\n11. [FILTER Expression](#filter-expression)\n12. [Group Processing](#group-processing)\n13. [Secondary Table Keys](#secondary-table-keys)\n14. [Performance Considerations](#performance-considerations)\n\n---\n\n## Table Type Categories\n\n### Standard Tables\n- Index access and key access\n- Non-unique primary key (always)\n- Suitable for sequential processing and when duplicates allowed\n- Default table type\n\n### Sorted Tables\n- Index access and key access\n- Unique or non-unique primary key\n- Automatically sorted by key\n- Binary search for key access (O(log n))\n\n### Hashed Tables\n- Key access only (no index access)\n- Unique primary key required\n- Hash algorithm for constant-time access (O(1))\n- Best for large datasets with unique key access\n\n---\n\n## Declaration Syntax\n\n```abap\n\" Using TYPE TABLE OF\nDATA itab TYPE TABLE OF string WITH EMPTY KEY.\nDATA std_tab TYPE STANDARD TABLE OF zdemo_struc WITH EMPTY KEY.\nDATA sorted_tab TYPE SORTED TABLE OF zdemo_struc WITH UNIQUE KEY id.\nDATA hashed_tab TYPE HASHED TABLE OF zdemo_struc WITH UNIQUE KEY id.\n\n\" With DDIC types\nDATA itab TYPE zdemo_table_type.\n\n\" Inline declarations\nDATA(itab) = VALUE string_table( ( `a` ) ( `b` ) ( `c` ) ).\n\n\" Structured line type\nDATA: BEGIN OF line,\n id TYPE i,\n name TYPE string,\n END OF line.\nDATA itab TYPE TABLE OF line WITH EMPTY KEY.\n\n\" Reference to internal table\nDATA itab_ref TYPE REF TO string_table.\nitab_ref = REF #( itab ).\n```\n\n---\n\n## Table Keys\n\n### Primary Key\n\n```abap\n\" Empty key (standard tables only)\nDATA itab TYPE TABLE OF struc WITH EMPTY KEY.\n\n\" Single key field\nDATA itab TYPE SORTED TABLE OF struc WITH UNIQUE KEY id.\n\n\" Composite key\nDATA itab TYPE HASHED TABLE OF struc WITH UNIQUE KEY client id.\n\n\" Non-unique key (sorted tables)\nDATA itab TYPE SORTED TABLE OF struc WITH NON-UNIQUE KEY category.\n\n\" Default key (all non-numeric fields)\nDATA itab TYPE TABLE OF struc WITH DEFAULT KEY.\n```\n\n### Secondary Keys\n\n```abap\n\" Sorted secondary key\nDATA itab TYPE TABLE OF struc\n WITH EMPTY KEY\n WITH NON-UNIQUE SORTED KEY by_name COMPONENTS name.\n\n\" Hashed secondary key\nDATA itab TYPE TABLE OF struc\n WITH EMPTY KEY\n WITH UNIQUE HASHED KEY by_id COMPONENTS id.\n\n\" Multiple secondary keys\nDATA itab TYPE SORTED TABLE OF struc\n WITH UNIQUE KEY id\n WITH NON-UNIQUE SORTED KEY by_cat COMPONENTS category\n WITH UNIQUE HASHED KEY by_code COMPONENTS code.\n\n\" Using secondary keys\nREAD TABLE itab WITH KEY by_name COMPONENTS name = 'Test' INTO wa.\nLOOP AT itab USING KEY by_cat WHERE category = 'A'.\n ...\nENDLOOP.\n```\n\n---\n\n## Creating and Populating Tables\n\n### VALUE Operator\n\n```abap\n\" Simple values\nDATA(itab) = VALUE string_table( ( `one` ) ( `two` ) ( `three` ) ).\n\n\" Structured entries\nDATA(itab) = VALUE itab_type(\n ( id = 1 name = `First` )\n ( id = 2 name = `Second` )\n ( id = 3 name = `Third` ) ).\n\n\" BASE - append to existing\nitab = VALUE #( BASE itab ( id = 4 name = `Fourth` ) ).\n\n\" LINES OF - copy from other tables\nitab = VALUE #( BASE itab ( LINES OF other_itab ) ).\n\n\" FOR iterations\nDATA(itab) = VALUE itab_type(\n FOR i = 1 UNTIL i > 10\n ( id = i name = |Entry { i }| ) ).\n\n\" FOR with source table\nDATA(new_tab) = VALUE target_type(\n FOR wa IN source_tab\n ( id = wa-key text = wa-description ) ).\n\n\" FOR with WHERE\nDATA(filtered) = VALUE itab_type(\n FOR wa IN source WHERE ( status = 'A' )\n ( wa ) ).\n```\n\n### APPEND and INSERT\n\n```abap\n\" APPEND - add to end\nAPPEND VALUE #( id = 1 ) TO itab.\nAPPEND wa TO itab.\nAPPEND INITIAL LINE TO itab.\nAPPEND INITIAL LINE TO itab ASSIGNING FIELD-SYMBOL(\u003cnew>).\nAPPEND LINES OF source_itab TO itab.\nAPPEND LINES OF source FROM 5 TO 10 TO itab.\n\n\" INSERT - position-specific or key-based\nINSERT wa INTO itab INDEX 1.\nINSERT wa INTO TABLE itab. \" Key-based for sorted/hashed\nINSERT LINES OF source INTO itab INDEX 3.\nINSERT LINES OF source INTO TABLE itab.\n```\n\n### CORRESPONDING Operator\n\n```abap\n\" Basic mapping\ntarget = CORRESPONDING #( source ).\n\n\" With BASE\ntarget = CORRESPONDING #( BASE ( target ) source ).\n\n\" Field mapping\ntarget = CORRESPONDING #( source MAPPING\n target_field = source_field\n other_field = another_field ).\n\n\" EXCEPT - exclude fields\ntarget = CORRESPONDING #( source EXCEPT field1 field2 ).\n\n\" DEEP - handle nested structures\ntarget = CORRESPONDING #( DEEP source ).\n\n\" DISCARDING DUPLICATES\nitab = CORRESPONDING #( source DISCARDING DUPLICATES ).\n```\n\n---\n\n## Reading Table Entries\n\n### Table Expressions (Recommended)\n\n```abap\n\" By index\nDATA(line) = itab[ 1 ].\nDATA(line) = itab[ lines( itab ) ]. \" Last line\n\n\" By key\nDATA(line) = itab[ id = 1 ].\nDATA(line) = itab[ id = 1 name = 'Test' ].\n\n\" Using secondary key\nDATA(line) = itab[ KEY by_name name = 'Test' ].\n\n\" Safe access with OPTIONAL (returns initial if not found)\nDATA(line) = VALUE #( itab[ id = 999 ] OPTIONAL ).\n\n\" Safe access with DEFAULT\nDATA(line) = VALUE #( itab[ id = 999 ] DEFAULT VALUE #( id = 0 ) ).\n\n\" Accessing components\nDATA(name) = itab[ 1 ]-name.\nDATA(count) = itab[ KEY by_id id = 1 ]-count.\n\n\" Check existence\nIF line_exists( itab[ id = 1 ] ).\n ...\nENDIF.\n\n\" Get index\nDATA(idx) = line_index( itab[ name = 'Test' ] ).\n```\n\n### READ TABLE Statement\n\n```abap\n\" Into work area\nREAD TABLE itab INTO wa INDEX 1.\nREAD TABLE itab INTO wa WITH KEY id = 1.\nREAD TABLE itab INTO wa WITH TABLE KEY id = 1.\n\n\" Into field symbol (recommended for modification)\nREAD TABLE itab ASSIGNING FIELD-SYMBOL(\u003cfs>) INDEX 1.\nREAD TABLE itab ASSIGNING \u003cfs> WITH KEY id = 1.\n\n\" Into data reference\nREAD TABLE itab REFERENCE INTO dref INDEX 1.\n\n\" Transporting specific fields\nREAD TABLE itab INTO wa TRANSPORTING name email.\nREAD TABLE itab TRANSPORTING NO FIELDS WITH KEY id = 1.\n\n\" Using secondary key\nREAD TABLE itab USING KEY by_name INTO wa WITH KEY by_name COMPONENTS name = 'Test'.\n\n\" Binary search (standard tables)\nREAD TABLE itab INTO wa WITH KEY name = 'Test' BINARY SEARCH.\n\n\" Check sy-subrc after READ\nIF sy-subrc = 0.\n \" Found at sy-tabix\nELSE.\n \" Not found\nENDIF.\n```\n\n---\n\n## Modifying Table Entries\n\n### Direct Modification\n\n```abap\n\" Modify by index\nitab[ 1 ]-name = 'Updated'.\nitab[ 1 ] = VALUE #( id = 1 name = 'New' ).\n\n\" Modify via field symbol\nREAD TABLE itab ASSIGNING FIELD-SYMBOL(\u003cfs>) INDEX 1.\n\u003cfs>-name = 'Updated'.\n\u003cfs>-count += 1.\n\n\" Modify in LOOP\nLOOP AT itab ASSIGNING FIELD-SYMBOL(\u003cline>).\n \u003cline>-name = to_upper( \u003cline>-name ).\n \u003cline>-updated = abap_true.\nENDLOOP.\n```\n\n### MODIFY Statement\n\n```abap\n\" Modify by index\nMODIFY itab FROM wa INDEX 5.\n\n\" Modify by key (sorted/hashed tables)\nMODIFY TABLE itab FROM wa.\n\n\" Modify transporting specific fields\nMODIFY itab FROM wa INDEX 5 TRANSPORTING name email.\nMODIFY TABLE itab FROM wa TRANSPORTING status.\n\n\" Modify with WHERE\nMODIFY itab FROM VALUE #( status = 'X' )\n TRANSPORTING status WHERE category = 'A'.\n```\n\n---\n\n## Deleting Table Entries\n\n```abap\n\" Delete by index\nDELETE itab INDEX 1.\nDELETE itab FROM 5 TO 10.\n\n\" Delete by key\nDELETE TABLE itab FROM wa.\nDELETE TABLE itab WITH TABLE KEY id = 1.\n\n\" Delete with WHERE\nDELETE itab WHERE status = 'D'.\nDELETE itab WHERE amount \u003c 0 AND category \u003c> 'X'.\n\n\" Delete adjacent duplicates (requires sorted table or prior SORT)\nSORT itab BY name.\nDELETE ADJACENT DUPLICATES FROM itab COMPARING name.\nDELETE ADJACENT DUPLICATES FROM itab COMPARING ALL FIELDS.\n\n\" Clear table\nCLEAR itab.\nFREE itab. \" Also releases memory\n```\n\n---\n\n## Looping and Iteration\n\n### LOOP Statement\n\n```abap\n\" Basic loop\nLOOP AT itab INTO wa.\n \" Process wa\nENDLOOP.\n\n\" With field symbol (recommended)\nLOOP AT itab ASSIGNING FIELD-SYMBOL(\u003cfs>).\n \u003cfs>-counter += 1.\nENDLOOP.\n\n\" With data reference\nLOOP AT itab REFERENCE INTO DATA(dref).\n dref->*-status = 'P'.\nENDLOOP.\n\n\" With WHERE condition\nLOOP AT itab INTO wa WHERE status = 'A'.\n ...\nENDLOOP.\n\n\" Using secondary key\nLOOP AT itab INTO wa USING KEY by_category WHERE category = 'X'.\n ...\nENDLOOP.\n\n\" With FROM/TO\nLOOP AT itab INTO wa FROM 5 TO 10.\n ...\nENDLOOP.\n\n\" Group processing\nLOOP AT itab INTO wa GROUP BY wa-category.\n \" wa is representative line\n LOOP AT GROUP wa INTO DATA(member).\n \" Process each group member\n ENDLOOP.\nENDLOOP.\n\n\" Available sy fields in loop\n\" sy-tabix - current index\n\" sy-index - loop counter (also works for DO/WHILE)\n```\n\n### FOR Expressions\n\n```abap\n\" Transform table\nDATA(new_tab) = VALUE itab_type(\n FOR wa IN itab\n ( id = wa-id name = to_upper( wa-name ) ) ).\n\n\" Filter and transform\nDATA(active) = VALUE itab_type(\n FOR wa IN itab WHERE ( active = abap_true )\n ( id = wa-id status = 'Active' ) ).\n\n\" With INDEX INTO\nDATA(numbered) = VALUE itab_type(\n FOR wa IN itab INDEX INTO idx\n ( line_no = idx content = wa ) ).\n\n\" Nested FOR\nDATA(product) = VALUE itab_type(\n FOR a IN itab_a\n FOR b IN itab_b\n ( a = a b = b result = a * b ) ).\n\n\" REDUCE aggregation\nDATA(sum) = REDUCE i( INIT s = 0\n FOR wa IN itab\n NEXT s = s + wa-amount ).\n\nDATA(max) = REDUCE i( INIT m = 0\n FOR wa IN itab\n NEXT m = COND #( WHEN wa-value > m THEN wa-value ELSE m ) ).\n\nDATA(concat) = REDUCE string( INIT str = ``\n FOR wa IN itab\n NEXT str = str && wa-name && `, ` ).\n```\n\n---\n\n## Sorting Tables\n\n```abap\n\" Sort by field(s)\nSORT itab BY name.\nSORT itab BY category name.\nSORT itab BY amount DESCENDING.\nSORT itab BY name ASCENDING amount DESCENDING.\n\n\" Sort by table key\nSORT itab BY PRIMARY KEY.\n\n\" Stable sort (preserve original order for equal elements)\nSORT itab BY category STABLE.\n\n\" Case-insensitive sort\nSORT itab BY name AS TEXT.\n```\n\n---\n\n## Table Functions\n\n```abap\n\" Count lines\nDATA(count) = lines( itab ).\nDATA(count) = line_count( itab[ id = 1 ] ). \" In expression\n\n\" Check if exists\nIF line_exists( itab[ id = 1 ] ).\n ...\nENDIF.\n\n\" Get index\nDATA(idx) = line_index( itab[ name = 'Test' ] ).\n\n\" Table aggregations (with REDUCE)\nDATA(sum) = REDUCE i( INIT s = 0 FOR wa IN itab NEXT s = s + wa-amount ).\nDATA(min) = REDUCE i( INIT m = 999999 FOR wa IN itab\n NEXT m = COND #( WHEN wa-val \u003c m THEN wa-val ELSE m ) ).\n```\n\n---\n\n## FILTER Expression\n\n```abap\n\" Basic filter\nDATA(filtered) = FILTER #( itab WHERE status = 'A' ).\n\n\" Using secondary key (more efficient)\nDATA(filtered) = FILTER #( itab USING KEY by_status WHERE status = 'A' ).\n\n\" With EXCEPT (exclude matching lines)\nDATA(non_active) = FILTER #( itab EXCEPT WHERE status = 'A' ).\n\n\" Filter with IN condition\nDATA filter_values TYPE SORTED TABLE OF string WITH UNIQUE KEY table_line.\nfilter_values = VALUE #( ( `A` ) ( `B` ) ( `C` ) ).\nDATA(matched) = FILTER #( itab IN filter_values WHERE status = table_line ).\n```\n\n---\n\n## Group Processing\n\n```abap\n\" Group by single field\nLOOP AT itab INTO wa GROUP BY wa-category.\n DATA(group_key) = wa-category.\n LOOP AT GROUP wa INTO DATA(member).\n \" Process group members\n ENDLOOP.\nENDLOOP.\n\n\" Group by multiple fields\nLOOP AT itab INTO wa GROUP BY ( cat = wa-category\n year = wa-year )\n ASCENDING\n ASSIGNING FIELD-SYMBOL(\u003cgrp>).\n \" \u003cgrp> contains group key fields\n LOOP AT GROUP \u003cgrp> ASSIGNING FIELD-SYMBOL(\u003cmember>).\n \" Process member\n ENDLOOP.\nENDLOOP.\n\n\" With aggregation (group size, index)\nLOOP AT itab INTO wa GROUP BY ( category = wa-category\n size = GROUP SIZE\n index = GROUP INDEX )\n ASSIGNING FIELD-SYMBOL(\u003cgrp>).\n \" \u003cgrp>-size contains number of entries in group\n \" \u003cgrp>-index contains group number (1, 2, 3...)\nENDLOOP.\n\n\" Without members (aggregate only)\nLOOP AT itab INTO wa GROUP BY wa-category WITHOUT MEMBERS.\n \" Only process unique group keys\nENDLOOP.\n```\n\n---\n\n## Secondary Table Keys\n\n```abap\n\" Declaration\nTYPES itab_type TYPE TABLE OF struc\n WITH EMPTY KEY\n WITH NON-UNIQUE SORTED KEY by_name COMPONENTS name\n WITH UNIQUE HASHED KEY by_id COMPONENTS id.\n\n\" Using in READ\nREAD TABLE itab WITH KEY by_name COMPONENTS name = 'Test' INTO wa.\nREAD TABLE itab USING KEY by_id INTO wa WITH KEY by_id COMPONENTS id = 1.\n\n\" Using in LOOP\nLOOP AT itab USING KEY by_name WHERE name CS 'test'.\n ...\nENDLOOP.\n\n\" Using in DELETE\nDELETE itab USING KEY by_id WHERE id = 0.\n\n\" Key specification in expressions\nDATA(line) = itab[ KEY by_name name = 'Test' ].\nDATA(idx) = line_index( itab[ KEY by_name name = 'Test' ] ).\n```\n\n---\n\n## Performance Considerations\n\n1. **Choose appropriate table type**\n - Standard: Sequential access, small tables, need index access\n - Sorted: Frequent key access, range queries, need both index and key\n - Hashed: Large tables with unique key access only\n\n2. **Use field symbols** instead of work areas for modification in loops\n\n3. **Use secondary keys** for different access patterns instead of SORT\n\n4. **Avoid dynamic WHERE** in production-critical code\n\n5. **Use FILTER with key** for efficient filtering\n\n6. **For large tables**, prefer hashed/sorted over standard with BINARY SEARCH\n\n7. **DELETE ADJACENT DUPLICATES** requires prior sort or sorted table\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":13599,"content_sha256":"3a83cbcb86b6ed260a83dfee80468235711b80f3c9273e484d66f371b0cbdabf"},{"filename":"references/numeric-operations.md","content":"# Numeric Operations - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/29_Numeric_Operations.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/29_Numeric_Operations.md)\n\n> **Version Note**: The `int8` type requires **7.50+**. `utclong_add()` requires **7.54+**.\n> Use type `i` or `p` for large integers on 7.40. All other numeric operations are\n> available from 7.40+.\n\n---\n\n## Numeric Types\n\n| Type | Description | Range |\n|------|-------------|-------|\n| `i` | 4-byte integer | -2,147,483,648 to 2,147,483,647 |\n| `int8` | 8-byte integer | Extended range |\n| `p` | Packed decimal | 1-16 bytes, up to 14 decimals |\n| `f` | Binary floating point | 17 decimal places |\n| `decfloat16` | Decimal floating point | 16 decimal places |\n| `decfloat34` | Decimal floating point | 34 decimal places |\n\n---\n\n## Arithmetic Operators\n\n```abap\n\" Basic operators\nresult = a + b. \" Addition\nresult = a - b. \" Subtraction\nresult = a * b. \" Multiplication\nresult = a / b. \" Division\n\n\" Special operators\nresult = a DIV b. \" Integer division (positive remainder)\nresult = a MOD b. \" Modulo (positive remainder)\nresult = a ** b. \" Exponentiation\n\n\" Calculation assignments\na += b. \" a = a + b\na -= b. \" a = a - b\na *= b. \" a = a * b\na /= b. \" a = a / b\n```\n\n---\n\n## Numeric Functions\n\n### Rounding and Truncation\n\n```abap\nDATA(abs_val) = abs( -5 ). \" 5\nDATA(sign_val) = sign( -5 ). \" -1\nDATA(ceil_val) = ceil( '1.2' ). \" 2\nDATA(floor_val) = floor( '1.8' ). \" 1\nDATA(trunc_val) = trunc( '1.8' ). \" 1\nDATA(frac_val) = frac( '1.8' ). \" 0.8\nDATA(round_val) = round( val = '1.567' dec = 2 ). \" 1.57\n```\n\n### Exponential and Logarithmic\n\n```abap\nDATA(sqrt_val) = sqrt( 16 ). \" 4.0\nDATA(ipow_val) = ipow( base = 2 exp = 10 ). \" 1024\nDATA(exp_val) = exp( 1 ). \" e\nDATA(log_val) = log( 10 ). \" natural log\nDATA(log10_val) = log10( 100 ). \" 2.0\n```\n\n### Trigonometric\n\n```abap\nDATA(sin_val) = sin( '0.5' ).\nDATA(cos_val) = cos( '0.5' ).\nDATA(tan_val) = tan( '0.5' ).\nDATA(asin_val) = asin( '0.5' ).\nDATA(acos_val) = acos( '0.5' ).\nDATA(atan_val) = atan( '0.5' ).\n```\n\n### Extremum\n\n```abap\nDATA(min_val) = nmin( val1 = 5 val2 = 3 val3 = 7 ). \" 3\nDATA(max_val) = nmax( val1 = 5 val2 = 3 val3 = 7 ). \" 7\n```\n\n---\n\n## Calculation Type Rules\n\nPriority order (highest to lowest):\n1. `decfloat34` → result `decfloat34`\n2. `decfloat16` → result `decfloat16`\n3. `f` → result `f`\n4. `p` → result `p` (length 8, decimals 0)\n5. `int8` → result `int8`\n6. Otherwise → `i`\n\n---\n\n## Lossless Operations (EXACT)\n\n```abap\nTRY.\n DATA(exact_int) = EXACT i( decimal_value ).\n CATCH cx_sy_conversion_rounding.\n \" Precision would be lost\nENDTRY.\n```\n\n---\n\n## Advanced Numeric Classes\n\n### CL_ABAP_BIGINT (Arbitrary Precision)\n\n```abap\nDATA(bigint1) = cl_abap_bigint=>factory_from_int8( 123456789 ).\nDATA(bigint2) = cl_abap_bigint=>factory_from_int8( 987654321 ).\n\nDATA(sum) = bigint1->add( bigint2 ).\nDATA(product) = bigint1->mul( bigint2 ).\nDATA(quotient) = bigint1->div( bigint2 ).\nDATA(power) = bigint1->pow( 10 ).\nDATA(sqrt) = bigint1->sqrt( ).\nDATA(gcd) = bigint1->gcd( bigint2 ).\n```\n\n### CL_ABAP_RATIONAL (Exact Fractions)\n\n```abap\nDATA(rational) = cl_abap_rational=>factory_from_string( '1/3' ).\nDATA(decimal) = rational->get_as_decfloat34( ).\n```\n\n### CL_ABAP_MATH (Constants)\n\n```abap\nDATA(pi) = cl_abap_math=>pi.\nDATA(e) = cl_abap_math=>e.\nDATA(max_int4) = cl_abap_math=>max_int4.\nDATA(min_int4) = cl_abap_math=>min_int4.\n```\n\n### Random Numbers\n\n```abap\n\" Random integer\nDATA(random) = cl_abap_random_int=>create(\n seed = CONV i( sy-uzeit )\n min = 1\n max = 100 ).\nDATA(number) = random->get_next( ).\n\n\" Random float\nDATA(random_f) = cl_abap_random_float=>create( seed = 42 ).\nDATA(float_num) = random_f->get_next( ).\n```\n\n---\n\n## Date/Time Calculations\n\n### Date Arithmetic\n\n```abap\n\" Days between dates\nDATA(days) = date2 - date1.\n\n\" Add days (XCO)\nDATA(tomorrow) = xco_cp=>sy->date( )->add( iv_day = 1 )->value.\nDATA(next_month) = xco_cp=>sy->date( )->add( iv_month = 1 )->value.\n```\n\n### Time Arithmetic\n\n```abap\n\" Seconds between times\nDATA(seconds) = time2 - time1.\n\n\" Extract components\nDATA(hours) = seconds DIV 3600.\nDATA(minutes) = ( seconds MOD 3600 ) DIV 60.\nDATA(secs) = seconds MOD 60.\n```\n\n### Timestamp Operations\n\n```abap\n\" Add to timestamp\nDATA(new_ts) = utclong_add(\n val = timestamp\n days = 1\n hours = 2 ).\n\n\" CL_ABAP_TSTMP\nDATA(ts) = cl_abap_tstmp=>add(\n tstmp = timestamp\n secs = 3600 ).\n```\n\n---\n\n## ABAP SQL Numeric Functions\n\n```abap\nSELECT\n div( amount, 100 ) AS int_div,\n division( amount, 3, 2 ) AS precise_div,\n ceil( value ) AS ceiling,\n floor( value ) AS floored,\n mod( number, 10 ) AS remainder,\n abs( value ) AS absolute,\n round( price, 2 ) AS rounded\nFROM table\nINTO TABLE @result.\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":4867,"content_sha256":"7cde9bf6e9bc195b829b2be4f84d1ae9462ce372a5e36a6d16f5d8d059159d29"},{"filename":"references/object-orientation.md","content":"# ABAP Object Orientation - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/04_ABAP_Object_Orientation.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/04_ABAP_Object_Orientation.md)\n\n> **Version Note**: `IS INSTANCE OF` and `CASE TYPE OF` require **7.50+**. On 7.40, use\n> `CAST` with `cx_sy_move_cast_error` handling or RTTI checks instead. All other\n> OO features (classes, interfaces, inheritance, events, friendship) are available from 7.40.\n\n---\n\n## Class Definition\n\n### Basic Structure\n\n```abap\nCLASS zcl_my_class DEFINITION\n PUBLIC\n FINAL\n CREATE PUBLIC.\n\n PUBLIC SECTION.\n \" Visible to all\n TYPES: ty_data TYPE string.\n CONSTANTS: c_max TYPE i VALUE 100.\n DATA: mv_public TYPE string.\n\n METHODS:\n constructor IMPORTING iv_name TYPE string,\n get_name RETURNING VALUE(rv_name) TYPE string,\n process IMPORTING iv_input TYPE string\n EXPORTING ev_output TYPE string\n CHANGING cv_data TYPE string\n RAISING zcx_my_exception.\n\n CLASS-METHODS:\n factory RETURNING VALUE(ro_instance) TYPE REF TO zcl_my_class.\n\n PROTECTED SECTION.\n \" Visible to class and subclasses\n DATA: mv_protected TYPE string.\n METHODS: internal_process.\n\n PRIVATE SECTION.\n \" Visible only within class\n DATA: mv_private TYPE string.\n METHODS: helper_method.\n\nENDCLASS.\n```\n\n### Class Implementation\n\n```abap\nCLASS zcl_my_class IMPLEMENTATION.\n\n METHOD constructor.\n mv_private = iv_name.\n ENDMETHOD.\n\n METHOD get_name.\n rv_name = mv_private.\n ENDMETHOD.\n\n METHOD process.\n \" Implementation\n ENDMETHOD.\n\n METHOD factory.\n ro_instance = NEW #( 'Default' ).\n ENDMETHOD.\n\n METHOD internal_process.\n \" Protected method\n ENDMETHOD.\n\n METHOD helper_method.\n \" Private method\n ENDMETHOD.\n\nENDCLASS.\n```\n\n---\n\n## Visibility Modifiers\n\n| Modifier | Class | Subclass | External |\n|----------|-------|----------|----------|\n| PUBLIC | Yes | Yes | Yes |\n| PROTECTED | Yes | Yes | No |\n| PRIVATE | Yes | No | No |\n\n---\n\n## CREATE Additions\n\n```abap\nCREATE PUBLIC \" Can be instantiated anywhere\nCREATE PROTECTED \" Only within class and subclasses\nCREATE PRIVATE \" Only within the class itself\n```\n\n---\n\n## Class Types\n\n```abap\n\" Final class - cannot be inherited\nCLASS zcl_final DEFINITION FINAL.\n\n\" Abstract class - cannot be instantiated\nCLASS zcl_abstract DEFINITION ABSTRACT.\n\n\" Abstract method\nCLASS zcl_abstract DEFINITION ABSTRACT.\n PUBLIC SECTION.\n METHODS process ABSTRACT.\nENDCLASS.\n```\n\n---\n\n## Object Instantiation\n\n```abap\n\" CREATE OBJECT\nDATA oref TYPE REF TO zcl_my_class.\nCREATE OBJECT oref EXPORTING iv_name = 'Test'.\n\n\" NEW operator (preferred)\nDATA(oref) = NEW zcl_my_class( iv_name = 'Test' ).\n\n\" Inline with method call\nDATA(result) = NEW zcl_processor( )->process( input ).\n\n\" Factory method\nDATA(instance) = zcl_my_class=>factory( ).\n```\n\n---\n\n## Method Signatures\n\n### Parameter Types\n\n```abap\nMETHODS process\n IMPORTING iv_input TYPE string \" Input (read-only)\n EXPORTING ev_output TYPE string \" Output (cleared first)\n CHANGING cv_data TYPE string \" Input/Output\n RETURNING VALUE(rv_result) TYPE string \" Functional return\n RAISING zcx_my_exception. \" Exceptions\n```\n\n### Optional Parameters\n\n```abap\nMETHODS process\n IMPORTING\n iv_required TYPE string\n iv_optional TYPE string OPTIONAL \" Can be omitted\n iv_default TYPE i DEFAULT 10. \" Has default value\n```\n\n### PREFERRED PARAMETER\n\n```abap\nMETHODS process\n IMPORTING\n iv_first TYPE string\n iv_second TYPE string\n PREFERRED PARAMETER iv_first.\n\n\" Call without parameter name\noref->process( 'value' ). \" Goes to iv_first\n```\n\n---\n\n## Method Calls\n\n```abap\n\" Full syntax\noref->method(\n EXPORTING iv_input = value\n IMPORTING ev_output = result\n CHANGING cv_data = data ).\n\n\" Functional style (for RETURNING methods)\nDATA(result) = oref->get_value( ).\n\n\" Chaining\nDATA(text) = oref->get_processor( )->process( input )->get_result( ).\n\n\" Static method\nDATA(instance) = zcl_factory=>create( ).\nzcl_utility=>helper_method( ).\n```\n\n---\n\n## Inheritance\n\n### Subclass Definition\n\n```abap\nCLASS zcl_child DEFINITION\n INHERITING FROM zcl_parent\n PUBLIC FINAL CREATE PUBLIC.\n\n PUBLIC SECTION.\n METHODS constructor\n IMPORTING iv_name TYPE string.\n\n \" Override parent method\n METHODS process REDEFINITION.\n\n \" New method in child\n METHODS additional_method.\n\nENDCLASS.\n\nCLASS zcl_child IMPLEMENTATION.\n\n METHOD constructor.\n super->constructor( iv_name ).\n \" Additional initialization\n ENDMETHOD.\n\n METHOD process.\n \" Call parent implementation if needed\n super->process( ).\n \" Child-specific logic\n ENDMETHOD.\n\nENDCLASS.\n```\n\n### Abstract Classes\n\n```abap\nCLASS zcl_abstract_base DEFINITION ABSTRACT.\n PUBLIC SECTION.\n METHODS:\n concrete_method,\n abstract_method ABSTRACT.\nENDCLASS.\n\nCLASS zcl_concrete DEFINITION\n INHERITING FROM zcl_abstract_base\n FINAL.\n PUBLIC SECTION.\n METHODS abstract_method REDEFINITION.\nENDCLASS.\n```\n\n---\n\n## Interfaces\n\n### Interface Definition\n\n```abap\nINTERFACE zif_my_interface PUBLIC.\n TYPES: ty_data TYPE string.\n CONSTANTS: c_version TYPE i VALUE 1.\n DATA: mv_value TYPE string.\n\n METHODS:\n process IMPORTING iv_input TYPE string\n RETURNING VALUE(rv_result) TYPE string,\n get_status RETURNING VALUE(rv_status) TYPE string.\n\n CLASS-METHODS:\n factory RETURNING VALUE(ro_instance) TYPE REF TO zif_my_interface.\n\nENDINTERFACE.\n```\n\n### Interface Implementation\n\n```abap\nCLASS zcl_impl DEFINITION PUBLIC FINAL CREATE PUBLIC.\n PUBLIC SECTION.\n INTERFACES zif_my_interface.\n\n \" Alias for convenience\n ALIASES process FOR zif_my_interface~process.\n ALIASES get_status FOR zif_my_interface~get_status.\n\nENDCLASS.\n\nCLASS zcl_impl IMPLEMENTATION.\n\n METHOD zif_my_interface~process.\n rv_result = |Processed: { iv_input }|.\n ENDMETHOD.\n\n METHOD zif_my_interface~get_status.\n rv_status = 'Active'.\n ENDMETHOD.\n\nENDCLASS.\n```\n\n### Interface Reference\n\n```abap\n\" Reference via interface\nDATA intf TYPE REF TO zif_my_interface.\nintf = NEW zcl_impl( ).\nDATA(result) = intf->process( 'input' ).\n\n\" Check interface implementation \" [7.50+] IS INSTANCE OF\nIF oref IS INSTANCE OF zif_my_interface.\n DATA(intf) = CAST zif_my_interface( oref ).\nENDIF.\n\n\" 7.40 alternative using RTTI:\n\" DATA(type) = cl_abap_typedescr=>describe_by_object_ref( oref ).\n\" IF type->is_instance_of( 'ZIF_MY_INTERFACE' ) = abap_true.\n```\n\n### Multiple Interfaces\n\n```abap\nCLASS zcl_multi DEFINITION.\n PUBLIC SECTION.\n INTERFACES: zif_interface_a,\n zif_interface_b.\nENDCLASS.\n```\n\n### Interface Inheritance\n\n```abap\nINTERFACE zif_extended PUBLIC.\n INTERFACES zif_base.\n \" Additional methods\n METHODS extended_method.\nENDINTERFACE.\n```\n\n---\n\n## Polymorphism\n\n```abap\n\" Parent type reference\nDATA parent TYPE REF TO zcl_parent.\n\n\" Can hold child instances\nparent = NEW zcl_child_a( ).\nparent->process( ). \" Calls zcl_child_a~process\n\nparent = NEW zcl_child_b( ).\nparent->process( ). \" Calls zcl_child_b~process\n\n\" Interface polymorphism\nDATA processor TYPE REF TO zif_processor.\nprocessor = NEW zcl_processor_a( ).\nprocessor->process( ).\n\nprocessor = NEW zcl_processor_b( ).\nprocessor->process( ).\n```\n\n---\n\n## Type Checking and Casting\n\n```abap\n\" Check instance type \" [7.50+] IS INSTANCE OF\nIF oref IS INSTANCE OF zcl_specific.\n \" Is of type or subtype\nENDIF.\n\n\" 7.40 alternative: use CAST with error handling\nTRY.\n DATA(specific_old) = CAST zcl_specific( general_ref ).\n \" Cast succeeded - is of type\n CATCH cx_sy_move_cast_error.\n \" Not of type\nENDTRY.\n\n\" Safe casting with CAST\nTRY.\n DATA(specific) = CAST zcl_specific( general_ref ).\n CATCH cx_sy_move_cast_error.\n \" Cast failed\nENDTRY.\n\n\" Casting to interface\nDATA(intf) = CAST zif_my_interface( oref ).\n```\n\n---\n\n## Events\n\n### Event Definition\n\n```abap\nCLASS zcl_publisher DEFINITION.\n PUBLIC SECTION.\n EVENTS: data_changed\n EXPORTING VALUE(ev_old_value) TYPE string\n VALUE(ev_new_value) TYPE string.\n\n METHODS set_data IMPORTING iv_data TYPE string.\nENDCLASS.\n\nCLASS zcl_publisher IMPLEMENTATION.\n METHOD set_data.\n DATA(old) = mv_data.\n mv_data = iv_data.\n RAISE EVENT data_changed\n EXPORTING ev_old_value = old\n ev_new_value = iv_data.\n ENDMETHOD.\nENDCLASS.\n```\n\n### Event Handler\n\n```abap\nCLASS zcl_subscriber DEFINITION.\n PUBLIC SECTION.\n METHODS:\n register_for IMPORTING io_publisher TYPE REF TO zcl_publisher,\n on_data_changed FOR EVENT data_changed OF zcl_publisher\n IMPORTING ev_old_value ev_new_value sender.\nENDCLASS.\n\nCLASS zcl_subscriber IMPLEMENTATION.\n METHOD register_for.\n SET HANDLER on_data_changed FOR io_publisher.\n ENDMETHOD.\n\n METHOD on_data_changed.\n \" Handle event\n ENDMETHOD.\nENDCLASS.\n```\n\n### Event Registration\n\n```abap\nDATA(publisher) = NEW zcl_publisher( ).\nDATA(subscriber) = NEW zcl_subscriber( ).\n\n\" Register handler\nsubscriber->register_for( publisher ).\n\n\" Trigger event\npublisher->set_data( 'new value' ).\n```\n\n---\n\n## Friendship\n\n```abap\nCLASS zcl_friend DEFINITION DEFERRED.\n\nCLASS zcl_private_class DEFINITION\n FRIENDS zcl_friend.\n PRIVATE SECTION.\n DATA mv_secret TYPE string.\nENDCLASS.\n\nCLASS zcl_friend DEFINITION.\n PUBLIC SECTION.\n METHODS access_secret\n IMPORTING io_private TYPE REF TO zcl_private_class\n RETURNING VALUE(rv_secret) TYPE string.\nENDCLASS.\n\nCLASS zcl_friend IMPLEMENTATION.\n METHOD access_secret.\n \" Can access private members\n rv_secret = io_private->mv_secret.\n ENDMETHOD.\nENDCLASS.\n```\n\n---\n\n## Class-Based Exception Handling\n\n```abap\nCLASS zcx_my_exception DEFINITION\n INHERITING FROM cx_static_check\n PUBLIC FINAL CREATE PUBLIC.\n\n PUBLIC SECTION.\n INTERFACES if_t100_message.\n\n METHODS constructor\n IMPORTING\n textid LIKE if_t100_message=>t100key OPTIONAL\n previous LIKE previous OPTIONAL.\n\nENDCLASS.\n```\n\n---\n\n## Best Practices\n\n1. **Prefer composition over inheritance**\n2. **Program to interfaces**, not implementations\n3. **Keep classes focused** (Single Responsibility)\n4. **Use factory methods** for complex instantiation\n5. **Prefer FINAL** unless inheritance is needed\n6. **Use PROTECTED** sparingly\n7. **Document public interfaces**\n8. **Use meaningful names** for classes and methods\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":10454,"content_sha256":"db9a7d96e53f778434c95b815da9040eceff62fa6180898d81cd6f5ff26c127f"},{"filename":"references/performance.md","content":"# ABAP Performance Optimization - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/32_Performance_Notes.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/32_Performance_Notes.md)\n\n---\n\n## Database Access Optimization\n\n### Reduce Result Sets\n\n```abap\n\" Only read necessary data\nSELECT * FROM dbtab\n WHERE status = 'A'\n INTO TABLE @DATA(result).\n\n\" Limit rows\nSELECT * FROM dbtab\n UP TO 100 ROWS\n INTO TABLE @DATA(result).\n\n\" Single row\nSELECT SINGLE * FROM dbtab\n WHERE id = @id\n INTO @DATA(result).\n\n\" Remove duplicates\nSELECT DISTINCT field1, field2\n FROM dbtab\n INTO TABLE @DATA(result).\n```\n\n### Minimize Data Volume\n\n```abap\n\" Select only needed columns (NOT SELECT *)\nSELECT id, name, status\n FROM dbtab\n INTO TABLE @DATA(result).\n\n\" Use aggregates on database\nSELECT carrid, COUNT(*) AS cnt, AVG( price ) AS avg_price\n FROM flight\n GROUP BY carrid\n INTO TABLE @DATA(stats).\n\n\" Update specific columns only\nUPDATE dbtab SET status = 'X' WHERE id = @id.\n```\n\n### Block Operations (Not Line-by-Line)\n\n```abap\n\" GOOD: Single database operation\nINSERT dbtab FROM TABLE @itab.\nUPDATE dbtab FROM TABLE @itab.\nDELETE dbtab FROM TABLE @itab.\nMODIFY dbtab FROM TABLE @itab.\n\n\" BAD: Loop with individual operations\nLOOP AT itab INTO wa.\n INSERT dbtab FROM @wa. \" Avoid!\nENDLOOP.\n```\n\n### Avoid Nested SELECT Loops\n\n```abap\n\" BAD: Nested SELECT (N+1 problem)\nSELECT * FROM orders INTO TABLE @DATA(orders).\nLOOP AT orders INTO DATA(order).\n SELECT * FROM order_items WHERE order_id = @order-id. \" Avoid!\nENDLOOP.\n\n\" GOOD: Use JOIN\nSELECT o~*, i~*\n FROM orders AS o\n INNER JOIN order_items AS i ON o~id = i~order_id\n INTO TABLE @DATA(result).\n\n\" GOOD: Use FOR ALL ENTRIES (check not empty!)\nIF orders IS NOT INITIAL.\n SELECT * FROM order_items\n FOR ALL ENTRIES IN @orders\n WHERE order_id = @orders-id\n INTO TABLE @DATA(items).\nENDIF.\n```\n\n### FOR ALL ENTRIES Considerations\n\n```abap\n\" CRITICAL: Always check if table is empty!\n\" Empty table causes FULL TABLE SCAN\nIF itab IS NOT INITIAL.\n SELECT * FROM dbtab\n FOR ALL ENTRIES IN @itab\n WHERE key_field = @itab-key\n INTO TABLE @DATA(result).\nENDIF.\n```\n\n### Use JOINs and Subqueries\n\n```abap\n\" JOIN is more efficient than separate queries\nSELECT a~*, b~name\n FROM table_a AS a\n INNER JOIN table_b AS b ON a~id = b~id\n INTO TABLE @DATA(result).\n\n\" Subquery for filtering\nSELECT * FROM orders\n WHERE customer_id IN ( SELECT id FROM customers WHERE region = 'EU' )\n INTO TABLE @DATA(result).\n```\n\n### Static vs Dynamic SQL\n\n```abap\n\" GOOD: Static (better optimization)\nSELECT * FROM dbtab WHERE field = @value INTO TABLE @result.\n\n\" SLOWER: Dynamic (runtime evaluation)\nDATA(field_name) = 'FIELD'.\nSELECT * FROM dbtab WHERE (field_name) = @value INTO TABLE @result.\n```\n\n---\n\n## Internal Table Performance\n\n### Table Type Selection\n\n| Table Type | Best For | Access Time |\n|------------|----------|-------------|\n| STANDARD | Small tables, sequential access | O(n) linear |\n| SORTED | Key access with ranges | O(log n) |\n| HASHED | Large tables, unique key access | O(1) constant |\n\n```abap\n\" Standard - small datasets, sequential processing\nDATA std_tab TYPE STANDARD TABLE OF struct WITH EMPTY KEY.\n\n\" Sorted - frequent key access, range queries\nDATA sorted_tab TYPE SORTED TABLE OF struct WITH UNIQUE KEY id.\n\n\" Hashed - large datasets, key-only access\nDATA hashed_tab TYPE HASHED TABLE OF struct WITH UNIQUE KEY id.\n```\n\n### Key Access Optimization\n\n```abap\n\" OPTIMAL: Full primary key (hashed = O(1), sorted = O(log n))\nREAD TABLE hashed_tab WITH TABLE KEY id = 123 INTO wa.\n\n\" GOOD: Left-aligned partial key on sorted table\nREAD TABLE sorted_tab WITH TABLE KEY id = 123 INTO wa.\n\n\" BAD: Free key forces linear search\nREAD TABLE any_tab WITH KEY name = 'Test' INTO wa. \" O(n)!\n```\n\n### Secondary Table Keys\n\n```abap\n\" Define secondary key for alternative access\nTYPES: BEGIN OF ty_data,\n id TYPE i,\n name TYPE string,\n date TYPE d,\n END OF ty_data,\n tt_data TYPE SORTED TABLE OF ty_data\n WITH UNIQUE KEY id\n WITH NON-UNIQUE SORTED KEY by_name COMPONENTS name.\n\n\" Use secondary key\nREAD TABLE itab WITH TABLE KEY by_name COMPONENTS name = 'Test' INTO wa.\n```\n\n### Loop Optimization\n\n```abap\n\" GOOD: WHERE clause on sorted/hashed tables\nLOOP AT sorted_tab INTO wa WHERE status = 'A'.\n \" Optimized if key fields used\nENDLOOP.\n\n\" GOOD: Use field symbols for modification\nLOOP AT itab ASSIGNING FIELD-SYMBOL(\u003cline>).\n \u003cline>-field = new_value. \" Direct modification\nENDLOOP.\n\n\" SLOWER: Work area copy\nLOOP AT itab INTO wa.\n wa-field = new_value.\n MODIFY itab FROM wa. \" Extra copy operation\nENDLOOP.\n```\n\n### TRANSPORTING Addition\n\n```abap\n\" Only transfer needed fields\nREAD TABLE itab INTO wa TRANSPORTING field1 field2.\n\n\" Check existence without data transfer\nREAD TABLE itab TRANSPORTING NO FIELDS WITH TABLE KEY id = 123.\nIF sy-subrc = 0.\n \" Exists\nENDIF.\n```\n\n### Block Operations on Tables\n\n```abap\n\" GOOD: Block append\nAPPEND LINES OF source_tab TO target_tab.\n\n\" BAD: Loop append\nLOOP AT source_tab INTO wa.\n APPEND wa TO target_tab. \" Avoid!\nENDLOOP.\n\n\" Block string operations\nFIND ALL OCCURRENCES OF pattern IN TABLE char_table RESULTS result_tab.\nREPLACE ALL OCCURRENCES OF old WITH new IN TABLE char_table.\n```\n\n### Sorting\n\n```abap\n\" GOOD: Explicit sort key\nSORT itab BY field1 ASCENDING field2 DESCENDING.\n\n\" AVOID: Implicit standard key (many fields)\nSORT itab. \" Uses all non-numeric fields - often inefficient\n```\n\n---\n\n## Memory Management\n\n### CLEAR vs FREE\n\n```abap\n\" CLEAR: Remove content, keep memory allocated\nCLEAR itab. \" Use when table will be refilled\n\n\" FREE: Remove content and deallocate memory\nFREE itab. \" Use when table won't be reused soon\n```\n\n### Data Reference Efficiency\n\n```abap\n\" Field symbols as pointers (no copy)\nLOOP AT itab ASSIGNING FIELD-SYMBOL(\u003cline>).\n \" Direct access to table row\nENDLOOP.\n\n\" Data reference for deep structures\nLOOP AT deep_itab REFERENCE INTO DATA(dref).\n dref->nested_field = value. \" Efficient for nested data\nENDLOOP.\n```\n\n---\n\n## String Processing\n\n### String Type vs Fixed Length\n\n```abap\n\" GOOD: Variable-length string (internal sharing)\nDATA text TYPE string.\ntext = text && ` more text`. \" Efficient concatenation\n\n\" SLOWER: Fixed-length operations\nDATA char100 TYPE c LENGTH 100.\n```\n\n### String Literals vs Templates\n\n```abap\n\" FASTER: Simple literal\nstr = `Plain text`.\n\n\" SLOWER: Template (evaluated as expression)\nstr = |Plain text|.\n\n\" Templates only when needed\nstr = |Value: { value }|. \" Justified use\n```\n\n### Pattern Matching\n\n```abap\n\" FASTER: Simple comparison\nIF text = 'expected'.\n\n\" FASTER: Basic patterns\nIF text CP '*pattern*'.\n\n\" SLOWER: PCRE regex (use only when needed)\nFIND PCRE '[complex]+pattern' IN text.\n```\n\n---\n\n## Type Handling\n\n### Avoid Unnecessary Conversions\n\n```abap\n\" GOOD: Same types\nDATA: val1 TYPE decfloat34,\n val2 TYPE decfloat34,\n result TYPE decfloat34.\nresult = val1 + val2.\n\n\" SLOWER: Mixed types (implicit conversion)\nDATA: int_val TYPE i,\n float_val TYPE f,\n dec_val TYPE p DECIMALS 2.\nresult = int_val + float_val + dec_val. \" Conversions happen!\n```\n\n---\n\n## Procedure Calls\n\n### Pass by Reference for Large Data\n\n```abap\n\" GOOD: By reference (no copy)\nMETHODS process\n IMPORTING\n it_data TYPE tt_large_table. \" Reference by default\n\n\" SLOWER: By value (copies data)\nMETHODS process\n IMPORTING\n VALUE(it_data) TYPE tt_large_table. \" Explicit copy!\n```\n\n---\n\n## Parallel Processing\n\n```abap\n\" Use CL_ABAP_PARALLEL for data-intensive operations\nDATA: ref_tab TYPE cl_abap_parallel=>t_in_inst_tab.\n\n\" Populate ref_tab with work items\nDATA(parallel) = NEW cl_abap_parallel( ).\nparallel->run_inst( EXPORTING p_in_tab = ref_tab ).\n```\n\n---\n\n## RAP/EML Optimization\n\n```abap\n\" BAD: EML in loop\nLOOP AT items INTO item.\n MODIFY ENTITIES OF entity\n ENTITY ent\n UPDATE SET FIELDS WITH VALUE #( ( %key = item-key field = item-value ) ).\nENDLOOP.\n\n\" GOOD: Single EML with all modifications\nMODIFY ENTITIES OF entity\n ENTITY ent\n UPDATE SET FIELDS WITH VALUE #(\n FOR item IN items ( %key = item-key field = item-value )\n ).\n```\n\n---\n\n## CDS Views\n\n- Push complex operations to database layer\n- Leverage SAP HANA optimization\n- Use associations instead of explicit JOINs\n- Apply filters in CDS, not ABAP\n\n---\n\n## Quick Reference: Do's and Don'ts\n\n### DO\n\n- ✓ Select only needed columns\n- ✓ Use WHERE clauses\n- ✓ Use block operations (INSERT/UPDATE/DELETE from table)\n- ✓ Use JOINs instead of nested SELECTs\n- ✓ Check FOR ALL ENTRIES table not empty\n- ✓ Use appropriate table types (hashed for large key access)\n- ✓ Use field symbols in loops\n- ✓ Use TRANSPORTING for partial reads\n- ✓ Use secondary keys for alternative access paths\n- ✓ Pass large data by reference\n\n### DON'T\n\n- ✗ SELECT * when only few columns needed\n- ✗ SELECT in loops (N+1 problem)\n- ✗ Loop with individual INSERT/UPDATE/DELETE\n- ✗ Use FOR ALL ENTRIES with empty table\n- ✗ Use free key access on large tables\n- ✗ Use PCRE when simple patterns suffice\n- ✗ Mix numeric types unnecessarily\n- ✗ Use VALUE( ) for large parameters\n- ✗ Use dynamic SQL when static works\n\n---\n\n## Analysis Tools\n\n- **ABAP Profiling** in ADT (SAT replacement)\n- **SQL Trace** for database analysis\n- **Runtime Analysis** for bottleneck identification\n- **Code Inspector** for static analysis\n\nReference: SAP Help Portal - ABAP Development Tools profiling documentation\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":9520,"content_sha256":"ff508c6ffbf1464e1821aabd419e33f331c7f5c0d3686b88c3fc7a2970209782"},{"filename":"references/program-flow.md","content":"# Program Flow Logic - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/13_Program_Flow_Logic.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/13_Program_Flow_Logic.md)\n\n> **Version Note**: `IS INSTANCE OF` and `CASE TYPE OF` require **7.50+**.\n> On 7.40, use RTTI (`cl_abap_typedescr=>describe_by_object_ref`) or\n> `CAST` with exception handling. All other flow control is available from 7.40+.\n\n---\n\n## IF Statements\n\n### Basic Syntax\n\n```abap\nIF condition.\n \" executes if true\nELSEIF other_condition.\n \" executes if first false, this true\nELSE.\n \" executes if all false\nENDIF.\n```\n\n### Example\n\n```abap\nDATA(time) = cl_abap_context_info=>get_system_time( ).\n\nIF time BETWEEN '050000' AND '115959'.\n DATA(greeting) = `Good morning`.\nELSEIF time BETWEEN '120000' AND '175959'.\n greeting = `Good afternoon`.\nELSEIF time BETWEEN '180000' AND '215959'.\n greeting = `Good evening`.\nELSE.\n greeting = `Good night`.\nENDIF.\n```\n\n---\n\n## Comparison Operators\n\n| Operator | Alternative | Description |\n|----------|-------------|-------------|\n| `=` | `EQ` | Equal |\n| `\u003c>` | `NE` | Not equal |\n| `\u003c` | `LT` | Less than |\n| `>` | `GT` | Greater than |\n| `\u003c=` | `LE` | Less or equal |\n| `>=` | `GE` | Greater or equal |\n\n---\n\n## Predicate Expressions\n\n```abap\nIF value IS INITIAL. \" Check initial value\nIF dref IS BOUND. \" Check data reference\nIF oref IS INSTANCE OF class. \" Check object type\nIF \u003cfs> IS ASSIGNED. \" Check field symbol\nIF line_exists( itab[ 1 ] ). \" Check table line\n```\n\n---\n\n## Boolean Functions\n\n```abap\n\" Returns 'X' or blank (string type)\nIF boolc( condition ) = 'X'.\n\n\" Returns abap_true or abap_false\nIF xsdbool( condition ) = abap_true.\n```\n\n---\n\n## COND Operator\n\n```abap\nDATA(result) = COND string(\n WHEN score >= 90 THEN `A`\n WHEN score >= 80 THEN `B`\n WHEN score >= 70 THEN `C`\n ELSE `F` ).\n```\n\n---\n\n## CASE Statement\n\n```abap\nCASE value.\n WHEN 1.\n \" Handle 1\n WHEN 2 OR 3.\n \" Handle 2 or 3\n WHEN OTHERS.\n \" Handle all other cases\nENDCASE.\n```\n\n---\n\n## CASE TYPE OF\n\n```abap\nDATA(type_desc) = cl_abap_typedescr=>describe_by_data( data ).\n\nCASE TYPE OF type_desc.\n WHEN TYPE cl_abap_elemdescr.\n \" Elementary type\n WHEN TYPE cl_abap_structdescr.\n \" Structure\n WHEN TYPE cl_abap_tabledescr.\n \" Table\n WHEN OTHERS.\n \" Other types\nENDCASE.\n```\n\n---\n\n## SWITCH Operator\n\n```abap\nDATA(text) = SWITCH string( code\n WHEN 1 THEN `One`\n WHEN 2 THEN `Two`\n WHEN 3 OR 4 THEN `Three or Four`\n ELSE `Other` ).\n```\n\n---\n\n## DO Loop\n\n### Basic DO\n\n```abap\nDO.\n \" Infinite loop - must EXIT\n IF sy-index > 10.\n EXIT.\n ENDIF.\nENDDO.\n```\n\n### DO with TIMES\n\n```abap\nDO 5 TIMES.\n \" Executes exactly 5 times\n \" sy-index contains current iteration (1-5)\nENDDO.\n```\n\n---\n\n## WHILE Loop\n\n```abap\nWHILE lines( itab ) \u003c 10.\n APPEND VALUE #( sy-index ) TO itab.\nENDWHILE.\n```\n\n---\n\n## Loop Control Statements\n\n### CONTINUE - Skip to Next Iteration\n\n```abap\nDO 10 TIMES.\n IF sy-index MOD 2 = 0.\n CONTINUE. \" Skip even numbers\n ENDIF.\n \" Process odd numbers only\nENDDO.\n```\n\n### CHECK - Conditional Skip\n\n```abap\nDO 10 TIMES.\n CHECK sy-index MOD 2 \u003c> 0. \" Skip if even\n \" Process odd numbers only\nENDDO.\n```\n\n### EXIT - Leave Loop\n\n```abap\nDO.\n IF sy-index = 5.\n EXIT. \" Leave loop\n ENDIF.\nENDDO.\n```\n\n---\n\n## Function Modules\n\n### Static Call\n\n```abap\nCALL FUNCTION 'FUNCTION_NAME'\n EXPORTING\n param1 = value1\n IMPORTING\n param2 = result\n EXCEPTIONS\n error1 = 1.\n\nIF sy-subrc \u003c> 0.\n \" Handle error\nENDIF.\n```\n\n### With Class-Based Exceptions\n\n```abap\nTRY.\n CALL FUNCTION 'FUNCTION_NAME'\n EXPORTING\n param1 = value1\n IMPORTING\n param2 = result.\n CATCH cx_some_exception INTO DATA(exc).\n \" Handle exception\nENDTRY.\n```\n\n### Dynamic Call\n\n```abap\nDATA(func_name) = 'FUNCTION_NAME'.\n\nCALL FUNCTION func_name\n EXPORTING param1 = value1\n IMPORTING param2 = result.\n\n\" With parameter table\nDATA(ptab) = VALUE abap_func_parmbind_tab(\n ( name = 'PARAM1' kind = abap_func_exporting value = NEW string( 'value' ) )\n ( name = 'PARAM2' kind = abap_func_importing value = NEW string( ) ) ).\n\nCALL FUNCTION func_name PARAMETER-TABLE ptab.\n```\n\n---\n\n## RETURN Statement\n\n```abap\nMETHOD calculate.\n IF invalid_input.\n RETURN. \" Exit method\n ENDIF.\n\n \" Continue processing\nENDMETHOD.\n\n\" With returning value\nMETHOD get_result.\n RETURN value * 2. \" Return and exit\nENDMETHOD.\n```\n\n---\n\n## WAIT Statement\n\n```abap\nWAIT UP TO 1 SECONDS.\nWAIT UP TO 500 MILLISECONDS.\n```\n\n---\n\n## ASSERT Statement\n\n```abap\nASSERT condition. \" Runtime error if false\n\n\" Use for debugging invariants\nASSERT lines( itab ) > 0.\n```\n\n---\n\n## Best Practices\n\n1. **Limit nesting** to 5 levels maximum\n2. **Outsource complexity** into methods\n3. **Use RETURN** instead of EXIT/CHECK outside loops\n4. **Prefer class methods** over function modules\n5. **Avoid redundant conditions** in IF chains\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":4950,"content_sha256":"7c929155fa34fe011ac3d95d426b9ff2b6836131aac2bf4c033f922c2e94436e"},{"filename":"references/rap-eml.md","content":"# RAP and EML - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/08_EML_ABAP_for_RAP.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/08_EML_ABAP_for_RAP.md)\n\n---\n\n## Core Definitions\n\n**ABAP Entity Manipulation Language (EML)**: A subset of ABAP for accessing RAP business object data.\n\n**RAP Business Objects (RAP BO)**:\n- Based on hierarchical CDS entity structures\n- Consist of parent and child entities via CDS compositions\n- Top parent entity is the root entity\n\n---\n\n## Implementation Types\n\n### Managed RAP BOs\n- Provider fully/partly supplies transactional buffer and behavior\n- Standard CRUD operations work automatically\n- Instance data automatically read, modified, and saved\n- Non-standard operations require custom implementation\n\n### Unmanaged RAP BOs\n- Everything must be provided by developers\n- For brownfield scenarios with existing transactional logic\n- Can have hybrid: managed RAP BO with unmanaged save\n\n---\n\n## RAP Behavior Definition (BDEF)\n\n### Basic Structure\n\n```cds\nmanaged implementation in class zbp_demo_rap_m unique;\nstrict ( 2 );\n\ndefine behavior for ZDemo_RAP_Root alias Root\npersistent table zdemo_rap_tab\nlock master\nauthorization master ( instance )\n{\n create;\n update;\n delete;\n\n field ( readonly ) key_field;\n field ( mandatory ) required_field;\n\n association _Child { create; }\n\n action someAction;\n\n determination det1 on save { create; }\n validation val1 on save { create; update; }\n}\n\ndefine behavior for ZDemo_RAP_Child alias Child\npersistent table zdemo_rap_child_tab\nlock dependent by _Parent\nauthorization dependent by _Parent\n{\n update;\n delete;\n\n field ( readonly ) parent_key;\n\n association _Parent;\n}\n```\n\n### Available Specifications\n\n**Standard Operations:**\n```cds\ncreate;\nupdate;\ndelete( precheck );\nassociation _child { create; }\n```\n\n**Non-Standard Operations:**\n```cds\naction act1; \" Instance action\nstatic action act2; \" Static action\ninternal action act3; \" Internal action\nfactory action act6 [1]; \" Factory action\ndraft action Edit; \" Draft action\nfunction func1 result [0..*] $self; \" Function\n```\n\n**Field Characteristics:**\n```cds\nfield ( readonly ) field1;\nfield ( readonly : update ) key_field;\nfield ( mandatory ) field2, field3;\nfield ( features : instance ) field4;\n```\n\n**Validations and Determinations:**\n```cds\nvalidation val on save { create; field field1; }\ndetermination det1 on modify { update; delete; field field5; }\ndetermination det2 on save { create; field field7; }\n```\n\n**Locking and Authorization:**\n```cds\nlock master\nlock dependent by _parent\nauthorization master ( instance )\nauthorization master ( global )\nauthorization dependent by _parent\n```\n\n---\n\n## ABAP Behavior Pools (ABP)\n\n### Global Class Definition\n\n```abap\nCLASS zbp_demo_rap_m DEFINITION PUBLIC ABSTRACT FINAL\n FOR BEHAVIOR OF zdemo_rap_root.\nENDCLASS.\n\nCLASS zbp_demo_rap_m IMPLEMENTATION.\nENDCLASS.\n```\n\n### Handler Classes (Local)\n\n```abap\nCLASS lhc_root DEFINITION INHERITING FROM cl_abap_behavior_handler.\n PRIVATE SECTION.\n METHODS get_instance_authorizations FOR INSTANCE AUTHORIZATION\n IMPORTING keys REQUEST requested_authorizations\n FOR root RESULT result.\n\n METHODS create FOR MODIFY\n IMPORTING entities FOR CREATE root.\n\n METHODS update FOR MODIFY\n IMPORTING entities FOR UPDATE root.\n\n METHODS delete FOR MODIFY\n IMPORTING keys FOR DELETE root.\n\n METHODS read FOR READ\n IMPORTING keys FOR READ root RESULT result.\n\n METHODS some_action FOR MODIFY\n IMPORTING keys FOR ACTION root~some_action.\n\n METHODS det1 FOR DETERMINE ON SAVE\n IMPORTING keys FOR root~det1.\n\n METHODS val1 FOR VALIDATE ON SAVE\n IMPORTING keys FOR root~val1.\nENDCLASS.\n\nCLASS lhc_root IMPLEMENTATION.\n METHOD create.\n \" Implementation\n ENDMETHOD.\n \" ... other methods\nENDCLASS.\n```\n\n### Saver Class (Unmanaged Save)\n\n```abap\nCLASS lsc_root DEFINITION INHERITING FROM cl_abap_behavior_saver.\n PROTECTED SECTION.\n METHODS finalize REDEFINITION.\n METHODS check_before_save REDEFINITION.\n METHODS adjust_numbers REDEFINITION.\n METHODS save REDEFINITION.\n METHODS cleanup REDEFINITION.\n METHODS cleanup_finalize REDEFINITION.\nENDCLASS.\n\nCLASS lsc_root IMPLEMENTATION.\n METHOD finalize.\n \" Final calculations\n ENDMETHOD.\n\n METHOD check_before_save.\n \" Consistency checks\n ENDMETHOD.\n\n METHOD save.\n \" Save to database\n ENDMETHOD.\n\n METHOD cleanup.\n \" Clear buffer\n ENDMETHOD.\nENDCLASS.\n```\n\n---\n\n## BDEF Derived Types\n\n### Type Declarations\n\n```abap\n\" Table types\nDATA cr_tab TYPE TABLE FOR CREATE root_entity.\nDATA upd_tab TYPE TABLE FOR UPDATE root_entity.\nDATA del_tab TYPE TABLE FOR DELETE root_entity.\nDATA read_tab TYPE TABLE FOR READ IMPORT root_entity.\nDATA result_tab TYPE TABLE FOR READ RESULT root_entity.\nDATA action_tab TYPE TABLE FOR ACTION IMPORT root_entity~action_name.\n\n\" Structure types\nDATA cr_struc TYPE STRUCTURE FOR CREATE root_entity.\nDATA upd_struc TYPE STRUCTURE FOR UPDATE root_entity.\n\n\" Response types\nDATA mapped TYPE RESPONSE FOR MAPPED root_entity.\nDATA failed TYPE RESPONSE FOR FAILED root_entity.\nDATA reported TYPE RESPONSE FOR REPORTED root_entity.\n```\n\n### Special Components (%...)\n\n**%cid and %cid_ref:**\n```abap\n\" Content ID for preliminary identification\ncr_tab = VALUE #( ( %cid = 'cid1' key_field = 1 field1 = 'A' ) ).\n\n\" Reference to existing instance's %cid\nupd_tab = VALUE #( ( %cid_ref = 'cid1' field1 = 'Updated' ) ).\n```\n\n**%key and %tky:**\n```abap\n\" %key: Primary keys only\n\" %tky: Primary keys + draft indicator (recommended)\ndel_tab = VALUE #( ( %tky = VALUE #( key_field = 1 ) ) ).\n```\n\n**%control:**\n```abap\n\" Indicate which fields are provided\nupd_tab = VALUE #( (\n key_field = 1\n field1 = 'New'\n %control = VALUE #(\n key_field = if_abap_behv=>mk-off\n field1 = if_abap_behv=>mk-on\n field2 = if_abap_behv=>mk-off ) ) ).\n```\n\n**%data:**\n```abap\n\" Contains all key and data fields\ncr_tab = VALUE #( (\n %cid = 'cid1'\n %data = VALUE #(\n key_field = 1\n field1 = 'A'\n field2 = 'B' ) ) ).\n```\n\n---\n\n## EML CREATE Operations\n\n### Short Form\n\n```abap\nDATA cr_tab TYPE TABLE FOR CREATE root_entity.\nDATA mapped TYPE RESPONSE FOR MAPPED root_entity.\nDATA failed TYPE RESPONSE FOR FAILED root_entity.\nDATA reported TYPE RESPONSE FOR REPORTED root_entity.\n\ncr_tab = VALUE #(\n ( %cid = 'cid1' key_field = 1 field1 = 'A' field2 = 'B' )\n ( %cid = 'cid2' key_field = 2 field1 = 'C' field2 = 'D' ) ).\n\nMODIFY ENTITY root_entity\n CREATE\n FIELDS ( key_field field1 field2 ) WITH cr_tab\n MAPPED mapped\n FAILED failed\n REPORTED reported.\n```\n\n### Long Form\n\n```abap\nMODIFY ENTITIES OF root_entity\n ENTITY root\n CREATE FROM VALUE #( (\n %cid = 'cid1'\n key_field = 1\n field1 = 'A'\n field2 = 'B'\n %control = VALUE #(\n key_field = if_abap_behv=>mk-on\n field1 = if_abap_behv=>mk-on\n field2 = if_abap_behv=>mk-on ) ) )\n MAPPED DATA(m)\n FAILED DATA(f)\n REPORTED DATA(r).\n```\n\n### AUTO FILL CID\n\n```abap\nMODIFY ENTITIES OF root_entity\n ENTITY root\n CREATE AUTO FILL CID WITH VALUE #( (\n key_field = 1\n field1 = 'A'\n %control = VALUE #(\n key_field = if_abap_behv=>mk-on\n field1 = if_abap_behv=>mk-on ) ) )\n MAPPED DATA(m)\n FAILED DATA(f)\n REPORTED DATA(r).\n```\n\n---\n\n## EML UPDATE Operations\n\n### Short Form\n\n```abap\nDATA upd_tab TYPE TABLE FOR UPDATE root_entity.\n\nupd_tab = VALUE #(\n ( key_field = 1 field1 = 'Updated1' )\n ( key_field = 2 field1 = 'Updated2' ) ).\n\nMODIFY ENTITY root_entity\n UPDATE\n FIELDS ( field1 ) WITH upd_tab\n FAILED DATA(f)\n REPORTED DATA(r).\n```\n\n### Long Form with %control\n\n```abap\nMODIFY ENTITIES OF root_entity\n ENTITY root\n UPDATE FROM VALUE #( (\n key_field = 1\n field1 = 'New'\n field2 = 'Also New'\n %control = VALUE #(\n key_field = if_abap_behv=>mk-off \" Don't touch key\n field1 = if_abap_behv=>mk-on \" Update this\n field2 = if_abap_behv=>mk-on ) ) ) \" Update this\n FAILED DATA(f)\n REPORTED DATA(r).\n```\n\n---\n\n## EML DELETE Operations\n\n```abap\nDATA del_tab TYPE TABLE FOR DELETE root_entity.\n\ndel_tab = VALUE #(\n ( key_field = 1 )\n ( key_field = 2 ) ).\n\nMODIFY ENTITY root_entity\n DELETE FROM del_tab\n FAILED DATA(f)\n REPORTED DATA(r).\n```\n\n---\n\n## EML READ Operations\n\n### Basic Read\n\n```abap\nDATA read_input TYPE TABLE FOR READ IMPORT root_entity.\nDATA read_result TYPE TABLE FOR READ RESULT root_entity.\n\nread_input = VALUE #( ( key_field = 1 ) ( key_field = 2 ) ).\n\nREAD ENTITY root_entity\n FROM read_input\n RESULT read_result\n FAILED DATA(f)\n REPORTED DATA(r).\n```\n\n### With Field Selection\n\n```abap\nREAD ENTITY root_entity\n FIELDS ( field1 field2 ) WITH read_input\n RESULT read_result\n FAILED DATA(f)\n REPORTED DATA(r).\n\n\" All fields\nREAD ENTITY root_entity\n ALL FIELDS WITH read_input\n RESULT read_result.\n```\n\n### Read-by-Association\n\n```abap\nREAD ENTITIES OF root_entity\n ENTITY root\n BY \\_child\n FROM VALUE #( ( key_field = 1 ) )\n RESULT DATA(children)\n FAILED DATA(f)\n REPORTED DATA(r).\n```\n\n---\n\n## Deep Create (Parent + Child)\n\n```abap\nMODIFY ENTITIES OF root_entity\n ENTITY root\n CREATE FIELDS ( key_field field1 )\n WITH VALUE #( (\n %cid = 'cid_root'\n key_field = 1\n field1 = 'Parent' ) )\n\n CREATE BY \\_child\n FIELDS ( child_key child_field )\n WITH VALUE #( (\n %cid_ref = 'cid_root'\n %target = VALUE #(\n ( %cid = 'cid_child1'\n child_key = 10\n child_field = 'Child 1' )\n ( %cid = 'cid_child2'\n child_key = 20\n child_field = 'Child 2' ) ) ) )\n\n MAPPED DATA(mapped)\n FAILED DATA(failed)\n REPORTED DATA(reported).\n```\n\n---\n\n## Action Execution\n\n```abap\nMODIFY ENTITY root_entity\n EXECUTE some_action\n FROM VALUE #( ( key_field = 1 ) )\n RESULT DATA(action_result)\n FAILED DATA(f)\n REPORTED DATA(r).\n```\n\n---\n\n## COMMIT and ROLLBACK\n\n```abap\n\" Persist changes\nCOMMIT ENTITIES\n RESPONSE OF root_entity\n MAPPED DATA(mapped)\n FAILED DATA(failed)\n REPORTED DATA(reported).\n\n\" Discard changes\nROLLBACK ENTITIES.\n```\n\n---\n\n## IN LOCAL MODE\n\n```abap\n\" Bypass access restrictions within ABP\nMODIFY ENTITY root_entity IN LOCAL MODE\n CREATE FROM cr_tab\n MAPPED DATA(m)\n FAILED DATA(f)\n REPORTED DATA(r).\n\nREAD ENTITY root_entity IN LOCAL MODE\n FROM read_input\n RESULT DATA(result).\n```\n\n---\n\n## Constants Reference\n\n| Type | Constant | Purpose |\n|------|----------|---------|\n| `ABP_BEHV_FLAG` | `IF_ABAP_BEHV=>MK` | Mark/unmark fields in %control |\n| `ABP_BEHV_FIELD_PERM` | `IF_ABAP_BEHV=>PERM-F` | Field permission results |\n| `ABP_BEHV_OP_PERM` | `IF_ABAP_BEHV=>PERM-O` | Operation permission results |\n| `ABP_BEHV_AUTH` | `IF_ABAP_BEHV=>AUTH` | Authorization results |\n| `IF_ABAP_BEHV=>T_CHAR01` | `IF_ABAP_BEHV=>OP` | Dynamic EML operations |\n\n---\n\n## RAP Response Parameters\n\n```abap\n\" MAPPED - Key mapping for created instances\nmapped-root = VALUE #( ( %cid = 'cid1' key_field = 1 ) ).\n\n\" FAILED - Failed instances\nfailed-root = VALUE #( ( %cid = 'cid1' %fail-cause = if_abap_behv=>cause-unspecific ) ).\n\n\" REPORTED - Messages\nreported-root = VALUE #( (\n %tky = VALUE #( key_field = 1 )\n %msg = new_message_with_text(\n severity = if_abap_behv_message=>severity-error\n text = 'Validation failed!' ) ) ).\n```\n\n---\n\n## Testing RAP with ABAP Unit\n\n```abap\n\" Create test environment\nDATA(test_env) = cl_botd_txbufdbl_bo_test_env=>create(\n src_bindings = VALUE #( ( 'ZDEMO_RAP_ROOT' ) ) ).\n\n\" Or mock EML APIs\nDATA(mock_env) = cl_botd_mockemlapi_bo_test_env=>create(\n environment = VALUE #( ( 'ZDEMO_RAP_ROOT' ) ) ).\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":11602,"content_sha256":"fa9e6cd879ac4bf04b01a51a985d8d194d0bfb5b56de3948fb14f3d0c8da41c0"},{"filename":"references/released-classes.md","content":"# Released ABAP Classes - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/22_Released_ABAP_Classes.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/22_Released_ABAP_Classes.md)\n\n> **Version Note**: Released ABAP classes are primarily for **ABAP Cloud** development.\n> `int8` type and `cl_abap_bigint=>factory_from_int8` require **7.50+**. On 7.40,\n> use type `i` or `p` for integer operations.\n\n---\n\n## Overview\n\nReleased ABAP classes are part of SAP's official APIs for ABAP Cloud Development.\n\n### Query Released Classes\n\n```abap\nSELECT ReleasedObjectType, ReleasedObjectName, ReleaseState\n FROM i_apisforclouddevelopment\n WHERE releasestate = 'RELEASED'\n AND ReleasedObjectType = 'CLAS'\n INTO TABLE @DATA(released_classes).\n```\n\n### Find Successors for Deprecated Objects\n\n```abap\nSELECT *\n FROM i_apiswithclouddevsuccessor\n INTO TABLE @DATA(successors).\n```\n\n---\n\n## Execution & Output\n\n### IF_OO_ADT_CLASSRUN\n\n```abap\nCLASS zcl_demo DEFINITION PUBLIC FINAL CREATE PUBLIC.\n PUBLIC SECTION.\n INTERFACES if_oo_adt_classrun.\nENDCLASS.\n\nCLASS zcl_demo IMPLEMENTATION.\n METHOD if_oo_adt_classrun~main.\n out->write( 'Hello from ABAP Cloud!' ).\n out->write( data_object ).\n out->write( itab ).\n ENDMETHOD.\nENDCLASS.\n```\n\n---\n\n## UUID Management\n\n### CL_SYSTEM_UUID\n\n```abap\n\" Generate UUID\nDATA(uuid) = cl_system_uuid=>create_uuid_x16_static( ).\n\n\" Convert formats\nTRY.\n DATA(uuid_c22) = cl_system_uuid=>convert_uuid_x16_static( uuid = uuid ).\n DATA(uuid_c32) = cl_system_uuid=>convert_uuid_x16_static(\n uuid = uuid format = cl_system_uuid=>if_system_uuid_rfc4122~format_c32 ).\n CATCH cx_uuid_error.\nENDTRY.\n```\n\n---\n\n## Numeric Operations\n\n### CL_ABAP_MATH\n\n```abap\nDATA(pi) = cl_abap_math=>pi.\nDATA(e) = cl_abap_math=>e.\nDATA(max_int4) = cl_abap_math=>max_int4.\nDATA(min_int4) = cl_abap_math=>min_int4.\n```\n\n### CL_ABAP_BIGINT\n\n```abap\nDATA(bigint) = cl_abap_bigint=>factory_from_int8( 123456789 ).\nDATA(result) = bigint->add( cl_abap_bigint=>factory_from_int8( 987654321 ) ).\nDATA(product) = bigint->mul( other_bigint ).\nDATA(sqrt) = bigint->sqrt( ).\n```\n\n### CL_ABAP_RATIONAL\n\n```abap\nDATA(rational) = cl_abap_rational=>factory_from_string( '1/3' ).\nDATA(decimal) = rational->get_as_decfloat34( ).\n```\n\n### Random Numbers\n\n```abap\nDATA(random) = cl_abap_random_int=>create( seed = 42 min = 1 max = 100 ).\nDATA(number) = random->get_next( ).\n\nDATA(random_f) = cl_abap_random_float=>create( seed = 42 ).\nDATA(float_val) = random_f->get_next( ).\n```\n\n---\n\n## String Processing\n\n### CL_ABAP_CHAR_UTILITIES\n\n```abap\nDATA(newline) = cl_abap_char_utilities=>newline.\nDATA(tab) = cl_abap_char_utilities=>horizontal_tab.\nDATA(cr_lf) = cl_abap_char_utilities=>cr_lf.\n```\n\n### XCO String Processing\n\n```abap\n\" Substring\nDATA(sub) = xco_cp=>string( text )->from( 5 )->to( 10 )->value.\n\n\" Split\nDATA(parts) = xco_cp=>string( text )->split( `;` )->value.\n\n\" Join\nDATA(joined) = xco_cp=>strings( string_table )->join( `, ` )->value.\n\n\" Case conversion\nDATA(upper) = xco_cp=>string( text )->to_upper_case( )->value.\nDATA(lower) = xco_cp=>string( text )->to_lower_case( )->value.\n```\n\n---\n\n## Date & Time\n\n### CL_ABAP_CONTEXT_INFO\n\n```abap\nDATA(system_date) = cl_abap_context_info=>get_system_date( ).\nDATA(system_time) = cl_abap_context_info=>get_system_time( ).\nDATA(user_alias) = cl_abap_context_info=>get_user_alias( ).\n```\n\n### XCO Date/Time\n\n```abap\n\" Current date\nDATA(date) = xco_cp=>sy->date( )->as( xco_cp_time=>format->iso_8601_extended )->value.\n\n\" Add days\nDATA(tomorrow) = xco_cp=>sy->date( )->add( iv_day = 1 )->value.\n\n\" Add months\nDATA(next_month) = xco_cp=>sy->date( )->add( iv_month = 1 )->value.\n```\n\n### CL_ABAP_TSTMP\n\n```abap\n\" Add seconds to timestamp\nDATA(new_ts) = cl_abap_tstmp=>add( tstmp = timestamp secs = 3600 ).\n\n\" Subtract timestamps\nDATA(diff) = cl_abap_tstmp=>subtractsecs( tstmp1 = ts1 tstmp2 = ts2 ).\n```\n\n---\n\n## Data Encoding\n\n### Base64\n\n```abap\n\" Encode\nDATA(encoded) = cl_web_http_utility=>encode_base64( unencoded = xstring_data ).\n\n\" Decode\nDATA(decoded) = cl_web_http_utility=>decode_base64( encoded = base64_string ).\n\n\" XCO alternative\nDATA(xco_encoded) = xco_cp=>xstring( xstring_data\n )->as( xco_cp_binary=>text_encoding->base64 )->value.\n```\n\n### GZIP Compression\n\n```abap\n\" Compress\ncl_abap_gzip=>compress_binary(\n EXPORTING raw_in = raw_data\n IMPORTING gzip_out = compressed ).\n\n\" Decompress\ncl_abap_gzip=>decompress_binary(\n EXPORTING gzip_in = compressed\n IMPORTING raw_out = decompressed ).\n```\n\n---\n\n## Regular Expressions\n\n### CL_ABAP_REGEX / CL_ABAP_MATCHER\n\n```abap\nDATA(regex) = cl_abap_regex=>create( pattern = '\\d+' ).\nDATA(matcher) = regex->create_matcher( text = 'abc123def' ).\n\nIF matcher->match( ).\n DATA(matched) = matcher->get_match( ).\nENDIF.\n\n\" Find all\nWHILE matcher->find_next( ).\n DATA(found) = matcher->get_match( ).\nENDWHILE.\n```\n\n---\n\n## RAP Classes\n\n### CL_ABAP_BEHV_AUX\n\n```abap\n\" Get current handler context\nDATA(context) = cl_abap_behv_aux=>get_current_handler_context( ).\n```\n\n### CL_ABAP_TX\n\n```abap\n\" Transactional control\ncl_abap_tx=>save( ).\n```\n\n---\n\n## Type Services (RTTI)\n\n### CL_ABAP_TYPEDESCR Hierarchy\n\n```abap\n\" Describe by data\nDATA(type_desc) = cl_abap_typedescr=>describe_by_data( data_object ).\n\n\" Describe by name\nDATA(type_desc) = cl_abap_typedescr=>describe_by_name( 'ZDEMO_STRUCTURE' ).\n\n\" Cast to specific descriptor\nDATA(struct_desc) = CAST cl_abap_structdescr( type_desc ).\nDATA(components) = struct_desc->get_components( ).\n\nDATA(table_desc) = CAST cl_abap_tabledescr( type_desc ).\nDATA(line_type) = table_desc->get_table_line_type( ).\n```\n\n---\n\n## Dynamic Programming\n\n### CL_ABAP_CORRESPONDING\n\n```abap\nDATA(corresponding) = cl_abap_corresponding=>create(\n source = source_structure\n destination = destination_structure\n mapping = VALUE #( ( srcname = 'OLD_NAME' dstname = 'NEW_NAME' ) ) ).\n\ncorresponding->execute(\n EXPORTING source = source_structure\n CHANGING destination = destination_structure ).\n```\n\n### CL_ABAP_DYN_PRG\n\n```abap\n\" Check table name\nTRY.\n cl_abap_dyn_prg=>check_table_name_str( table_name ).\n CATCH cx_abap_not_a_table.\nENDTRY.\n\n\" Check against allowlist\ncl_abap_dyn_prg=>check_allowlist(\n val = input\n allowlist = VALUE #( ( 'ALLOWED1' ) ( 'ALLOWED2' ) ) ).\n```\n\n---\n\n## Calendar Functions\n\n### CL_SCAL_UTILS\n\n```abap\nDATA(month_names) = cl_scal_utils=>month_names_get( ).\nDATA(weekday) = cl_scal_utils=>date_get_day_of_week( date = sy-datum ).\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":6471,"content_sha256":"431fc7d5cffce1962f71f9eb3bf5e280643f976c72025b37bf136fef7131dea9"},{"filename":"references/sap-luw.md","content":"# SAP Logical Unit of Work (LUW) - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/17_SAP_LUW.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/17_SAP_LUW.md)\n\n---\n\n## Overview\n\nSAP LUW ensures transactional consistency through all-or-nothing commits: either all changes commit together or all rollback.\n\n---\n\n## COMMIT and ROLLBACK\n\n### COMMIT WORK\n\n```abap\nCOMMIT WORK. \" Asynchronous - returns immediately\nCOMMIT WORK AND WAIT. \" Synchronous - waits for completion\n```\n\nEffects:\n- Closes current SAP LUW, opens new one\n- Commits all change requests\n- Processes registered update function modules\n- Triggers database commit\n\n### ROLLBACK WORK\n\n```abap\nROLLBACK WORK.\n```\n\nEffects:\n- Closes current SAP LUW, opens new one\n- Undoes all changes within current SAP LUW\n- Removes previous registrations\n- Triggers database rollback\n\n---\n\n## Update Function Modules\n\n### Calling Update Functions\n\n```abap\n\" Asynchronous (default)\nCALL FUNCTION 'Z_UPDATE_FUNC' IN UPDATE TASK\n EXPORTING values = data.\n\nCOMMIT WORK. \" Returns immediately\n\n\" Synchronous\nCALL FUNCTION 'Z_UPDATE_FUNC' IN UPDATE TASK\n EXPORTING values = data.\n\nCOMMIT WORK AND WAIT. \" Waits for completion\n\n\" Local update\nSET UPDATE TASK LOCAL.\n\nCALL FUNCTION 'Z_UPDATE_FUNC' IN UPDATE TASK\n EXPORTING values = data.\n\nCOMMIT WORK. \" Executes immediately in current work process\n```\n\n### Update Function Implementation\n\n```abap\nFUNCTION z_update_func\n IMPORTING\n VALUE(values) TYPE some_dbtab.\n\n MODIFY some_dbtab FROM @values.\n\nENDFUNCTION.\n```\n\n---\n\n## Background RFC (bgRFC)\n\n```abap\nCALL FUNCTION 'Z_REMOTE_FUNC' IN BACKGROUND UNIT\n EXPORTING param1 = value1.\n```\n\nEnables asynchronous execution in same or different ABAP systems.\n\n---\n\n## Subroutines (Deprecated)\n\n```abap\n\" Register for commit\nPERFORM some_subroutine ON COMMIT.\n\n\" Register for rollback\nPERFORM some_subroutine ON ROLLBACK.\n\n\" Data transfer via ABAP memory\nEXPORT data_var TO MEMORY ID 'KEY'.\nIMPORT data_var FROM MEMORY ID 'KEY'.\n```\n\n---\n\n## Implicit Database Commits\n\nTriggered automatically by:\n- Dialog step completion (dynpro PAI/PBO)\n- Synchronous/asynchronous RFC calls\n- HTTP/HTTPS/SMTP communication\n- WAIT statements\n- Sending messages (error, information, warning)\n\n---\n\n## ABAP Cloud Behavior\n\n```abap\n\" Both behave identically in ABAP Cloud\nCOMMIT WORK.\nCOMMIT WORK AND WAIT.\n```\n\nIn ABAP Cloud:\n- Local updates always enforced implicitly\n- Updates occur in same work process\n- Always synchronous\n\n---\n\n## RAP Integration\n\n```abap\n\" RAP-specific commit\nCOMMIT ENTITIES. \" Implicitly triggers COMMIT WORK\n\n\" RAP-specific rollback\nROLLBACK ENTITIES. \" Resets all changes\n```\n\n---\n\n## Controlled SAP LUW\n\nEnhanced transactional phase management:\n\n```abap\n\" Activate modify phase\ncl_abap_tx=>modify( ).\n\n\" Database modifications NOT allowed here\n\" Would throw BEHAVIOR_ILLEGAL_STMT_IN_CALL\n\n\" Activate save phase\ncl_abap_tx=>save( ).\n\n\" Database modifications allowed here\nMODIFY zdemo_table FROM TABLE @itab.\n```\n\n---\n\n## Transactional Phases\n\n| Phase | Database Modifications |\n|-------|----------------------|\n| Modify | Not allowed |\n| Save | Allowed |\n\n---\n\n## Lock Objects\n\n```abap\n\" Enqueue (lock)\nCALL FUNCTION 'ENQUEUE_EZLOCK'\n EXPORTING\n mode_table = 'E'\n key = value\n EXCEPTIONS\n foreign_lock = 1.\n\n\" Dequeue (unlock)\nCALL FUNCTION 'DEQUEUE_EZLOCK'\n EXPORTING\n mode_table = 'E'\n key = value.\n```\n\n---\n\n## Best Practices\n\n1. **Use COMMIT WORK AND WAIT** when immediate confirmation needed\n2. **Avoid implicit commits** in transaction-critical code\n3. **Use RAP** for modern transactional scenarios\n4. **Bundle modifications** for consistency\n5. **Handle locks** appropriately\n6. **Test rollback scenarios** thoroughly\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":3785,"content_sha256":"4bd35ffcd170112a9a05518744f64938e1040b36dd401da2ec3f43f1093b7a23"},{"filename":"references/skill-reference-guide.md","content":"# SAP ABAP Skill Reference Guide\n\nThis document provides a comprehensive guide to all reference materials available for the SAP ABAP skill.\n\n## Core Language References\n\n### Data Types and Declarations\n- **Internal Tables**: `references/internal-tables.md` - Complete table operations, keys, grouping, table expressions\n- **ABAP Dictionary**: `references/abap-dictionary.md` - Data elements, domains, structures, table types\n- **Date and Time**: `references/date-time.md` - Type d, t, utclong, timestamps, XCO library\n- **Numeric Operations**: `references/numeric-operations.md` - Math functions, big integers, decimal floating points\n- **Bits and Bytes**: `references/bits-bytes.md` - Binary operations, CASTING, bit manipulation\n- **String Processing**: `references/string-processing.md` - String functions, templates, FIND, REPLACE, regex\n\n### Program Flow and Control\n- **Program Flow**: `references/program-flow.md` - IF, CASE, LOOP, DO, WHILE, control statements\n- **Constructor Expressions**: `references/constructor-expressions.md` - VALUE, NEW, CONV, CORRESPONDING, COND, REDUCE\n- **Built-in Functions**: `references/builtin-functions.md` - String, numeric, table, logical functions\n\n### ABAP SQL and Database Access\n- **ABAP SQL**: `references/abap-sql.md` - SELECT, INSERT, UPDATE, DELETE, JOINs, CTEs, aggregate functions\n- **SQL Hierarchies**: `references/sql-hierarchies.md` - CTE hierarchies, HIERARCHY descendants/ancestors\n- **WHERE Conditions**: `references/where-conditions.md` - SQL and table WHERE patterns, operators\n- **SAP LUW**: `references/sap-luw.md` - Logical Unit of Work, COMMIT, ROLLBACK, database transactions\n\n### Object-Oriented Programming\n- **Object Orientation**: `references/object-orientation.md` - Classes, interfaces, inheritance, polymorphism\n- **Design Patterns**: `references/design-patterns.md` - Factory, Singleton, Strategy, Observer patterns\n- **Dynamic Programming**: `references/dynamic-programming.md` - RTTI, RTTC, field symbols, data references\n\n### Modern ABAP and RAP\n- **RAP and EML**: `references/rap-eml.md` - RESTful Application Programming Model, EML statements\n- **CDS Views**: `references/cds-views.md` - Core Data Services, view entities, associations\n- **ABAP Cloud**: `references/cloud-development.md` - Cloud-ready development, released APIs\n- **Released Classes**: `references/released-classes.md` - Released API catalog for ABAP Cloud\n- **AMDP**: `references/amdp.md` - ABAP Managed Database Procedures, SQLScript integration\n\n### Testing and Error Handling\n- **Unit Testing**: `references/unit-testing.md` - ABAP Unit framework, test classes, assertions\n- **Exception Handling**: `references/exceptions.md` - TRY/CATCH, exception classes, error handling\n- **Authorization**: `references/authorization.md` - AUTHORITY-CHECK, DCL, access control\n\n### Performance and Optimization\n- **Performance**: `references/performance.md` - Database access optimization, internal table performance\n- **Table Grouping**: `references/table-grouping.md` - GROUP BY loops, aggregation patterns\n\n### Data Exchange and Integration\n- **XML/JSON Processing**: `references/xml-json.md` - iXML, sXML, CALL TRANSFORMATION\n- **Generative AI**: `references/generative-ai.md` - AI SDK, LLM integration, Joule\n\n## Source Documentation\n\nAll content based on official SAP ABAP Cheat Sheets:\n- **Repository**: [https://github.com/SAP-samples/abap-cheat-sheets](https://github.com/SAP-samples/abap-cheat-sheets)\n- **SAP Help**: [https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm](https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm)\n\n## How to Use This Guide\n\n1. **Quick Reference**: Look at SKILL.md for commonly used patterns\n2. **Detailed Information**: Navigate to specific reference files using this guide\n3. **Examples**: Each reference file contains practical code examples\n4. **Best Practices**: All references include performance tips and common pitfalls\n\n## Skill Structure\n\n```\nsap-abap/\n├── SKILL.md # Quick reference and common patterns\n├── README.md # Skill overview and auto-trigger keywords\n└── references/ # Detailed reference files (28 files)\n ├── skill-reference-guide.md # This file - complete guide to references\n ├── internal-tables.md # Table operations (562 lines)\n ├── abap-sql.md # SQL reference (563 lines)\n ├── string-processing.md # String functions (563 lines)\n ... and 25 more specialized references\n```\n\n## Last Updated\n\n- **Skill Version**: 1.1.0\n- **Last Updated**: 2026-04-02\n- **ABAP Release**: 7.40 SP08+ / 7.50+ / ABAP Cloud\n- **Reference Files**: 28\n- **Total Lines**: ~25,000 across all reference files\n\n## Version Compatibility\n\nThis skill targets ABAP 7.40 SP08 and above. Features requiring higher releases are\nannotated in individual reference files. Key boundaries:\n\n- **7.40 SP02**: Inline declarations, constructor expressions, table expressions, string templates\n- **7.40 SP05**: `@` host variables, comma syntax, SQL expressions, `CORRESPONDING`, `LET`, `FOR`\n- **7.40 SP08**: `REDUCE`, `FILTER`, `BASE`, `GROUP BY` for internal tables, CDS parameters\n- **7.50**: `FINAL(...)`, host expressions `@(...)`, `UNION`, `IS INSTANCE OF`, CDS table functions\n- **7.51**: CTEs (`WITH`), `OFFSET`, `UPPER`/`LOWER` in SQL, enumerated types\n- **7.52**: `FROM @itab`, `WITH PRIVILEGED ACCESS`, virtual sort\n\nSee the Version Compatibility table in SKILL.md for the complete feature matrix.\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":5562,"content_sha256":"557f7255352ed7c4086b968029f158cfe8cc2d961cb44439d372db67c2c26b6e"},{"filename":"references/sql-hierarchies.md","content":"# ABAP SQL Hierarchies - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/10_ABAP_SQL_Hierarchies.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/10_ABAP_SQL_Hierarchies.md)\n\n> **Version Note**: SQL hierarchies require CTEs (`WITH`) which are available from **7.51+**.\n> `FINAL(...)` in code examples requires **7.50+** — replace with `DATA(...)` on 7.40.\n> Hierarchy navigators are available from **7.51+**.\n\n---\n\n## CTE Hierarchies\n\nCommon Table Expressions can declare SQL hierarchies using `WITH HIERARCHY`.\n\n### CDS Hierarchy as CTE Source\n\n```abap\nWITH\n +tree AS\n ( SELECT FROM demo_cds_simple_tree( p_id = @root_id )\n FIELDS * )\n WITH HIERARCHY demo_cds_simple_tree\n SELECT FROM +tree\n FIELDS id, parent, name, hierarchy_rank,\n hierarchy_tree_size, hierarchy_level\n INTO TABLE @FINAL(cte_cds_result).\n```\n\n### HIERARCHY Generator as CTE Source\n\n```abap\nWITH\n +tree AS\n ( SELECT FROM HIERARCHY(\n SOURCE demo_cds_simple_tree_view\n CHILD TO PARENT ASSOCIATION _tree\n START WHERE id = @root_id\n SIBLINGS ORDER BY id\n MULTIPLE PARENTS NOT ALLOWED ) AS asql_hierarchy\n FIELDS id, parent, name )\n WITH HIERARCHY asql_hierarchy\n SELECT FROM +tree\n FIELDS id, parent, hierarchy_distance\n INTO TABLE @FINAL(cte_asql_result).\n```\n\n### CTE with Internal Associations\n\n```abap\nWITH\n +cte_simple_tree_source AS\n ( SELECT FROM demo_simple_tree\n FIELDS id, parent_id AS parent, name )\n WITH ASSOCIATIONS (\n JOIN TO MANY +cte_simple_tree_source AS _tree\n ON +cte_simple_tree_source~parent = _tree~id ),\n +tree AS\n ( SELECT FROM HIERARCHY(\n SOURCE +cte_simple_tree_source\n CHILD TO PARENT ASSOCIATION _tree\n START WHERE id = @root_id\n SIBLINGS ORDER BY id\n MULTIPLE PARENTS NOT ALLOWED ) AS cte_hierarchy\n FIELDS id, parent, name )\n WITH HIERARCHY cte_hierarchy\n SELECT FROM +tree\n FIELDS id, parent, hierarchy_rank\n INTO TABLE @FINAL(cte_cte_result).\n```\n\n---\n\n## HIERARCHY Generator\n\nCreate SQL hierarchies directly in ABAP:\n\n```abap\nDATA root_id TYPE demo_cds_simple_tree_view-id.\n\nSELECT FROM HIERARCHY( SOURCE demo_cds_simple_tree_view\n CHILD TO PARENT ASSOCIATION _tree\n START WHERE id = @root_id\n SIBLINGS ORDER BY id\n MULTIPLE PARENTS NOT ALLOWED )\n FIELDS id, parent, name, hierarchy_rank,\n hierarchy_tree_size, hierarchy_parent_rank,\n hierarchy_level, hierarchy_is_cycle,\n hierarchy_is_orphan, node_id, parent_id\n INTO TABLE @FINAL(asql_cds_result).\n```\n\n### Key Parameters\n\n| Parameter | Description |\n|-----------|-------------|\n| `SOURCE` | Hierarchy source (CDS view or CTE) |\n| `CHILD TO PARENT ASSOCIATION` | Self-association for relationships |\n| `START WHERE` | Root node conditions |\n| `SIBLINGS ORDER BY` | Sort order for siblings |\n| `MULTIPLE PARENTS NOT ALLOWED` | Single/multiple parent control |\n\n---\n\n## Hierarchy Navigators\n\n### HIERARCHY_DESCENDANTS\n\n```abap\nSELECT FROM HIERARCHY_DESCENDANTS(\n SOURCE demo_cds_simple_tree( p_id = @root_id )\n START WHERE id = @sub_id )\n FIELDS id, parent_id, name, hierarchy_distance\n INTO TABLE @FINAL(descendants).\n```\n\n### HIERARCHY_ANCESTORS\n\n```abap\nSELECT FROM HIERARCHY_ANCESTORS(\n SOURCE demo_cds_simple_tree( p_id = @root_id )\n START WHERE id = @max_id )\n FIELDS id, parent_id, name, hierarchy_distance\n INTO TABLE @FINAL(ancestors).\n```\n\n### HIERARCHY_SIBLINGS\n\n```abap\nSELECT FROM HIERARCHY_SIBLINGS(\n SOURCE demo_cds_simple_tree( p_id = @root_id )\n START WHERE id = @sibl_id )\n FIELDS id, parent_id, name, hierarchy_sibling_distance\n INTO TABLE @FINAL(siblings).\n```\n\n### HIERARCHY_DESCENDANTS_AGGREGATE\n\n```abap\nTYPES:\n BEGIN OF value,\n id TYPE i,\n amount TYPE p LENGTH 16 DECIMALS 2,\n END OF value.\n\nDATA value_tab TYPE SORTED TABLE OF value WITH UNIQUE KEY id.\n\nSELECT FROM HIERARCHY_DESCENDANTS_AGGREGATE(\n SOURCE demo_cds_simple_tree( p_id = @sub_id ) AS h\n JOIN @value_tab AS v\n ON v~id = h~id\n MEASURES SUM( v~amount ) AS amount_sum\n WHERE hierarchy_rank > 1\n WITH SUBTOTAL\n WITH BALANCE )\n FIELDS id, amount_sum, hierarchy_rank, hierarchy_aggregate_type\n INTO TABLE @FINAL(descendants_aggregate).\n```\n\n### Aggregate Parameters\n\n| Parameter | Description |\n|-----------|-------------|\n| `MEASURES` | Aggregate functions (SUM, COUNT, etc.) |\n| `WHERE` | Result set restrictions |\n| `WITH SUBTOTAL` | Sum of qualifying nodes |\n| `WITH BALANCE` | Sum of non-qualifying nodes |\n\n---\n\n## Implicit Hierarchy Columns\n\n| Column | Description |\n|--------|-------------|\n| `hierarchy_rank` | Position in traversal order |\n| `hierarchy_tree_size` | Count of descendants + self |\n| `hierarchy_parent_rank` | Rank of parent node |\n| `hierarchy_level` | Depth from root |\n| `hierarchy_is_cycle` | Cycle detection flag |\n| `hierarchy_is_orphan` | Orphan node flag |\n| `hierarchy_distance` | Distance from start node |\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":5295,"content_sha256":"b2405ecdb652e3da78c6a5c6fbb6c7a9a9cfab7a3c6a93b804ecefdce1a6bb56"},{"filename":"references/string-processing.md","content":"# ABAP String Processing - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/07_String_Processing.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/07_String_Processing.md)\n\n> **Version Note**: `FINAL(...)` requires **7.50+** — use `DATA(...)` on 7.40.\n> All string functions and templates are available from 7.40 SP02+.\n\n## Table of Contents\n\n1. [String Data Types](#string-data-types)\n2. [String Templates](#string-templates)\n3. [String Functions](#string-functions)\n4. [FIND and REPLACE](#find-and-replace)\n5. [Regular Expressions](#regular-expressions)\n6. [Split and Concatenate](#split-and-concatenate)\n7. [Case Conversion](#case-conversion)\n8. [Numeric String Operations](#numeric-string-operations)\n\n---\n\n## String Data Types\n\n| Type | Description | Length | Initial Value |\n|------|-------------|--------|---------------|\n| `string` | Variable-length text | Dynamic (up to 2GB) | Empty string |\n| `c` | Fixed-length text | 1-262,143 chars | Blanks |\n| `n` | Numeric characters | Digits 0-9 only | Zeros |\n| `d` | Date field | 8 chars (YYYYMMDD) | '00000000' |\n| `t` | Time field | 6 chars (HHMMSS) | '000000' |\n| `x` | Fixed-length bytes | Raw byte data | Hex zeros |\n| `xstring` | Variable-length bytes | Dynamic | Empty |\n\n---\n\n## Declaration and Literals\n\n```abap\n\" String declaration\nDATA str TYPE string.\nDATA str VALUE `initial value`.\nDATA(inline_str) = `Hello`.\nFINAL(immutable) = `constant`.\n\n\" Fixed-length character\nDATA char TYPE c LENGTH 10.\nDATA char(10) TYPE c VALUE 'fixed text'.\n\n\" Literals\nDATA(text_field) = 'single quotes'. \" Type c, trailing blanks trimmed\nDATA(text_string) = `backquotes`. \" Type string, blanks preserved\n\n\" Escape backquote in string\nDATA(escaped) = `This is a backquote: ``.`.\n```\n\n---\n\n## String Templates\n\n```abap\n\" Basic syntax with pipes and curly braces\nDATA(msg) = |Hello { name }!|.\nDATA(result) = |Value: { value }, Status: { status }|.\n\n\" Control characters\nDATA(multiline) = |Line 1\\nLine 2\\nLine 3|.\nDATA(tabbed) = |Col1\\tCol2\\tCol3|.\n\n\" Escape special characters with backslash\nDATA(special) = |Pipe: \\|, Backslash: \\\\, Brace: \\{|.\n```\n\n### Formatting Options\n\n```abap\n\" Date formatting\nDATA(date_iso) = |{ sy-datum DATE = ISO }|. \" 2024-01-15\nDATA(date_user) = |{ sy-datum DATE = USER }|. \" Per user settings\n\n\" Time formatting\nDATA(time_iso) = |{ sy-uzeit TIME = ISO }|. \" 14:30:00\n\n\" Case transformation\nDATA(upper) = |{ text CASE = UPPER }|.\nDATA(lower) = |{ text CASE = LOWER }|.\n\n\" Width and alignment\nDATA(left) = |{ text WIDTH = 20 ALIGN = LEFT }|.\nDATA(right) = |{ text WIDTH = 20 ALIGN = RIGHT }|.\nDATA(center) = |{ text WIDTH = 20 ALIGN = CENTER }|.\n\n\" Padding\nDATA(padded) = |{ num WIDTH = 10 PAD = '0' }|.\n\n\" Number formatting\nDATA(decimals) = |{ amount DECIMALS = 2 }|.\nDATA(sign) = |{ amount SIGN = LEFT }|.\nDATA(no_zero) = |{ 0 ZERO = NO }|. \" Empty if zero\n\n\" Alpha conversion (leading zeros)\nDATA(with_zeros) = |{ '1234' ALPHA = IN WIDTH = 10 }|. \" 0000001234\nDATA(no_zeros) = |{ '00001234' ALPHA = OUT }|. \" 1234\n\n\" Scientific notation\nDATA(scientific) = |{ number STYLE = SCIENTIFIC }|.\n```\n\n---\n\n## String Length\n\n```abap\n\" strlen - includes trailing blanks for string, not for c\nDATA(len_c) = strlen( 'abc ' ). \" 3\nDATA(len_str) = strlen( `abc ` ). \" 6\n\n\" numofchar - excludes trailing blanks for all types\nDATA(chars_c) = numofchar( 'abc ' ). \" 3\nDATA(chars_str) = numofchar( `abc ` ). \" 3\n\n\" xstrlen - byte length for byte strings\nDATA(bytes) = xstrlen( xstr ).\n```\n\n---\n\n## Concatenation\n\n```abap\n\" && operator\nDATA(full) = first && ` ` && last.\nDATA(url) = `https://` && domain && `/` && path.\n\n\" &&= assignment operator\ntext &&= ` additional`.\n\n\" CONCATENATE statement\nCONCATENATE str1 str2 INTO result.\nCONCATENATE str1 str2 str3 INTO result SEPARATED BY `,`.\nCONCATENATE 'a ' 'b ' 'c ' INTO result RESPECTING BLANKS.\n\n\" Concatenate table lines\nCONCATENATE LINES OF itab INTO result.\nCONCATENATE LINES OF itab INTO result SEPARATED BY `,`.\n\n\" concat_lines_of function\nDATA(joined) = concat_lines_of( table = itab ).\nDATA(joined_sep) = concat_lines_of( table = itab sep = `, ` ).\n```\n\n---\n\n## Splitting\n\n```abap\n\" SPLIT into variables\nSPLIT text AT `,` INTO part1 part2 part3.\n\n\" SPLIT into table\nSPLIT text AT `,` INTO TABLE itab.\n\n\" segment function - get specific part\nDATA(second) = segment( val = text index = 2 sep = `,` ).\n```\n\n---\n\n## Case Transformation\n\n```abap\n\" String functions (return new string)\nDATA(upper_text) = to_upper( text ).\nDATA(lower_text) = to_lower( text ).\n\n\" TRANSLATE statement (modifies source)\nTRANSLATE text TO UPPER CASE.\nTRANSLATE text TO LOWER CASE.\n```\n\n---\n\n## Shifting and Condensing\n\n```abap\n\" SHIFT statement\nSHIFT text. \" 1 place left\nSHIFT text BY 3 PLACES LEFT.\nSHIFT text BY 3 PLACES RIGHT.\nSHIFT text BY 3 PLACES LEFT CIRCULAR. \" Wrap around\nSHIFT text UP TO 'abc'. \" Shift to substring\nSHIFT text LEFT DELETING LEADING ` `.\nSHIFT text RIGHT DELETING TRAILING ` `.\n\n\" shift_left/shift_right functions\nDATA(shifted) = shift_left( val = text places = 3 ).\nDATA(shifted) = shift_left( val = text circular = 2 ).\nDATA(shifted) = shift_right( val = text sub = ` ` ).\n\n\" CONDENSE statement\nCONDENSE text. \" Remove leading/trailing, compress\nCONDENSE text NO-GAPS. \" Remove all blanks\n\n\" condense function\nDATA(condensed) = condense( text ).\nDATA(condensed) = condense( val = text to = `` ). \" No-gaps effect\nDATA(condensed) = condense( val = text del = `#` from = `x` to = `y` ).\n```\n\n---\n\n## Substring Operations\n\n```abap\n\" substring function\nDATA(sub) = substring( val = text off = 5 ). \" From position 5 to end\nDATA(sub) = substring( val = text len = 3 ). \" First 3 chars\nDATA(sub) = substring( val = text off = 5 len = 3 ). \" 3 chars from position 5\n\n\" Direct offset/length notation\nDATA(first5) = text(5).\nDATA(from3) = text+3.\nDATA(from3_len5) = text+3(5).\nDATA(rest) = text+5(*). \" * = rest of string\n\n\" Modify substring\ntext(5) = 'Hello'.\ntext+3(3) = '###'.\n\n\" Advanced substring functions\nDATA(after) = substring_after( val = text sub = `prefix` ).\nDATA(before) = substring_before( val = text sub = `suffix` ).\nDATA(from) = substring_from( val = text sub = `start` ).\nDATA(to) = substring_to( val = text sub = `end` ).\n```\n\n---\n\n## Finding Substrings\n\n### find Function\n\n```abap\n\" Basic search (returns offset or -1)\nDATA(pos) = find( val = text sub = `search` ).\n\n\" Case-insensitive\nDATA(pos) = find( val = text sub = `SEARCH` case = abap_false ).\n\n\" Occurrence (1 = first, 2 = second, -1 = last)\nDATA(pos) = find( val = text sub = `x` occ = 2 ).\nDATA(pos) = find( val = text sub = `x` occ = -1 ). \" From right\n\n\" With offset and length\nDATA(pos) = find( val = text sub = `x` off = 5 len = 10 ).\n\n\" Find end position\nDATA(end_pos) = find_end( val = text sub = `search` ).\n```\n\n### FIND Statement\n\n```abap\n\" Basic find\nFIND 'pattern' IN text.\nIF sy-subrc = 0.\n \" Found\nENDIF.\n\n\" With result information\nFIND FIRST OCCURRENCE OF `pattern` IN text\n MATCH COUNT DATA(count)\n MATCH OFFSET DATA(offset)\n MATCH LENGTH DATA(length).\n\n\" All occurrences\nFIND ALL OCCURRENCES OF `pattern` IN text\n MATCH COUNT DATA(total_count)\n RESULTS DATA(match_results).\n\n\" With section\nFIND ALL OCCURRENCES OF `x` IN SECTION OFFSET 5 LENGTH 20 OF text\n MATCH COUNT DATA(cnt).\n\n\" Case sensitivity\nFIND `ABC` IN text IGNORING CASE MATCH OFFSET DATA(off).\nFIND `ABC` IN text RESPECTING CASE MATCH OFFSET DATA(off).\n\n\" Regular expression\nFIND FIRST OCCURRENCE OF PCRE `\\d+` IN text\n MATCH OFFSET DATA(num_offset)\n MATCH LENGTH DATA(num_length).\n\n\" In table\nFIND ALL OCCURRENCES OF `pattern` IN TABLE itab\n RESULTS DATA(table_results).\n```\n\n---\n\n## Character Set Operations\n\n### Comparison Operators\n\n```abap\n\" CA - Contains Any\nIF text CA 'aeiou'. \" Contains any vowel\n DATA(pos) = sy-fdpos. \" Position of first match\nENDIF.\n\n\" NA - Not Contains Any (negation of CA)\nIF text NA 'xyz'.\n \" Contains none of x, y, z\nENDIF.\n\n\" CO - Contains Only\nIF text CO '0123456789'. \" Only digits\nENDIF.\n\n\" CN - Contains Not Only\nIF text CN 'abc'. \" Contains other than a, b, c\nENDIF.\n\n\" CS - Contains String\nIF text CS 'pattern'. \" Case-insensitive substring\nENDIF.\n\n\" NS - Not Contains String\nIF text NS 'pattern'.\nENDIF.\n\n\" CP - Conforms to Pattern\nIF text CP '*test*'. \" * = any chars, + = single char\nENDIF.\n```\n\n### Character Functions\n\n```abap\n\" find_any_of - offset of first occurrence of any character\nDATA(pos) = find_any_of( val = text sub = `aeiou` ).\n\n\" find_any_not_of - offset of first char not in set\nDATA(pos) = find_any_not_of( val = text sub = `0123456789` ).\n\n\" count - occurrences of substring\nDATA(cnt) = count( val = text sub = `a` ).\n\n\" count_any_of - occurrences of any character in set\nDATA(cnt) = count_any_of( val = text sub = `aeiou` ).\n\n\" count_any_not_of - occurrences of chars not in set\nDATA(cnt) = count_any_not_of( val = text sub = `aeiou` ).\n```\n\n---\n\n## Replacing\n\n### replace Function\n\n```abap\n\" First occurrence\nDATA(result) = replace( val = text sub = `old` with = `new` ).\n\n\" All occurrences (occ = 0)\nDATA(result) = replace( val = text sub = `old` with = `new` occ = 0 ).\n\n\" Specific occurrence\nDATA(result) = replace( val = text sub = `x` with = `y` occ = 2 ).\n\n\" From right (negative occ)\nDATA(result) = replace( val = text sub = `x` with = `y` occ = -1 ).\n\n\" Case-insensitive\nDATA(result) = replace( val = text sub = `OLD` with = `new` case = abap_false ).\n\n\" Position-based (when sub not specified)\nDATA(result) = replace( val = text with = `new` off = 5 len = 3 ).\n```\n\n### REPLACE Statement\n\n```abap\n\" First occurrence\nREPLACE 'old' IN text WITH 'new'.\n\n\" All occurrences\nREPLACE ALL OCCURRENCES OF 'old' IN text WITH 'new'.\n\n\" With results\nREPLACE ALL OCCURRENCES OF 'old' IN text WITH 'new'\n REPLACEMENT COUNT DATA(count)\n REPLACEMENT OFFSET DATA(offset)\n REPLACEMENT LENGTH DATA(length)\n RESULTS DATA(results).\n\n\" Case-insensitive\nREPLACE ALL OCCURRENCES OF 'OLD' IN text WITH 'new' IGNORING CASE.\n\n\" Section replacement\nREPLACE SECTION OFFSET 5 LENGTH 3 OF text WITH 'new'.\n\n\" In table\nREPLACE ALL OCCURRENCES OF 'old' IN TABLE itab WITH 'new'.\n```\n\n### translate Function\n\n```abap\n\" Character-by-character replacement\nDATA(result) = translate( val = text from = `abc` to = `xyz` ).\n\" a->x, b->y, c->z\n\n\" TRANSLATE statement\nTRANSLATE text USING 'axbycz'. \" Pairs: a->x, b->y, c->z\n```\n\n---\n\n## Regular Expressions\n\n```abap\n\" FIND with PCRE\nFIND FIRST OCCURRENCE OF PCRE `\\d{3}-\\d{4}` IN text\n MATCH OFFSET DATA(off)\n MATCH LENGTH DATA(len).\n\nFIND ALL OCCURRENCES OF PCRE `[a-z]+` IN text\n RESULTS DATA(matches).\n\n\" REPLACE with PCRE\nREPLACE ALL OCCURRENCES OF PCRE `\\s+` IN text WITH ` `.\n\n\" Backreferences\nREPLACE ALL OCCURRENCES OF PCRE `(\\w+)\\s+\\1` IN text WITH `$1`.\n\n\" String functions with PCRE\nDATA(pos) = find( val = text pcre = `\\d+` ).\nDATA(result) = replace( val = text pcre = `\\s+` with = `-` occ = 0 ).\nDATA(matched) = match( val = text pcre = `[A-Z]+` ).\n\n\" Class-based approach\nDATA(regex) = cl_abap_regex=>create_pcre( pattern = `\\d+` ).\nDATA(matcher) = regex->create_matcher( text = text ).\nDATA(results) = matcher->find_all( ).\n```\n\n---\n\n## Other String Functions\n\n```abap\n\" Reverse\nDATA(reversed) = reverse( text ).\n\n\" Insert\nDATA(result) = insert( val = text sub = `new` off = 5 ).\n\n\" Repeat\nDATA(repeated) = repeat( val = `abc` occ = 3 ). \" abcabcabc\n\n\" String comparison (min/max)\nDATA(smallest) = cmin( val1 = str1 val2 = str2 val3 = str3 ).\nDATA(biggest) = cmax( val1 = str1 val2 = str2 val3 = str3 ).\n\n\" Levenshtein distance\nDATA(dist) = distance( val1 = `abap` val2 = `abac` ).\n\n\" Escape special characters\nDATA(escaped) = escape( val = text format = cl_abap_format=>e_url_full ).\nDATA(json_safe) = escape( val = text format = cl_abap_format=>e_json_string ).\nDATA(template_safe) = escape( val = text format = cl_abap_format=>e_string_tpl ).\n```\n\n---\n\n## Utility Classes\n\n```abap\n\" CL_ABAP_STRING_UTILITIES\ncl_abap_string_utilities=>del_trailing_blanks( CHANGING str = text ).\ntext = cl_abap_string_utilities=>c2str_preserving_blanks( char ).\n\n\" CL_ABAP_CHAR_UTILITIES\nDATA(cr) = cl_abap_char_utilities=>cr_lf.\nDATA(tab) = cl_abap_char_utilities=>horizontal_tab.\nDATA(newline) = cl_abap_char_utilities=>newline.\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":12484,"content_sha256":"2e24261453f027855711eb8702ab7a24bf1c812ed5b7c5c5705b43caa8b9e488"},{"filename":"references/table-grouping.md","content":"# Internal Table Grouping - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/11_Internal_Tables_Grouping.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/11_Internal_Tables_Grouping.md)\n\n---\n\n## Basic Grouping\n\n### Single Column Grouping\n\n```abap\n\" Representative binding (work area represents group)\nLOOP AT spfli_tab INTO wa GROUP BY wa-carrid.\n ... wa-carrid ...\nENDLOOP.\n```\n\n### With Member Loop\n\n```abap\nLOOP AT spfli_tab INTO wa GROUP BY wa-carrid.\n LOOP AT GROUP wa INTO DATA(member).\n ... member-... ...\n ENDLOOP.\nENDLOOP.\n```\n\n---\n\n## Multiple Column Grouping\n\n### Structured Group Key\n\n```abap\nLOOP AT spfli_tab INTO wa\n GROUP BY ( key1 = wa-carrid key2 = wa-airpfrom ).\n ... wa-carrid ... wa-airpfrom ...\nENDLOOP.\n```\n\n---\n\n## Explicit Group Key Binding\n\n### Single Column\n\n```abap\nLOOP AT spfli_tab INTO wa\n GROUP BY wa-carrid\n INTO DATA(key).\n ... key ...\nENDLOOP.\n```\n\n### Multiple Columns\n\n```abap\nLOOP AT spfli_tab INTO wa\n GROUP BY ( key1 = wa-carrid key2 = wa-airpfrom )\n INTO DATA(key).\n ... key-key1 ... key-key2 ...\nENDLOOP.\n```\n\n---\n\n## Group Metadata\n\n### GROUP SIZE and GROUP INDEX\n\n```abap\nLOOP AT spfli_tab INTO wa\n GROUP BY ( key1 = wa-carrid key2 = wa-airpfrom\n index = GROUP INDEX size = GROUP SIZE )\n WITHOUT MEMBERS\n INTO DATA(key).\n ... key-key1 ... key-key2 ... key-index ... key-size ...\nENDLOOP.\n```\n\n---\n\n## WITHOUT MEMBERS\n\nSkip member iteration, only process group keys:\n\n```abap\nLOOP AT spfli_tab INTO wa\n GROUP BY wa-carrid\n WITHOUT MEMBERS\n INTO DATA(key).\n \" Only group key available, no member loop possible\n ... key ...\nENDLOOP.\n```\n\n---\n\n## Binding Types Comparison\n\n| Type | Description | Features |\n|------|-------------|----------|\n| Representative | Work area represents group | Simpler syntax |\n| Group Key | Explicit output area | GROUP INDEX, GROUP SIZE, WITHOUT MEMBERS |\n\n---\n\n## Advanced Patterns\n\n### Aggregation with Grouping\n\n```abap\nLOOP AT flights INTO DATA(flight)\n GROUP BY flight-carrid\n INTO DATA(carrier).\n\n DATA(total) = REDUCE i( INIT sum = 0\n FOR member IN GROUP carrier\n NEXT sum = sum + member-price ).\n\n out->write( |{ carrier }: { total }| ).\nENDLOOP.\n```\n\n### Nested Grouping\n\n```abap\nLOOP AT itab INTO wa\n GROUP BY ( cat1 = wa-field1 cat2 = wa-field2 )\n INTO DATA(group1).\n\n LOOP AT GROUP group1 INTO DATA(member)\n GROUP BY member-field3\n INTO DATA(group2).\n\n LOOP AT GROUP group2 INTO DATA(detail).\n \" Process detail\n ENDLOOP.\n ENDLOOP.\nENDLOOP.\n```\n\n---\n\n## Best Practices\n\n1. **Use GROUP SIZE** for counting without member iteration\n2. **Use WITHOUT MEMBERS** when only aggregates needed\n3. **Prefer structured keys** for multi-column grouping\n4. **Use REDUCE** for aggregations within groups\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":2794,"content_sha256":"ea03ac33630104830c802ff7590fc17e84fdd89cbb3f88a648f13792070f1443"},{"filename":"references/unit-testing.md","content":"# ABAP Unit Testing - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/14_ABAP_Unit_Tests.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/14_ABAP_Unit_Tests.md)\n\n> **Version Note**: Test seams (`TEST-SEAM`/`TEST-INJECTION`) require **7.50+**.\n> Test relations (`@testing` ABAP Doc) require **7.52+**. All other ABAP Unit\n> features are available from 7.40+.\n\n---\n\n## Test Class Structure\n\n```abap\nCLASS ltc_test_class DEFINITION\n FOR TESTING\n RISK LEVEL HARMLESS\n DURATION SHORT.\n\n PRIVATE SECTION.\n DATA cut TYPE REF TO zcl_class_under_test. \" Class Under Test\n\n CLASS-METHODS class_setup.\n CLASS-METHODS class_teardown.\n METHODS setup.\n METHODS teardown.\n\n METHODS test_method_1 FOR TESTING.\n METHODS test_method_2 FOR TESTING.\n\nENDCLASS.\n\nCLASS ltc_test_class IMPLEMENTATION.\n\n METHOD class_setup.\n \" Run once before all tests\n ENDMETHOD.\n\n METHOD class_teardown.\n \" Run once after all tests\n ENDMETHOD.\n\n METHOD setup.\n \" Run before each test\n cut = NEW #( ).\n ENDMETHOD.\n\n METHOD teardown.\n \" Run after each test\n CLEAR cut.\n ENDMETHOD.\n\n METHOD test_method_1.\n \" Given\n DATA(input) = 5.\n\n \" When\n DATA(result) = cut->multiply_by_two( input ).\n\n \" Then\n cl_abap_unit_assert=>assert_equals(\n act = result\n exp = 10 ).\n ENDMETHOD.\n\nENDCLASS.\n```\n\n---\n\n## Risk Level and Duration\n\n### Risk Levels\n\n```abap\nRISK LEVEL HARMLESS \" No system changes (default)\nRISK LEVEL CRITICAL \" Changes system settings\nRISK LEVEL DANGEROUS \" Changes persistent data\n```\n\n### Duration\n\n```abap\nDURATION SHORT \" Seconds (default)\nDURATION MEDIUM \" About 1 minute\nDURATION LONG \" More than 1 minute\n```\n\n---\n\n## Fixture Methods\n\n| Method | Type | Execution |\n|--------|------|-----------|\n| `class_setup` | Static | Once before all tests |\n| `setup` | Instance | Before each test |\n| `teardown` | Instance | After each test |\n| `class_teardown` | Static | Once after all tests |\n\n---\n\n## Assertions (CL_ABAP_UNIT_ASSERT)\n\n### Equality and Comparison\n\n```abap\n\" Verify equality\ncl_abap_unit_assert=>assert_equals(\n act = actual_value\n exp = expected_value\n msg = 'Values should be equal' ).\n\n\" Verify difference\ncl_abap_unit_assert=>assert_differs(\n act = value1\n exp = value2 ).\n\n\" Verify number in range\ncl_abap_unit_assert=>assert_number_between(\n lower = 1\n upper = 10\n number = actual_number ).\n```\n\n### Boolean Assertions\n\n```abap\n\" True condition\ncl_abap_unit_assert=>assert_true(\n act = condition\n msg = 'Condition should be true' ).\n\n\" False condition\ncl_abap_unit_assert=>assert_false(\n act = condition ).\n```\n\n### Reference Assertions\n\n```abap\n\" Reference is bound\ncl_abap_unit_assert=>assert_bound(\n act = ref ).\n\n\" Reference is not bound\ncl_abap_unit_assert=>assert_not_bound(\n act = ref ).\n```\n\n### Initial Value Assertions\n\n```abap\n\" Value is initial\ncl_abap_unit_assert=>assert_initial(\n act = data_object ).\n\n\" Value is not initial\ncl_abap_unit_assert=>assert_not_initial(\n act = data_object ).\n```\n\n### System Field Assertions\n\n```abap\n\" Check sy-subrc\ncl_abap_unit_assert=>assert_subrc(\n exp = 0\n msg = 'Operation should succeed' ).\n\n\" Check return code\ncl_abap_unit_assert=>assert_return_code(\n exp = 0\n act = return_code ).\n```\n\n### Table Assertions\n\n```abap\n\" Line exists in table\ncl_abap_unit_assert=>assert_table_contains(\n line = expected_line\n table = itab ).\n\n\" Line does not exist\ncl_abap_unit_assert=>assert_table_not_contains(\n line = line_to_check\n table = itab ).\n```\n\n### String Assertions\n\n```abap\n\" Pattern matching\ncl_abap_unit_assert=>assert_char_cp(\n act = text\n exp = '*error*' ). \" Contains 'error'\n\n\" No pattern match\ncl_abap_unit_assert=>assert_char_np(\n act = text\n exp = '*error*' ).\n\n\" Regex matching\ncl_abap_unit_assert=>assert_text_matches(\n text = actual_text\n pattern = '\\d{3}-\\d{4}' ).\n\n\" No regex match\ncl_abap_unit_assert=>assert_text_not_matches(\n text = actual_text\n pattern = 'error' ).\n```\n\n### Manual Control\n\n```abap\n\" Force test failure\ncl_abap_unit_assert=>fail(\n msg = 'This should not happen' ).\n\n\" Skip test\ncl_abap_unit_assert=>skip(\n msg = 'Prerequisites not met' ).\n```\n\n### Common Parameters\n\n- `act`: Actual value to verify\n- `exp`: Expected value\n- `msg`: Error message (optional)\n- `quit`: Control test flow (use `if_abap_unit_constant=>quit-no` to continue)\n\n---\n\n## Test Class Friendship\n\n```abap\n\" Allow test class to access private methods\nCLASS zcl_production_class DEFINITION LOCAL FRIENDS ltc_test_class.\n\n\" Multiple test classes\nCLASS ltc_test_1 DEFINITION DEFERRED.\nCLASS ltc_test_2 DEFINITION DEFERRED.\nCLASS zcl_production_class DEFINITION LOCAL FRIENDS ltc_test_1 ltc_test_2.\n```\n\n---\n\n## Partial Interface Implementation\n\n```abap\nCLASS ltd_test_double DEFINITION FOR TESTING.\n PUBLIC SECTION.\n INTERFACES zif_some_interface PARTIALLY IMPLEMENTED.\nENDCLASS.\n\nCLASS ltd_test_double IMPLEMENTATION.\n METHOD zif_some_interface~needed_method.\n \" Only implement what's needed for test\n ENDMETHOD.\nENDCLASS.\n```\n\n---\n\n## Test Doubles\n\n### Manual Test Double (Interface-based)\n\n```abap\n\" Test double class\nCLASS ltd_database_access DEFINITION FOR TESTING.\n PUBLIC SECTION.\n INTERFACES zif_database_access.\n DATA returned_data TYPE zdemo_table.\nENDCLASS.\n\nCLASS ltd_database_access IMPLEMENTATION.\n METHOD zif_database_access~get_data.\n result = me->returned_data. \" Return configured data\n ENDMETHOD.\nENDCLASS.\n\n\" Usage in test\nMETHOD test_with_double.\n \" Given\n DATA(double) = NEW ltd_database_access( ).\n double->returned_data = VALUE #( ( id = 1 name = 'Test' ) ).\n\n cut = NEW zcl_processor( database = double ).\n\n \" When\n DATA(result) = cut->process( ).\n\n \" Then\n cl_abap_unit_assert=>assert_equals( act = result exp = 'Test' ).\nENDMETHOD.\n```\n\n### Injection Techniques\n\n**Constructor Injection:**\n```abap\n\" Production class\nCLASS zcl_processor DEFINITION.\n PUBLIC SECTION.\n METHODS constructor\n IMPORTING database TYPE REF TO zif_database_access.\nENDCLASS.\n\n\" In test\ncut = NEW zcl_processor( database = test_double ).\n```\n\n**Setter Injection:**\n```abap\ncut->set_database( test_double ).\n```\n\n**Back Door Injection (via friendship):**\n```abap\n\" With LOCAL FRIENDS declaration\ncut->mo_database = test_double.\n```\n\n---\n\n## Test Seams\n\n### Production Code\n\n```abap\nMETHOD do_something.\n DATA result TYPE string.\n\n TEST-SEAM database_access.\n SELECT * FROM dbtab INTO TABLE @DATA(data).\n result = process( data ).\n END-TEST-SEAM.\n\n RETURN result.\nENDMETHOD.\n```\n\n### Test Code\n\n```abap\nMETHOD test_do_something.\n \" Inject test data\n TEST-INJECTION database_access.\n data = VALUE #( ( id = 1 name = 'Test' ) ).\n result = 'processed'.\n END-TEST-INJECTION.\n\n \" When\n DATA(actual) = cut->do_something( ).\n\n \" Then\n cl_abap_unit_assert=>assert_equals( act = actual exp = 'processed' ).\nENDMETHOD.\n```\n\n---\n\n## ABAP OO Test Double Framework\n\n```abap\n\" Create test double for class\nDATA(double) = CAST zif_my_interface(\n cl_abap_testdouble=>create( 'ZIF_MY_INTERFACE' ) ).\n\n\" Configure method behavior\ncl_abap_testdouble=>configure_call( double\n )->returning( value = 'mocked result'\n )->and_expect( )->is_called_once( ).\n\n\" Set input expectations\ncl_abap_testdouble=>configure_call( double\n )->for_method( 'GET_DATA'\n )->with_parameters(\n VALUE #( ( name = 'ID' value = 1 ) )\n )->returning( VALUE #( ( id = 1 name = 'Test' ) ) ).\n\n\" Verify interactions\ncl_abap_testdouble=>verify_expectations( double ).\n```\n\n---\n\n## SQL Test Double Framework\n\n```abap\nCLASS ltc_sql_test DEFINITION FOR TESTING\n RISK LEVEL HARMLESS DURATION SHORT.\n\n PRIVATE SECTION.\n CLASS-DATA sql_env TYPE REF TO if_osql_test_environment.\n\n CLASS-METHODS class_setup.\n CLASS-METHODS class_teardown.\n\n METHODS test_select FOR TESTING.\nENDCLASS.\n\nCLASS ltc_sql_test IMPLEMENTATION.\n\n METHOD class_setup.\n sql_env = cl_osql_test_environment=>create(\n VALUE #( ( 'ZDEMO_TABLE' ) ) ).\n ENDMETHOD.\n\n METHOD class_teardown.\n sql_env->destroy( ).\n ENDMETHOD.\n\n METHOD test_select.\n \" Insert test data\n sql_env->insert_test_data(\n VALUE zdemo_table( ( id = 1 name = 'Test' ) ) ).\n\n \" Execute code under test\n DATA(result) = cut->read_data( ).\n\n \" Assert\n cl_abap_unit_assert=>assert_equals(\n act = lines( result )\n exp = 1 ).\n\n \" Clear for next test\n sql_env->clear_doubles( ).\n ENDMETHOD.\n\nENDCLASS.\n```\n\n---\n\n## CDS Test Double Framework\n\n```abap\nCLASS ltc_cds_test DEFINITION FOR TESTING\n RISK LEVEL HARMLESS DURATION SHORT.\n\n PRIVATE SECTION.\n CLASS-DATA cds_env TYPE REF TO if_cds_test_environment.\n\n CLASS-METHODS class_setup.\n CLASS-METHODS class_teardown.\nENDCLASS.\n\nCLASS ltc_cds_test IMPLEMENTATION.\n\n METHOD class_setup.\n cds_env = cl_cds_test_environment=>create( 'ZDEMO_CDS_VIEW' ).\n ENDMETHOD.\n\n METHOD class_teardown.\n cds_env->destroy( ).\n ENDMETHOD.\n\nENDCLASS.\n```\n\n---\n\n## RAP BO Test Double Framework\n\n```abap\n\" Transactional buffer double\nDATA(test_env) = cl_botd_txbufdbl_bo_test_env=>create(\n src_bindings = VALUE #( ( 'ZDEMO_RAP_ROOT' ) ) ).\n\n\" Mock EML APIs\nDATA(mock_env) = cl_botd_mockemlapi_bo_test_env=>create(\n environment = VALUE #( ( 'ZDEMO_RAP_ROOT' ) ) ).\n```\n\n---\n\n## Test Documentation\n\n```abap\n\"! @testing zcl_class_under_test\nCLASS ltc_test_class DEFINITION FOR TESTING.\n ...\nENDCLASS.\n```\n\n---\n\n## Running Tests\n\n**In ADT:**\n- All class tests: `Ctrl + Shift + F10`\n- With coverage: `Ctrl + Shift + F11`\n- Right-click → Run as → ABAP Unit Test\n\n**ATC Integration:**\n- Tests run as part of ABAP Test Cockpit\n- Configure in ATC check variant\n\n---\n\n## Best Practices\n\n1. **One assertion per test** when possible\n2. **Use Given-When-Then** structure\n3. **Name tests descriptively** (test_calculate_returns_sum_of_inputs)\n4. **Keep tests independent** - no shared state between tests\n5. **Use setup/teardown** for common initialization\n6. **Prefer constructor injection** for dependencies\n7. **Test public interface** - avoid testing private methods directly\n8. **Use appropriate risk level** to enable test execution\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":10149,"content_sha256":"9875f67945dcbcbb5fc16df7c8e84e0c77c6373f6981ac2d865643fc03804f73"},{"filename":"references/where-conditions.md","content":"# WHERE Conditions - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/31_WHERE_Conditions.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/31_WHERE_Conditions.md)\n\n> **Version Note**: `SELECT FROM @itab` (internal table as data source) requires **7.52+**.\n> `IS INSTANCE OF` in WHERE requires **7.50+**. On 7.40, use `FOR ALL ENTRIES` instead\n> of `FROM @itab`, and RTTI checks instead of `IS INSTANCE OF`.\n\n---\n\n## ABAP SQL WHERE Conditions\n\n### Comparison Operators\n\n| Operator | Alternative | Description |\n|----------|-------------|-------------|\n| `=` | `EQ` | Equality |\n| `\u003c>` | `NE` | Inequality |\n| `\u003c` | `LT` | Less than |\n| `>` | `GT` | Greater than |\n| `\u003c=` | `LE` | Less or equal |\n| `>=` | `GE` | Greater or equal |\n\n### Logical Operators\n\n```abap\nWHERE condition1 AND condition2\nWHERE condition1 OR condition2\nWHERE NOT condition\nWHERE ( condition1 AND condition2 ) OR condition3\n```\n\n### BETWEEN\n\n```abap\nWHERE count BETWEEN 1 AND 10\nWHERE count NOT BETWEEN 1 AND 10\n```\n\n### Pattern Matching (LIKE)\n\n```abap\nWHERE animal LIKE '%ee%' \" Contains 'ee'\nWHERE animal LIKE '_e%' \" Second char is 'e'\nWHERE animal LIKE '%#%' ESCAPE '#' \" Contains '%'\nWHERE animal NOT LIKE '_e%'\n```\n\n### Set Membership (IN)\n\n```abap\nWHERE animal IN ( 'elephant', 'gorilla', 'dog' )\nWHERE animal NOT IN ( 'dog', 'snake' )\nWHERE count IN ( SELECT key FROM table )\nWHERE ( id, animal ) IN ( ( 1, 'bear' ), ( 2, 'dog' ) )\nWHERE count IN @rangestab\n```\n\n### NULL Handling\n\n```abap\nWHERE count IS INITIAL\nWHERE count IS NOT INITIAL\nWHERE field IS NULL\nWHERE field IS NOT NULL\n```\n\n### Subquery Comparisons\n\n```abap\nWHERE count = ( SELECT key FROM table WHERE num = 40 )\nWHERE count > ALL ( SELECT key FROM table )\nWHERE count = ANY ( SELECT key FROM table )\n```\n\n### EXISTS\n\n```abap\nWHERE EXISTS ( SELECT 'X' FROM table WHERE key = tab~id )\n```\n\n### Dynamic Conditions\n\n```abap\nDATA(where_clause) = `count > 15`.\nSELECT id FROM @itab AS tab WHERE (where_clause) INTO TABLE @result.\n\nDATA(where_tab) = VALUE string_table(\n ( `animal = 'kangaroo'` ) ( `OR` ) ( `count = 4` ) ).\nSELECT id FROM @itab AS tab WHERE (where_tab) INTO TABLE @result.\n```\n\n---\n\n## Internal Table WHERE Conditions\n\n### LOOP AT with WHERE\n\n```abap\nLOOP AT itab INTO DATA(wa) WHERE num = 0.\nLOOP AT itab INTO wa WHERE num > 20.\nLOOP AT itab INTO wa WHERE id >= 3 AND num > 5.\nLOOP AT itab INTO wa WHERE num >= 40 OR num = 0.\nLOOP AT itab INTO wa WHERE NOT num = 0.\nLOOP AT itab INTO wa WHERE ( id \u003c 5 AND num > 10 ) AND text = `abc`.\n```\n\n### Character Comparisons\n\n| Operator | Description |\n|----------|-------------|\n| `CO` | Contains only |\n| `CN` | Contains not only |\n| `CS` | Contains string |\n| `NS` | Contains no string |\n| `CA` | Contains any |\n| `NA` | Contains not any |\n| `CP` | Conforms to pattern |\n| `NP` | Does not conform |\n\n```abap\nLOOP AT itab INTO wa WHERE text CO `abc`.\nLOOP AT itab INTO wa WHERE text CS `ef`.\nLOOP AT itab INTO wa WHERE text CP `*c`.\n```\n\n### Range Table Operations\n\n```abap\nDATA rangestab TYPE RANGE OF i.\nrangestab = VALUE #( ( sign = `I` option = `BT` low = 5 high = 45 ) ).\n\nLOOP AT itab INTO wa WHERE num IN rangestab.\nDELETE itab WHERE num IN rangestab.\nREAD TABLE itab INTO line WHERE num IN rangestab.\n```\n\n### Predicate Expressions\n\n```abap\nLOOP AT itab INTO wa WHERE num IS INITIAL.\nLOOP AT itab INTO wa WHERE ref IS BOUND.\nLOOP AT itab INTO wa WHERE oref IS INSTANCE OF cl_system_uuid.\n```\n\n---\n\n## DELETE with WHERE\n\n```abap\nDELETE itab WHERE num > 20.\nDELETE itab WHERE num = 0.\nDELETE itab WHERE num > 5 AND id >= 3.\nDELETE itab WHERE text CO `abc`.\nDELETE itab WHERE num BETWEEN 5 AND 45.\nDELETE itab WHERE ref IS BOUND.\n```\n\n---\n\n## READ TABLE with WHERE\n\n```abap\nREAD TABLE itab INTO DATA(line) WHERE num > 20.\nREAD TABLE itab INTO line WHERE num > 5 AND id >= 3.\nREAD TABLE itab INTO line WHERE text CS `ef`.\nREAD TABLE itab INTO line WHERE num IN rangestab.\n```\n\n---\n\n## FILTER Operator\n\n```abap\n\" Filter sorted/hashed tables\nDATA(filtered) = FILTER #( sorted_tab WHERE id >= 4 ).\nDATA(filtered) = FILTER #( sorted_tab USING KEY primary_key WHERE id >= 4 ).\n\n\" EXCEPT - exclude matching\nDATA(non_matching) = FILTER #( sorted_tab EXCEPT WHERE id >= 4 ).\n\n\" Filter with filter table\nDATA filter_vals TYPE SORTED TABLE OF i WITH NON-UNIQUE KEY table_line.\nfilter_vals = VALUE #( ( 3 ) ( 5 ) ).\nDATA(matched) = FILTER #( sorted_tab IN filter_vals WHERE id = table_line ).\nDATA(not_matched) = FILTER #( sorted_tab EXCEPT IN filter_vals WHERE id = table_line ).\n```\n\n---\n\n## Table Comprehensions (VALUE...FOR)\n\n```abap\nTYPES int_tab TYPE TABLE OF i WITH EMPTY KEY.\n\nDATA(result) = VALUE int_tab( FOR w IN itab WHERE ( num = 0 ) ( w-id ) ).\nDATA(result) = VALUE int_tab( FOR w IN itab WHERE ( num > 20 ) ( w-id ) ).\nDATA(result) = VALUE int_tab( FOR w IN itab WHERE ( text CS `ef` ) ( w-id ) ).\nDATA(result) = VALUE int_tab( FOR w IN itab WHERE ( num BETWEEN 5 AND 45 ) ( w-id ) ).\nDATA(result) = VALUE int_tab( FOR w IN itab WHERE ( num IN rangestab ) ( w-id ) ).\n\n\" Dynamic WHERE\nDATA(dynamic_cond) = `num > 20`.\nDATA(result) = VALUE int_tab( FOR w IN itab WHERE (dynamic_cond) ( w-id ) ).\n```\n\n---\n\n## REDUCE with WHERE\n\n```abap\nDATA(result) = REDUCE int_tab( INIT tab = VALUE #( )\n FOR r IN itab WHERE ( num > 20 )\n NEXT tab = VALUE #( BASE tab ( r-id ) ) ).\n\nDATA(result) = REDUCE int_tab( INIT tab = VALUE #( )\n FOR r IN itab WHERE ( text CS `ef` )\n NEXT tab = VALUE #( BASE tab ( r-id ) ) ).\n\nDATA(result) = REDUCE int_tab( INIT tab = VALUE #( )\n FOR r IN itab WHERE ( num IN rangestab )\n NEXT tab = VALUE #( BASE tab ( r-id ) ) ).\n```\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":5629,"content_sha256":"0f8b4097cb968a81fb95e9a54b804a9135c94ccfa0542c3876ca680970735484"},{"filename":"references/xml-json.md","content":"# XML and JSON Processing - Complete Reference\n\n**Source**: [https://github.com/SAP-samples/abap-cheat-sheets/blob/main/21_XML_JSON.md](https://github.com/SAP-samples/abap-cheat-sheets/blob/main/21_XML_JSON.md)\n\n---\n\n## XML Processing Libraries\n\n### iXML (DOM-Based)\n\nHigher memory, full DOM tree in memory.\n\n**Creating XML:**\n\n```abap\nDATA(ixml) = cl_ixml_core=>create( ).\nDATA(document) = ixml->create_document( ).\n\n\" Create root element\nDATA(root) = document->create_element_ns( name = 'root' prefix = 'ns' ).\ndocument->append_child( root ).\n\n\" Create child elements\nDATA(child) = document->create_element( 'item' ).\nchild->set_value( 'value' ).\nroot->append_child( child ).\n\n\" Render to xstring\nDATA xml TYPE xstring.\nixml->create_renderer(\n document = document\n ostream = ixml->create_stream_factory( )->create_ostream_xstring( string = xml )\n)->render( ).\n```\n\n**Parsing XML:**\n\n```abap\nDATA(ixml) = cl_ixml_core=>create( ).\nDATA(document) = ixml->create_document( ).\nDATA(parser) = ixml->create_parser(\n istream = ixml->create_stream_factory( )->create_istream_xstring( string = xml )\n document = document\n stream_factory = ixml->create_stream_factory( ) ).\n\nIF parser->parse( ) = 0.\n DATA(root) = document->get_root_element( ).\n DATA(child) = root->get_first_child( ).\nENDIF.\n```\n\n### sXML (Token-Based)\n\nMore memory-efficient, sequential processing.\n\n**Creating XML:**\n\n```abap\nDATA(writer) = CAST if_sxml_writer(\n cl_sxml_string_writer=>create( type = if_sxml=>co_xt_xml10 ) ).\n\nTRY.\n writer->open_element( name = 'root' ).\n writer->open_element( name = 'item' ).\n writer->write_value( 'value' ).\n writer->close_element( ).\n writer->close_element( ).\n CATCH cx_sxml_state_error.\nENDTRY.\n\nDATA(xml) = CAST cl_sxml_string_writer( writer )->get_output( ).\n```\n\n**Parsing XML:**\n\n```abap\nDATA(reader) = cl_sxml_string_reader=>create( xml ).\n\nTRY.\n DO.\n reader->next_node( ).\n IF reader->node_type = if_sxml_node=>co_nt_final.\n EXIT.\n ENDIF.\n\n CASE reader->node_type.\n WHEN if_sxml_node=>co_nt_element_open.\n DATA(name) = reader->name.\n WHEN if_sxml_node=>co_nt_value.\n DATA(value) = reader->value.\n ENDCASE.\n ENDDO.\n CATCH cx_sxml_state_error.\nENDTRY.\n```\n\n---\n\n## CALL TRANSFORMATION\n\n### ABAP to XML\n\n```abap\n\" Single data object\nCALL TRANSFORMATION id\n SOURCE data = my_data\n RESULT XML DATA(xml).\n\n\" Multiple sources\nCALL TRANSFORMATION id\n SOURCE obj1 = data1 obj2 = data2\n RESULT XML xml.\n\n\" Dynamic specification\nDATA(srctab) = VALUE abap_trans_srcbind_tab(\n ( name = 'DATA' value = REF #( my_data ) ) ).\nCALL TRANSFORMATION id\n SOURCE (srctab)\n RESULT XML xml.\n```\n\n### XML to ABAP\n\n```abap\n\" Single target\nCALL TRANSFORMATION id\n SOURCE XML xml\n RESULT data = my_data.\n\n\" Dynamic specification\nDATA(restab) = VALUE abap_trans_resbind_tab(\n ( name = 'DATA' value = REF #( my_data ) ) ).\nCALL TRANSFORMATION id\n SOURCE XML xml\n RESULT (restab).\n```\n\n---\n\n## JSON Processing\n\n### Creating JSON with sXML\n\n```abap\nDATA(writer) = CAST if_sxml_writer(\n cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ) ).\n\nTRY.\n writer->open_element( name = 'object' ).\n writer->open_element( name = 'str' ).\n writer->write_attribute( name = 'name' value = 'key' ).\n writer->write_value( 'value' ).\n writer->close_element( ).\n writer->close_element( ).\n CATCH cx_sxml_state_error.\nENDTRY.\n\nDATA(json) = cl_abap_conv_codepage=>create_in( )->convert(\n CAST cl_sxml_string_writer( writer )->get_output( ) ).\n```\n\n### CALL TRANSFORMATION for JSON\n\n```abap\n\" ABAP to JSON\nDATA(json_writer) = cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ).\nCALL TRANSFORMATION id\n SOURCE data = my_data\n RESULT XML json_writer.\nDATA(json) = json_writer->get_output( ).\n\n\" Using SOURCE/RESULT JSON\nCALL TRANSFORMATION id\n SOURCE data = my_data\n RESULT JSON DATA(json_xstr).\n\n\" JSON to ABAP\nCALL TRANSFORMATION id\n SOURCE JSON json_xstr\n RESULT data = my_data.\n```\n\n### Formatted JSON Output\n\n```abap\nDATA(writer) = CAST if_sxml_writer(\n cl_sxml_string_writer=>create( type = if_sxml=>co_xt_json ) ).\nwriter->set_option( option = if_sxml_writer=>co_opt_linebreaks ).\nwriter->set_option( option = if_sxml_writer=>co_opt_indent ).\n\nCALL TRANSFORMATION id\n SOURCE data = my_data\n RESULT XML writer.\n```\n\n---\n\n## XCO Library for JSON\n\n```abap\n\" ABAP to JSON\nDATA(json) = xco_cp_json=>data->from_abap( my_data )->to_string( ).\n\n\" JSON to ABAP\nxco_cp_json=>data->from_string( json )->write_to( REF #( my_data ) ).\n\n\" Build JSON manually\nDATA(builder) = xco_cp_json=>data->builder( ).\nbuilder->begin_object( )\n ->add_member( 'key' )->add_string( 'value' )\n ->add_member( 'number' )->add_number( 123 )\n ->end_object( ).\nDATA(json_built) = builder->get_data( )->to_string( ).\n\n\" Name transformation\nxco_cp_json=>data->from_string( json )->apply( VALUE #(\n ( xco_cp_json=>transformation->pascal_case_to_underscore )\n) )->write_to( REF #( my_data ) ).\n```\n\n---\n\n## /ui2/cl_json Class\n\n```abap\n\" Serialize (ABAP to JSON)\nDATA(json) = /ui2/cl_json=>serialize( data = my_data ).\n\n\" With formatting\nDATA(json_pretty) = /ui2/cl_json=>serialize(\n data = my_data\n format_output = abap_true\n pretty_name = /ui2/cl_json=>pretty_mode-camel_case ).\n\n\" Deserialize (JSON to ABAP)\n/ui2/cl_json=>deserialize(\n EXPORTING json = json\n CHANGING data = my_data ).\n\n\" With name mapping\n/ui2/cl_json=>deserialize(\n EXPORTING json = json\n name_mappings = VALUE #(\n ( abap = 'FIELD1' json = 'field_one' )\n ( abap = 'FIELD2' json = 'fieldTwo' ) )\n CHANGING data = my_data ).\n\n\" Generate ABAP type from JSON\nDATA(dref) = /ui2/cl_json=>generate( json = json ).\n```\n\n---\n\n## String/XString Conversion\n\n```abap\n\" String to xstring\nDATA(xstr) = cl_abap_conv_codepage=>create_out( codepage = 'UTF-8' )->convert( str ).\n\n\" XString to string\nDATA(str) = cl_abap_conv_codepage=>create_in( )->convert( xstr ).\n\n\" Using XCO\nDATA(xstr_xco) = xco_cp=>string( str )->as_xstring( xco_cp_character=>code_page->utf_8 )->value.\nDATA(str_xco) = xco_cp=>xstring( xstr )->as_string( xco_cp_character=>code_page->utf_8 )->value.\n```\n\n---\n\n## Compression\n\n```abap\n\" Compress\ncl_abap_gzip=>compress_binary(\n EXPORTING raw_in = xstr\n IMPORTING gzip_out = compressed ).\n\n\" Decompress\ncl_abap_gzip=>decompress_binary(\n EXPORTING gzip_in = compressed\n IMPORTING raw_out = decompressed ).\n```\n\n---\n\n## Object Serialization\n\nClass must implement `IF_SERIALIZABLE_OBJECT`:\n\n```abap\nCLASS zcl_demo DEFINITION.\n PUBLIC SECTION.\n INTERFACES if_serializable_object.\n DATA value TYPE string.\nENDCLASS.\n\n\" Serialize\nDATA(obj) = NEW zcl_demo( ).\nobj->value = 'test'.\nCALL TRANSFORMATION id SOURCE obj = obj RESULT XML DATA(xml).\n\n\" Deserialize\nDATA obj2 TYPE REF TO zcl_demo.\nCALL TRANSFORMATION id SOURCE XML xml RESULT obj = obj2.\n```\n\n---\n\n## Best Practices\n\n1. **Use sXML** for memory efficiency with large documents\n2. **Use XCO/ui2/cl_json** for simple JSON operations\n3. **Use CALL TRANSFORMATION** for complex conversions\n4. **Handle encoding** explicitly (UTF-8 recommended)\n5. **Implement IF_SERIALIZABLE_OBJECT** for object serialization\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":7135,"content_sha256":"83e21e5b0d70ea31c899645a1c2985227cfe674ba2678e433476e574dd4ee9a4"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"SAP ABAP Development Skill","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Related Skills","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"sap-abap-cds","type":"text","marks":[{"type":"strong"}]},{"text":": Use when developing CDS views for ABAP-backed Fiori applications or defining data models with annotations","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"sap-btp-cloud-platform","type":"text","marks":[{"type":"strong"}]},{"text":": Use when working with ABAP Environment on BTP or deploying ABAP applications to the cloud","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"sap-cap-capire","type":"text","marks":[{"type":"strong"}]},{"text":": Use when connecting ABAP systems with CAP applications or integrating with OData services","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"sap-fiori-tools","type":"text","marks":[{"type":"strong"}]},{"text":": Use when building Fiori applications with ABAP backends or consuming OData services from ABAP systems","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"sap-api-style","type":"text","marks":[{"type":"strong"}]},{"text":": Use when documenting ABAP APIs or following SAP API documentation standards","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"When to Use This Skill","type":"text"}]},{"type":"paragraph","content":[{"text":"Use this skill when writing or reviewing ABAP code, modernizing classic ABAP to ABAP Cloud-compatible patterns, working with RAP or EML, implementing ABAP SQL, designing unit tests, or troubleshooting language/runtime behavior across supported ABAP releases.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Version Compatibility","type":"text"}]},{"type":"paragraph","content":[{"text":"This skill covers ABAP syntax from ","type":"text"},{"text":"7.40 SP08","type":"text","marks":[{"type":"strong"}]},{"text":" through ","type":"text"},{"text":"ABAP Cloud","type":"text","marks":[{"type":"strong"}]},{"text":". Features requiring a higher release are annotated with inline comments in code examples using the format ","type":"text"},{"text":"\" [7.xx+]","type":"text","marks":[{"type":"code_inline"}]},{"text":" or noted in reference files. The table below summarizes the key version boundaries.","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Feature","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"7.40 SP02","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"7.40 SP05","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"7.40 SP08","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"7.50","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"7.51","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"7.52","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"7.54","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Inline declarations ","type":"text"},{"text":"DATA(...)","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Constructor operators (VALUE, NEW, CONV, COND, SWITCH, REF, EXACT, CAST)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Table expressions ","type":"text"},{"text":"itab[...]","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"String templates","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"WITH EMPTY KEY","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"line_exists()","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"line_index()","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ABAP SQL: ","type":"text"},{"text":"@","type":"text","marks":[{"type":"code_inline"}]},{"text":" host variables","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ABAP SQL: comma-separated lists","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ABAP SQL: SQL expressions in SELECT","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"CORRESPONDING","type":"text","marks":[{"type":"code_inline"}]},{"text":" operator","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Table comprehensions (","type":"text"},{"text":"FOR","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"LET","type":"text","marks":[{"type":"code_inline"}]},{"text":" expressions","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"REDUCE","type":"text","marks":[{"type":"code_inline"}]},{"text":" operator","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"FILTER","type":"text","marks":[{"type":"code_inline"}]},{"text":" operator","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"BASE","type":"text","marks":[{"type":"code_inline"}]},{"text":" addition","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"LOOP AT ... GROUP BY","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ABAP SQL: ","type":"text"},{"text":"dbtab~*","type":"text","marks":[{"type":"code_inline"}]},{"text":" in SELECT","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"ABAP SQL: ","type":"text"},{"text":"RIGHT OUTER JOIN","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"CDS views with parameters","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"FINAL(...)","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" inline declaration","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Host expressions ","type":"text","marks":[{"type":"strong"}]},{"text":"@( expr )","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"UNION","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" in SELECT","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"IS INSTANCE OF","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" / ","type":"text","marks":[{"type":"strong"}]},{"text":"CASE TYPE OF","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"int8","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" type","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"CDS table functions","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"CDS access control (implicit)","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"$session.user/client/system_language","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Test seams (","type":"text","marks":[{"type":"strong"}]},{"text":"TEST-SEAM","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":")","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Common Table Expressions (","type":"text","marks":[{"type":"strong"}]},{"text":"WITH","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":")","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"OFFSET","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" in SELECT","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"UPPER","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":"/","type":"text","marks":[{"type":"strong"}]},{"text":"LOWER","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" in CDS","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Enumerated types","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Internal tables as data source ","type":"text","marks":[{"type":"strong"}]},{"text":"FROM @itab","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"WITH PRIVILEGED ACCESS","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"utclong","type":"text","marks":[{"type":"code_inline"},{"type":"strong"}]},{"text":" type and functions","type":"text","marks":[{"type":"strong"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph"}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":"center"},"content":[{"type":"paragraph","content":[{"text":"x","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"On a 7.40 system","type":"text","marks":[{"type":"strong"}]},{"text":": Replace any ","type":"text"},{"text":"FINAL(...)","type":"text","marks":[{"type":"code_inline"}]},{"text":" with ","type":"text"},{"text":"DATA(...)","type":"text","marks":[{"type":"code_inline"}]},{"text":", and avoid 7.50+ features marked in bold above. Most modern ABAP syntax (VALUE, NEW, CONV, inline declarations, table expressions, REDUCE, FILTER, GROUP BY) is available since 7.40 SP08.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Table of Contents","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Version Compatibility","type":"text","marks":[{"type":"link","attrs":{"href":"#version-compatibility","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Quick Reference","type":"text","marks":[{"type":"link","attrs":{"href":"#quick-reference","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Bundled Resources","type":"text","marks":[{"type":"link","attrs":{"href":"#bundled-resources","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Common Patterns","type":"text","marks":[{"type":"link","attrs":{"href":"#common-patterns","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Error Catalog","type":"text","marks":[{"type":"link","attrs":{"href":"#error-catalog","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Performance Tips","type":"text","marks":[{"type":"link","attrs":{"href":"#performance-tips","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Source Documentation","type":"text","marks":[{"type":"link","attrs":{"href":"#source-documentation","title":null}}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Quick Reference","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Data Types and Declarations","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"abap"},"content":[{"text":"\" Elementary types\nDATA num TYPE i VALUE 123.\nDATA txt TYPE string VALUE `Hello`.\nDATA flag TYPE abap_bool VALUE abap_true.\n\n\" Inline declarations\nDATA(result) = some_method( ).\nFINAL(immutable) = `constant value`. \" [7.50+] Use DATA(...) on 7.40\n\n\" Structures\nDATA: BEGIN OF struc,\n id TYPE i,\n name TYPE string,\n END OF struc.\n\n\" Internal tables\nDATA itab TYPE TABLE OF string WITH EMPTY KEY.\nDATA sorted_tab TYPE SORTED TABLE OF struct WITH UNIQUE KEY id.\nDATA hashed_tab TYPE HASHED TABLE OF struct WITH UNIQUE KEY id.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Internal Tables - Essential Operations","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"abap"},"content":[{"text":"\" Create with VALUE\nitab = VALUE #( ( col1 = 1 col2 = `a` )\n ( col1 = 2 col2 = `b` ) ).\n\n\" Read operations\nDATA(line) = itab[ 1 ]. \" By index\nDATA(line2) = itab[ col1 = 1 ]. \" By key\nREAD TABLE itab INTO wa INDEX 1.\nREAD TABLE itab ASSIGNING FIELD-SYMBOL(\u003cfs>) WITH KEY col1 = 1.\n\n\" Modify operations\nMODIFY TABLE itab FROM VALUE #( col1 = 1 col2 = `updated` ).\nitab[ 1 ]-col2 = `changed`.\n\n\" Loop processing\nLOOP AT itab ASSIGNING FIELD-SYMBOL(\u003cline>).\n \u003cline>-col2 = to_upper( \u003cline>-col2 ).\nENDLOOP.\n\n\" Delete\nDELETE itab WHERE col1 > 5.\nDELETE TABLE itab FROM VALUE #( col1 = 1 ).","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"ABAP SQL Essentials","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"abap"},"content":[{"text":"\" SELECT into table\nSELECT * FROM dbtab INTO TABLE @DATA(result_tab). \" @ syntax: 7.40 SP05+\n\n\" SELECT with conditions\nSELECT carrid, connid, fldate \" comma syntax: 7.40 SP05+\n FROM zdemo_abap_fli\n WHERE carrid = 'LH'\n INTO TABLE @DATA(flights).\n\n\" Aggregate functions\nSELECT carrid, COUNT(*) AS cnt, AVG( price ) AS avg_price\n FROM zdemo_abap_fli\n GROUP BY carrid\n INTO TABLE @DATA(stats).\n\n\" JOIN operations\nSELECT a~carrid, a~connid, b~carrname\n FROM zdemo_abap_fli AS a\n INNER JOIN zdemo_abap_carr AS b ON a~carrid = b~carrid\n INTO TABLE @DATA(joined).\n\n\" Modification statements\nINSERT dbtab FROM @struc.\nUPDATE dbtab FROM @struc.\nMODIFY dbtab FROM TABLE @itab.\nDELETE FROM dbtab WHERE condition.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Constructor Expressions","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"abap"},"content":[{"text":"\" VALUE - structures and tables\nDATA(struc) = VALUE struct_type( comp1 = 1 comp2 = `text` ).\nDATA(itab) = VALUE itab_type( ( a = 1 ) ( a = 2 ) ( a = 3 ) ).\n\n\" NEW - create instances\nDATA(dref) = NEW i( 123 ).\nDATA(oref) = NEW zcl_my_class( param = value ).\n\n\" CORRESPONDING - structure/table mapping\ntarget = CORRESPONDING #( source ).\ntarget = CORRESPONDING #( source MAPPING target_field = source_field ).\n\n\" COND/SWITCH - conditional values\nDATA(text) = COND string( WHEN flag = abap_true THEN `Yes` ELSE `No` ).\nDATA(result) = SWITCH #( code WHEN 1 THEN `A` WHEN 2 THEN `B` ELSE `X` ).\n\n\" CONV - type conversion\nDATA(dec) = CONV decfloat34( 1 / 3 ).\n\n\" FILTER - table filtering\nDATA(filtered) = FILTER #( itab WHERE status = 'A' ).\n\n\" REDUCE - aggregation\nDATA(sum) = REDUCE i( INIT s = 0 FOR wa IN itab NEXT s = s + wa-amount ).","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Object-Oriented ABAP","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"abap"},"content":[{"text":"\" Class definition\nCLASS zcl_example DEFINITION PUBLIC FINAL CREATE PUBLIC.\n PUBLIC SECTION.\n METHODS constructor IMPORTING iv_name TYPE string.\n METHODS get_name RETURNING VALUE(rv_name) TYPE string.\n CLASS-METHODS factory RETURNING VALUE(ro_instance) TYPE REF TO zcl_example.\n PRIVATE SECTION.\n DATA mv_name TYPE string.\nENDCLASS.\n\nCLASS zcl_example IMPLEMENTATION.\n METHOD constructor.\n mv_name = iv_name.\n ENDMETHOD.\n METHOD get_name.\n rv_name = mv_name.\n ENDMETHOD.\n METHOD factory.\n ro_instance = NEW #( `Default` ).\n ENDMETHOD.\nENDCLASS.\n\n\" Interface implementation\nCLASS zcl_impl DEFINITION PUBLIC.\n PUBLIC SECTION.\n INTERFACES zif_my_interface.\nENDCLASS.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Exception Handling","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"abap"},"content":[{"text":"TRY.\n DATA(result) = risky_operation( ).\n CATCH cx_sy_zerodivide INTO DATA(exc).\n DATA(msg) = exc->get_text( ).\n CATCH cx_root INTO DATA(any_exc).\n \" Handle any exception\n CLEANUP.\n \" Cleanup code\nENDTRY.\n\n\" Raising exceptions\nRAISE EXCEPTION TYPE zcx_my_exception\n EXPORTING textid = zcx_my_exception=>error_occurred.\n\n\" With COND/SWITCH\nDATA(val) = COND #( WHEN valid THEN result\n ELSE THROW zcx_my_exception( ) ).","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"String Processing","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"abap"},"content":[{"text":"\" Concatenation\nDATA(full) = first && ` ` && last.\ntxt &&= ` appended`.\n\n\" String templates\nDATA(msg) = |Name: { name }, Date: { date DATE = ISO }|.\n\n\" Functions\nDATA(upper) = to_upper( text ).\nDATA(len) = strlen( text ).\nDATA(found) = find( val = text sub = `search` ).\nDATA(replaced) = replace( val = text sub = `old` with = `new` occ = 0 ).\nDATA(parts) = segment( val = text index = 2 sep = `,` ).\n\n\" FIND/REPLACE statements\nFIND ALL OCCURRENCES OF pattern IN text RESULTS DATA(matches).\nREPLACE ALL OCCURRENCES OF old IN text WITH new.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Dynamic Programming","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"abap"},"content":[{"text":"\" Field symbols\nFIELD-SYMBOLS \u003cfs> TYPE any.\nASSIGN struct-component TO \u003cfs>.\nASSIGN struct-(comp_name) TO \u003cfs>. \" Dynamic component\n\n\" Data references\nDATA dref TYPE REF TO data.\ndref = REF #( variable ).\nCREATE DATA dref TYPE (type_name).\ndref->* = value.\n\n\" RTTI - Get type information\nDATA(tdo) = cl_abap_typedescr=>describe_by_data( dobj ).\nDATA(components) = CAST cl_abap_structdescr( tdo )->components.\n\n\" RTTC - Create types dynamically\nDATA(elem_type) = cl_abap_elemdescr=>get_string( ).\nCREATE DATA dref TYPE HANDLE elem_type.","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Bundled Resources","type":"text"}]},{"type":"paragraph","content":[{"text":"This skill includes 28 comprehensive reference files covering all aspects of ABAP development:","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Related Skills","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"sap-abap-cds","type":"text","marks":[{"type":"strong"}]},{"text":": For CDS view development and ABAP Cloud data modeling","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"sap-btp-cloud-platform","type":"text","marks":[{"type":"strong"}]},{"text":": For ABAP Environment setup and BTP deployment","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"sap-cap-capire","type":"text","marks":[{"type":"strong"}]},{"text":": For CAP service integration and ABAP system connections","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"sap-fiori-tools","type":"text","marks":[{"type":"strong"}]},{"text":": For Fiori application development with ABAP backends","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"sap-api-style","type":"text","marks":[{"type":"strong"}]},{"text":": For API documentation standards and best practices","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Quick Access","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Reference Guide","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"references/skill-reference-guide.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Complete guide to all reference files","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Internal Tables","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"references/internal-tables.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Complete table operations","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"ABAP SQL","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"references/abap-sql.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Comprehensive SQL reference","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Object Orientation","type":"text","marks":[{"type":"strong"}]},{"text":": ","type":"text"},{"text":"references/object-orientation.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Classes and interfaces","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Development Topics","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/constructor-expressions.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - VALUE, NEW, COND, REDUCE","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/rap-eml.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - RAP and EML operations","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/cds-views.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - CDS view development","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/string-processing.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - String functions and regex","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/unit-testing.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - ABAP Unit framework","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"references/performance.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Optimization techniques","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"... and 18 more specialized references","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Common Patterns","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Safe Table Access (Avoid Exceptions)","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"abap"},"content":[{"text":"\" Using VALUE with OPTIONAL\nDATA(line) = VALUE #( itab[ key = value ] OPTIONAL ).\n\n\" Using VALUE with DEFAULT\nDATA(line) = VALUE #( itab[ 1 ] DEFAULT VALUE #( ) ).\n\n\" Check before access\nIF line_exists( itab[ key = value ] ).\n DATA(line) = itab[ key = value ].\nENDIF.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Functional Method Chaining","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"abap"},"content":[{"text":"DATA(result) = NEW zcl_builder( )\n ->set_name( `Test` )\n ->set_value( 123 )\n ->build( ).","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"FOR Iteration Expressions","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"abap"},"content":[{"text":"\" Transform table\nDATA(transformed) = VALUE itab_type(\n FOR wa IN source_itab\n ( id = wa-id name = to_upper( wa-name ) ) ).\n\n\" With WHERE\nDATA(filtered) = VALUE itab_type(\n FOR wa IN source WHERE ( status = 'A' )\n ( wa ) ).\n\n\" With INDEX INTO\nDATA(numbered) = VALUE itab_type(\n FOR wa IN source INDEX INTO idx\n ( line_no = idx data = wa ) ).","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"ABAP Cloud Compatibility","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"abap"},"content":[{"text":"\" Use released APIs only\nDATA(uuid) = cl_system_uuid=>create_uuid_x16_static( ).\nDATA(date) = xco_cp=>sy->date( )->as( xco_cp_time=>format->iso_8601_extended )->value.\nDATA(time) = xco_cp=>sy->time( )->as( xco_cp_time=>format->iso_8601_extended )->value.\n\n\" Output in cloud (if_oo_adt_classrun)\nout->write( result ).\n\n\" Avoid: sy-datum, sy-uzeit, DESCRIBE TABLE, WRITE, MOVE...TO","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"ABAP 7.40 Compatibility","type":"text"}]},{"type":"paragraph","content":[{"text":"When targeting ABAP 7.40 systems, replace 7.50+ syntax with these patterns:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":"abap"},"content":[{"text":"\" Instead of FINAL (7.50+):\nFINAL(value) = `constant`. \" 7.50+\nDATA(value) = `constant`. \" 7.40 compatible\n\n\" Instead of host expressions (7.50+):\nSELECT * FROM dbtab WHERE col = @( lv_val ). \" 7.50+\nSELECT * FROM dbtab WHERE col = @lv_val. \" 7.40 compatible\n\n\" Instead of UNION (7.50+):\nSELECT a FROM tab1 UNION SELECT a FROM tab2. \" 7.50+\n\" Use two separate SELECTs on 7.40 and combine in ABAP:\nSELECT a FROM tab1 INTO TABLE @DATA(r1).\nSELECT a FROM tab2 INTO TABLE @DATA(r2).\nDATA(combined) = VALUE itab_type( FOR l1 IN r1 ( l1 )\n FOR l2 IN r2 ( l2 ) ).\n\n\" Instead of IS INSTANCE OF (7.50+):\nIF oref IS INSTANCE OF zcl_my_class. \" 7.50+\n\" 7.40 alternative — use typed CAST with exception handling:\nTRY.\n DATA(lo) = CAST zcl_my_class( oref ). \" 7.40+\n CATCH cx_sy_move_cast_error.\n \" oref is not compatible with zcl_my_class\nENDTRY.\n\n\" Instead of CTEs WITH (7.51+):\nWITH +cte AS ( SELECT ... ) SELECT ... \" 7.51+\n\" Use subqueries or temporary tables on 7.40","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Error Catalog","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"CX_SY_ITAB_LINE_NOT_FOUND","type":"text"}]},{"type":"paragraph","content":[{"text":"Cause","type":"text","marks":[{"type":"strong"}]},{"text":": Table expression access to non-existent line ","type":"text"},{"text":"Solution","type":"text","marks":[{"type":"strong"}]},{"text":": Use OPTIONAL, DEFAULT, or check with ","type":"text"},{"text":"line_exists( )","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"CX_SY_ZERODIVIDE","type":"text"}]},{"type":"paragraph","content":[{"text":"Cause","type":"text","marks":[{"type":"strong"}]},{"text":": Division by zero ","type":"text"},{"text":"Solution","type":"text","marks":[{"type":"strong"}]},{"text":": Check divisor before operation","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"CX_SY_RANGE_OUT_OF_BOUNDS","type":"text"}]},{"type":"paragraph","content":[{"text":"Cause","type":"text","marks":[{"type":"strong"}]},{"text":": Invalid substring access or array bounds ","type":"text"},{"text":"Solution","type":"text","marks":[{"type":"strong"}]},{"text":": Validate offset and length before access","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"CX_SY_CONVERSION_NO_NUMBER","type":"text"}]},{"type":"paragraph","content":[{"text":"Cause","type":"text","marks":[{"type":"strong"}]},{"text":": String cannot be converted to number ","type":"text"},{"text":"Solution","type":"text","marks":[{"type":"strong"}]},{"text":": Validate input format before conversion","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"CX_SY_REF_IS_INITIAL","type":"text"}]},{"type":"paragraph","content":[{"text":"Cause","type":"text","marks":[{"type":"strong"}]},{"text":": Dereferencing unbound reference ","type":"text"},{"text":"Solution","type":"text","marks":[{"type":"strong"}]},{"text":": Check ","type":"text"},{"text":"IS BOUND","type":"text","marks":[{"type":"code_inline"}]},{"text":" before dereferencing","type":"text"}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Performance Tips","type":"text"}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use SORTED/HASHED tables","type":"text","marks":[{"type":"strong"}]},{"text":" for frequent key access","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Prefer field symbols","type":"text","marks":[{"type":"strong"}]},{"text":" over work areas in loops for modification","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use PACKAGE SIZE","type":"text","marks":[{"type":"strong"}]},{"text":" for large SELECT results","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Avoid SELECT in loops","type":"text","marks":[{"type":"strong"}]},{"text":" - use FOR ALL ENTRIES or JOINs","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use secondary keys","type":"text","marks":[{"type":"strong"}]},{"text":" for different access patterns","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Minimize CORRESPONDING","type":"text","marks":[{"type":"strong"}]},{"text":" calls - explicit assignments are faster","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"heading","attrs":{"level":2},"content":[{"text":"Source Documentation","type":"text"}]},{"type":"paragraph","content":[{"text":"All content based on SAP official ABAP Cheat Sheets:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Repository: ","type":"text"},{"text":"https://github.com/SAP-samples/abap-cheat-sheets","type":"text","marks":[{"type":"link","attrs":{"href":"https://github.com/SAP-samples/abap-cheat-sheets","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"SAP Help (latest): ","type":"text"},{"text":"https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm","type":"text","marks":[{"type":"link","attrs":{"href":"https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"SAP Help (7.40): ","type":"text"},{"text":"https://help.sap.com/doc/abapdocu_740_index_htm/7.40/en-US/index.htm","type":"text","marks":[{"type":"link","attrs":{"href":"https://help.sap.com/doc/abapdocu_740_index_htm/7.40/en-US/index.htm","title":null}}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"ABAP Release News: ","type":"text"},{"text":"https://github.com/SAP-samples/abap-cheat-sheets/blob/main/33_ABAP_Release_News.md","type":"text","marks":[{"type":"link","attrs":{"href":"https://github.com/SAP-samples/abap-cheat-sheets/blob/main/33_ABAP_Release_News.md","title":null}}]}]}]}]}]},"metadata":{"date":"2026-11-02","name":"sap-abap","author":"@skillopedia","source":{"stars":487,"repo_name":"sap-skills","origin_url":"https://github.com/secondsky/sap-skills/blob/HEAD/plugins/sap-abap/skills/sap-abap/SKILL.md","repo_owner":"secondsky","body_sha256":"94f55878de3345170b42c29e69f0dc33df345cb145e09ba39adc69cda5e4d6f6","cluster_key":"3102dfb03f148d44b44500ce323a436c604cbf18a4227f534566d2af1728a57d","clean_bundle":{"format":"clean-skill-bundle-v1","source":"secondsky/sap-skills/plugins/sap-abap/skills/sap-abap/SKILL.md","text_bytes":223157,"source_commit":"652a861d3ed422b71f01c8805f9ec03b14017cd8","skills_sh_rank":10795,"attachment_count":31,"text_attachments":31,"attachment_storage":"skill_attachments","binary_attachments":0},"cluster_size":1,"skill_md_path":"plugins/sap-abap/skills/sap-abap/SKILL.md","import_metadata":{"date":"2026-11-02","author":"@skillopedia","version":"v1","category":"software-engineering","category_label":"Engineering"},"exact_dupes_collapsed_into_this":0},"license":"GPL-3.0","version":"v1","category":"software-engineering","metadata":{"sources":["https://help.sap.com/doc/abapdocu_latest_index_htm/latest/en-US/index.htm","https://github.com/SAP-samples/abap-cheat-sheets"],"version":"2.4.1","website":"https://sap-ai-skills.com","maintainer":"Eduard Jiglau","abap_release":"7.40 SP08+ / 7.50+ / ABAP Cloud","last_verified":"2026-04-02","maintainer_email":"[email protected]"},"import_tag":"skills-sh-top20k-2026-11","description":"Comprehensive ABAP development skill for SAP systems. Use when writing ABAP code,\nworking with internal tables, structures, ABAP SQL, object-oriented programming,\nRAP (RESTful Application Programming Model), CDS views, EML statements, ABAP Cloud\ndevelopment, string processing, dynamic programming, RTTI/RTTC, field symbols,\ndata references, exception handling, or ABAP unit testing. Covers both classic\nABAP and modern ABAP for Cloud Development patterns.\n"}},"renderedAt":1793671615159}

SAP ABAP Development Skill Related Skills - sap-abap-cds : Use when developing CDS views for ABAP-backed Fiori applications or defining data models with annotations - sap-btp-cloud-platform : Use when working with ABAP Environment on BTP or deploying ABAP applications to the cloud - sap-cap-capire : Use when connecting ABAP systems with CAP applications or integrating with OData services - sap-fiori-tools : Use when building Fiori applications with ABAP backends or consuming OData services from ABAP systems - sap-api-style : Use when documenting ABAP APIs or following SAP API documentation st…