{"id":84,"date":"2021-06-24T19:42:17","date_gmt":"2021-06-24T22:42:17","guid":{"rendered":"https:\/\/www.matiasvillagarcia.com\/blog\/?p=84"},"modified":"2021-06-25T12:56:39","modified_gmt":"2021-06-25T15:56:39","slug":"usando-table-functions-y-vistas-cds","status":"publish","type":"post","link":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/2021\/06\/24\/usando-table-functions-y-vistas-cds\/","title":{"rendered":"Usando Table Functions y Vistas CDS"},"content":{"rendered":"\n<p>Al igual que cuando creamos la vista CDS, para crear una table function debemos crear un data definition como hicimos antes, pero al momento de llegar al template seleccionamos \u201cDefine Table Function with parameters\u201d<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"573\" height=\"576\" src=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-12.png\" alt=\"\" class=\"wp-image-85\" srcset=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-12.png 573w, https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-12-298x300.png 298w, https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-12-150x150.png 150w\" sizes=\"auto, (max-width: 573px) 100vw, 573px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"571\" height=\"577\" src=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-13.png\" alt=\"\" class=\"wp-image-86\" srcset=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-13.png 571w, https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-13-297x300.png 297w\" sizes=\"auto, (max-width: 571px) 100vw, 571px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"570\" height=\"576\" src=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-14.png\" alt=\"\" class=\"wp-image-87\" srcset=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-14.png 570w, https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-14-297x300.png 297w\" sizes=\"auto, (max-width: 570px) 100vw, 570px\" \/><\/figure>\n\n\n\n<p>Al hacer click en finish nos aparecer\u00e1 el template seleccionado el cual debemos completar para que quede similar a lo siguiente:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"515\" height=\"271\" src=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-15.png\" alt=\"\" class=\"wp-image-88\" srcset=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-15.png 515w, https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-15-300x158.png 300w\" sizes=\"auto, (max-width: 515px) 100vw, 515px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>@EndUserText.label: 'Table function para vuelos'\ndefine table function ZTF_VUELOS\nwith parameters \n@Environment.systemField: #CLIENT\nclient : mandt,\nreturns {\n  client : abap.clnt;\n  carrid : s_carr_id;\n  connid : s_conn_id;\n  fldate : s_date;\n  carrname : s_carrname;\n  URL : s_carrurl;\n  price : s_price;\n  currency : s_currcode;\n  passname : s_passname;\n}\nimplemented by method zcl_vuelos2=>obtener_datos_pasajeros;<\/code><\/pre>\n\n\n\n<p>Vemos que al final le estamos especificando la clase (ZCL_VUELOS2) y el m\u00e9todo (obtener_datos_pasajeros) que vamos a llamar.<\/p>\n\n\n\n<p>El pr\u00f3ximo paso ser\u00e1 crear esta clase y m\u00e9todo, para esto hacemos click derecho sobre nuestro package o objeto local y seleccionamos crear una clase.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"351\" src=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-16.png\" alt=\"\" class=\"wp-image-89\" srcset=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-16.png 624w, https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-16-300x169.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p>Ingresamos un nombre (El que usamos en la Table function) y descripci\u00f3n.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"570\" height=\"587\" src=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-17.png\" alt=\"\" class=\"wp-image-90\" srcset=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-17.png 570w, https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-17-291x300.png 291w\" sizes=\"auto, (max-width: 570px) 100vw, 570px\" \/><\/figure>\n\n\n\n<p>De nuevo seleccionamos una orden de transporte y le damos click a Finish o si es un objeto local directamente hacemos click en finish.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"573\" height=\"588\" src=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-18.png\" alt=\"\" class=\"wp-image-91\" srcset=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-18.png 573w, https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-18-292x300.png 292w\" sizes=\"auto, (max-width: 573px) 100vw, 573px\" \/><\/figure>\n\n\n\n<p>Nos creara el template que se vera similar a:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"325\" height=\"248\" src=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-19.png\" alt=\"\" class=\"wp-image-92\" srcset=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-19.png 325w, https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-19-300x229.png 300w\" sizes=\"auto, (max-width: 325px) 100vw, 325px\" \/><\/figure>\n\n\n\n<p>Adaptamos la clase para que tenga la l\u00f3gica que nosotros queramos, por ejemplo:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"391\" src=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-20.png\" alt=\"\" class=\"wp-image-93\" srcset=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-20.png 624w, https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-20-300x188.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<pre class=\"wp-block-code\"><code>CLASS zcl_vuelos2 DEFINITION\n  PUBLIC\n  FINAL\n  CREATE PUBLIC .\n\n  PUBLIC SECTION.\n    INTERFACES : if_amdp_marker_hdb.\n    CLASS-METHODS :  obtener_datos_pasajeros FOR TABLE FUNCTION ZTF_VUELOS.\n  PROTECTED SECTION.\n  PRIVATE SECTION.\nENDCLASS.\n\nCLASS zcl_vuelos2 IMPLEMENTATION.\n\n        METHOD obtener_datos_pasajeros BY DATABASE FUNCTION FOR HDB\n                        LANGUAGE SQLSCRIPT\n                        OPTIONS READ-ONLY\n                        USING scarr sflight sbook.\n\n               RETURN\n\n                    SELECT a.mandt AS client, a.carrid AS carrid, a.connid AS connid, a.fldate AS fldate,\n                           b.carrname AS carrname, b.URL as URL, a.price AS price, a.currency AS currency,\n                           c.passname AS passname FROM sflight AS a\n                           INNER JOIN scarr AS b\n                            ON a.carrid = b.carrid\n                           INNER JOIN sbook AS c\n                            ON a.carrid = c.carrid AND\n                               a.connid = c.connid AND\n                               a.fldate = c.fldate\n                           WHERE a.mandt = c.mandt;\n        ENDMETHOD.\nENDCLASS.\n<\/code><\/pre>\n\n\n\n<p>Ahora debemos creamos una vista CDS que utilice nuestra table function. Para esto, como hicimos antes nos creamos una vista CDS.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"569\" height=\"587\" src=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-21.png\" alt=\"\" class=\"wp-image-94\" srcset=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-21.png 569w, https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-21-291x300.png 291w\" sizes=\"auto, (max-width: 569px) 100vw, 569px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"571\" height=\"585\" src=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-22.png\" alt=\"\" class=\"wp-image-95\" srcset=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-22.png 571w, https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-22-293x300.png 293w\" sizes=\"auto, (max-width: 571px) 100vw, 571px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"569\" height=\"587\" src=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-23.png\" alt=\"\" class=\"wp-image-96\" srcset=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-23.png 569w, https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-23-291x300.png 291w\" sizes=\"auto, (max-width: 569px) 100vw, 569px\" \/><\/figure>\n\n\n\n<p>Nuestra vista deber\u00eda ser algo similar a esto:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"280\" src=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-24.png\" alt=\"\" class=\"wp-image-97\" srcset=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-24.png 624w, https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-24-300x135.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p>Lo importante a ver ac\u00e1, es que estamos haciendo el SELECT desde la Table Function (SELECT FROM ZTF_VUELOS ).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@AbapCatalog.sqlViewName: 'ZCDS_TF_DATOS_V'\n@AbapCatalog.compiler.compareFilter: true\n@AbapCatalog.preserveKey: true\n@AccessControl.authorizationCheck: #CHECK\n@EndUserText.label: 'Datos de pasajeros usando TF'\ndefine view ZCDS_TF_DATOS as select from ZTF_VUELOS ( client : $session.client ) {\n    carrid,\n    connid,\n    fldate,\n    carrname,\n    URL,\n    @Semantics.amount.currencyCode: 'CurrencyCode' \n    price,\n    @Semantics.currencyCode\n      cast ('USD' as abap.cuky) as CurrencyCode,\n    currency,\n    passname\n}\n<\/code><\/pre>\n\n\n\n<p>Una ves con nuestra nueva vista creada, la podemos consultar como hicimos antes desde la SE16. Pero tambi\u00e9n lo que podemos hacer es ponerle un breakpoint en la clase que creamos.<\/p>\n\n\n\n<p>Para hacer esto, en eclipse, vamos a la clase que creamos y hacemos doble click donde esta marcado en la captura de abajo. Nos deber\u00eda aparecer un puntito en color verde si el breakpoint esta activo.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"409\" src=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-25.png\" alt=\"\" class=\"wp-image-98\" srcset=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-25.png 624w, https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-25-300x197.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p>Una ves con el breakpoint activo, podemos ejecutar la vista desde la SE16 y se nos deber\u00eda activar el debugger en eclipse.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"299\" height=\"141\" src=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-26.png\" alt=\"\" class=\"wp-image-99\"\/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"553\" height=\"295\" src=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-27.png\" alt=\"\" class=\"wp-image-100\" srcset=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-27.png 553w, https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-27-300x160.png 300w\" sizes=\"auto, (max-width: 553px) 100vw, 553px\" \/><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"276\" src=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-28.png\" alt=\"\" class=\"wp-image-101\" srcset=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-28.png 624w, https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-28-300x133.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p>Para ver mejor por debug podemos cambiar el c\u00f3digo por:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>CLASS zcl_vuelos2 DEFINITION\n  PUBLIC\n  FINAL\n  CREATE PUBLIC .\n\n  PUBLIC SECTION.\n    INTERFACES : if_amdp_marker_hdb.\n    CLASS-METHODS :  obtener_datos_pasajeros FOR TABLE FUNCTION ZTF_VUELOS.\n  PROTECTED SECTION.\n  PRIVATE SECTION.\nENDCLASS.\n\nCLASS zcl_vuelos2 IMPLEMENTATION.\n\n        METHOD obtener_datos_pasajeros BY DATABASE FUNCTION FOR HDB\n                        LANGUAGE SQLSCRIPT\n                        OPTIONS READ-ONLY\n                        USING scarr sflight sbook.\n\n\/*               RETURN *\/\n\n                    lt_datos = SELECT a.mandt AS client, a.carrid AS carrid, a.connid AS connid, a.fldate AS fldate,\n                           b.carrname AS carrname, b.URL as URL, a.price AS price, a.currency AS currency,\n                           c.passname AS passname FROM sflight AS a\n                           INNER JOIN scarr AS b\n                            ON a.carrid = b.carrid\n                           INNER JOIN sbook AS c\n                            ON a.carrid = c.carrid AND\n                               a.connid = c.connid AND\n                               a.fldate = c.fldate\n                           WHERE a.mandt = c.mandt;\n\n                    RETURN :lt_datos;\n\n        ENDMETHOD.\nENDCLASS.\n<\/code><\/pre>\n\n\n\n<p>En la imagen de abajo podemos ver el breakpoint en la l\u00ednea 22, a la derecha del c\u00f3digo podemos ver nuestra variable lt_datos donde se guarda el resultado de la consulta y en la parte de inferior de la pantalla podemos ver el contenido de la tabla interna.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"624\" height=\"420\" src=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-29.png\" alt=\"\" class=\"wp-image-102\" srcset=\"https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-29.png 624w, https:\/\/www.matiasvillagarcia.com\/blog\/wp-content\/uploads\/2021\/06\/image-29-300x202.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><\/figure>\n\n\n\n<p>Tambien al igual que con una vista CDS com\u00fan, la podemos usar desde un reporte ABAP:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>SELECT * FROM ZCDS_TF_DATOS( pcarrid = 'AA', pconnid = '0017', pfldate = @lv_fecha )\n  INTO TABLE @DATA(lt_datos2).\nIF sy-subrc = 0.\n\nENDIF.<\/code><\/pre>\n\n\n\n<p>Tambien podemos usar un ALV IDA para mostrar los datos:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>REPORT zida_cds.\ndata: lo_exc type ref to cx_salv_function_not_supported.\n\ntry.\n  cl_salv_gui_table_ida=&gt;create_for_cds_view( 'ZCDS_VUELOS' )-&gt;fullscreen( )-&gt;display( ).\n  catch cx_salv_function_not_supported into lo_exc.\n    message lo_exc type 'I'.\nendtry.<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Al igual que cuando creamos la vista CDS, para crear una table function debemos crear un data definition como hicimos antes, pero al momento de llegar al template seleccionamos \u201cDefine Table Function with parameters\u201d Al hacer click en finish nos aparecer\u00e1 el template seleccionado el cual debemos completar para que quede similar a lo siguiente: [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,6,5,7],"tags":[],"class_list":["post-84","post","type-post","status-publish","format-standard","hentry","category-abap","category-cds","category-hana","category-oop"],"_links":{"self":[{"href":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/wp-json\/wp\/v2\/posts\/84","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/wp-json\/wp\/v2\/comments?post=84"}],"version-history":[{"count":7,"href":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/wp-json\/wp\/v2\/posts\/84\/revisions"}],"predecessor-version":[{"id":109,"href":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/wp-json\/wp\/v2\/posts\/84\/revisions\/109"}],"wp:attachment":[{"href":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/wp-json\/wp\/v2\/media?parent=84"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/wp-json\/wp\/v2\/categories?post=84"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.matiasvillagarcia.com\/blog\/index.php\/wp-json\/wp\/v2\/tags?post=84"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}