TLS v1.3 setup

Transport Layer Security is used for web traffic. TLS v1.3 is a modern way of implementing this. It is safer and faster than the older TLS v1.2.

AspectTLS 1.2TLS 1.3
Year standardized20082018
Handshake latency2 round trips (typically)1 round trip (or 0‑RTT)
Cryptographic algorithmsMany (incl. weak/legacy)Only modern, secure algorithms
Forward secrecyOptionalMandatory
Security postureFlexible but complexSimpler, safer by design
CompatibilityVery wideRequires modern stacks
The problem with TLSv1.3 is that old infrastructure and applications still do not support it properly. Please be careful with testing when activating.

General SAP background notes:

TLS v1.3 for ABAP

Background OSS notes:

Do look at the regressions listed in OSS note 3318423 – Is TLS 1.3 Supported by SAP Kernel for ABAP and SAP S/4HANA? – SAP for Me. Most of them are fixed by applying latest kernel and/or crypto library update.

OSS note 3346659 – TLS Ciphersuite String Configuration for SAP AS ABAP Systems and for SAP Kernel Software Components contains section to enable TLS v1.3 next to TLS v1.2. This might be a good intermediate implementation step.

For some reasons there might be issues with custom code using HTTP_GET, HTTP_POST or similar. See OSS note 2582368 – SapSSL update for client-side sending of TLS extension SNI by saphttp, sapkprotp, sldreg. Workaround according to this note is to use HTTP2_GET and HTTP2_POST from function group SCMS instead.

TLS v1.3 for HANA

Background OSS notes:

TLS v1.3 for other SAP products

TLS v1.3 support for other SAP products (list is not extensive, search on me.sap.com if your product is not yet in the list):

Data archiving: Idocs

This blog will explain how to archive idocs via object IDOC. Generic technical setup must have been executed already, and is explained in this blog.

Object IDOC

Go to transaction SARA and select object IDOC.

Dependency schedule:

Main tables that are archived:

  • EDIDC (idoc control record)
  • EDIDS (idoc status record)
  • EDID4 (idoc content)

Technical programs and OSS notes

Write program: RSEXARCA

Delete program: RSEXARCD

Read program: RSEXARCR

Reload program: RSEXARCL

Relevant OSS notes:

Application specific customizing

In transaction WE47 the idoc status must be set to archive-able:

Executing the write run and delete run

In transaction SARA, IDOC select the write run:

Select your data, save the variant and start the archiving write run.

Give the archive session a good name that describes idoc type and year. This is needed for data retrieval later on.

After the write run is done, check the logs. IDOC archiving has average speed, and high percentage of archiving (up to 100%). Mostly errors are not archived due to status (transaction WE47).

Deletion run is standard by selecting the archive file and starting the deletion run.

Data retrieval

Data retrieval is via program RSEXARCR is extremely poor. Setup archive infostructure SAP_IDOC_001, and use transaction SARI (with IDOC and SAP_IDOC_001) to search and retrieve the idocs:

Or use WE09 transaction and include the selection for Archive:

Support maintenance overview on me.sap.com

On me.sap.com there is a support maintenance overview page. You can reach this page via this direct URL: Reporting – SAP for Me. A full explanation of all functions can be found on this blog. The below is the quick manual.

Support maintenance overview

When you start the page you get the total overview:

By clicking on a segment, you can zoom in:

By clicking on the system number you can go to the system administration details:

This can be used to update wrong old information, or to delete systems which have been decommissioned, but are still present in the SAP administration.

Navigation options

You can navigate from the System to the products and addons. Do this by selecting the system in the left part:

Another option is to start with the leading product or addon to see on the left side, which systems have this component installed:

MaxDB tips & tricks

MaxDB has 3 main use cases for SAP:

  • Standalone database (not so much in use)
  • As database for SCM livecache
  • As database for content server

Basically the current 7.9 version is the last supported version until 31.12.2027. Prepare for new solutions if you are still using MaxDB.

Generic MaxDB OSS notes

End of support:

Generic database features of MaxDB:

MaxDB for content server

MaxDB for livecache

S4HANA supports livecache as embedded option. Read more in this blog.

SAP Cloud ALM memory estimator

If you are running SAP Solution manager and are planning to move to SAP Cloud ALM, you can estimate the expected memory usage on SAP Cloud ALM. The first 24 GB are for free in the standard SAP contract. If you need more, you might need to acquire extra licenses.

