Está en la página 1de 43

ABAP

#abap
Tabla de contenido
Acerca de 1

Capítulo 1: Empezando con ABAP 2

Observaciones 2

Versiones 2

Examples 2

Hola Mundo 2

Hola mundo en objetos ABAP 3

Capítulo 2: ABAP GRID List Viewer (ALV) 4

Examples 4

Creación y visualización de un ALV 4

Optimizar el ancho de columna ALV 4

Ocultar columnas en un ALV 4

Cambiar el nombre de los encabezados de columna en un ALV 4

Habilitar la funcionalidad de la barra de herramientas ALV 5

Habilitación de la separación de filas en ALV 5

Configuración del título de un ALV mostrado 5

Capítulo 3: Abrir SQL 7

Examples 7

Instrucción SELECT 7

Capítulo 4: Bucles 8

Observaciones 8

Examples 8

Lazo de tabla interno 8

Mientras bucle 8

Hacer bucle 9

Comandos generales 9

Capítulo 5: Clases de mensajes / palabra clave MESSAGE 11

Introducción 11

Observaciones 11

Examples 11
Definiendo una clase de mensaje 11

MENSAJE con símbolo de texto predefinido 11

Mensaje sin clase de mensaje predefinida 11

Mensajería Dinámica 12

Pasando parámetros a los mensajes 12

Capítulo 6: Comentarios 13

Examples 13

Fin de la línea 13

Línea completa 13

Capítulo 7: Convenciones de nombres 14

Sintaxis 14

Examples 14

Variable local 14

Variable global 14

Capítulo 8: Declaración de datos 15

Examples 15

Declaración de datos en línea 15

Declaración de una sola variable 15

Declaración Variable Múltiple 15

Declaración de datos en línea en la declaración SELECT 15

Opciones de Declaración Variable 15

Capítulo 9: Declaraciones de flujo de control 17

Examples 17

IF / ELSEIF / ELSE 17

CASO 17

COMPROBAR 17

AFIRMAR 17

COND / INTERRUPTOR 18

COND 18

Ejemplos 18

CAMBIAR 18

Ejemplos 18
Capítulo 10: Examen de la unidad 20

Examples 20

Estructura de una clase de prueba 20

Acceso a datos separados de la lógica 20

Capítulo 11: Expresiones regulares 22

Examples 22

Reemplazo 22

buscando 22

Expresiones regulares orientadas a objetos 22

Evaluando expresiones regulares con una función de predicado 22

Obtención de submisiones usando OO-Expresiones regulares 23

Capítulo 12: Instrumentos de cuerda 24

Examples 24

Literales 24

Plantillas de cadena 24

Cuerdas de concatenacion 24

Capítulo 13: Objetos ABAP 26

Examples 26

Declaración de clase 26

Las clases ABAP pueden ser declaradas global o localmente . Una clase global puede ser uti 26

Constructor, metodos 26

Método con parámetros (Importando, Cambiando, Exportando) 27

Método con parámetro de retorno 27

Herencia - definición 28

Información 28

Implementación de clase 28

Herencia - Resumen y Métodos Finales y Clases 28

Información 28

Implementación de la clase: 28

Método de ejemplo de llamada: 29

Capítulo 14: Plantilla de programas 30

Sintaxis 30
Examples 30

Programa OO con métodos de eventos esenciales. 30

Capítulo 15: Programación dinámica 32

Examples 32

Simbolos de campo 32

Referencias de datos 33

Servicios de tipo RunTime 34

Capítulo 16: Tablas internas 35

Examples 35

Tipos de tablas internas 35

Declaración de Tablas Internas ABAP 35

Declaración de tabla interna basada en la definición de tipo local 35

Declaración basada en la tabla de base de datos 36

Declaración de tabla interna en línea 36

Tabla interna con declaración de líneas de encabezado 36

Leer, escribir e insertar en tablas internas 37

Creditos 38
Acerca de
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version
from: abap

It is an unofficial and free ABAP ebook created for educational purposes. All the content is
extracted from Stack Overflow Documentation, which is written by many hardworking individuals at
Stack Overflow. It is neither affiliated with Stack Overflow nor official ABAP.

The content is released under Creative Commons BY-SA, and the list of contributors to each
chapter are provided in the credits section at the end of this book. Images may be copyright of
their respective owners unless otherwise specified. All trademarks and registered trademarks are
the property of their respective company owners.

Use the content presented in this book at your own risk; it is not guaranteed to be correct nor
accurate, please send your feedback and corrections to info@zzzprojects.com

https://riptutorial.com/es/home 1
Capítulo 1: Empezando con ABAP
Observaciones
ABAP es un lenguaje de programación desarrollado por SAP para la programación de
aplicaciones empresariales en el entorno SAP.

Anteriormente solo de procedimiento, ABAP ahora también es un lenguaje orientado a objetos


gracias a la mejora de Objetos ABAP.

Versiones

Versión Fecha de lanzamiento

ABAP 7.50 2015-10-20

ABAP 7.40 2012-11-29

ABAP 7.0 2006-04-01

ABAP 6.40 2004-04-01

ABAP 6.20 2002-04-01

ABAP 6.10 2001-07-01

ABAP 4.6C 2001-04-01

ABAP 4.6A 1999-12-01

ABAP 4.5 1999-03-01

ABAP 4.0 1998-06-01

ABAP 3.0 1997-02-20

Examples
Hola Mundo

PROGRAM zhello_world.
START-OF-SELECTION.
WRITE 'Hello, World!'.

En lugar de imprimir en la consola, ABAP escribe valores en una lista que se mostrará tan pronto
como se ejecutó la lógica principal.

https://riptutorial.com/es/home 2
Hola mundo en objetos ABAP

PROGRAM zhello_world.

CLASS main DEFINITION FINAL CREATE PRIVATE.


PUBLIC SECTION.
CLASS-METHODS: start.
ENDCLASS.

CLASS main IMPLEMENTATION.


METHOD start.
cl_demo_output=>display( 'Hello World!' ).
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
main=>start( ).

Lea Empezando con ABAP en línea: https://riptutorial.com/es/abap/topic/1196/empezando-con-


abap

https://riptutorial.com/es/home 3
Capítulo 2: ABAP GRID List Viewer (ALV)
Examples
Creación y visualización de un ALV

