I have a SAP HANA Express Server with XSA, I create a MTA Application with a DB and NodeJS modules, in the NodeJS module I create a .xsodata connected to the DB module.
XSOdata definition:
service {
//Definición de servicios
"SISGASTOS"."CATEGORIA" as "Categoria"
create events ( before "movilidad.rindegastos:Informe.xsjslib::crear_categoria");
"SISGASTOS"."ESTADO" as "Estado"
create events ( before "movilidad.rindegastos:Informe.xsjslib::crear_estado");
"SISGASTOS"."PROYECTO" as "Proyecto"
create events ( before "movilidad.rindegastos:Informe.xsjslib::crear_proyecto");
"SISGASTOS"."TIPO_DOCUMENTO" as "TipoDoc"
create events ( before "movilidad.rindegastos:Informe.xsjslib::crear_tipo_documento");
"SISGASTOS"."INFORME" as "Informe"
navigates ("Informe_Comentario" as "Comentarios", "Informe_Proyecto" as "Proyecto", "Informe_Estado" as "Estado","Informe_Gasto" as "Gastos", "Informe_Hist" as "Info_Historial")
create events ( before "movilidad.rindegastos:Informe.xsjslib::crear_informe");
"SISGASTOS"."HIST_INFORME" as "Hist_Informe"
navigates ("Hist_Informe_Estado" as "Estado")
create events ( before "movilidad.rindegastos:Informe.xsjslib::crear_hist_informe");
"SISGASTOS"."COMENTARIO_INFORME" as "ComentarioInforme";
// create events ( before "movilidad.rindegastos:Informe.xsjslib::crear_comentario_informe");
"SISGASTOS"."GASTO" as "Gasto"
navigates ("Gasto_Categoria" as "Categoria", "Gasto_TipoDoc" as "TipoDoc", "Gasto_Estado" as "Estado", "Gasto_Comentario" as "Comentarios", "Gasto_Anexo" as "Anexos", "Gasto_Hist" as "Gasto_Historial")
create events ( before "movilidad.rindegastos:Informe.xsjslib::crear_gasto");
"SISGASTOS"."HIST_GASTO" as "Hist_Gasto"
navigates ("Hist_Gasto_Estado" as "Estado")
create events ( before "movilidad.rindegastos:Informe.xsjslib::crear_hist_gasto");
"SISGASTOS"."COMENTARIO" as "Comentario"
create events ( before "movilidad.rindegastos:Informe.xsjslib::crear_comentario");
"SISGASTOS"."ANEXO" as "Anexo"
create events ( before "movilidad.rindegastos:Informe.xsjslib::crear_anexo");
//Asociacion Historiales
association "Hist_Gasto_Estado"
principal "Hist_Gasto"("ID_ESTADO") multiplicity "1"
dependent "Estado"("ID_ESTADO") multiplicity "1";
association "Hist_Informe_Estado"
principal "Hist_Informe"("ID_ESTADO") multiplicity "1"
dependent "Estado"("ID_ESTADO") multiplicity "1";
//Asociacion Informe
association "Informe_Comentario"
principal "Informe"("ID_INFORME") multiplicity "1"
dependent "ComentarioInforme"("ID_INFORME") multiplicity "*";
association "Informe_Proyecto"
principal "Informe"("ID_PROYECTO") multiplicity "1"
dependent "Proyecto"("ID_PROYECTO") multiplicity "1";
association "Informe_Estado"
principal "Informe"("ID_ESTADO") multiplicity "1"
dependent "Estado"("ID_ESTADO") multiplicity "1";
association "Informe_Gasto"
principal "Informe"("ID_INFORME") multiplicity "1"
dependent "Gasto"("ID_INFORME") multiplicity "*";
association "Informe_Hist"
principal "Informe"("ID_INFORME") multiplicity "1"
dependent "Hist_Informe"("ID_INFORME") multiplicity "*";
//Asociación Gasto
association "Gasto_Categoria"
principal "Gasto"("ID_CATEGORIA") multiplicity "1"
dependent "Categoria"("ID_CATEGORIA") multiplicity "1";
association "Gasto_TipoDoc"
principal "Gasto"("ID_TIPO_DOCUMENTO") multiplicity "1"
dependent "TipoDoc"("ID_TIPO_DOCUMENTO") multiplicity "1";
association "Gasto_Estado"
principal "Gasto"("ID_ESTADO") multiplicity "1"
dependent "Estado"("ID_ESTADO") multiplicity "1";
association "Gasto_Comentario"
principal "Gasto"("ID_GASTO") multiplicity "1"
dependent "Comentario"("ID_GASTO") multiplicity "*";
association "Gasto_Anexo"
principal "Gasto"("ID_GASTO") multiplicity "1"
dependent "Anexo"("ID_GASTO") multiplicity "*";
association "Gasto_Hist"
principal "Gasto"("ID_GASTO") multiplicity "1"
dependent "Hist_Gasto"("ID_GASTO") multiplicity "*";
}
We call the service from a SAPUI5 application using an update operation.
submitChanges: function() {
this.getView().getModel("oModelDialogo").setProperty("/busy", true);
this.getView().getModel().submitChanges({
success: function(oResult) {
this.getView().getModel("oModelDialogo").setProperty("/busy", false);
console.log(oResult);
}.bind(this),
error: function(oError) {
this.getView().getModel("oModelDialogo").setProperty("/busy", false);
console.log(oError);
}.bind(this)
});
},
But the response is Not Implemented 501:
--batch_1523471867867_0
Content-Type: application/http
Content-Transfer-Encoding: binary
HTTP/1.1 501 Not Implemented
Content-Type: application/json;charset=utf-8
{"error":{"code":501,"message":{"lang":"en-US","value":"Not implemented"}}}
The read, create and delete operations works fine, only the update operation have problems.
Edit:
As 0x17 recomend I change the defaultUpdateMethod in manifest file as follow:
"models": {
"i18n": {
"type": "sap.ui.model.resource.ResourceModel",
"settings": {
"bundleName": "Adjuntos.i18n.i18n"
}
},
"": {
"dataSource": "mainService",
"preload": true,
"settings": {
"defaultBindingMode": "TwoWay",
"defaultUpdateMethod": "sap.ui.model.odata.UpdateMethod.Put"
}
}
},
With that the update request works! Thanks.
Could you pl. check the complete request headers that were sent during the update operation? I guess this could happen if the request method is set to MERGE
I'm assuming you are making use of OData V2 Model in the ui5 app. However, in the HANA xsa version of (based out of Cloudfoundry) OData V2 API, MERGE is not supported by default.
Can you just set the defaultUpdateMethod to PUT (in manifest.json) and try again ? You can also change the same in the controller code like so
The OData v2 APIs in SCP Neo vs SAP XSA (based on cloudfoundry) have subtle differences. The latter is not as robust as the former when it comes to V2 APIs but it is slowly tilting towards the use of OData V4 APIs (which is good)