Installation of the SAP Cloud ALM memory estimator

Check that OSS note 3639977 – Collective corrections as of ST-PI 7.40 SP32 and ST-PI 7.58 SP00 for SAP Cloud ALM is installed (or a newer ST-PI).

Check if report /SDF/CALM_MEMORY_ESTIMATION is available in your solution manager system.

Running the memory estimator

In your solution manager system run in SE38 the program /SDF/CALM_MEMORY_ESTIMATION. Choose a representative day (take a busy weekday, and not a weekend day).

Let the program run.

Show the results:

You now can see the total and the highest impacted areas.

SAP readiness check for SCM

If you are running SCM – APO solution, you need to consider what to do with the functions running there. The extended support of the SCM – APO solution will end by 31.12.2030.

To check the current usage and potential solutions, you can run the SAP readiness check for SAP Supply Chain Solution.

Running the check

Install the check program by applying OSS note 3477050 – SAP Readiness Check for SAP Supply Chain Solutions.

Then start program RC_SCM_COLLECT_ANALYSIS_DATA and execute it:

Schedule the analysis in batch job. When the batch jobs are completed, use the Download Analysis Data button to download the results to your laptop.

Upload the results in the SAP readiness site: https://me.sap.com/readinesscheck .

Results for the SCM readiness check

After uploading the analysis will take a few minutes. When completed, you can see the results:

ZSCMON aggregated SCMON view

The SAP tool for ABAP system usage SCMON is great. The problem is that the data is a lot to digest. The SUSG function can aggregate the data, but that is difficult to view.

The below Z program is simply taking the SCMON data and is providing a summarized view.

Transaction ZSCMON and program ZSCMON

Create a program ZSCMON and assign transaction code ZSCMON as well.

Report code:

REPORT zscmon.

CONSTANTS : zgc_tcode TYPE tcode VALUE 'ZSCMON',
            zgc_col   TYPE lvc_fname  VALUE 'NUMBEROFCALLS'.

DATA: zgv_objtyp TYPE trobjtype,
      zgv_objnme TYPE sobj_name,
      zgv_clsnme TYPE scmon_classname.


PARAMETERS: zp_stdat TYPE scmon_slicestartdate,
            zp_eddat TYPE scmon_sliceenddate.

SELECT-OPTIONS: zs_obtyp FOR zgv_objtyp,
                zs_obnme FOR zgv_objnme,
                zs_clsnm FOR zgv_clsnme.

PARAMETERS: zp_sum  RADIOBUTTON GROUP g1 DEFAULT 'X',
            zp_det  RADIOBUTTON GROUP g1.

INITIALIZATION.
* AUTHORITY CHECK for TCODE
  CALL FUNCTION 'AUTHORITY_CHECK_TCODE'
    EXPORTING
      tcode  = zgc_tcode
    EXCEPTIONS
      ok     = 0
      not_ok = 2
      OTHERS = 3.
  IF sy-subrc <> 0.
    MESSAGE e172(00) WITH zgc_tcode.
  ENDIF.

AT SELECTION-SCREEN.
  IF zp_eddat LT zp_stdat.
    MESSAGE TEXT-001 TYPE 'E'.      
"Slice End Date cannot be less that Slice Start Date
  ENDIF.

START-OF-SELECTION.

  IF zp_det EQ abap_true.
    SELECT object,
           obj_name,
           proctype,
           procname,
           classname,
           SUM( counter ) AS numberofcalls
              FROM scmon_vdata INTO TABLE @DATA(zgt_scmond)
              WHERE slicestart  GE @zp_stdat
                AND sliceend    LE @zp_eddat
                AND object      IN @zs_obtyp[]
                AND obj_name    IN @zs_obnme[]
                AND classname   IN @zs_clsnm[]
              GROUP BY object, obj_name, proctype, procname, classname.

*ALV Object
    cl_salv_table=>factory(
           IMPORTING r_salv_table = DATA(zgo_alv)
           CHANGING  t_table      = zgt_scmond ).

  ELSEIF zp_sum EQ abap_true.
    SELECT object,
           obj_name,
           SUM( counter ) AS numberofcalls
              FROM scmon_vdata INTO TABLE @DATA(zgt_scmons)
              WHERE slicestart  GE @zp_stdat
                AND sliceend    LE @zp_eddat
                AND object      IN @zs_obtyp[]
                AND obj_name    IN @zs_obnme[]
              GROUP BY object, obj_name.      