Este ejemplo muestra la creación ALV más simple utilizando la clase cl_salv_table y sin opciones
de formato adicionales. Se incluirían opciones de formato adicionales después del bloque TRY
ENDTRY y antes de la llamada del método alv->display( ) .

Todos los ejemplos posteriores que utilicen el enfoque de Objetos ABAP para la creación de ALV
utilizarán este ejemplo como punto de partida.

DATA: t_spfli TYPE STANDARD TABLE OF spfli,


alv TYPE REF TO cl_salv_table,
error_message TYPE REF TO cx_salv_msg.

" Fill the internal table with example data


SELECT * FROM spfli INTO TABLE t_spfli.

" Fill ALV object with data from the internal table
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = alv
CHANGING
t_table = t_spfli ).
CATCH cx_salv_msg INTO error_message.
" error handling
ENDTRY.

" Use the ALV object's display method to show the ALV on the screen
alv->display( ).

Optimizar el ancho de columna ALV

Este ejemplo muestra cómo optimizar el ancho de columna para que los encabezados de
columna y los datos no se recorten.

alv->get_columns( )->set_optimize( ).

Ocultar columnas en un ALV

Este ejemplo oculta el campo MANDT (cliente) de la ALV. Tenga en cuenta que el parámetro pasado
a get_column( ) debe estar en mayúsculas para que esto funcione.

alv->get_columns( )->get_column( 'MANDT' )->set_visible( if_salv_c_bool_sap=>false ).

Cambiar el nombre de los encabezados de columna en un ALV

https://riptutorial.com/es/home 4
El texto de la columna puede cambiar al cambiar el tamaño horizontal de una columna. Hay tres
métodos para lograr esto:

Nombre del método Longitud máxima de la partida

set_short_text 10

set_medium_text 20

set_long_text 40

El siguiente ejemplo muestra el uso de los tres. Un objeto de column se declara y crea una
instancia como referencia al resultado de alv->get_columns( )->get_column( 'DISTID' ) . El nombre
de la columna debe estar en mayúsculas. Esto es así para que este método de encadenamiento
solo se llame una vez en su instanciación, en lugar de ejecutarse cada vez que se cambie un
encabezado de columna.

DATA column TYPE REF TO cl_salv_column.


column = alv->get_columns( )->get_column( 'DISTID' ).

column->set_short_text( 'Dist. Unit' ).


column->set_medium_text( 'Unit of Distance' ).
column->set_long_text( 'Mass Unit of Distance (kms, miles)' ).

Habilitar la funcionalidad de la barra de herramientas ALV

El siguiente método de llamada permite el uso de muchas funciones avanzadas, como la


clasificación, el filtrado y la exportación de datos.

alv->get_functions( )->set_all( ).

Habilitación de la separación de filas en ALV

Este método aumenta la legibilidad al dar filas consecutivas que alternan el sombreado del color
de fondo.

alv->get_display_settings( )->set_striped_pattern( if_salv_c_bool_sap=>true ).

Configuración del título de un ALV mostrado

De forma predeterminada, cuando se muestra un ALV, el título en la parte superior es solo el


nombre del programa. Este método permite al usuario establecer un título de hasta 70 caracteres.
El siguiente ejemplo muestra cómo se puede establecer un título dinámico que muestra el número
de registros mostrados.

alv->get_display_settings( )->set_list_header( |Flight Schedule - { lines( t_spfli ) }


records| ).

https://riptutorial.com/es/home 5
Lea ABAP GRID List Viewer (ALV) en línea: https://riptutorial.com/es/abap/topic/4660/abap-grid-
list-viewer--alv-

https://riptutorial.com/es/home 6
Capítulo 3: Abrir SQL
Examples
Instrucción SELECT

SELECT es una declaración Open-SQL para leer datos de una o varias tablas de base de datos
en objetos de datos .

1. Selección de todos los registros

* This returns all records into internal table lt_mara.


SELECT * FROM mara
INTO lt_mara.

2. Selección de registro único

* This returns single record if table consists multiple records with same key.
SELECT SINGLE * INTO TABLE lt_mara
FROM mara
WHERE matnr EQ '400-500'.

3. Selección de registros distintos

* This returns records with distinct values.


SELECT DISTINCT * FROM mara
INTO TABLE lt_mara
ORDER BY matnr.

4. Funciones agregadas

* This puts the number of records present in table MARA into the variable lv_var
SELECT COUNT( * ) FROM mara
INTO lv_var.

Lea Abrir SQL en línea: https://riptutorial.com/es/abap/topic/6885/abrir-sql

https://riptutorial.com/es/home 7
Capítulo 4: Bucles
Observaciones
Cuando se realiza un bucle sobre tablas internas, generalmente es preferible ASSIGN a un símbolo
de campo en lugar de un bucle INTO un área de trabajo. La asignación de símbolos de campo
simplemente actualiza su referencia para apuntar a la siguiente línea de la tabla interna durante
cada iteración, mientras que el uso de INTO hace que la línea de la tabla se copie en el área de
trabajo, lo que puede ser costoso para las tablas largas / anchas.

Examples
Lazo de tabla interno

LOOP AT itab INTO wa.


ENDLOOP.

FIELD-SYMBOLS <fs> LIKE LINE OF itab.


LOOP AT itab ASSIGNING <fs>.
ENDLOOP.

LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>).


ENDLOOP.

LOOP AT itab REFERENCE INTO dref.


ENDLOOP.

LOOP AT itab TRANSPORTING NO FIELDS.


ENDLOOP.

Bucle condicional

Si solo las líneas que coinciden con una determinada condición deben incluirse en el bucle, la
adición WHERE se puede agregar.

LOOP AT itab INTO wa WHERE f1 = 'Max'.


ENDLOOP.

Mientras bucle

ABAP también ofrece el WHILE -Loop convencional que se ejecuta hasta que la expresión dada se
evalúa como falsa. El sy-index sistema del campo del sistema se incrementará para cada paso del
bucle.

WHILE condition.
* do something
ENDWHILE

https://riptutorial.com/es/home 8
Hacer bucle

Sin ninguna adición, el DO Loop se ejecuta sin fin o al menos hasta que sale explícitamente del
interior. El sy-index sistema del campo del sistema se incrementará para cada paso del bucle.

DO.
* do something... get it?
* call EXIT somewhere
ENDDO.

