Esta serie de blogs presenta la Proyecto ABAP2UI5. Es un proyecto de código abierto que lo ayuda a desarrollar aplicaciones UI5 independientes en ABAP puro. El predecesor se introdujo en este entrada en el blog. El proyecto ahora tiene algunas mejoras que permiten usar una amplia gama de controles UI5. Por ejemplo, ahora es posible mostrar tablas y listas y definir diferentes diseños con encabezados y pies de página. Con estos, puede crear aplicaciones para muchos casos de uso diferentes.
ABAP2UI5 quiere proporcionar una forma «lista para la nube» y «no sap-gui» para crear aplicaciones UI5 en ABAP puro sin usar OData, Javascript, anotaciones o RAP, como en los «viejos tiempos» cuando solo necesitábamos unas pocas líneas. de código ABAP para mostrar tablas y entradas con el marco CL_GUI_ALV_GRID y CL_GUI_CFW.
Si está interesado en los antecedentes técnicos, eche un vistazo a esta primera publicación de blog: ABAP2UI5 – Desarrollo de Pantallas de Selección UI5 en ABAP puro
Toda la información del proyecto se puede encontrar en el repositorio de GitHub y en twitter:
Para obtener una primera impresión de ABAP2UI5, eche un vistazo a esta demostración: todo se crea en el backend en ABAP puro. No se necesita implementación de aplicaciones ni javascript adicionales:
Una aplicación de ejemplo se ve así:
CLASS z2ui5_cl_app_demo_01 DEFINITION PUBLIC.
PUBLIC SECTION.
INTERFACES z2ui5_if_app.
DATA product TYPE string.
DATA quantity TYPE string.
ENDCLASS.
CLASS Z2UI5_CL_APP_DEMO_01 IMPLEMENTATION.
METHOD z2ui5_if_app~controller.
CASE client->get( )-lifecycle_method.
WHEN client->cs-lifecycle_method-on_init.
product="tomato".
quantity = '500'.
WHEN client->cs-lifecycle_method-on_event.
CASE client->get( )-event.
WHEN 'BUTTON_POST'.
client->display_message_toast( |{ product } { quantity } ST - GR successful| ).
ENDCASE.
WHEN client->cs-lifecycle_method-on_rendering.
DATA(view) = client->factory_view( ).
view->page( title="Page title"
)->simple_form('Form Title'
)->content( 'f'
)->title( 'Input'
)->label( 'quantity'
)->input( view->_bind( quantity )
)->label( 'product'
)->input( value = product editable = abap_False
)->button( text="post" press = view->_event( 'BUTTON_POST' ) ).
ENDCASE.
ENDMETHOD.
ENDCLASS.
Los otros ejemplos de código se pueden encontrar aquí:
Pantalla de selección / Lista / Mesa
Como puedes ver, lo único que tienes que hacer para desarrollar una aplicación UI5 con ABAP2UI5 es crear una nueva clase implementando la siguiente interfaz:
INTERFACE z2ui5_if_app
PUBLIC .
INTERFACES if_serializable_object.
METHODS controller
IMPORTING
client TYPE REF TO z2ui5_if_client.
ENDINTERFACE.
Repasemos el proceso de desarrollo paso a paso comenzando con el controlador:
La interfaz Z2UI5_IF_APP proporciona el método «controlador», que le brinda el control de la aplicación UI5 de interfaz similar a un controlador Javascript de una aplicación de estilo libre UI5. Por lo tanto, se ven muy similares:
Controlador UI5 frente a controlador ABAP2UI5 |
|
|
El controlador ABAP2UI5 tiene tres eventos de ciclo de vida. La ruta on_init se llama cuando se inicia una aplicación, la ruta on_rendering se llama después de cada solicitud del servidor cuando se representa la vista y la ruta on_event cuando se genera un evento UI5.
Por supuesto, cuando todo se maneja en un solo método, esta no es la idea de un código limpio, pero ABAP2UI5 no quiere establecer ningún requisito sobre cómo se estructuran las aplicaciones. Entonces, solo existe este método como una capa básica y luego cada usuario puede implementar diferentes métodos además de esto por sí mismos. Tal vez uno para init, otro para user_commands, etc.
ABAP2UI5 brinda la posibilidad de desarrollar vistas de UI5 similares a una aplicación de estilo libre de UI5. La única diferencia es que las vistas no están definidas en XML, sino que se crean con una clase generadora de vistas ABAP2UI5. Con esto, el usuario tiene total libertad para estructurar la vista y también la flexibilidad de usar muchos controles UI5 diferentes. Un ejemplo simple (comparado con una vista UI5 normal) se ve así:
UI5-Vista frente a ABAP2UI5-Vista |
|
|
Y un ejemplo más detallado se ve así:
UI5-Vista frente a ABAP2UI5-Vista |
|
|
En el segundo ejemplo, puede ver que necesita 70 líneas de código para una vista. Tal vez eso parezca mucho para una sola vista y el proceso de generación es muy técnico. Pero, de nuevo, ABAP2UI5 solo quiere proporcionar la capa básica y la funcionalidad para crear aplicaciones UI5 para que el espacio ocupado por el sistema de ABAP2UI5 sea muy pequeño. Aparte de esto, cada usuario puede crear contenedores útiles alrededor de la representación de la vista.
En este momento, los siguientes controles de UI5 están disponibles y se agregarán más en el futuro:
¿Qué controles UI5 funcionan con ABAP2UI5?
Solo funcionan los controles que no tienen su «propia lógica de javascript». Eso significa que, por ejemplo, podemos usar el control de entrada, porque tiene solo unos pocos atributos, que se envían directamente al servidor y no necesitamos ningún javascript adicional para esto. La mayoría de los controles 70-80% funcionan así, por lo que podemos usarlos con ABAP2UI5 listos para usar.
Controles que necesitan una implementación de Javascript adicional como el Administrador de mensajes no son posibles Pero existiría la posibilidad de crear un control personalizado a su alrededor y hacerlo controlable por el servidor y con esto formar parte de ABAP2UI5. Pero la pregunta es si vale la pena el esfuerzo. En el futuro, tiene sentido echar un vistazo a ciertos controles muy populares, pero primero mantengamos ABAP2UI5 simple y omitamos esto.
Hay dos métodos de eventos posibles en este momento.
Evento
|
La mayoría de las veces es suficiente enviar un simple comando de usuario al servidor. Para esto puedes usar el método _event() |
ID de visualización de evento
|
Con este método, ABAP2UI5 vuelve a una respuesta con una identificación determinada. Por ejemplo, esto es muy útil cuando solo desea navegar hacia atrás después de llamar a una nueva aplicación. En la sección REST y borrador, puede ver que cada solicitud genera una nueva identificación y se guarda un borrador del estado real de la aplicación. Eso nos da la posibilidad de saltar también a cada estado anterior con el método _event_display_id() |
Si existe la necesidad de más funciones de eventos, es posible ampliar ABAP2UI5 en el futuro.
Hay tres posibilidades de cómo ABAP2UI5 envía datos a la interfaz:
XML directo
|
Simplemente coloque el valor en el atributo, luego ABAP2UI5 escribe el valor directamente en UI5-XML-View y lo envía a la interfaz |
Unión unidireccional
|
ABAP2UI5 escribe el valor en el modelo de vista y vincula el modelo de vista a la vista XML. Útil para modelos de datos profundos como tablas, veremos esto en la próxima publicación del blog |
Encuadernación bidireccional
|
Igual que el enlace unidireccional, pero además los valores de interfaz se envían de vuelta al servidor con cada solicitud. Así que asegúrese de que el valor que vincula aquí sean atributos públicos de su aplicación que ABAP2UI5 pueda asignarle y actualizar los valores desde el exterior. Este modo de vinculación es útil para entradas o tablas editables. |
Por lo tanto, el usuario tiene que decidir durante la definición de la vista cómo se envían los datos a la interfaz y si se deben devolver o no. Para mantener pequeña la carga útil de la solicitud, es una buena idea usar el enlace bidireccional solo si es necesario y los valores se cambian en la interfaz. También se recomienda no sobrecargar la aplicación con miles de atributos, porque ABAP2Ui5 realiza un bucle después de cada solicitud sobre todos los atributos de la clase y verifica si existen valores que deban actualizarse. Hasta ahora nunca he tenido problemas, pero tenga en cuenta que hay un bucle funcionando en segundo plano.
Todo el marco se basa en REST, por lo tanto, no existe ninguna sesión entre dos solicitudes y es compatible con cualquier caso de uso móvil o dispositivo móvil. También es compatible con entornos “tranquilos” como BTP ABAP Environment o la nueva versión de lenguaje ABAP Cloud.
Además, después de cada solicitud, el estado real de la aplicación se serializa y persiste en la base de datos. Z2UI5_IF_APP incluye la interfaz IF_SERIALIZABLE_OBJECT, por lo tanto, es posible usar atributos de la instancia de la aplicación entre dos solicitudes y se siente como trabajar con una aplicación con estado como en un entorno de pantalla de selección o dynpro:
La persistencia de ABAP2UI5 se denomina tabla de borrador, aunque no es completamente igual a la que conoce de RAP. Los borradores de ABAP2UI5 no son específicos del tipo, simplemente persisten en la clase de la aplicación de forma genérica. Por lo tanto, no hay trabajo adicional en la creación de tablas de borrador mecanografiadas, todo funciona automáticamente en segundo plano.
Los borradores son muy útiles para los resultados intermedios, pero tal vez no exagere con esta posibilidad. No es buena idea construir cadenas interminables de apps guardándose entre sí en atributos o intentar salvar millones de entradas en tablas internas. Pero, por supuesto, este tampoco es un buen estilo de programación en otros contextos. Por otro lado, el servidor ABAP y la base de datos son muy potentes, por lo que guardar tablas internas con, por ejemplo, miles de entradas no es un problema.
Pero no olvide borrar la tabla Z2UI5_T_DRAFT de vez en cuando, de lo contrario se llenará.
Esa fue la primera parte de la introducción al Proyecto ABAP2UI5. Siéntase libre de instalar este proyecto y probar los ejemplos y demostraciones. Para noticias y mejoras sigue este proyecto en Gorjeo o echa un vistazo a la repositorio GitHub de vez en cuando.
En la próxima publicación del blog, usaremos ABAP2UI5 para enviar modelos de datos profundos a la interfaz y desarrollar aplicaciones que muestren listas y tablas.
Que piensas de esta aproximación? Siéntase libre de compartir sus comentarios e ideas.
¡Gracias por leer!
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