*  ALV Object
    cl_salv_table=>factory(
           IMPORTING r_salv_table = zgo_alv
           CHANGING  t_table      = zgt_scmons ).

  ENDIF.

*Set functions, zebra pattern, column width optimization
  zgo_alv->get_functions(
           )->set_all( ).
  zgo_alv->get_display_settings(
           )->set_striped_pattern( value = abap_true ).
  DATA(zgo_alv_cols) = zgo_alv->get_columns( ).
  zgo_alv_cols->set_optimize( ).

* modify individual properties
  TRY.
      DATA(zgo_col) = zgo_alv_cols->get_column( zgc_col ).
      zgo_col->set_long_text( TEXT-002 ).               
      zgo_col->set_medium_text( TEXT-002 ).            
      zgo_col->set_short_text( TEXT-002 ).              
    CATCH cx_salv_not_found.                           
  ENDTRY.

* ALV DISPLAY
  zgo_alv->display( ).

Text symbols:

001 Slice End Date cannot be less that Slice Start Date
002 NoOfCalls
003 Not authorized to access ABAP call monitor data

Selection texts:

ZP_DET Detail
ZP_EDDAT Slice End Date
ZP_STDAT Slice Start Date
ZP_SUM Summary
ZS_CLSNM Called Class Name
ZS_OBNME Object Name
ZS_OBTYP Object Type

Running the transaction ZSCMON

Now run the program or transaction ZSCMON:

Fill out the correct data for the slice Start and End date.

Result:

Run the program in detail mode if you still want to list the details.

ALV with IDA (integrated data access)

Next to the classical ALV grid, SAP offers the ALV with IDA (integrated data access). This is especially useful with HANA as database and when having to process very large data sets in the ALV.

Formal documentation

The formal documentation of the ALV grid with IDA can be found at help.sap.com on this link.

This also contains a comparison between the classic ALV and ALV with IDA.

Blogs

Many blogs on this topic can be found. Some useful ones:

Using the ALV with IDA in coding

Using the ALV with IDA in ABAP coding can be done with a single statement:

cl_salv_gui_table_ida=>create(  iv_table_name = 'SFLIGHT' ) ->fullscreen( ) ->display( ).

In each ABAP system there is the demo program SALV_IDA_DISPLAY_DATA_SIMPLE which you can use to see how details can be prograamed.

SE16J: SE16 with Joins

In S4HANA2023 and more recent versions there is a new SE16 flavour: SE16J (for setting up queries on tables with Joins). This is very powerful function next to SE16H.

Reference OSS note for SE16J: 3529563 – Functions of transaction SE16J.

Setup new SE16J query

Start transaction SE16J. Give your new query a name and description and press the Create button:

Now click on the 3 dots to add a secondary table:

You can put in selection criteria, aggregation, decide to output fields.

Give the secondary table (in our example VBAP):

Important now: select the Inner join tick box if you want inner join, otherwise you get outer join. Select the fields for output, aggregation etc.

Important: on the right hand side give the JOIN fields.

Now press the Check button, and when ok, the Save button:

Run query

Now run the query by hitting execute. Due to the saving, next time, just pull up the existing query.

Output example:

Use of new ABAP 7.4 syntax

ABAP 7.4 has many nice syntax improvements. These enhancements increase the efficiency of the code written, making it easier for developers to use and to read the code.

Key features:

  • Inline Declarations
  • Table Expressions
  • Constructor Operator NEW
  • Value Operator VALUE
  • FOR operator
  • Reduction operator REDUCE
  • Conditional operators COND and SWITCH
  • CORRESPONDING operator
  • Strings
  • Filter

Inline Declaration(DATA)

Inline declarations are a new concept of declaring variables and field symbols. This enables programmer to declare the variable at the time of they used. With this new format the compiler knows that the data store the value in the form of string variable. No need to explicitly declare the string variable. So, the line of code got reduced.

Before 7.4

DATA zlv_text TYPE string. 
zlv_text = 'ABC’.

With 7.4

DATA(zlv_text) = 'ABC'.

Inline Declaration(Loop at into work area)

Every time we need to loop over an internal table we need work area . Many times this work area is not in use when loop processing is completed. Hence inline declaration make it easy to declare it and use it when it is required.

Before 7.40

Types: Begin of zlts_itab, 
Matnr type matnr,
            Sernr type gernr,
            end of zlts_itab,