La adición de TIMES ofrece una manera muy conveniente de repetir el código (la amount representa
un valor de tipo i ).

DO amount TIMES.
* do several times
ENDDO.

Comandos generales

Para romper bucles, se puede usar el comando EXIT .

DO.
READ TABLE itab INDEX sy-index INTO DATA(wa).
IF sy-subrc <> 0.
EXIT. "Stop this loop if no element was found
ENDIF.
" some code
ENDDO.

Para saltar al siguiente paso del bucle, se puede usar el comando CONTINUE .

DO.
IF sy-index MOD 1 = 0.
CONTINUE. " continue to next even index
ENDIF.
" some code
ENDDO.

La sentencia CHECK es un CONTINUE con condición. Si la condición resulta ser falsa , se ejecutará
CONTINUE . En otras palabras: el bucle solo continuará con el paso si la condición es verdadera .

Este ejemplo de CHECK ...

DO.
" some code
CHECK sy-index < 10.
" some code
ENDDO.

... es equivalente a ...

https://riptutorial.com/es/home 9
DO.
" some code
IF sy-index >= 10.
CONTINUE.
ENDIF.
" some code
ENDDO.

Lea Bucles en línea: https://riptutorial.com/es/abap/topic/2270/bucles

https://riptutorial.com/es/home 10
Capítulo 5: Clases de mensajes / palabra
clave MESSAGE
Introducción
La instrucción MESSAGE se puede usar para interrumpir el flujo del programa y mostrar mensajes
cortos al usuario. El contenido de los mensajes se puede definir en el código del programa, en los
símbolos de texto del programa o en una clase de mensaje independiente definida en SE91 .

Observaciones
La longitud máxima de un mensaje, incluidos los parámetros que se le pasan con & , es de 72
caracteres.

Examples
Definiendo una clase de mensaje
PROGRAM zprogram MESSAGE-ID sabapdemos.

El mensaje definido por el sistema se puede almacenar en una clase de mensaje. El token
MESSAGE-ID define la clase de mensaje sabapdemos para todo el programa. Si no se usa, la clase de
mensaje debe especificarse en cada llamada de MESSAGE .

MENSAJE con símbolo de texto predefinido

PROGRAM zprogram MESSAGE-ID za.


...
MESSAGE i000 WITH TEXT-i00.

Un mensaje mostrará el texto almacenado en el símbolo de texto i00 al usuario. Dado que el tipo
de mensaje es i (como se ve en i000 ), después de que el usuario salga del cuadro de diálogo, el
flujo del programa continuará desde el punto de la llamada de MESSAGE .

Aunque el texto no proviene de la clase de mensaje za , se debe especificar un MESSAGE-ID .

Mensaje sin clase de mensaje predefinida

PROGRAM zprogram.
...
MESSAGE i050(sabapdemos).

Puede ser inconveniente definir una clase de mensaje para todo el programa, por lo que es
posible definir la clase de mensaje de la que proviene el mensaje en la propia declaración MESSAGE

https://riptutorial.com/es/home 11
. Este ejemplo mostrará el mensaje 050 de la clase de mensaje sabapdemos .

Mensajería Dinámica

DATA: msgid TYPE sy-msgid VALUE 'SABAPDEMOS',


msgty TYPE sy-msgty VALUE 'I',
msgno TYPE sy-msgno VALUE '050'.

MESSAGE ID mid TYPE mtype NUMBER num.

La llamada de MESSAGE anterior es sinónimo de la llamada MESSAGE i050(sapdemos). .

Pasando parámetros a los mensajes

El símbolo & se puede usar en un mensaje para permitir que se le pasen parámetros.

Parámetros ordenados

Mensaje 777 de clase sabapdemos :

Message with type &1 &2 in event &3

Llamar a este mensaje con tres parámetros devolverá un mensaje usando los parámetros:

MESSAGE i050(sabapdemos) WITH 'E' '010' 'START-OF-SELECTION`.

Este mensaje se mostrará como Message with type E 010 in event START-OF-SELECTION . El número
junto al símbolo & designa el orden en que se muestran los parámetros.

Parámetros desordenados

Mensaje 888 de clase sabapdemos :

& & & &

La llamada de este mensaje es similar:

MESSAGE i050(sabapdemos) WITH 'param1' 'param2' 'param3' 'param4'.

Esto dará salida a param1 param2 param3 param4 .

Lea Clases de mensajes / palabra clave MESSAGE en línea:


https://riptutorial.com/es/abap/topic/10691/clases-de-mensajes---palabra-clave-message

https://riptutorial.com/es/home 12
Capítulo 6: Comentarios
Examples
Fin de la línea

Cualquier texto que sigue a un " carácter en la misma línea está comentado:

DATA ls_booking TYPE flightb. " Commented text

Línea completa

El * carácter comenta una línea completa. El * debe ser el primer carácter en la línea.

* DATA ls_booking TYPE flightb. Nothing on this line will be executed.

Lea Comentarios en línea: https://riptutorial.com/es/abap/topic/1644/comentarios

https://riptutorial.com/es/home 13
Capítulo 7: Convenciones de nombres
Sintaxis
• Los caracteres, números y _ se pueden usar para el nombre de variable.
• Dos caracteres utilizando para estado variable y tipo de objeto.
• Las variables locales comienzan con L.
• Las variables globales comienzan con G.
• El parámetro de entrada de función comienza con I (importar).
• El parámetro de salida de la función comienza con E (exportar).
• El símbolo de las estructuras es S.
• El símbolo de la mesa es T.

Examples
Variable local

data: lv_temp type string.


data: ls_temp type sy.
data: lt_temp type table of sy.

Variable global

data: gv_temp type string.


data: gs_temp type sy.
data: gt_temp type table of sy.

Lea Convenciones de nombres en línea: https://riptutorial.com/es/abap/topic/6770/convenciones-


de-nombres

https://riptutorial.com/es/home 14
Capítulo 8: Declaración de datos
Examples
Declaración de datos en línea

En ciertas situaciones, las declaraciones de datos se pueden realizar en línea.

LOOP AT lt_sflight INTO DATA(ls_sflight).


WRITE ls_sflight-carrid.
ENDLOOP.

Declaración de una sola variable

DATA begda TYPE sy-datum.

Declaración Variable Múltiple

DATA: begda TYPE sy-datum,


endda TYPE sy-datum.

