En el presente tutorial se explica cómo crear una simple aplicación CRUD desde cero
utilizando SAPUI5 y un servicio ICF basado en REST y JSON.
Contenido
1. Requisitos previos ......................................................................................................................... 2
2. Visión General ............................................................................................................................... 2
3. Descargar el Proyecto en Eclipse. .................................................................................................. 2
4. Referencias .................................................................................................................................... 2
4.1. SAPUI5 .................................................................................................................................. 2
4.2. Copia y Corrección de la clase CL_TREX_JSON_SERIALIZER .................................................... 3
4.3. Extendiendo Modelo SAPUI5 JSON ....................................................................................... 4
5. Creación del Servicio ICF REST ....................................................................................................... 4
5.1. Creación de una clase controladora personalizada ................................................................ 4
5.2. Creación del nodo ICF............................................................................................................ 6
5.3. Recuperando el método de solicitud y los parámetros pasados en la URL. ......................... 10
6. Implementación del servicio REST ............................................................................................... 14
6.1. Objetos del Diccionario y Clase Modelo .............................................................................. 14
6.2. Implantación del método Create (verbo HTTP POST) .......................................................... 19
6.3. Implantación del método Read (verbo HTTP GET) ............................................................... 24
6.4. Implantación del método Update (verbo HTTP PUT) ........................................................... 25
6.5. Implementación del método Delete (verbo HTTP DELETE) .................................................. 26
7. Creación de la interfaz de usuario ............................................................................................... 28
7.1. Installar plugin SAPUI5 en Eclipse. ...................................................................................... 28
7.2. Creación del proyecto ......................................................................................................... 29
7.3. Configuración del arranque SAPUI5 y bibliotecas necesarias .............................................. 31
7.4. Creación de los componentes de vista ................................................................................ 31
7.5. Creación de los BSP para implementar la aplicación y el framework SAPUI5. ..................... 35
7.6. Implementación de los métodos del controlador ................................................................ 40
7.6.1. Create ......................................................................................................................... 41
7.6.2. Read ........................................................................................................................... 45
7.6.3. Update ........................................................................................................................ 46
7.6.4. Delete ......................................................................................................................... 47
7.6.5. Find............................................................................................................................. 49
8. Anexos ........................................................................................................................................ 52
8.1. Configurar FQDN. ................................................................................................................. 52
1. Requisitos previos
Instalar SAPUI5 Application Development Tool en el IDE Eclipse
UI Development Toolkit for HTML5
SAP NetWeaver ABAP 7.01 Stack Level 7 o Posterior.
Copia de la Clase CL_TREX_JSON_SERIALIZER con correción.
2. Visión General
En este documento se muestra cómo crear una simple aplicación CRUD usando
el servicio SAPUI5 e ICF REST / JSON. Las aplicaciones cliente se desarrollarán
utilizando el framework SAPUI5 mediante el uso de las herramientas de
desarrollo de aplicaciones SAPUI5 (herramienta basada en Eclipse). La
comunicación se basa en un servicio REST construida desde cero en ABAP con ICF
(Internet Connection Framework). Todas las respuestas se basan en JSON. El
objetivo de la aplicación será dar mantenimiento a una simple lista de contactos
que se persistirá en una tabla con la estructura siguiente.
4. Referencias
4.1.SAPUI5
How to Build a SAP HTML5 Application Using MVC with the SAPUI5
Application
UI Development Toolkit for HTML5
4.2. Copia y Corrección de la clase CL_TREX_JSON_SERIALIZER
ENDMETHOD.
METHOD if_http_extension~handle_request.
* Variables
DATA: l_verb TYPE string,
l_path_info TYPE string,
l_resource TYPE string,
l_param_1 TYPE string,
l_param_2 TYPE string.
ENDCASE.
Para probar el servicio, necesitamos un cliente REST. Aquí vamos a utilizar una
extensión de Chrome llamada POSTMAN.
El servicio debe aceptar GET, POST, PUT y DELETE y devolver el código de error
405 por cualquier otro método. Vamos a ver.
Antes de ejecutar nuestras pruebas, es necesario llenar la autenticación
básica y refrescar las cabeceras.
GET
POST
PUT
DELETE
Para cualquier otro verbo HTTP, la respuesta esperada es el retorno del código
de error 405 con el mensaje " Method not allowed". Vamos a tratar con el
verbo PATCH.
6. Implementación del servicio REST
6.1. Objetos del Diccionario y Clase Modelo
Tabla ZTB_SCNBLOG2.
Ingresaremos a la transacción SE11 y crearemos la tabla como se
muestra en la imagen.
method CREATE.
DATA: l_email TYPE ztb_scnblog2-email.
* Verifica si el contacto ya existe
SELECT SINGLE email FROM ztb_scnblog2
INTO l_email
WHERE email = i_s_contact-email.
IF sy-subrc = 0.
e_rc = 4.
me->status = text-001. " El contacto ya existe
EXIT.
ENDIF.
* Crear contacto
INSERT ztb_scnblog2 FROM i_s_contact.
e_rc = sy-subrc.
endmethod.
o READ
method READ.
ELSE.
ENDIF.
endmethod.
o UPDATE
method UPDATE.
* Perform validations
e_rc = sy-subrc.
endmethod.
o DELETE
method DELETE.
e_rc = sy-subrc.
endmethod.
o GET_MESSAGE
method GET_MESSAGE.
r_msg = me->status.
endmethod.
METHOD if_http_extension~handle_request.
TYPES: BEGIN OF local_type_response,
success TYPE string,
msg TYPE string,
data TYPE ztt_scnblog2,
END OF local_type_response.
* Objetos
DATA: lo_contact TYPE REF TO zcl_scnblog2_contact,
lo_json_serializer TYPE REF TO zcl_json_serializer. ”Copia de
la clase standard CL_TREX_JSON_SERIALIZER
* Tablas internas
DATA: lt_contacts TYPE STANDARD TABLE OF ztb_scnblog2.
* Estructuras
DATA: ls_contact TYPE ztb_scnblog2,
ls_response TYPE local_type_response.
* Variables
DATA: l_rc TYPE i,
l_json TYPE string.
* Variables
DATA: l_verb TYPE string,
l_path_info TYPE string,
l_resource TYPE string,
l_param_1 TYPE string,
l_param_2 TYPE string.
…..
*Creamos el Contacto
CALL METHOD lo_contact->create
EXPORTING
i_s_contact = ls_contact
IMPORTING
e_rc = l_rc.
IF l_rc IS INITIAL.
ls_response-success = ‘true’.
ls_response-msg = ‘User created successfully!’.
ELSE.
ls_response-success = ‘false’.
ls_response-msg = lo_contact->get_message( ).
ENDIF.
* Retornamos los datos recibidos del formulario de regreso al cliente
APPEND ls_contact TO ls_response-data.
……
ENDCASE.
CREATE OBJECT lo_json_serializer
EXPORTING
DATA = ls_response. ” Data to be serialized
*Creamos al contacto
CALL METHOD lo_contact->create
EXPORTING
i_s_contact = ls_contact
IMPORTING
e_rc = l_rc.
IF l_rc IS INITIAL.
ls_response-success = ‘true’.
ls_response-msg = ‘User created successfully!’.
ELSE.
ls_response-success = ‘false’.
ls_response-msg = lo_contact->get_message( ).
ENDIF.
ENDCASE.
CREATE OBJECT lo_json_serializer
EXPORTING
DATA = ls_response. ” Data to be serialized
Haga clic en el botón Enviar para probar el servicio. El servicio debe devolver
una respuesta JSON con el mensaje " Contact created successfully!”
Vamos a comprobar la tabla de base de datos utilizando la SE16.
Si se pulsa el botón enviar de nuevo sin cambiar los datos del formulario que
el servicio debería devolver un mensaje que informa de que el contacto ya
existe.
* Actualizando contacto
CALL METHOD lo_contact->update
EXPORTING
i_s_contact = ls_contact
IMPORTING
e_rc = l_rc.
IF l_rc IS INITIAL.
ls_response-success = ‘true’.
ls_response-msg = ‘Contact updated successfully!’.
ELSE.
ls_response-success = ‘false’.
ls_response-msg = lo_contact->get_message( ).
ENDIF.
* Eliminamos el contacto
CALL METHOD lo_contact->delete
EXPORTING
i_s_contact = ls_contact
IMPORTING
e_rc = l_rc.
IF l_rc IS INITIAL.
ls_response-success = ‘true’.
ls_response-msg = ‘Contact deleted successfully!’.
ELSE.
ls_response-success = ‘false’.
ls_response-msg = lo_contact->get_message( ).
ENDIF.
Ingresar a Eclipse (para este tutorial se trabajó con Eclipse Neo para
Java EE)
Ir al menú “Help” y elegir la opción “Install new Software”.
Pegar una de las siguientes direcciones URL en el campo de entrada
“Work With”, para obtener una lista de opciones de descargar
disponibles. Puedes encontrar una lista de todas las URL del sitio de
actualización en el siguiente click aquí:
new sap.ui.commons.Button({
text: “Read (All)”,
press: function() {
oController.Read();
}
}),
new sap.ui.commons.Button({
text: “Update”,
press: function() {
oController.Update();
}
}),
new sap.ui.commons.Button({
text: “Delete”,
press: function() {
oController.Delete();
}
}),
new sap.ui.commons.Button({
text: “Find”,
press: function() {
oController.Find();
}
})]
})
});
// Columna E-mail
oTable.addColumn(new sap.ui.table.Column({
label: new sap.ui.commons.Label({text: “Email”}),
template: new sap.ui.commons.Label()
.bindProperty(“text”, “email”),
sortProperty: “email”,
filterProperty: “email”,
width: “50%”
}));
/**
* Called when the Controller is destroyed. Use this one to free resources
and finalize activities.
*/
// onExit: function() {
// }
Create: function() {
},
Read : function() {
},
Update : function() {
},
Delete : function() {
},
Find : function() {
}
});
7.6.1. Create
A continuación se muestra el código que tenemos que implementar
para manejar el método de crear.
// Crreando un dialog para ingresar la información del contacto a crear
var oDialog = new sap.ui.commons.Dialog(“Dialog”, {
modal: true,
closed: function(oControlEvent){
sap.ui.getCore().getElementById(‘Dialog’).destroy();
}
});
oDialog.setTitle(“New Contact”);
function handleSuccess(oData){
if(oData.success===’true’){
// Cerra el Dialog
sap.ui.getCore().getElementById(‘Dialog’).close();
// Mostrar mensaje
sap.ui.commons.MessageBox.alert(oData.msg);
function handleError(){
// Mostrar mensaje
sap.ui.commons.MessageBox.alert(arguments[0].statusText);
}
}}));
oDialog.open();
},
function handleSuccess(oData){
if(oData.success===’false’){
// Mostrar mensaje
sap.ui.commons.MessageBox.alert(oData.msg);
}
function handleError(){
// Mostrar mensaje
sap.ui.commons.MessageBox.alert(arguments[0].statusText
);
}
if(i>=0){
}else{
// Si el usuario no selección ninguna fila
sap.ui.commons.MessageBox.alert(‘No record selected’);
}
function handleSuccess(oData){
// Mostrar mensaje
sap.ui.commons.MessageBox.alert(oData.msg);
}
function handleError(){
// Mostrar mensaje
sap.ui.commons.MessageBox.alert(arguments[0].statusText);
}
}else{
// usuario no selecciono ninguna fila
sap.ui.commons.MessageBox.alert(‘No record selected’);
}
function handleSuccess(oData){
if(oData.success===’true’){
if(jQuery.isArray(oData2.data)){
// Mostrar mensaje
sap.ui.commons.MessageBox.alert(oData.msg);
}
function handleError(){
// Mostrar mensaje
sap.ui.commons.MessageBox.alert(arguments[0].statusText);
}
oDialog.setTitle(“Find Contact”);
// Enviamos la peticion
oModel.loadDataNew(ServiceURL, handleSuccess, handleError,
oParameters);
function handleSuccess(oData){
if(oData.success===’false’){
// Mostrar mensaje
sap.ui.commons.MessageBox.alert(oData.msg);
}else{
// Mostrar mensaje
sap.ui.getCore().getElementById(‘Dialog’).close();
}
function handleError(){
// Mostrar mensaje
sap.ui.commons.MessageBox.alert(arguments[0].statusText);
}
}}));
oDialog.open();
192.168.1.15 vmsapides.axelera.com.pe
http://vmsapides.axelera.com.pe:8000/sap/bc/bsp/sap/zscnblog2/index.htm