DATA : zlt_itab type table of zlts_itab,  
             zls_wa type zlts_itab.
LOOP AT zlt_itab INTO zls_wa.
......
ENDLOOP. 

With 7.40

LOOP At zlt_ itab INTO DATA(zls_wa). 
…………
ENDLOOP.

Inline Declaration(Field Symbol)

Like work area we can use inline declaration for Field symbol. Here we can use angular bracket and FIELD_SYMBOL keyword as before. Read a line of internal table and assign it to a field symbol.

Before 7.40

FIELD_SYMBOLS <zls_test> type zlts_itab.
LOOP AT zlt_itab assigning <zls_test>
.....
ENDLOOP.

Read table zlt_ itab assigning <zls_test>.

With 7.40

LOOP At zlt_ itab assigning FIELD_SYMBOL (<zls_test>).
…………

ENDLOOP.
Read table zlt_itab assigning FIELD-SYMBOL(<zls_test>).

Inline Declaration(Select into table)

We need to put @symbol in front of the variables using in the select statement while using new feature. That helps compiler to understand that we are not referring the field of the database but the variable in the program.

No need to declare the internal table separately.

Please note when we use new feature we need to put comma between field while retrieving data from DB table, and also put into statement at the end.

Before 7.40

DATA : zlv_fld1 type matnr  value ‘number’,
zlt_itab TYPE TABLE OF mara.

SELECT * FROM mara
INTO TABLE zlt_itab
WHERE matnr = zlv_fld1.

With 7.40

SELECT * FROM mara 
INTO TABLE @DATA(zlt_itab)
WHERE matnr = @zlv_fld1.

Inline Declaration(Call Method)

Inline ABAP DATA declarations are a new concept introduced in release 7.4 which allows you to declare your internal table variables or work areas within the code that uses them.

No need to declare the internal table separately.

Before 7.40

DATA zlv_a1 TYPE ...
DATA zlv_a2 TYPE ...

zlo_oref->meth( IMPORTING p1 = zlv_a1
                             IMPORTING p2 = zlv_a2 ).

With 7.40

zlo_oref->meth( IMPORTING p1 =DATA(zlv_a1)
IMPORTING p2 = DATA(zlv_a2) ).

Table Expression(Read Table Index)

Previously we saw we can read the internal table to work area without declaring work area before the read statement.

In new feature we can see we might never have to use Read statement at all.

If we want to read 3rd line from Internal table we need to pass 3 into the variable idx = 3.

Before 7.40

READ TABLE zlt_itab INDEX zlv_indx  INTO zls_wa.

With 7.40

zls_wa =zlt_itab[ zlv_idx ].

Table Expression(Read Table using key and with key)

In this example we are reading internal table with key and if the passing parameter values and it satisfied then work area will be populated. If not then sy-subrc will not equal to 0.

But in new statement we can simply write work area equal to…it simple replace the read statement with direct assignment of table details to work area.

Before 7.40

1. READ TABLE zlt_itab INDEX zlv_idx
USING KEY key INTO zls_wa.

2. READ TABLE zlt_itab
               WITH KEY col1 =
                        col2 = …  INTO zls_wa.

3. READ TABLE zlt_itab WITH TABLE KEY key
COMPONENTS col1 = …
                              col2 = …INTO zls_wa.

With 7.40

zls_wa = zlt_itab[ KEY key INDEX zlv_idx ].

zls_wa = zlt_itab[ col1 = … col2 = … ].

zls_wa = zlt_itab[ KEY key col1 = …col2 = … ].

Table Expression (Does record exist?)

Whenever we have data in internal table it is very common practice to check the data which we require from table that is already exist or not?

We use here TRANSPORTING NO FIELDS statement  as we are not interested about the data but it is exist or not in the table.

In new statement we use line_exist statement to do this. We use the statement then internal table and the parameters if it is successful then compiler go inside.

Before 7.40

READ TABLE zlt_itab ... TRANSPORTING NO FIELDS.
IF sy-subrc = 0.   
...
ENDIF.

With 7.40

IF line_exists( zlt_itab[ ... ] ).      
...
ENDIF.

Table Expression(Get table index)

This example is used to read the index table index. We use line_index in the new statement.

Before 7.40

DATA zv_idx type sy-tabix.
READ TABLE ...
TRANSPORTING NO FIELDS.

zv_idx = sy-tabix.