Declaración de datos en línea en la declaración SELECT

Cuando se utiliza una declaración de datos en línea dentro de un bloque SELECT...ENDSELECT o una
SELECT SINGLE , el carácter @ debe usarse como un carácter de escape para la expresión
DATA(lv_cityto) . Una vez que se ha utilizado el carácter de escape, todas las demás variables del
host también deben escaparse (como es el caso con lv_carrid continuación).

DATA lv_carrid TYPE s_carr_id VALUE 'LH'.


SELECT SINGLE cityto FROM spfli
INTO @DATA(lv_cityto)
WHERE carrid = @lv_carrid
AND connid = 2402.
WRITE: / lv_cityto.

Salidas BERLIN .

Opciones de Declaración Variable

Se pueden declarar diferentes tipos de variables con opciones especiales.

DATA: lv_string TYPE string, " standard declaration


lv_char TYPE c, " declares a character variable of length 1
lv_char5(5) TYPE c, " declares a character variable of length 5
l_packed TYPE p LENGTH 10 DECIMALS 5 VALUE '1234567890.123456789'. " evaluates to
1,234,567,890.12346

https://riptutorial.com/es/home 15
Lea Declaración de datos en línea: https://riptutorial.com/es/abap/topic/1646/declaracion-de-datos

https://riptutorial.com/es/home 16
Capítulo 9: Declaraciones de flujo de control
Examples
IF / ELSEIF / ELSE

IF lv_foo = 3.
WRITE: / 'lv_foo is 3'.
ELSEIF lv_foo = 5.
WRITE: / 'lv_foo is 5'.
ELSE.
WRITE: / 'lv_foo is neither 3 nor 5'.
ENDIF.

CASO

CASE lv_foo.
WHEN 1.
WRITE: / 'lv_foo is 1'.
WHEN 2.
WRITE: / 'lv_foo is 2'.
WHEN 3.
WRITE: / 'lv_foo is 3'.
WHEN OTHERS.
WRITE: / 'lv_foo is something else'.
ENDCASE

COMPROBAR

CHECKes una declaración simple que evalúa una expresión lógica y sale del bloque de
procesamiento actual si es falso.

METHOD do_something.
CHECK iv_input IS NOT INITIAL. "Exits method immediately if iv_input is initial

"The rest of the method is only executed if iv_input is not initial


ENDMETHOD.

AFIRMAR

ASSERT se utiliza en áreas sensibles donde desea estar absolutamente seguro de que una variable
tiene un valor específico. Si la condición lógica después de ASSERT resulta ser falsa, se lanza una
excepción no ASSERTION_FAILED ( ASSERTION_FAILED ).

ASSERT 1 = 1. "No Problem - Program continues

ASSERT 1 = 2. "ERROR

https://riptutorial.com/es/home 17
COND / INTERRUPTOR

SWITCH y COND ofrecen una forma especial de flujo de programa condicional. A diferencia de IF y
CASE , representan valores diferentes basados en una expresión en lugar de ejecutar sentencias.
Es por eso que cuentan como funcionales.

COND
Cuando se deben considerar múltiples condiciones, COND puede hacer el trabajo. La sintaxis es
bastante simple:

COND <type>(
WHEN <condition> THEN <value>
...
[ ELSE <default> | throw <exception> ]
).

Ejemplos

" Set screen element active depending on radio button


screen-active = COND i(
WHEN p_radio = abap_true THEN 1
ELSE 0 " optional, because type 'i' defaults to zero
).

" Check how two operands are related to each other


" COND determines its type from rw_compare
rw_compare = COND #(
WHEN op1 < op2 THEN 'LT'
WHEN op1 = op2 THEN 'EQ'
WHEN op1 > op2 THEN 'GT'
).

CAMBIAR
SWITCH es una buena herramienta para mapear valores, ya que solo verifica la igualdad, por lo que
es más corto que COND en algunos casos. Si se dio una entrada inesperada, también es posible
lanzar una excepción. La sintaxis es un poco diferente:

SWITCH <type>(
<variable>
WHEN <value> THEN <new_value>
...
[ ELSE <default> | throw <exception> ]
).

Ejemplos

https://riptutorial.com/es/home 18
DATA(lw_language) = SWITCH string(
sy-langu
WHEN 'E' THEN 'English'
WHEN 'D' THEN 'German'
" ...
ELSE THROW cx_sy_conversion_unknown_langu( )
).

Lea Declaraciones de flujo de control en línea:


https://riptutorial.com/es/abap/topic/7289/declaraciones-de-flujo-de-control

https://riptutorial.com/es/home 19
Capítulo 10: Examen de la unidad
Examples
Estructura de una clase de prueba

Las clases de prueba se crean como clases locales en una prueba de unidad especial incluida.

Esta es la estructura básica de una clase de prueba:

CLASS lcl_test DEFINITION


FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.

PRIVATE SECTION.
DATA:
mo_cut TYPE REF TO zcl_dummy.

METHODS:
setup,

"********* 30 chars *********|


dummy_test for testing.
ENDCLASS.

CLASS lcl_test IMPLEMENTATION.


METHOD setup.
CREATE OBJECT mo_cut.
ENDMETHOD.

METHOD dummy_test.
cl_aunit_assert=>fail( ).
ENDMETHOD.
ENDCLASS.

Cualquier método declarado con FOR TESTING será una prueba unitaria. setup es un método
especial que se ejecuta antes de cada prueba.

Acceso a datos separados de la lógica

Un principio importante para las pruebas unitarias es separar el acceso a los datos de la lógica
empresarial. Una técnica eficiente para esto es definir interfaces para el acceso a datos. Su clase
principal siempre usa una referencia a esa interfaz en lugar de leer directamente o escribir datos.

En el código de producción, la clase principal recibirá un objeto que ajusta el acceso a los datos
reales. Esto podría ser una declaración de selección, función llamadas mudule, cualquier cosa
realmente. La parte importante es que esta clase no debe realizar nada más. Ilógico.

Al probar la clase principal, le asigna un objeto que sirve datos estáticos y falsos.

https://riptutorial.com/es/home 20
Un ejemplo para acceder a la tabla SCARR

Interfaz de acceso a datos ZIF_DB_SCARR :

INTERFACE zif_db_scarr
PUBLIC.
METHODS get_all
RETURNING
VALUE(rt_scarr) TYPE scarr_tab .
ENDINTERFACE.

