ABAP - Keyword Documentation →  ABAP - Dictionary →  ABAP CDS in ABAP Dictionary →  ABAP CDS - Data Definitions →  ABAP CDS - DDL for Data Definitions →  ABAP CDS - DEFINE VIEW →  ABAP CDS - SELECT →  ABAP CDS - SELECT, Built-In Functions →  ABAP CDS - Special Functions →  ABAP CDS - Conversion Functions → 

ABAP CDS - Conversion Functions for Units and Currencies

Syntax

... UNIT_CONVERSION( p1 => a1, p2 => a2, ... )
  | CURRENCY_CONVERSION( p1 => a1, p2 => a2, ... )
  | DECIMAL_SHIFT( p1 => a1, p2 => a2, ... ) ...


Variants:

1. ... UNIT_CONVERSION( p1 => a1, p2 => a2, ... )

2. ... CURRENCY_CONVERSION( p1 => a1, p2 => a2, ... )

3. ... DECIMAL_SHIFT( p1 => a1, p2 => a2, ... )

Effect

Conversion functions for converting between units and between currencies in a CDS view. The functions have keyword parameters p1, p2, ... (some of which are optional), to which the actual parameters a1, a2, ... must be assigned when called using =>.

Variant 1

... UNIT_CONVERSION( p1 => a1, p2 => a2, ... )


Effect

The function UNIT_CONVERSION performs a unit conversion for the value passed to the formal parameter quantity. The result has the data type QUAN with the length 31 and 14 decimal places. The unit conversion is performed on the basis of the client-specific rules saved in transaction CUNI and in the database tables T006... of the package SZME.

The table below shows the actual parameters p1, p2, ... and their meaning.

Formal Parameter Optional Meaning Data Type Actual Parameter
quantity - Source value QUAN, DEC, INT1, INT2, INT4, FLTP Field of a data source, parameter
source_unit - Source currency from column MSEHI of database table T006 UNIT Field of a data source, literal, parameter
target_unit - Target unit from column MSEHI of database table T006 UNIT Field of a data source, literal, parameter
client X, - Client whose rules are used to perform the unit conversion. Optional (if the current data source is client-specific). Default: Content of the client column of the current row CLNT Field of a data source, literal, parameter
error_handling X Error handling. If "FAIL_ON_ERROR" (default value), an error raises an exception; if "SET_TO_NULL", the result is reset to the null value; if "KEEP_UNCONVERTED", the source value is not changed. CHAR with length 20 Literal

Note

The precision of the result of the unit conversion depends on the database platform. The highest precision is achieved on databases that support decimal floating point numbers. Due to rounding, the result can be different from a unit conversion performed using ABAP methods, such as a standard function module.

Example

The following CDS view calls a unit conversion in the SELECT list for the column DEC3 of the database table DEMO_EXPRESSIONS. The source unit is a literal that is cast to the required type. The target unit must be passed as a parameter. In the event of an error, for example if a conversion between the entered units is impossible, the result is reset to zero.

@AbapCatalog.sqlViewName: 'DEMO_CDS_UNTCNV'
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view demo_cds_unit_conversion
  with parameters
    to_unit :abap.unit( 3 )
  as select from
    demo_expressions
    {
      id,
      dec3                              as original_value,
      cast( 'MI' as abap.unit(3) )      as original_unit,
      unit_conversion( quantity => dec3,
      source_unit => cast( 'MI' as abap.unit(3) ),
      target_unit => :to_unit,
      error_handling => 'SET_TO_NULL' ) as converted_value,
      :to_unit                          as converted_unit
    }
  

The program DEMO_CDS_UNIT_CONVERSION accesses the view in a SELECT statement. Here, the target unit is passed to the parameter in question. As a comparison, the same conversion is also performed using the function module UNIT_CONVERSION_SIMPLE. As a prerequisite for the example, the units and their conversion rules must be available in the corresponding database tables.

Variant 2

... CURRENCY_CONVERSION( p1 => a1, p2 => a2, ... )


Effect

The function CURRENCY_CONVERSION performs a currency conversion for the value passed to the formal parameter amount. The result has the data type CURR with the same technical attributes as the actual parameter passed to amount. The currency conversion is performed on the basis of the client-specific rules saved in the database tables TCUR... of package SFIB. These rules can be edited using transaction OB08.

The table below shows the actual parameters p1, p2, ... and their meaning.

Formal Parameter Optional Meaning Data Type Actual Parameter
amount - Source value CURR Field of a data source, parameter
source_currency - Source currency from column WAERS of database table TCURC CUKY Field of a data source, literal, parameter
target_currency - Target currency from column WAERS of database table TCURC CUKY Field of a data source, literal, parameter
exchange_rate_date - Exchange rate date for column WAERS of database table TCURR DATS Field of a data source, literal, parameter
exchange_rate_type X Exchange rate type from column KURST of database table TCURR, default value: "M" CHAR with length 4 Literal, parameter
client X, - Client whose rules are used to perform the currency conversion. Optional (if the current data source is client-specific). Default: Content of the client column of the current row CLNT Field of a data source, literal, parameter
round X If "X" (default value), the intermediate result of the conversion is rounded to the end result using commercial rounding; else it is truncated CHAR Literal
decimal_shift X If "X" (default value), the decimal places of the source value are moved as specified by the decimal places of the source currency (see below). CHAR Literal
decimal_shift_back X If "X" (default value), the decimal places of the result are moved as specified by the decimal places of the target currency (see below). CHAR Literal
error_handling X Error handling. If "FAIL_ON_ERROR" (default value), an error raises an exception; if "SET_TO_NULL", the result is reset to the null value; if "KEEP_UNCONVERTED", the source value is not changed. CHAR with length 20 Literal

