cancel
Showing results for 
Search instead for 
Did you mean: 

binding type with decimal

Former Member
0 Kudos

Hi Guru's,

I am having issues with validating input fields, hopefully someone can explain to me what is going wrong because clearly I am doing something wrong .

I have table in the Hana database which allows to enter materials, some of the fields contain weights and these must be entered in whole or decimal values with a maximum of two decimals. so in my hdbdd file I have an entry like this: "NET_DECL_WEIGHT: numbericDecimal;". This numbericDecimal type is defined as an decimal (type numbericDecimal: Decimal(8,2);).

So enough about the table definition, in my controller file I attached the validation handlers as follows:

      // Attaching validation handlers

      sap.ui.getCore().attachValidationError(function (oEvent) {

        oEvent.getParameter("element").setValueState("Error");

        alert("attachValidationError");

      });

      sap.ui.getCore().attachValidationSuccess(function(oEvent){

        oEvent.getParameter("element").setValueState("None");

        alert("attachValidationSuccess");

      });

      sap.ui.getCore().attachFormatError(function(oEvent){

        oEvent.getParameter("element").setValueState("Error");

        alert("attachFormatError");

      });

      sap.ui.getCore().attachParseError(function(oEvent){

        oEvent.getParameter("element").setValueState("Error");

        alert("attachParseError");       

      });

And in my XML view I created an input field as follows:

        <Input value="{

          path: 'NET_DECL_WEIGHT',

          type:'sap.ui.model.odata.type.Decimal',

          formatOptions: {

            minIntegerDigits: 1,

            minFractionDigits: 2,

            maxFractionDigits: 2,

            decimals: 2,

            decimalSeparator: '.',

            roundingMode: 'HALF_CEILING',

            groupingEnabled: false

          }

        }" textAlign="Right" placeholder="{i18n>assignmentPlaceholderWeight}" description="{i18n>assignmentMaterialWeightDesc}" />

The problem is however that the "attachValidationError" event is raised as soon as I type an decimal value in the input field. A comma is seen as a separator and a dot as a decimal. so when I type "1234,5678" then the "attachValidationSuccess" event is raised and the data is converted into "12345678.00". But when I type "1234.5678" the "attachValidationError" event is raised.

Previously I tried the type "sap.ui.model.type.Float" and that one works fine, however, I couldn't save the data back into the database which is caused (I assume) by the fact that the datafield in Hana is a Decimal and I Could not find a way to define it as a Float value.

I don't know if you need any more information, if so please let me know. I am still quiet new with these binding techniques but love to learn how to do this in a correct way since in the past I wrote seperate "onChange" functions for this which I like to avoid if possible.

Kind Regards,

Nico

Accepted Solutions (1)

Accepted Solutions (1)

Former Member
0 Kudos

Hi,

Please take a look on this on how to use the Odata Types : OData Types - User Interface Add-On for SAP NetWeaver - SAP Library

Might be adding constraints solves your problem.

Thanks

Viplove

Former Member
0 Kudos

Thanks for your reply but it would sounds strange that adding constraints would remove my validation errors? Anyway I gave it a quick try by changing the xmlview to:

value="{ path: 'NET_DECL_WEIGHT', type: 'sap.ui.model.odata.type.Decimal', constraints: {maximum: 3000} }"

but even when I add more then 3000 it still validates successfully while typing 21.21 immediately validates with an error...

Former Member
0 Kudos

Hi Viplove,

I continued to struggle and found out that under the constraints area in the API guide SAP mentions the following:

{int|string}oConstraints.precision?, Default: Infinitythe maximum number of digits allowed in the property’s value
{int|string}oConstraints.scale?the maximum number of digits allowed to the right of the decimal point; the number must be less than precision (if given). As a special case, "variable" is supported.

The number of digits to the right of the decimal point may vary from zero to scale, and the number of digits to the left of the decimal point may vary from one to precision minus scale.

The number is always displayed with exactly scale digits to the right of the decimal point (unless scale is "variable").

Although the question marks (as far as I know) mean that they are optional I did find the message saying that the scale should be less  then the precision interesting since the precision has a default value while the scale does not.

So I tried to add the scale constraint to e.g. 50 (since the formatting already takes care of reducing the amount of decimals) and all of a sudden it works :-). So thanks for your answer because although it didn't immediately solve my issue it put me in the right direction..I still wonder though if this isn't simply a bug because I still do not understand why I should use a scale constraint if I don't even want one.

Kind Regards,

Nico van der Linden

Answers (2)

Answers (2)

Former Member
0 Kudos

Ok I think my original question was not entirely clear, so let me try to rephrase it.

I have a database field which is of type edm.Decimal(8,2), I don't see an option to use Float on Hana so therefore this Decimal type was used.

In sapui5 I use binding to my form, for the decimal fields I want to format them and only allow the correct decimal input. When I only use  <Input value="{ path: 'NET_DECL_WEIGHT' }" /> for the decimal field then it goes fine but it does not save the decimal value. I tried using "type: 'sap.ui.model.type.Float'" then I can use the formatters but as soon as I save the data I get the error:

The serialized resource has an invalid value in member 'NET_DECL_WEIGHT'."

This error is caused (I assume) due to the fact that edm.decimal is not compatible with the sap.ui.model.type.Float type. So I looked around and found that you could use the sap.ui.model.odata.type.Decimal type. But when I use that I get the following issue:

- typing decimals in this input field (e.g. 2.1212) will always generate a validation error (although strangely enough 2.00 works fine...)

So my question is how can I use a decimal input field with validation on the binding and save it back into the database as as edm.Decimal type..

junwu
Active Contributor
0 Kudos

What's issue? what u want to achieve?

Former Member
0 Kudos

Hi Jun Wu,

I want these fields to check that only numeric values are added and when more then 2 decimals are entered it should round the second decimal up or down. I don't know how sapui5 handles locales because the app will be used in different countries of which some use 'comma's' and some use 'dots' as a decimal notation.

But my main issue at the moment is that an error in the validation is raised as soon as I enter a decimal value which I don't understand since the type is an odata Decimal type?

actually, what I noticed is that I can write any number ending on .00 and is gives a 'success' message e.g. 1234.00 validates successfull. But when I increase the decimal e.g. to 1234.01 then it gives an validation error... And I have no idea why?