Clase de datos falsos y clase de prueba:

CLASS lcl_db_scarr DEFINITION.


PUBLIC SECTION.
INTERFACES: zif_db_scarr.
ENDCLASS.

CLASS lcl_db_scarr IMPLEMENTATION.


METHOD zif_db_scarr~get_all.
" generate static data here
ENDMETHOD.
ENDCLASS.

CLASS lcl_test DEFINITION


FOR TESTING
DURATION SHORT
RISK LEVEL HARMLESS.

PRIVATE SECTION.
DATA:
mo_cut TYPE REF TO zcl_main_class.

METHODS:
setup.
ENDCLASS.

CLASS lcl_test IMPLEMENTATION.


METHOD setup.
DATA: lo_db_scarr TYPE REF TO lcl_db_scarr.

CREATE OBJECT lo_db_scarr.

CREATE OBJECT mo_cut


EXPORTING
io_db_scarr = lo_db_scarr.
ENDMETHOD.
ENDCLASS.

La idea aquí es que en el código de producción, ZCL_MAIN_CLASS obtendrá un objeto ZIF_DB_SCARR


que realiza una SELECT y devuelve toda la tabla mientras que la prueba de la unidad se ejecuta en
un conjunto de datos estáticos definidos allí mismo en la prueba de la unidad.

Lea Examen de la unidad en línea: https://riptutorial.com/es/abap/topic/3999/examen-de-la-unidad

https://riptutorial.com/es/home 21
Capítulo 11: Expresiones regulares
Examples
Reemplazo

La instrucción REPLACE puede trabajar con expresiones regulares directamente:

DATA(lv_test) = 'The quick brown fox'.


REPLACE ALL OCCURRENCES OF REGEX '\wo' IN lv_test WITH 'XX'.

La variable lv_test evaluará The quick bXXwn XXx .

buscando

La sentencia FIND puede trabajar con expresiones regulares directamente:

DATA(lv_test) = 'The quick brown fox'.

FIND REGEX '..ck' IN lv_test.


" sy-subrc == 0

FIND REGEX 'a[sdf]g' IN lv_test.


" sy-subrc == 4

Expresiones regulares orientadas a objetos

Para operaciones de CL_ABAP_REGEX regulares más avanzadas, es mejor usar CL_ABAP_REGEX y sus
clases relacionadas.

DATA: lv_test TYPE string,


lo_regex TYPE REF TO cl_abap_regex.

lv_test = 'The quick brown fox'.


CREATE OBJECT lo_regex
EXPORTING
pattern = 'q(...)\w'.

DATA(lo_matcher) = lo_regex->create_matcher( text = lv_test ).


WRITE: / lo_matcher->find_next( ). " X
WRITE: / lo_matcher->get_submatch( 1 ). " uic
WRITE: / lo_matcher->get_offset( ). " 4

Evaluando expresiones regulares con una función de predicado

Las matches función de predicado se pueden usar para evaluar cadenas sobre la marcha sin
utilizar declaraciones de objetos.

IF matches( val = 'Not a hex string'

https://riptutorial.com/es/home 22
regex = '[0-9a-f]*' ).
cl_demo_output=>display( 'This will not display' ).
ELSEIF matches( val = '6c6f7665'
regex = '[0-9a-f]*' ).
cl_demo_output=>display( 'This will display' ).
ENDIF.

Obtención de submisiones usando OO-Expresiones regulares

Al utilizar el método GET_SUBMATCH de la clase CL_ABAP_MATCHER , podemos obtener los datos en los
grupos / subgrupos.

Objetivo: obtener el token a la derecha de la palabra clave "Tipo".

DATA: lv_pattern TYPE string VALUE 'type\s+(\w+)',


lv_test TYPE string VALUE 'data lwa type mara'.

CREATE OBJECT ref_regex


EXPORTING
pattern = lv_pattern
ignore_case = c_true.

ref_regex->create_matcher(
EXPORTING
text = lv_test
RECEIVING
matcher = ref_matcher
).

