I'm developing a bespoke Fiori app which is consuming an OData service on ECC via HCI OData provisioning. I am already calling function imports successfully but when I try to call a function import with an amount parameter (set to 3 decimal places) I get the following message:
String index out of range: 0
I am passing the amount as a JavaScript number type:
incrementTotal: function(path) {
var dataModel = this.getModel("data");
if (dataModel) {
var item = dataModel.getProperty(path);
}
if (item) {
var amount = parseFloat(item.newCount).toFixed(this.INTERNAL_DECIMAL_PLACES);
this.callIncrementTotal(item.DocNo, item.FiscalYear,item.ItemNo, amount, item.Unit);
}
},
callIncrementTotal: function(docNo, fiscalYear, itemNo, amount, unit) {
var oComponentController = this;
var urlParams = { I_DOC_NO: docNo,
I_YEAR: fiscalYear,
I_ITEM_NO: itemNo,
I_AMT: amount,
I_UNIT: unit };
this.getModel().callFunction( "/IncrementTotal",
{ urlParameters: urlParams,
async: true,
success: function(oData) {
},
error: function(oResult) {
}
});
},
You can see that the screen fields are mapped to a JSON model. My function import parameters look like this:
Now, if I change the I_AMT parameter from a Double to an Int32, and set the JavaScript value to zero-decimals it works fine. However, I need 2 decimal places for this field. Of course I could multiply the value by 100 before the call but I don't want to have to do that. I like to do things properly.
I have tried lots of combinations of Double, Decimal and Float types (always clearing the HCI metadata cache in between) and none seem to work. As soon as I switch it back to Int32 it works.
I have already tested this function import on the gateway client (on ECC with service maintained there) and it worked.
I have very tight timescales so if anyone can help I would be very grateful.
Here is the complete error from HCI
Service Details
Backend HTTP Status
500
Backend System
DEV
Backend HTTP Status
500
Backend System
DEV
Service Name
Z_INV_SRV
Service Namespace
SAP
Service Version
1
Log Entry
Transaction ID
c0827039-7112-4952-988f-223f4abf88f8
Log Level
ERROR
Text
String index out of range: 0
Long Text
Request URL: https://gwaas-c0ad1b2ff.ap1.hana.ondemand.com/odata/SAP/Z_INV_SRV/$batch
Time Stamp
31 May 2016, 14:48:51
Error Category
Language
en
java.lang.StringIndexOutOfBoundsException: String index out of range: 0
at java.lang.String.charAt(String.java:711)
at com.sap.gateway.core.bep.xml.AbapType.getType(AbapType.java:77)
at com.sap.gateway.core.bep.o4sap.Utils.getKeyConverter(Utils.java:19)
at com.sap.gateway.core.bep.request.RequestInfo.addParameterToMaps(RequestInfo.java:750)
at com.sap.gateway.core.bep.request.RequestInfo.setFunctionImport(RequestInfo.java:727)
at com.sap.gateway.core.bep.request.RequestInfo.initialize(RequestInfo.java:488)
at com.sap.gateway.core.bep.request.RequestInfo.<init>(RequestInfo.java:153)
at com.sap.gateway.core.bep.dp.DataProvider.createRequestInfo(DataProvider.java:452)
at com.sap.gateway.core.bep.dp.DataProvider.getExecuteFunctionImportRequestInfo(DataProvider.java:787)
at com.sap.gateway.core.bep.dp.DataProvider.createBatchInfos(DataProvider.java:687)
at com.sap.gateway.core.bep.dp.DataProvider.executeBatch(DataProvider.java:604)
at com.sap.gateway.core.api.provider.data.GenericODataProcessor.executeBatch(GenericODataProcessor.java:1922)
at org.apache.olingo.odata2.core.Dispatcher.dispatch(Dispatcher.java:190)
at org.apache.olingo.odata2.core.ODataRequestHandler.handle(ODataRequestHandler.java:130)
at org.apache.olingo.odata2.core.rest.ODataSubLocator.handle(ODataSubLocator.java:164)
at org.apache.olingo.odata2.core.rest.ODataSubLocator.handlePost(ODataSubLocator.java:86)
at sun.reflect.GeneratedMethodAccessor300.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.cxf.service.invoker.AbstractInvoker.performInvocation(AbstractInvoker.java:180)
at org.apache.cxf.service.invoker.AbstractInvoker.invoke(AbstractInvoker.java:96)
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:198)
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:261)
at org.apache.cxf.jaxrs.JAXRSInvoker.invoke(JAXRSInvoker.java:100)
at org.apache.cxf.interceptor.ServiceInvokerInterceptor$1.run(ServiceInvokerInterceptor.java:58)
at org.apache.cxf.interceptor.ServiceInvokerInterceptor.handleMessage(ServiceInvokerInterceptor.java:94)
at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:271)
at org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:121)
at org.apache.cxf.transport.http.AbstractHTTPDestination.invoke(AbstractHTTPDestination.java:239)
at org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:223)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:203)
at org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:137)
at org.apache.cxf.transport.servlet.CXFNonSpringServlet.invoke(CXFNonSpringServlet.java:158)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:243)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.doPost(AbstractHTTPServlet.java:163)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:755)
at org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:219)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.sap.gateway.core.service.servlet.OpenSearchFilter.doFilter(OpenSearchFilter.java:42)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.sap.core.communication.server.CertValidatorFilter.doFilter(CertValidatorFilter.java:151)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.sap.core.js.csrf.RestCsrfPreventionFilter.doFilter(RestCsrfPreventionFilter.java:95)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at com.sap.gateway.core.service.filter.ProxyFilter.doFilter(ProxyFilter.java:48)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.eclipse.virgo.web.enterprise.security.valve.OpenEjbSecurityInitializationValve.invoke(OpenEjbSecurityInitializationValve.java:44)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614)
at com.sap.core.jpaas.security.auth.service.lib.AbstractAuthenticator.invoke(AbstractAuthenticator.java:168)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
at com.sap.core.tenant.valve.TenantValidationValve.invokeNextValve(TenantValidationValve.java:168)
at com.sap.core.tenant.valve.TenantValidationValve.invoke(TenantValidationValve.java:94)
at com.sap.js.statistics.tomcat.valve.RequestTracingValve.invoke(RequestTracingValve.java:38)
at com.sap.core.js.monitoring.tomcat.valve.RequestTracingValve.invoke(RequestTracingValve.java:27)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:812)