With 7.40

DATA(zv_idx) = line_index(zlt _itab[ ... ] ).

String processing

This is frequently used in ABAP code. The data from the DB needs to be formatted before display and vice versa.

Concatenation of string: the changes are as followed:

  • String template: Create character string out of literals texts, expressions and control character, The goal is to display data in more human readable format.
  • We use pipe symbol and && operator to concatenate string.
  • To replace the write to statement.
  • A string template is defined by using the |(pipe) symbol at the beginning and end of a template.
  • If we add some value with string template like {expression} and control character.
  • Embedded expression are defined within the string template with curly brackets. Note a space between bracket and expression is obligatory.
  • An expression can be variable, functional method, predefined function or calculation expression.

Before 7.4

Data zlv_qmnum type string.
Data zlv_string type string.

zlv_qmnum = zls_qmel-qmnum.

Concatenate ‘Your notification no:’
                           zlv_qmnum
                           into zlv_string
                           separated by space.

Write :/ zlv_string.

With 7.4

Data zlv_qmnum type string.
Data zlv_string type string.

zlv_qmnum = zls_qmel-qmnum.
zlv_string = |’Your Notification No:’|&& zlv_qmnum.
zlv_string = ’Your Notification No:’.

Same as (as soon as we add pipe symbol it became string template).

zlv_string = |’Your Notification No:’.|.
zlv_string = |{ a numeric variable }|.
zlv_string = |’The return code is: ({ sy-subrc }|.
zlv_string = |’The length of text : {( text-001 )} is { strlen(text-001) }.

Chaining Operator: The chaining operator && can be used to create one character string out of multiple other strings  and string template.

In this example a number text , a space, an existing character string and a new string template are concatenated into new character string. The code convert the amount field in a display format as per user settings.

Character_string = ‘Text literal(002)’&& ‘ ’&& character_string && |{ amount_field NUMBER = USER }|.

Conversion operator

Conversion operator is used to convert value into specified type. It is suitable to avoid the declaration of helper variable.

For example :let us assume that a method expects string but we have data in character. We would need to move the  value to the string variable and then pass the helper variable to the method call. With CONV variable helper variable not required. The value can be converted directly during method call.

Before 7.40

Data zlv_cust_name type c length 20.
Data:zlv_helper type string.

zlv_helper = zlv_cust_name.

Cl_func->process_func(ziv_input = zlv_helper).

With 7.40

Data zlv_cust_name type c length 20.
Cl_func->process_func(ziv_input =CONV string( zlv_cust_name ).

Cl_func->process_func(ziv_input =CONV #(zlv_cust_name ).

Casting operator

The casting operator CAST is a constructor operator that performs a down cast or up cast for the object and create a reference variable as a result.

Syntax of casting operator is :

Cast #/type( [let_exp] dobj)

Type can be class or interface. The # character is a symbol for the operand type.

With 7.40

CLASS zcl1 DEFINITION.
ENDCLASS.
CLASS zcl2 DEFINITION INHERITING FROM    zcl1.
ENDCLASS.

DATA: zlo_oref1 TYPE REF TO zcl1,
      zlo_oref2 TYPE REF TO zcl2.

IF zlo_oref1 IS INSTANCE OF zcl2.
  zlo_oref2 ?= zlo_oref1.
  zlo_oref2 =  CAST #( zlo_oref1 ).
ENDIF.

Value operator

The VALUE operator in SAP ABAP 7.4 is used to create and initialize data objects of a specified type. It is particularly useful for constructing values for structured types, table types, and controlling the type of results in table expressions.

Initial Value for All Types:

The VALUE operator can be used to create initial values for any non-generic data types

DATA zlv_initial TYPE i
zlv_initial = VALUE i( )

Structures

For structures, the VALUE operator allows you to specify values for individual fields

TYPES: BEGIN OF zlts_struct,
field1 TYPE string,
field2 TYPE string,
END OF zlts_struct

DATA zls_struct TYPE zlts_struct

zls_struct = VALUE zlts_struct( field1 = 'Value1' field2 = 'Value2' )

Internal Tables

The VALUE operator can also be used to construct internal tables

DATA zlt_table TYPE TABLE OF string
zlt_table = VALUE #( ( 'Row1' ) ( 'Row2' ) ( 'Row3' ) )

For operator

For operator is used to loop at an internal table. For each loop the row is read and assigned to a work area or field symbol. This is similar to the same FOR loop in C language.

Transfer data from one internal table to another internal table:

New Syntax:

Data: zlt_r_equipment TYPE RANGE OF equnr,
zlt_r_equipment = VALUE #(  FOR zls_equipment IN zlt_r_equipment
                    ( sign   = zls_equipment-sign
                      option = zls_equipment-option
                      low    = |{ zls_equipment-low   ALPHA = IN }|
                      high   = |{ zls_equipment-high ALPHA = IN }| ) ).
).

Reduction operator

Reduce operator creates a results of specified data type after going through iteration. In Classical ABAP if we had to evaluate the data in an internal table then we had to loop through the internal table, evaluate the condition, and then take appropriate action. This could be done much simpler way using REDUCE.

Data(zlv_lines) = REDUCE i ( init x = 0 for wa_sales in lt_sales where ( salesoffice = ‘IN’) Next x= x+1 ) .

Conditional operator

It is an accepted practice in ABAP to use CASE statement instead of IF statement. CASE statement made the code readable but had an issue that it was not able to evaluate multiple condition.so we use if else statement. In 7.40 we use COND operator for the same.

Data(zlv_text) = COND # ( when zlv_qmtxt = ‘X1’and zlv_artpr = ‘XX’ then ‘Customer’
when zlv_qmtxt = ‘01’and zlv_artpr = ‘XX’ then ‘test1’
when zlv_qmtxt = ‘02’and zlv_artpr = ‘XX’ then ‘test2’).