ref_matcher->get_submatch(
EXPORTING
index = 0
RECEIVING
submatch = lv_smatch.

La variable resultante lv_smatch contiene el valor MARA .

Lea Expresiones regulares en línea: https://riptutorial.com/es/abap/topic/5113/expresiones-


regulares

https://riptutorial.com/es/home 23
Capítulo 12: Instrumentos de cuerda
Examples
Literales

ABAP ofrece tres operadores diferentes para declarar variables de tipo cadena o de tipo char

Simbolos Tipo interno Longitud Nombre

'...' do 1-255 caracteres literales de campo de texto

`...` Cuerda C 0-255 caracteres literales de cadena de texto

| ... | Cuerda C 0-255 caracteres plantillas literales

Tenga en cuenta que el rango de longitud solo se aplica a los valores codificados. Las variables
internas de CString tienen una longitud arbitraria, mientras que las variables de tipo C siempre
tienen una longitud fija.

Plantillas de cadena

Las plantillas de cadenas son una forma conveniente de mezclar cadenas literales con valores de
variables:

WRITE |Hello, { lv_name }, nice to meet you!|.

También puede formatear cosas como fechas. Para utilizar el formato de fecha de inicio de sesión
del usuario:

WRITE |The order was completed on { lv_date DATE = USER } and can not be changed|.

Se admiten llamadas y expresiones de métodos funcionales:

WRITE |Your token is { to_upper( lv_token ) }|.


WRITE |Version is: { cond #( when lv_date < sy-datum then 'out of date' else 'up to date' )
}|.

¡Atención! La implementación directa de resultados temporales (como las llamadas a


los métodos) dentro de las plantillas de cadenas puede llevar a problemas de
rendimiento masivos (lea más sobre esto aquí ). Si bien usarlo en sentencias que rara
vez se ejecutan está bien, hace que su programa se ralentice rápidamente en los
bucles.

Cuerdas de concatenacion

https://riptutorial.com/es/home 24
Las variables de cadena y de tipo char se pueden concatenar usando el comando ABAP
CONCATENATE . Se requiere una variable extra para almacenar los resultados.

Ejemplo:

CONCATENATE var1 var2 var3 INTO result.


"result now contains the values of var1, var2 & var3 stringed together without spaces

Taquigrafía

Las versiones más recientes de ABAP ofrecen una variante muy corta de concatenación
utilizando && (operador de encadenamiento).

DATA(lw_result) = `Sum: ` && lw_sum.

¡Atención! Vale la pena darse cuenta de que el uso de resultados temporales en


combinación con el operador de Encadenamiento dentro de los bucles puede dar lugar
a problemas de rendimiento masivos debido a las crecientes instrucciones de copia
(lea más sobre esto aquí ).

Lea Instrumentos de cuerda en línea: https://riptutorial.com/es/abap/topic/3531/instrumentos-de-


cuerda

https://riptutorial.com/es/home 25
Capítulo 13: Objetos ABAP
Examples
Declaración de clase

Las clases ABAP pueden ser declaradas global o localmente


. Una clase global puede ser utilizada por cualquier objeto
dentro del repositorio ABAP. Por el contrario, una clase
local solo se puede usar dentro del alcance que se declara.

CLASS lcl_abap_class DEFINITION.


PUBLIC SECTION.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.

CLASS lcl_abap_class IMPLEMENTATION.


ENDCLASS.

Constructor, metodos

Implementación de la clase:

CLASS lcl_abap_class DEFINITION.


PUBLIC SECTION.
METHODS: constructor,
method1.
PROTECTED SECTION.
PRIVATE SECTION.
METHODS: method2,
method3.
ENDCLASS.

CLASS lcl_abap_class IMPLEMENTATION.


METHOD constructor.
"Logic
ENDMETHOD.

METHOD method1.
"Logic
ENDMETHOD.

METHOD method2.
"Logic
method3( ).
ENDMETHOD.

METHOD method3.
"Logic

https://riptutorial.com/es/home 26
ENDMETHOD.
ENDCLASS.

Método de ejemplo de llamada:

DATA lo_abap_class TYPE REF TO lcl_abap_class.


CREATE OBJECT lo_abap_class. "Constructor call
lo_abap_class->method1( ).

Método con parámetros (Importando, Cambiando, Exportando)

Implementación de la clase:

CLASS lcl_abap_class DEFINITION.


PRIVATE SECTION.
METHODS method1 IMPORTING iv_string TYPE string
CHANGING cv_string TYPE string
EXPORTING ev_string TYPE string.
ENDCLASS.

CLASS lcl_abap_class IMPLEMENTATION.


METHOD method1.
cv_string = iv_string.
ev_string = 'example'.
ENDMETHOD.
ENDCLASS.

Método de ejemplo de llamada:

method1 (
EXPORTING iv_string = lv_string
IMPORTING ev_string = lv_string2
CHANGING cv_string = lv_string3
).

Método con parámetro de retorno

Implementación de la clase:

CLASS lcl_abap_class DEFINITION.


PRIVATE SECTION.
METHODS method1 RETURNING VALUE(rv_string) TYPE string.
ENDCLASS.

CLASS lcl_abap_class IMPLEMENTATION.


METHOD method1.
rv_string = 'returned value'.
ENDMETHOD.
ENDCLASS.

Método de ejemplo de llamada:

lv_string = method1( ).

https://riptutorial.com/es/home 27
Tenga en cuenta que los parámetros declarados con RETURNING se pasan solo por valor.

Herencia - definición

Información
La herencia le permite derivar una nueva clase de una clase existente. Haces esto
usando la suma de HERENCIA DE

CLASE subclase DEFINICIÓN HERENCIA DE superclase.

declaración. La nueva subclase de clase hereda todos los componentes de la


superclase de clase existente. La nueva clase se llama la subclase de la clase de la
que se deriva. La clase original se llama la superclase de la nueva clase. Una clase
puede tener más de una subclase directa, pero solo puede tener una superclase
directa.

Implementación de clase

CLASS lcl_vehicle DEFINITION.


ENDCLASS.

CLASS lcl_vehicle IMPLEMENTATION.


ENDCLASS.

CLASS lcl_car DEFINITION INHERITING FROM lcl_vehicle.


ENDCLASS.

CLASS lcl_car IMPLEMENTATION.


ENDCLASS.

Herencia - Resumen y Métodos Finales y Clases

Información
Las adiciones ABSTRACT y FINAL a los métodos y las declaraciones de CLASS le
permiten definir métodos o clases abstractos y finales.

Un método abstracto se define en una clase abstracta y no se puede implementar en


esa clase. En su lugar, se implementa en una subclase de la clase. Las clases
abstractas no pueden ser instanciadas.

Un método final no se puede redefinir en una subclase. Las clases finales no pueden
tener subclases. Concluyen un árbol de herencia.

Implementación de la clase:

https://riptutorial.com/es/home 28
CLASS lcl_abstract DEFINITION ABSTRACT.
PUBLIC SECTION.
METHODS: abstract_method ABSTRACT,
final_method FINAL
normal_method.

ENDCLASS.

CLASS lcl_abstract IMPLEMENTATION.


METHOD final_method.
"This method can't be redefined in child class!
ENDMETHOD.

METHOD normal_method.
"Some logic
ENDMETHOD.

"We can't implement abstract_method here!

ENDCLASS.

CLASS lcl_abap_class DEFINITION INHERITING FROM lcl_abstract.


PUBLIC SECTION.
METHODS: abstract_method REDEFINITION,
abap_class_method.
ENDCLASS.

CLASS lcl_abap_class IMPLEMENTATION.


METHOD abstract_method.
"Abstract method implementation
ENDMETHOD.

METHOD abap_class_method.
"Logic
ENDMETHOD.
ENDCLASS.

Método de ejemplo de llamada:

DATA lo_class TYPE REF TO lcl_abap_class.


CREATE OBJECT lo_class.

lo_class->abstract_method( ).
lo_class->normal_method( ).
lo_class->abap_class_method( ).
lo_class->final_method( ).

Lea Objetos ABAP en línea: https://riptutorial.com/es/abap/topic/2244/objetos-abap

https://riptutorial.com/es/home 29
Capítulo 14: Plantilla de programas
Sintaxis
• DEFINICIÓN DE CLASE RESUMEN FINAL hace que la clase de programa sea
esencialmente estática, ya que los métodos de instancia nunca podrían usarse. La intención
es mantener la clase mínima.

Examples
Programa OO con métodos de eventos esenciales.

REPORT z_template.

CLASS lcl_program DEFINITION ABSTRACT FINAL.

PUBLIC SECTION.

CLASS-METHODS start_of_selection.
CLASS-METHODS initialization.
CLASS-METHODS end_of_selection.

ENDCLASS.

CLASS lcl_program IMPLEMENTATION.

METHOD initialization.

ENDMETHOD.

METHOD start_of_selection.

ENDMETHOD.

METHOD end_of_selection.

ENDMETHOD.

ENDCLASS.

INITIALIZATION.

lcl_program=>initialization( ).

START-OF-SELECTION.

lcl_program=>start_of_selection( ).

END-OF-SELECTION.

lcl_program=>end_of_selection( ).

Lea Plantilla de programas en línea: https://riptutorial.com/es/abap/topic/10552/plantilla-de-

https://riptutorial.com/es/home 30
programas

https://riptutorial.com/es/home 31
Capítulo 15: Programación dinámica
Examples
Simbolos de campo

Los símbolos de campo son equivalentes de ABAP a los punteros, excepto que los símbolos de
campo siempre están referenciados (no es posible cambiar la dirección real en la memoria).

Declaración

Para declarar un símbolo de campo, debe utilizarse la palabra clave FIELD-SYMBOLS . Los tipos
pueden ser genéricos ( ANY [... TABLE] ) para manejar una amplia variedad de variables.

FIELD-SYMBOLS: <fs_line> TYPE any, "generic


<fs_struct> TYPE kna1. "non-generic

Asignando

Los símbolos de campo unassigned están unassigned en la declaración, lo que significa que no
apuntan a nada. El acceso a un símbolo de campo sin asignar dará lugar a una excepción y, si no
se detecta, a un volcado breve. Por lo tanto, el estado debe ser verificado con IS ASSIGNED :

IF <fs> IS ASSIGNED.
*... symbol is assigned
ENDIF.

Como solo son referencias, no se pueden almacenar datos reales en el interior. Por lo tanto, los
DATA declarados son necesarios en todos los casos de uso.

DATA: w_name TYPE string VALUE `Max`,


w_index TYPE i VALUE 1.

FIELD-SYMBOLS <fs_name> TYPE any.

ASSIGN w_name TO <fs_name>. "<fs_name> now gets w_name


<fs_name> = 'Manni'. "Changes to <fs_name> now also affect w_name

* As <fs_name> is generic, it can also be used for numbers

ASSIGN w_index TO <fs_name>. "<fs_name> now refers to w_index.


ADD 1 TO <fs_name>. "w_index gets incremented by one

Desasignar

A veces puede ser útil restablecer un símbolo de campo. Esto se puede hacer utilizando UNASSIGN .

UNASSIGN <fs>.
* Access on <fs> now leads to an exception again

https://riptutorial.com/es/home 32
Uso para tablas internas

Los símbolos de campo se pueden utilizar para modificar tablas internas.

LOOP AT itab INTO DATA(wa).


* Only modifies wa_line
wa-name1 = 'Max'.
ENDLOOP.

LOOP AT itab ASSIGNING FIELD-SYMBOL(<fs>).


* Directly refers to a line of itab and modifies its values
<fs>-name1 = 'Max'.
ENDLOOP.

¡Atención! Los símbolos de campo permanecen asignados incluso después de salir del bucle. Si
desea reutilizarlos de forma segura, anule su asignación inmediatamente.

Referencias de datos

Esencial para las referencias de datos es la adición REF TO después de TYPE .

Creación dinámica de estructuras

Si el tipo de estructura debe decidirse en tiempo de ejecución, podemos definir nuestra estructura
objetivo como referencia a los data tipo genérico.

DATA wa TYPE REF TO data.

Para dar un tipo a wa usamos la sentencia CREATE DATA . La adición TYPE se puede especificar por:

Referencia:

CREATE DATA wa TYPE kna1

• Las comprobaciones estáticas están activas, por lo que no es posible crear un


tipo desconocido

Nombre:

CREATE DATA wa TYPE (lw_name_as_string)

• Los paréntesis son necesarios y lw_name_as_string contiene el nombre de los


tipos como cadena.
• Si no se encontró el tipo, se CX_SY_CREATE_DATA_ERROR una excepción del tipo
CX_SY_CREATE_DATA_ERROR

Para la creación de instancias de tipos creados dinámicamente, se puede especificar la adición


HANDLE . HANDLE recibe un objeto que hereda de CL_ABAP_DATADESCR .

CREATE DATA dref TYPE HANDLE obj

• obj puede crearse usando los servicios de R un T ime T ype S

https://riptutorial.com/es/home 33
• Debido a que dref sigue siendo una referencia a datos, debe ser anulada ( ->* )
para ser utilizada como contenedor de datos (normalmente se realiza a través de
los símbolos de campo)

Servicios de tipo RunTime

Los servicios de tipo RunTime ( short: RTTS ) se usan para:

• creando tipos (RunTime Type Creation; short: RTTC )


• tipos de análisis (Identificación de tipo RunTime; breve: RTTI )

Las clases

CL_ABAP_TYPEDESCR
|
|--CL_ABAP_DATADESCR
| |
| |--CL_ABAP_ELEMDESCR
| |--CL_ABAP_REFDESCR
| |--CL_ABAP_COMPLEXDESCR
| |
| |--CL_ABAP_STRUCTDESCR
| |--CL_ABAP_TABLEDESCR
|
|--CL_ABAP_OBJECTDESCR
|
|--CL_ABAP_CLASSDESCR
|--CL_ABAP_INTFDESCR

CL_ABAP_TYPEDESCR es la clase base. Implementa los métodos necesarios para describir:

• DESCRIBE_BY_DATA
• DESCRIBE_BY_NAME
• DESCRIBE_BY_OBJECT_REF
• DESCRIBE_BY_DATA_REF

Lea Programación dinámica en línea: https://riptutorial.com/es/abap/topic/4442/programacion-


dinamica

https://riptutorial.com/es/home 34
Capítulo 16: Tablas internas
Examples
Tipos de tablas internas

DATA: <TABLE NAME> TYPE <SORTED|STANDARD|HASHED> TABLE OF <TYPE NAME>


WITH <UNIQUE|NON-UNIQUE> KEY <FIELDS FOR KEY>.

Mesa estandar

Esta tabla tiene todas las entradas almacenadas de forma lineal y se accede a los registros de
forma lineal. Para tamaños de mesa grandes, el acceso a la mesa puede ser lento.

Tabla ordenada

Requiere la adición WITH UNIQUE | NON-UNIQUE KEY . La búsqueda es rápida debido a la realización de
una búsqueda binaria. Las entradas no se pueden agregar a esta tabla ya que podría romper el
orden de clasificación, por lo que siempre se insertan con la palabra clave INSERT .

Tabla hash

Requiere la adición WITH UNIQUE | NON-UNIQUE KEY . Utiliza un algoritmo de hashing propietario para
mantener los pares clave-valor. En teoría, las búsquedas pueden ser tan lentas como la tabla
STANDARD , pero en la práctica son más rápidas que una tabla SORTED toma una cantidad de tiempo
constante independientemente del tamaño de la tabla.

Declaración de Tablas Internas ABAP

Declaración de tabla interna basada en la


definición de tipo local
" Declaration of type
TYPES: BEGIN OF ty_flightb,
id TYPE fl_id,
dat TYPE fl_date,
seatno TYPE fl_seatno,
firstname TYPE fl_fname,
lastname TYPE fl_lname,
fl_smoke TYPE fl_smoker,
classf TYPE fl_class,
classb TYPE fl_class,
classe TYPE fl_class,
meal TYPE fl_meal,
service TYPE fl_service,
discout TYPE fl_discnt,
END OF lty_flightb.

https://riptutorial.com/es/home 35
" Declaration of internal table
DATA t_flightb TYPE STANDARD TABLE OF ty_flightb.

Declaración basada en la tabla de base de


datos
DATA t_flightb TYPE STANDARD TABLE OF flightb.

Declaración de tabla interna en línea


Requiere versión ABAP> 7.4

TYPES t_itab TYPE STANDARD TABLE OF i WITH EMPTY KEY.

DATA(t_inline) = VALUE t_itab( ( 1 ) ( 2 ) ( 3 ) ).

Tabla interna con declaración de líneas de


encabezado
En ABAP hay tablas con líneas de encabezado y tablas sin líneas de encabezado. Las tablas con
líneas de encabezado son un concepto más antiguo y no deben utilizarse en nuevos desarrollos.

Tabla interna: Tabla estándar con / sin línea de cabecera

Este código declara la tabla i_compc_all con la estructura existente de compc_str .

DATA: i_compc_all TYPE STANDARD TABLE OF compc_str WITH HEADER LINE.


DATA: i_compc_all TYPE STANDARD TABLE OF compc_str.

Tabla interna: tabla hash con / sin línea de encabezado

DATA: i_map_rules_c TYPE HASHED TABLE OF /bic/ansdomm0100 WITH HEADER LINE


DATA: i_map_rules_c TYPE HASHED TABLE OF /bic/ansdomm0100

Declaración de un área de trabajo para tablas sin encabezado.

Un área de trabajo (comúnmente abreviada wa ) tiene la misma estructura exacta que la tabla,
pero puede contener solo una línea (un WA es una estructura de una tabla con una sola
dimensión).

DATA: i_compc_all_line LIKE LINE OF i_compc_all.

https://riptutorial.com/es/home 36
Leer, escribir e insertar en tablas internas

Lea, escriba e inserte en tablas internas con una línea de encabezado:

" Read from table with header (using a loop):


LOOP AT i_compc_all. " Loop over table i_compc_all and assign header line
CASE i_compc_all-ftype. " Read cell ftype from header line from table i_compc_all
WHEN 'B'. " Bill-to customer number transformation
i_compc_bil = i_compc_all. " Assign header line of table i_compc_bil with content of
header line i_compc_all
APPEND i_compc_bil. " Insert header line of table i_compc_bil into table
i_compc_bil
" ... more WHENs
ENDCASE.
ENDLOOP.

Recordatorio: las tablas internas con líneas de encabezado están prohibidas en


contextos orientados a objetos. Siempre se recomienda el uso de tablas internas sin
líneas de encabezado.

Lea, escriba e inserte en tablas internas sin una línea de encabezado:

" Loop over table i_compc_all and assign current line to structure i_compc_all_line
LOOP AT i_compc_all INTO i_compc_all_line.
CASE i_compc_all_line-ftype. " Read column ftype from current line (which as
assigned into i_compc_all_line)
WHEN 'B'. " Bill-to customer number transformation
i_compc_bil_line = i_compc_all_line. " Copy structure
APPEND i_compc_bil_line TO i_compc_bil. " Append structure to table
" more WHENs ...
ENDCASE.
ENDLOOP.

