![](/cvo_files/imgs_sap_abap/logos/logo_cvo_academy_it.png)
✒️ABAP Los cortes de control utilizando tablas internas
ABAP Los cortes de control utilizando tablas internas
![ABAP Los cortes de control utilizando tablas internas ABAP Los cortes de control utilizando tablas internas](https://www.cvosoft.com/cvo_files/imgs_sap_abap/og-images/122.jpg)
Vídeo - Cortes de control utilizando tabla internas
1 Cortes de control utilizando tablas internas en reportes
Vemos a continuación un vídeo donde se exponen los cortes de control para la generación de listados, utilizando las sentencias AT.
Esta forma de trabajo, que a simple vista parece complicada, es muy simple de utilizar y simplifica mucho la tarea del programador en la generación de reportes.
Veremos como realizar un corte de contro la una tabla interna par apoder imprimir un listado por pantalla.
<< copia del código del video >>
Supongamos que tenemos una tabla interna con registros de clientes que incluyen un "importe" entre sus campos, y queremos obtener un listado de clientes donde se muestre en una sola línea el importe total por cada cliente.
En este caso tendremos que realizar un corte de control por cada cliente, y un corte adicional para imprimir los resultados.
Lo primero que hacemos es cargar la tabla interna con distintos registros.
Después ordenamos la tabla interna de clientes según el orden en el que queremos que se visualicen los datos.
Después recorremos la tabla para realizar el listado. Antes de realizar el corte de control dentro del LOOP, pasamos los datos que se están leyendo a una estructura auxiliar (st_clientes_aux). Esto se debe a que ABAP completa con asteriscos todos los campos a la derecha del campo por el cual hacemos el corte.
Para realizar el corte de control por cliente utilizamos la sentencia AT NEW seguida del número del cliente (nrocli). Internamente la sentencia AT NEW compara el actual número de cliente con el anterior. Si estos son distintos, entonces se procesará el código que está entre el AT NEW y ENDAT.
Luego, como queremos imprimir por pantalla el total por cliente, acumulamos el importe.
Para realizar la impresión de los datos utilizamos la sentencia AT END, seguida del campo por el cual hacemos el corte. Internamente la sentencia AT END compara el actual número de cliente con el siguiente número de cliente. Si estos clientes son distintos, entonces se procesará el código que está entre AT END y ENDAT.
Si ejecutamos el programa vemos el listado ordenado por cliente, donde se muestra el total acumulado para cada uno de ellos.
Audio: Vamos a remarcar los conceptos más importantes a tener en cuenta acerca de los cortes de control. Un corte de control es una forma de estructurar un reporte de salida de modo que podemos sumarizar datos y mostrar totales por distintos campos del reporte. Una condición esencial que presentan los cortes de control es que la tabla de salida del reporte debe ordenarse por los campos por los cuales se va a realizar el corte de control. Es indispensable utilizar una estructura auxiliar para almacenar los datos del registro de la tabla interna del reporte, ya que ABAP completará con * los campos que se encuentren a la derecha del campo por el cual realizamos el corte, y por tanto se perdería la información almacenada en ellos.
Principalmente vamos a utilizar las sentencias AT NEW y AT END.
La sentencia AT NEW <campo> comparará el valor actual del campo con el valor anterior del campo. En caso de ser distintos, se procesará el código de dentro del AT NEW..ENDAT.
La sentencia AT END <campo> comparará el valor actual del campo con el valor siguiente del campo, es decir el que se encuentra en la próxima vuelta de la tabla interna. En caso de ser distintos, se procesará el código de dentro del AT END..ENDAT.
Para sumar campos dentro del LOOP a la tabla interna del reporte, podemos utilizar la sentencia ADD o también la sentencia SUM que se utiliza para sumarizar variables de tipo integer, P o Flow.
Es posible realizar el corte de control por más de un campo. En este caso, colocaremos en el AT NEW o en del AT END el campo que se encuentre más a la derecha.
Por ejemplo, supongamos que tenemos nuestra tabla interna ti_tabla, con los campos: <campo1> <campo2> y <campo3> en ese orden. Si quisiéremos realizar un corte de control hasta <campo3>, solo colocaríamos AT NEW <campo3> o AT END <campo3>.
Si quisiéramos realizar un corte de control hasta <campo2>, colocaríamos entonces colocaríamos AT NEW <campo2> o AT END <campo2>.
También existen las sentencias AT FIRST y AT LAST, que no se utilizan muy a menudo pero nos pueden ayudar para algún requerimiento muy específico.
Los datos de cada registro de la tabla interna tienen que seguir el orden en el que queremos hacer el corte. Es decir, si tenemos un registro con los campos <c1, c2, c3, c4>, no podremos realizar cortes por los campos <c3> y <c2>, pero sin embargo si podremos realizar cortes por los campos <c1> y <c4>.
Dudas de alumnos:
Quiero hacer un reporte con 2 cortes de control. Es decir, teniendo Clientes, cuentas y montos.
Primeramente hacer un corte por CUENTA, sumando todos los importes de la cuenta, y luego un corte de control por el CLIENTE, sumando todos los importes del cliente.
Como deberíamos hacer esto?
Ej:
Cliente 1
Cuenta 10 300.000
Cuenta 20 450.000
Cuenta 30 500.000
Total Cliente1: 12.500.000
Cliente 2
Cuenta 40 300.000
Cuenta 60 450.000
Cuenta 80 500.000
Total Cliente2: 12.500.000
Cliente 3
Cuenta 140 300.000
Cuenta 640 450.000
Cuenta 820 500.000
Total Cliente3: 12.500.000
Respuesta:
Tendrías que realizar los siguientes pasos:
Supongamos que la tabla interna se llama TI_CLIENTES.
1-Ordenas la tabla interna TI_CLIENTES por CLIENTE y CUENTA.
2-Recorres la tabla interna LOOP AT TI_CLIENTES INTO WA_CLIENTES.
3-Guardas en una estructura auxiliar WA_CLIENTES_AUX el contenido del registro que estas recorriendo y en adelante trabajas con esa estructura auxiliar WA_CLIENTES_AUX.
4-Realizas un AT NEW CLIENTE y dentro cada vez que cambia el CLIENTE borras la variable V_TOTAL_CLIENTE que es donde vamos a sumarizar el total por cliente.
5-Fuera del AT NEW CLIENTE sumamos el total de cliente ADD WA_CLIENTES-MONTOS TO V_TOTAL_CLIENTE.
6-Realizas un AT NEW CUENTA y dentro, cada vez que cambia la CUENTA borras la variable V_TOTAL_CUENTA que es donde vamos a sumarizar el total por cuenta.
7-Fuera del AT NEW CUENTA sumamos el total de la cuenta ADD WA_CLIENTES-MONTOS TO V_TOTAL_CUENTA.
8-Realizas un AT END CUENTA y dentro imprimis el nombre de la cuenta WA_CLIENTES-CUENTA y el total que esta almacenado en V_TOTAL_CUENTA.
9-Realizas un AT END CLIENTE y dentro imprimis el nombre de la cuenta WA_CLIENTES-CLIENTE y el total que esta almacenado en V_TOTAL_CLIENTE.
 
 
 
Agradecimiento:
Ha agradecido este aporte: Steve Romero Quiquia
Favorito:
Está publicación ha sido agregada a sus favoritos por: Lorena Amoretti
Sobre el autor
Publicación académica de José Antonio Saavedra Rodríguez, en su ámbito de estudios para la Carrera Consultor ABAP.
José Antonio Saavedra Rodríguez
El Salvador - Legajo: SX28V
✒️Autor de: 166 Publicaciones Académicas
🎓Egresado de los módulos:
- Carrera Consultor ABAP Nivel Inicial
- Carrera Consultor en SAP SD Nivel Avanzado
- Carrera Consultor en SAP SD Nivel Inicial