Write:/zlv_text

Switch operator

Switch operator is a conditional operator like CASE but more powerful and less code. It is used to switch from one value to another based on condition.

Old syntax:

data: zlv_indicator like scal-indicator, zlv_day(10) type c.
    case zlv_indicator.
    when 1.
      zlv_day = 'Monday'.
    when 2.
      zlv_day = 'Tuesday'.
    when 3.
      zlv_day = 'Wednesday'.
    when 4.
      zlv_day = 'Thursday'.
    when 5.
      zlv_day = 'Friday'.
    when 6.
      zlv_day = 'Saturday'.
    when 7.
      zlv_day = 'Sunday'.
else.
     Raise exception type zcx_day_problem.
endcase.

New Syntax:

DATA(zlv_day) = SWITCH char10( zlv_indicator
when 1 THEN 'Monday'
   when 2 THEN 'Tuesday'
   when 3 THEN 'Wednesday'
   when 4 THEN 'Thursday'
   when 5 THEN 'Friday'
   when 6 THEN 'Saturday'
   when 7 THEN 'Sunday'
   ELSE THROW zcx_day_problem( ) ).

Corresponding operator

Corresponding operator allows the copy of data from one internal table to another internal table just like move corresponding but provides more options on which columns are copied.

TYPES : BEGIN OF zlts_demo1,
col1 TYPE c,
          col2 TYPE c,
        END OF zlts_demo1,

      BEGIN OF zlts_demo2,
          col1 TYPE c,
          col3 TYPE c,
          col4 TYPE c,
        END OF zlts_demo2.

Data: zlt_itab1 TYPE STANDARD TABLE OF zlts_demo1,
      zlt_itab2 TYPE STANDARD TABLE OF zlts_demo2.

zlt_itab1 = VALUE #( ( col1 = 'A' col2 = 'B' )
                 ( col1 = 'P' col2 = 'Q' )
                  ( col1 = 'N' col2 = 'P' ) ).

zlt_itab2 = CORRESPONDING #(zlt_itab1 ).

cl_demo_output=>write_data( zlt_itab1 ).
cl_demo_output=>write_data( zlt_itab2 ).

cl_demo_output=>display( ).

Filter

A new FILTER operator is available which can used on ABAP internal tables to filter the data (or) to retrieve subset of data into a new internal table. As of ABAP 7.4 this keyword is available to use in the system.

Old Syntax:

Data: zlt_qmel_all type standard table of qmel,
zlt_qmel_zz type standard table of qmel.

Select * from qmel into table @zlt_qmel_all.

If sy-subrc = 0.
Loop at zlt_qmel_all into data data(zls_qmel) where qmart = ‘00’.
Append zls_qmel to zlt_qmel_zz.
Clear : zls_qmel.
Endloop.
Endif.

New Syntax:

zlt_qmel_zz = FILTER #(zlt_qmel_all using key qmart where qmart = ‘00’)