" Insert into table with Header:


INSERT TABLE i_sap_knb1. " insert into TABLE WITH HEADER: insert table
header into it's content
insert i_sap_knb1_line into table i_sap_knb1. " insert into HASHED TABLE: insert structure
i_sap_knb1_line into hashed table i_sap_knb1
APPEND p_t_errorlog_line to p_t_errorlog. " insert into STANDARD TABLE: insert structure /
wa p_t_errorlog_line into table p_t_errorlog_line

Lea Tablas internas en línea: https://riptutorial.com/es/abap/topic/1647/tablas-internas

https://riptutorial.com/es/home 37
Creditos
S.
Capítulos Contributors
No

Empezando con
1 Christian, Community, gkubed, Jagger, mkysoft
ABAP

ABAP GRID List


2 Achuth hadnoor, gkubed
Viewer (ALV)

3 Abrir SQL AKHIL RAJ, gkubed

4 Bucles Christian, Community, gkubed, Stu G

Clases de mensajes
5 / palabra clave gkubed
MESSAGE

6 Comentarios 4444, Christian, gkubed

Convenciones de
7 mkysoft
nombres

8 Declaración de datos Christian, gkubed

Declaraciones de
9 Community, gkubed, maillard
flujo de control

10 Examen de la unidad maillard

Expresiones
11 AKHIL RAJ, gkubed, maillard
regulares

Instrumentos de
12 Achuth hadnoor, Community, maillard, nexxus, Suncatcher
cuerda

13 Objetos ABAP Community, Michał Majer, Thomas Matecki

Plantilla de
14 nath
programas

Programación
15 Community, gkubed
dinámica

Community, gkubed, Michał Majer, Rahul Kadukar, Thorsten


16 Tablas internas
Niehues

https://riptutorial.com/es/home 38

También podría gustarte