Estoy seguro de que a estas alturas ya ha comenzado su viaje en la nube en ABAP. Tal vez acaba de publicar un nuevo escenario de negocios, extendió una vista de CDS o depuró sus clases.
En este blog, quiero presentar un caso de negocios que casi todos los clientes deben implementar de alguna manera: Impresión!
Esta publicación de blog puede parecer similar a esta: https://blogs.sap.com/2020/04/03/generar-pdfs-en-sap-cloud-platform-abap-environment/. En esta publicación, sin embargo, usamos exclusivamente servicios en Cloud Foundry, ofrecemos un escenario de producto completo, una guía de configuración y objetos de ejemplo.
Esta guía está diseñada para usarse junto con los objetos publicados en el repositorio SAP-samples Github:https://github.com/SAP-samples/forms-service-by-adobe-samples. Esto creará un escenario de trabajo listo para usar y solo necesita realizar la configuración inicial. Puede importar los objetos de demostración desde el repositorio de Github a través de ABAPgit, activar todos los objetos y ejecutar zcl_dsag_fill_data para escribir algunos datos de prueba en su base de datos.
Las plantillas de formulario se almacenarán directamente en SAP Business Technology Platform. Por lo tanto, teóricamente podrían ser accedidos por múltiples sistemas. Para esta guía, se proporciona una plantilla de demostración a la que se puede acceder aquí: Plantilla de demostración. Después de la configuración inicial, puede publicar una factura de demostración en su cola de impresión (ver Ejecutando el ejemplo).
Imagine que su equipo de gestión de productos inicia un nuevo proyecto para realizar una nueva solución de orden de compra en SAP Business Technology Platform. En este blog, queremos explorar cómo se podría realizar dicho requisito utilizando los servicios SAP BTP y el entorno SAP BTP, ABAP. Nuestro objetivo será crear la siguiente salida:
Antes de comenzar a implementar este ejemplo, primero debemos obtener una descripción general aproximada de nuestro espacio Cloud Foundry.
Herramientas:
Aquí hay una breve lista de los servicios que se necesitan:
El servicio de destino de SAP se utiliza para conectar servicios y aplicaciones a servicios de terceros. La información de conexión, incluidas las credenciales, se puede mantener de forma centralizada mediante este servicio.
Él SAVIA Servicio de destino será utilizado por el entorno SAP BTP, ABAP para conectarse al Tienda de plantillas hospedado por el Servicio de formularios de la API de Adobe.
El “cerebro” de nuestra operación. Almacenaremos y definiremos nuestros datos comerciales y servicios de datos en ABAP. Él entorno ABAP también se conectará a todos los servicios externos y proporcionará los archivos de impresión renderizados a través de la cola de impresión integrada.
El servicio SAP Forms de Adobe es la solución de representación de formularios basada en la nube de SAP. La tecnología se basa en Adobe Document Services (ADS).
Con el Servicio de formularios por API de Adobe Ofrecemos una solución central de almacenamiento de plantillas de formularios de Adobe (tienda de plantillas).
Antes de que podamos comenzar a programar nuestro ejemplo en ABAP y Adobe LiveCycle Designer 11.0 para soluciones SAP, primero debemos configurar todos los servicios dependientes. La siguiente sección asume que está familiarizado con el entorno SAP BTP, Cloud Foundry. Especialmente cómo suscribirse y consumir servicios a través de la cabina. Si eres nuevo en este producto te recomiendo leer el dedicado página de ayuda Antes de continuar.
Quizás se pregunte por qué necesitamos instancias de suscripción y servicio. La suscripción inicial es necesaria para habilitar las IU de configuración del servicio (IU de configuración de ADS / IU de administración de la tienda de plantillas) y para configurar los datos de su arrendatario. Sin él, los servicios no funcionarán según lo previsto. Para acceder a las IU, debe autorizar a los usuarios a través de una colección de funciones personalizada.
Las instancias de servicio se utilizan para dar acceso al servicio a sistemas externos. Los sistemas externos no tienen un usuario mantenido en Cloud Foundry, por lo que necesitamos credenciales específicas para autorizar estos sistemas.
El entorno ABAP utilizará la instancia de servicio para el servicio SAP Forms para generar un archivo de impresión (por ejemplo, PDF), y la instancia de servicio para Forms Service by Adobe API nos permite conectarnos al almacén de plantillas.
Para permitir que el entorno ABAP acceda al almacén de plantillas, debemos transmitir la información de la clave de servicio (para el Servicio de formularios de la API de Adobe). Para evitar codificar esta información de conexión, crearemos un destino específico para el almacén de plantillas utilizando el servicio de destino de Cloud Foundry.
Una vez que hemos conectado el servicio de destino al entorno ABAP, podemos reutilizar todos los destinos mantenidos.
Para crear un destino para la tienda de plantillas, debe:
Para proporcionar a nuestra impresora física los archivos de impresión almacenados en la cola de impresión, necesitamos usar un servicio de proxy que recupera los archivos y los envía a la impresora correspondiente. Para habilitar este servicio, necesitamos mantener un usuario de comunicación, un arreglo de comunicación y una nueva cola de impresión específica.
Siga la guía de configuración aquí: https://blogs.sap.com/2017/08/07/cloud-print-manager-instalación-y-configuración/. Asegúrese de anotar el nombre de su cola de impresión. Esta guía asume que el nombre de la cola de impresión se COLA DE IMPRESIÓNsi no, debe ajustar el guión final en consecuencia.
Cree un nuevo acuerdo de comunicación (escenario: SAP_COM_0276) con la clave de servicio de la instancia de servicio de destino.
Si solo está interesado en un proyecto de prueba de concepto rápido o si desea comenzar a ampliar un ejemplo básico, se proporciona un proyecto de muestra.
Creé una clase ejecutable corta que representa un PDF utilizando los datos comerciales y la plantilla de la tienda de plantillas. Los archivos de impresión generados se enviarán a la cola de impresión. Si planea ejecutar esto, asegúrese de que los valores codificados se ajusten a su entorno.
Asegúrese de haber generado los datos de prueba de antemano ejecutando la clase zcl_dsag_fill_data.
CLASS zcl_dsag_execute_fdp DEFINITION
PUBLIC
FINAL
CREATE PUBLIC .
PUBLIC SECTION.
INTERFACES: if_oo_adt_classrun.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS zcl_dsag_execute_fdp IMPLEMENTATION.
METHOD if_oo_adt_classrun~main.
try.
"Initialize Template Store Client
data(lo_store) = new ZCL_FP_TMPL_STORE_CLIENT(
"name of the destination (in destination service instance) pointing to Forms Service by Adobe API service instance
iv_name="restapi"
"name of communication arrangement with scenario SAP_COM_0276
iv_service_instance_name="SAP_COM_0276"
).
out->write( 'Template Store Client initialized' ).
"Initialize class with service definition
data(lo_fdp_util) = cl_fp_fdp_services=>get_instance( 'ZDSAG_BILLING_SRV_DEF' ).
out->write( 'Dataservice initialized' ).
"Get initial select keys for service
data(lt_keys) = lo_fdp_util->get_keys( ).
lt_keys[ name="ID" ]-value="1".
data(lv_xml) = lo_fdp_util->read_to_xml( lt_keys ).
out->write( 'Service data retrieved' ).
data(ls_template) = lo_store->get_template_by_name(
iv_get_binary = abap_true
iv_form_name="DSAG_DEMO" "<= form object in template store
iv_template_name="TEMPLATE" "<= template (in form object) that should be used
).
out->write( 'Form Template retrieved' ).
cl_fp_ads_util=>render_4_pq(
EXPORTING
iv_locale="en_US"
iv_pq_name="PRINT_QUEUE" "<= Name of the print queue where result should be stored
iv_xml_data = lv_xml
iv_xdp_layout = ls_template-xdp_template
is_options = value #(
trace_level = 4 "Use 0 in production environment
)
IMPORTING
ev_trace_string = data(lv_trace)
ev_pdl = data(lv_pdf)
).
out->write( 'Output was generated' ).
cl_print_queue_utils=>create_queue_item_by_data(
"Name of the print queue where result should be stored
iv_qname="PRINT_QUEUE"
iv_print_data = lv_pdf
iv_name_of_main_doc="DSAG DEMO Output"
).
out->write( 'Output was sent to print queue' ).
catch cx_fp_fdp_error zcx_fp_tmpl_store_error cx_fp_ads_util.
out->write( 'Exception occurred.' ).
endtry.
out->write( 'Finished processing.' ).
ENDMETHOD.
ENDCLASS.
Si todo funcionó correctamente, debería recibir un PDF similar al que se muestra al principio. Ahora puede echar un vistazo más profundo a las vistas, las clases y el diseño de formulario de CDS proporcionados.
La salida de ejemplo funciona. Ahora puede continuar extendiendo los objetos en su sistema para que se ajusten a sus casos de uso.
Para el desarrollo de formularios en general, recomiendo los siguientes pasos:
En nuestro ejemplo, el nodo raíz será ZI_DSAG_BILL_ORDER. El nodo raíz es el nodo inicial de nuestro árbol de datos resultante. Este nodo generalmente se determina comprobando qué nodos no tienen asociaciones que los apunten.
Dado el servicio de datos anterior, la salida del servicio de datos podría verse así:
Para generar datos de nuestras vistas de CDS, debemos exponerlos a través de una definición de servicio (no se necesita un enlace de servicio para nuestro caso de uso).
@EndUserText.label: 'Service Destination for billing example'
define service ZDSAG_BILLING_SRV_DEF {
expose ZI_DSAG_BILL_ITEM;
expose ZI_DSAG_BILL_ORDER;
expose ZI_DSAG_PRODUCT;
expose ZI_DSAG_RECEIVER;
}
Los datos xml ahora se pueden generar usando el siguiente ejemplo:
"Initiate data service from definition
data(lo_fdp_util) = cl_fp_fdp_services=>get_instance( 'ZDSAG_BILLING_SRV_DEF' ).
"Retrieve the key fields of the root node
data(lt_keys) = lo_fdp_util->get_keys( ).
"Fill out key fields (depends on your actual data)
lt_keys[ name="ID" ]-value="1".
"Execute the data service and retrieve the data tree
data(lv_xml) = lo_fdp_util->read_to_xml( lt_keys ).
"Generate data schema from your service
data(lv_schema) = lo_fdp_util->get_xsd( )
Para cargar o descargar un diseño de plantilla de formulario en el entorno ABAP, implementé un cliente de almacén de plantillas como codificación Z (disponible en el repositorio de GitHub). Aquí hay algunos ejemplos esenciales que muestran cómo se usa este cliente en ABAP:
"Initialize Template Store Client
data(lo_store) = new ZCL_FP_TMPL_STORE_CLIENT(
"destination name connecting to the template store in cf destination service
iv_name="restapi"
"name of the comm. arrangement connecting the cf destination service
iv_service_instance_name="SAP_COM_0276"
).
try.
"Get data schema for form object
lo_store->get_schema_by_name( iv_form_name="DSAG_DEMO" ).
catch zcx_fp_tmpl_store_error into data(lo_tmpl_error).
"Error occurred
"Check if error occurred because no schema was found
if lo_tmpl_error->mv_http_status_code = 404.
"Upload a new schema to form object
lo_store->set_schema(
iv_form_name="DSAG_DEMO"
"Generate schema from the data service util
is_data = value #( note="" schema_name="schema" xsd_schema = lo_fdp_util->get_xsd( ) )
).
else.
"Get error: lo_tmpl_error->get_longtext( ).
endif.
endtry.
data(ls_template) = lo_store->get_template_by_name(
"Should the xdp template be retrieved or only metadata
iv_get_binary = abap_true
"Name of the form object in the template store
iv_form_name="DSAG_DEMO"
"Name of the template in the template store
iv_template_name="TEMPLATE"
).
"To access the template data use:
ls_template-xdp_template
Suele ser muy útil tener disponible el esquema de datos del servicio comercial antes de comenzar a desarrollar la plantilla de formulario. Es aconsejable desarrollar primero su servicio de datos y luego ejecutar una ejecución de clase para cargar el esquema en un objeto de formulario en el almacén de plantillas (vea el ejemplo anterior: Cargue un esquema de datos en un formulario en el almacén de plantillas). A continuación, puede descargar el archivo de esquema xsd de la tienda de plantillas.
Alternativamente, el archivo xsd generado también está disponible en Github.
Para importar el esquema a Adobe LiveCycle Designer 11.0 para soluciones SAP:
Espero que esta guía le brinde una buena descripción general de lo que es posible en SAP BTP utilizando servicios nativos de la nube.
Feliz impresión y saludos,
pascal bremer
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