Novidades do ABAP 740
ABAP 740
Temas:
Expressões de construção:
* Instanciando com operador NEW;
* Valores com operador VALUE;
* Conversões com operadores CONV e CAST;
* Exatidão de dados usando EXACT;
* Condicionais usando operadores COND e SWITCH;
Instanciando com operador NEW
O operador de instancia NEW é o operador de construção para criar objetos.
* ... NEW dtype( value ) ...
Cria uma instancia de objetos do tipo dtype e já atribui para alguma variável.
* ... NEW class( p1 = a1 p2 = a2 ... ) ...
Cria instancia da classe e passa parâmetros para a instancia.
* ... NEW #( value ) ...
Cria objetos de tipo genérico.
Exemplos de Uso:
.
DATA oref TYPE REF TO class.
oref = NEW #( ... ).
OU
DATA(oref) = NEW class( ... ).
Valores com operador VALUE
Usado para construir objetos passando um valor pré-estabelecido.
* ... VALUE dtype|#( ) ...
Construtor com valor inicial para um tipo genérico.
* ... VALUE dtype|#( comp1 = a1 comp2 = a2 ... ) ...
Cria uma estrutura onde para cada component um valor é passado.
* ... VALUE dtype|#( ( ... ) ( ... ) ... ) ...
Construtor de tabela interna, onde para cada linha um valor é passado. Dentro dos parenteses você usa a sintaxe para estruturas mas não diretamente a sintaxe de linhas da tabela.
Mas você pode aninhar os operadores VALUE.
Exemplos de Uso:
CLASS c1 DEFINITION.
PUBLIC SECTION. TYPES: BEGIN OF t_struct,
col1 TYPE i,
col2 TYPE i,
END OF t_struct.
CLASS-METHODS m1 IMPORTING p TYPE t_struct.
ENDCLASS.
CLASS c1 IMPLEMENTATION.
METHOD m1.
...
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
c1=>m1( VALUE #( ) ).
Exemplos de Uso2:
TYPES t_itab TYPE TABLE OF i WITH EMPTY KEY.
DATA itab TYPE t_itab.
itab = VALUE #( ( ) ( 1 ) ( 2 ) ).
Structured line type (RANGES table):
DATA itab TYPE RANGE OF i.
itab = VALUE #( sign = 'I' option = 'BT' ( low = 1 high = 10 )
( low = 21 high = 30 )
( low = 41 high = 50 )
option = 'GE' ( low = 61 ) ).
itab = VALUE #( sign = 'I' option = 'BT' ( low = 1 high = 10 )
( low = 21 high = 30 )
( low = 41 high = 50 )
option = 'GE' ( low = 61 ) ).
Exemplos de Uso3:
TYPES: BEGIN OF t_col2,
col1 TYPE i,
col2 TYPE i,
END OF t_col2.
TYPES: BEGIN OF t_struct,
col1 TYPE i,
col2 TYPE t_col2,
END OF t_struct.
DATA: struct TYPE t_struct,
col2 TYPE t_col2.
col1 TYPE i,
col2 TYPE i,
END OF t_col2.
TYPES: BEGIN OF t_struct,
col1 TYPE i,
col2 TYPE t_col2,
END OF t_struct.
DATA: struct TYPE t_struct,
col2 TYPE t_col2.
"1
struct = VALUE t_struct( col1 = 1
col2-col1 = 1
col2-col2 = 2 ).
"2
struct = VALUE t_struct( col1 = 1
col2-col1 = 1
col2-col2 = 2 ).
"2
col2 = VALUE t_col2( col1 = 1
col2 = 2 ).
struct = VALUE t_struct( col1 = 1
col2 = col2 ).
"3
col2 = 2 ).
struct = VALUE t_struct( col1 = 1
col2 = col2 ).
"3
struct = VALUE t_struct( col1 = 1
col2 = VALUE #( col1 = 1
col2 = 2 ) ).
col2 = VALUE #( col1 = 1
col2 = 2 ) ).
Conversões com operadores CONV e CAST
CONV -> Este operador de conversão é um operador de construção que convert um valor em um tipo específico.
* ... CONV dtype|#( ... ) ...
Você pode usar o CONV onde precisar de uma variável auxiliar antes de saber o typo de dados.
Exemplo de Uso:
DATA text TYPE c LENGTH 255.
DATA(xstr) = cl_abap_codepage=>convert_to( source = CONV string( text ) ).
DATA text TYPE c LENGTH 255.
DATA(xstr) = cl_abap_codepage=>convert_to( source = CONV #( text ) ).
Exemplo de Uso2:
IF ' ' = CONV char1( ` ` ).
...
ENDIF.
CAST -> O operador CAST é o operador construtor que executa o up ou down cast para variáveis com um tipo específico de dados.
* ... CAST dtype|class|interface|#( ... ) ...
- Você usa o CAST para down cast quando você precisar de variáveis auxiliares antes de saber o tipo.
- Você usa o CAST para o up cast
Exemplo de Uso:
DATA(components) = CAST cl_abap_structdescr(
cl_abap_typedescr=>describe_by_name( 'T100' ) )->components.
TYPES: BEGIN OF t_struc,
col1 TYPE i, col2 TYPE i,
END OF t_struc.
Exemplo de Uso2:
DATA dref TYPE REF TO data.
DATA struc TYPE t_struc.
dref = NEW t_struc( ).
CAST t_struc( dref )->col1 = struc-col1.
DATA dref TYPE REF TO data.
DATA struc TYPE t_struc.
dref = NEW t_struc( ).
CAST t_struc( dref )->col1 = struc-col1.
Exatidão de dados usando EXACT
O operador EXACT é o construtor que executa um cálculo com exatidão (Sem Perdas).
* ... EXACT dtype|#( arith_exp ) ...
arith_exp é uma expressão aritmética que calcula com menor perda do tipo decfloat34 e o resultado será convertido para um tipo específico.
* ... EXACT dtype|#( arg ) ...
arg não é uma expressão aritmética e este valor é apontado para o resultado de um tipo específico de acordo com as regras para menor perda de dados.
Exemplo de Uso:
TRY.
DATA(r1) = EXACT decfloat34( 3 / 2 ).
cl_demo_output=>write( |Exact: { r1 }| ).
CATCH cx_sy_conversion_rounding INTO DATA(e1).
cl_demo_output=>write( |Not exact: { e1->value }| ).
ENDTRY.
DATA(r1) = EXACT decfloat34( 3 / 2 ).
cl_demo_output=>write( |Exact: { r1 }| ).
CATCH cx_sy_conversion_rounding INTO DATA(e1).
cl_demo_output=>write( |Not exact: { e1->value }| ).
ENDTRY.
TRY.
DATA(r2) = EXACT decfloat34( 3 / 7 ).
cl_demo_output=>write( |Exact: { r2 }| ).
CATCH cx_sy_conversion_rounding INTO DATA(e2).
cl_demo_output=>write( |Not exact: { e2->value }| ).
ENDTRY.
DATA(r2) = EXACT decfloat34( 3 / 7 ).
cl_demo_output=>write( |Exact: { r2 }| ).
CATCH cx_sy_conversion_rounding INTO DATA(e2).
cl_demo_output=>write( |Not exact: { e2->value }| ).
ENDTRY.
cl_demo_output=>display( ).
The output is:
Exact: 1.5
Not exact: 0.4285714285714285714285714285714286
Condicionais usando operadores COND e SWITCH
* ... COND dtype|#( WHEN log_exp1 THEN result1
[ WHEN log_exp2 THEN result2 ]
...
[ ELSE resultn ] ) ...
Construtor onde o resultado é de um tipo específico onde depende da expressão lógica.
* ... SWITCH dtype|# ( operand
WHEN const1 THEN result1
[ WHEN const2 THEN result2 ]
...
[ ELSE resultn ] ) ...
Construtor onde o resultado é de um tipo específico dependendo da diferenciação de caso.
Exemplo de Uso COND:
DATA(time) =
COND string(
WHEN sy-timlo < '120000' THEN
|{ sy-timlo TIME = ISO } AM|
WHEN sy-timlo > '120000' THEN
|{ CONV t( sy-timlo - 12 * 3600 )
TIME = ISO } PM|
WHEN sy-timlo = '120000' THEN
|High Noon|
ELSE
THROW cx_cant_be( ) ).
Exemplo de Uso SWITCH:
CLASS cx_langu_not_supported DEFINITION INHERITING FROM cx_static_check.
ENDCLASS.
ENDCLASS.
CLASS class DEFINITION.
PUBLIC SECTION.
METHODS meth IMPORTING iso_langu TYPE string
RETURNING VALUE(text) TYPE string.
ENDCLASS.
PUBLIC SECTION.
METHODS meth IMPORTING iso_langu TYPE string
RETURNING VALUE(text) TYPE string.
ENDCLASS.
CLASS class IMPLEMENTATION.
METHOD meth.
...
ENDMETHOD.
ENDCLASS.
METHOD meth.
...
ENDMETHOD.
ENDCLASS.
...
DATA(text) =
NEW class(
NEW class(
)->meth(
SWITCH #( sy-langu
WHEN 'D' THEN `DE`
WHEN 'E' THEN `EN`
ELSE THROW cx_langu_not_supported( ) ) ).
Comentários
Postar um comentário