The literals #cdsboolean.TRUE, #cdsboolean.true, #cdsboolean.FALSE, and #cdsboolean.false can also be specified for the input parameters round, decimal_shift, and decimal_shift_back with the domain prefix CDSBOOLEAN (case-sensitive) or the literals 'true' or 'false' (not case-sensitive). Internally, these literals are handled like the values "X" or " ".

Handling the Decimal Places

Note

Example

The following CDS view calls a currency conversion in the SELECT list for the column AMOUNT of the database table DEMO_PRICES. The target currency must be passed as a parameter. In the event of an error, for example when a currency does not exist, the result is reset to zero.

@AbapCatalog.sqlViewName: 'DEMO_CDS_CURRCO'
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view demo_cds_curr_conv
  with parameters
    to_currency :abap.cuky( 5 ),
    exc_date    :abap.dats
  as select from
    demo_prices
    {
      id,
      currency_conversion( amount => amount,
      source_currency => currency,
      round => 'X',
      target_currency => :to_currency,
      exchange_rate_date => :exc_date,
      error_handling => 'SET_TO_NULL' ) as amount,
      :to_currency                      as currency
    }
  

The program DEMO_CDS_CURRENCY_CONVERSION accesses the view in a SELECT statement. The target currency is passed here. As a comparison, the same conversion is also performed using the function module CONVERT_TO_LOCAL_CURRENCY. As a prerequisite for the example, the currencies and conversion rules must be available in the corresponding database tables.

Variant 3

... DECIMAL_SHIFT( p1 => a1, p2 => a2, ... )


Effect

The function DECIMAL_SHIFT sets the decimal separator of the value that is passed to the formal parameter amount in accordance with a currency. The result has the data type CURR with the length 31 and 14 decimal places. Its value is produced by multiplying the input parameter rounded to two decimal places by 10 to the power of two minus the decimal places defined by the currency passed.

Possible currencies and their decimal places are based on the database tables TCUR... of the package SFIB.

Formal Parameter Optional Meaning Data Type Actual Parameter
amount - Source value CURR Field of a data source, parameter
currency - Currency from column WAERS of database table TCURC; the associated decimal places determined from the column CURRDEC of TCURX CUKY Field of a data source, literal, parameter
error_handling X Error handling. If "FAIL_ON_ERROR" (default value), an error raises an exception; if "SET_TO_NULL", the result is reset to the null value; if "KEEP_UNCONVERTED", the source value is not changed. CHAR with length 20 Literal

Note

If the type of the actual parameter passed to amount has two decimal places, its value is set to the number of decimal places of the passed currency.

Example

In the SELECT list, the following CDS view sets the decimal separator for the column AMOUNT of the database table DEMO_PRICES in accordance with currencies with decimal places between 0 and 5. The column AMOUNT has two decimal places, which means that the decimal places are determined directly by the currencies passed. In the event of an error, for example when a currency does not exist, the result is reset to zero.

@AbapCatalog.sqlViewName: 'DEMO_CDS_DCSHFT'
@AccessControl.authorizationCheck: #NOT_REQUIRED
define view demo_cds_decimal_shift
  as select from
    demo_prices
    {
      id,
      @Semantics.amount.currencyCode:'currency'
      amount                            as original,
      @Semantics.currencyCode
      currency,
      decimal_shift( amount => amount,
      currency => cast( '0 ' as abap.cuky(5) ),
      error_handling => 'SET_TO_NULL' ) as shift_0,
      decimal_shift( amount => amount,
      currency => cast( '1 ' as abap.cuky(5) ),
      error_handling => 'SET_TO_NULL' ) as shift_1,
      decimal_shift( amount => amount,
      currency => cast( '2 ' as abap.cuky(5) ),
      error_handling => 'SET_TO_NULL' ) as shift_2,
      decimal_shift( amount => amount,
      currency => cast( '3 ' as abap.cuky(5) ),
      error_handling => 'SET_TO_NULL' ) as shift_3,
      decimal_shift( amount => amount,
      currency => cast( '4 ' as abap.cuky(5) ),
      error_handling => 'SET_TO_NULL' ) as shift_4,
      decimal_shift( amount => amount,
      currency => cast( '5 ' as abap.cuky(5) ),
      error_handling => 'SET_TO_NULL' ) as shift_5
    }
  

The program DEMO_CDS_DECIMAL_SHIFT accesses the view in a SELECT statement. As a prerequisite for the example, the currencies and their number of decimal places must be available in the corresponding database tables.