
He estado buscando una solución por un tiempo, pero no he podido encontrar una que cumpla con mis requisitos, incluso después de consultar varios blogs. Tomó un poco de esfuerzo, pero finalmente encontré una solución que se ajusta a mis necesidades. Letss goo (nerviosamente emocionado)
Introducción-
Tratar con múltiples filas de datos puede ser un desafío, especialmente cuando necesita consolidarlos en una sola fila con diferentes columnas. Afortunadamente, SAP CDS proporciona una solución poderosa para realizar esta transformación de datos. En esta publicación de blog, le mostraremos cómo usar SAP CDS para convertir varias filas en una sola fila con diferentes columnas.
¿Qué es SAP CDS?
SAP CDS (Core Data Services) es un lenguaje y marco de modelado que permite a los desarrolladores definir modelos de datos y acceder a ellos de forma estandarizada. Las vistas de CDS se utilizan para crear modelos de datos virtuales que combinan datos de diferentes orígenes, como tablas, vistas y otras vistas de CDS. Las vistas de CDS proporcionan una forma simple y eficiente de consultar datos de los sistemas SAP.
Comencemos considerando lo siguiente Guión.
Img1 de mi sistema SAP personal: requisito
Ahora quiero fusionar filas de la tabla ZDEMO_SFLIGHT según CARRID & CONNID como FLDATE1, PRICE1, CURRENCY1…FLDATE2 a SEATSOCC2.
Img2 de mi máquina personal- Requisito
Y la salida final será:
Img3 de mi máquina personal – Salida final esperada
Paso 1: Crear función de tabla.
@EndUserText.label: 'Table Function Demo SFLIGHT'
define table function ZDEMO_SFLIGHT_TAB_FCT
returns
{
MANDT : abap.clnt;
CARRID : s_carr_id;
CONNID : s_conn_id;
FLDATE : s_date;
PRICE : s_price;
CURRENCY : s_currcode;
PLANETYPE : s_planetye;
SEATSMAX : s_seatsmax;
SEATSOCC : s_seatsocc;
ROW_NUM : abap.char( 2 );
}
implemented by method
zcl_demo_sflight=>get_data;
Este es un ejemplo de una función de tabla ABAP llamada «ZDEMO_SFLIGHT_TAB_FCT». Devuelve una tabla de datos con las siguientes columnas:
cliente: abap.clnt (ID de cliente)
CARRID: s_carr_id (ID de la aerolínea)
CONNID: s_conn_id (ID de conexión de vuelo)
FLDATE: s_date (fecha de vuelo)
PRECIO: s_price (precio del boleto)
MONEDA: s_currcode (código de moneda)
PLANETYPE: s_planetye (tipo de avión)
SEATSMAX : s_seatsmax (número máximo de asientos)
SEATSOCC : s_seatsocc (número de asientos ocupados)
row_num : abap.char(2) (número de fila)
La función de tabla se implementa mediante un método llamado «get_data» en la clase ABAP «ZCL_DEMO_SFLIGHT». Cuando se llama a esta función, ejecutará el método «get_data» y devolverá una tabla de datos con las columnas especificadas.
Paso 2: Crear clase y método.
CLASS ZCL_DEMO_SFLIGHT DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES IF_AMDP_MARKER_HDB.
CLASS-METHODS:
GET_DATA FOR TABLE FUNCTION ZDEMO_SFLIGHT_TAB_FCT.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS ZCL_DEMO_SFLIGHT IMPLEMENTATION.
METHOD GET_DATA
BY DATABASE FUNCTION
FOR HDB
LANGUAGE SQLSCRIPT
OPTIONS READ-ONLY
USING ZDEMO_SFLIGHT .
ITAB =
select
MANDT,
CARRID,
CONNID,
FLDATE,
PRICE,
CURRENCY,
PLANETYPE,
SEATSMAX,
SEATSOCC,
ROW_NUMBER() OVER (PARTITION BY carrid, connid order by carrid, connid ) as row_num
from zdemo_sflight ;
RETURN
SELECT MANDT,
CARRID,
CONNID,
FLDATE,
PRICE,
CURRENCY,
PLANETYPE,
SEATSMAX,
SEATSOCC,
ROW_NUM
FROM :itab
GROUP BY MANDT,
CARRID,
CONNID,
FLDATE,
PRICE,
CURRENCY,
PLANETYPE,
SEATSMAX,
SEATSOCC,
ROW_NUM;
ENDMETHOD.
ENDCLASS.
Este es el código de implementación para la clase ABAP “ZCL_DEMO_SFLIGHT” que define el método “GET_DATA” utilizado para implementar la función de tabla “ZDEMO_SFLIGHT_TAB_FCT”.
La clase implementa la interfaz «IF_AMDP_MARKER_HDB» que se usa para indicar que la clase contiene un procedimiento de base de datos HANA.
El método “GET_DATA” se implementa como un procedimiento HANA SQLScript y lee datos de la tabla de la base de datos “ZDEMO_SFLIGHT”. Luego, los datos se transforman utilizando la función «ROW_NUMBER()» para agregar un número secuencial a cada fila según los campos «CARRID» y «CONNID». Finalmente, el resultado se devuelve como una tabla utilizando la instrucción «RETURN».
Usando ROW_NUMBER PARTITION BY, obtenemos datos ordenados.
Img4 de mi Eclipse personal- Datos ordenados
Ahora podemos consumir esta función de tabla en una vista de CDS para obtener el resultado adecuado.
Paso 3. Crear CDS
@AbapCatalog.sqlViewName: 'ZDEMO_SQL_FLIGHT'
@AbapCatalog.compiler.compareFilter: true
@AbapCatalog.preserveKey: true
@AccessControl.authorizationCheck: #NOT_REQUIRED
@EndUserText.label: 'CDS to consume table function'
define view ZDEMO_CDS_ZFLIGHT
as select from ZDEMO_SFLIGHT_TAB_FCT
{
CARRID,
CONNID,
max (case ROW_NUM when '1' then FLDATE end) as FLDATE1,
max (case ROW_NUM when '1' then PRICE end) as PRICE1,
max (case ROW_NUM when '1' then CURRENCY end) as CURRENCY1,
max (case ROW_NUM when '1' then PLANETYPE end) as PLANETYPE1,
max (case ROW_NUM when '1' then SEATSMAX end) as SEATSMAX1,
max (case ROW_NUM when '1' then SEATSOCC end) as SEATSOCC1,
max (case ROW_NUM when '2' then FLDATE end) as FLDATE2,
max (case ROW_NUM when '2' then PRICE end) as PRICE2,
max (case ROW_NUM when '2' then CURRENCY end) as CURRENCY2,
max (case ROW_NUM when '2' then PLANETYPE end) as PLANETYPE2,
max (case ROW_NUM when '2' then SEATSMAX end) as SEATSMAX2,
max (case ROW_NUM when '2' then SEATSOCC end) as SEATSOCC
}
group by
CARRID,
CONNID
Este es un ejemplo de una definición de vista de CDS que consume la función de tabla «ZDEMO_SFLIGHT_TAB_FCT».
La vista se llama “ZDEMO_CDS_ZFLIGHT” y tiene las siguientes columnas:
CARRID: la identificación de la compañía aérea
CONNID: el ID de conexión del vuelo
FLDATE1: la fecha de vuelo de la primera fila (basada en ROW_NUM)
PRICE1: el precio del boleto para la primera fila
CURRENCY1: el código de moneda para la primera fila
PLANETYPE1: el tipo de avión para la primera fila
SEATSMAX1: el número máximo de asientos para la primera fila
SEATSOCC1: el número de asientos ocupados para la primera fila
FLDATE2: la fecha de vuelo de la segunda fila (basada en ROW_NUM)
PRICE2: el precio del boleto para la segunda fila
CURRENCY2: el código de moneda para la segunda fila
PLANETYPE2: el tipo de avión para la segunda fila
SEATSMAX2: el número máximo de asientos para la segunda fila
SEATSOCC2: el número de asientos ocupados para la segunda fila
La vista agrupa los datos por «CARRID» y «CONNID» utilizando la cláusula «GROUP BY».
Según el número de fila, los datos se completarán en los campos correspondientes.
La salida de CDS View:
Img5 de mi sistema SAP personal- Salida
Conclusión:
La vista de CDS «ZDEMO_CDS_ZFLIGHT» pudo consumir los datos de la función de tabla «ZDEMO_SFLIGHT_TAB_FCT» y proporcionar los resultados esperados. Esto demuestra el poder y la flexibilidad de usar funciones de tabla y vistas de CDS juntas en la programación ABAP.
Las funciones de tabla se pueden usar para proporcionar datos de una variedad de fuentes, incluidos los sistemas externos, y las vistas de CDS se pueden usar para crear un modelo de datos unificado que otros programas ABAP pueden consumir de manera estándar. Esta es una característica importante de la programación ABAP, ya que permite a los desarrolladores crear una vista unificada de datos de múltiples fuentes que se pueden consumir de manera consistente.
Estos son los puntos clave y las conclusiones del código ABAP:
Nota: esta solución es precisa cuando sabe cuántas entradas habrá en la tabla con combinación de campos. (Por ejemplo, algunos informes financieros basados en BUKRS y LIFNR)
Sus aportes son bienvenidos y si tiene alguna sugerencia, no dude en comentar.
PD: Soy novato en escribir Blogs, y voy mejorando poco a poco
Además, siga la página del tema del entorno de SAP S/4Hana https://community.sap.com/topics/s4hana
Leer otra publicación sobre SAP S4/HANA
A continuación hay algunos blogs geniales a los que me referí para mi solución óptima.
https://blogs.sap.com/2019/07/16/transpose-or-merge-multiple-rows-in-one-row-cds-views/
Calle Eloy Gonzalo, 27
Madrid, Madrid.
Código Postal 28010
Paseo de la Reforma 26
Colonia Juárez, Cuauhtémoc
Ciudad de México 06600
Real Cariari
Autopista General Cañas,
San José, SJ 40104
Av. Jorge Basadre 349
San Isidro
Lima, LIM 15073