Skip to Content

To write the first blog took me some time though there are few topics in my mind which I think I should blog. To write a blog with the right contents and presenting in a way which is very helpful for others is a challenge and hats off to al the bloggers for their efforts. I have been a constant follower of scn blogs and many such blogs has helped me a lot. So this is my first humble attempt to share something which I feel would help anyone who come across similar issue.

The topic is about packed number. Recently I came across an issue with one of our customers where they having issues storing large amount value to a packed decimal field. It was throwing overflow exception . To solve this issue I tried searching to get to know how packed decimals behave I couldn’t get enough details anywhere about the exact behavior of packed decimals and i had spend some time to write a test program to understand the right behavior of packed decimals.

Customer was having  a custom domain of data type dec length  16 and decimal 9 .Based on the various documentations on packed number our assumption was that we have created a packed number with maximum length possible which is length 16 .

image - Copy.jpg

The amount value we were trying to store is 100000000.00. 9 digits before the decimal and 2 digits after the decimal .We were getting an overflow exception .I could see from the amount value if i reduce the number of digits before the decimal by one the overflow exception doesn’t happen ( 8 digits before the decimal and 9 digits after the decimal ) . This made me wonder what’s the length all about and how it works in case of packed decimal . I spend some time debugging the issue.

Below is how it appeared in the debugger .

/wp-content/uploads/2016/05/debugger1_964589.jpg

What I understand is  though I have declared my domain is of length 16 and dec 9 ,internally system converts into a packed decimal of length 9 and

dec 9 .P(9) DECIMAL 9.Now I had to understand what’s this length stands for ,what does it mean by length 9  in case of packed decimal.

Predefined Numeric Types is explained here ABAP Keyword Documentation

Based on  definitions about packed decimal length 9 means 9 bytes and  2 digits forms 1 byte and so the actual length is 18 digits which includes one space for +/- sign. So in this case a domain  declared with the  length 16 and decimal 9 is converted by the system as a packed decimal of length 9 and decimal 9 which means a total of 18 digits including 9 decimal and 8 digits before the decimal and one space for the sign . Now I understood the reason why the amount 100000000.00 was not accepted by the variable ,instead 10000000.00 was accepted .

Overview of All Predefined Dictionary Types is explained here ABAP Keyword Documentation

Below is the test program to understand more about packed decimals.

REPORT ZTEST_PROGRAM

*Data Declarations

data lv_char(50) value ‘9.999999999’.

data: lv_p TYPE p LENGTH 16 DECIMALS 9.

data: lv_num type i value 1.

data: lv_dec type i value 9.




write:/ ‘Keeping Decimal place constant as 9’.


DO 25 TIMES.

lv_num = lv_num + 1.

CONCATENATE ‘9’ lv_char  into lv_char.

TRY .

  lv_p  = lv_char.

CATCH CX_SY_CONVERSION_OVERFLOW .

write:/’overflow’.

  ENDTRY.

CHECK lv_p is NOT INITIAL.

  write:/ lv_p, lv_num ,’Numbers and’, lv_dec,’ Decimals’.

ENDDO.

uline.



write:/ ‘Keeping Decimal place constant as 9 in the situation’.

CLEAR: lv_num,lv_dec,lv_p,lv_char.

lv_char = ‘9.999999999’.

lv_num = 1. lv_dec = 9.


DO 10 TIMES.

  lv_num = lv_num + 1.

CONCATENATE ‘9’ lv_char  into lv_char.

TRY .

  lv_p2  = lv_char.

CATCH CX_SY_CONVERSION_OVERFLOW .

  write:/’overflow’.

ENDTRY.

CHECK lv_p2 is NOT INITIAL.

  write:/ lv_p2, lv_num ,’Numbers and’, lv_dec,’ Decimals’.

ENDDO.

uline.


write:/ ‘Keeping Decimal place constant as 3’.

CLEAR: lv_num,lv_dec,lv_p,lv_char.

data: lv_p1 TYPE p LENGTH 9 DECIMALS 3.

lv_char = ‘9.999’.

lv_num = 1.

lv_dec = 3.

DO 20 TIMES. lv_num = lv_num + 1.

CONCATENATE ‘9’ lv_char  into lv_char.

TRY .

   lv_p1  = lv_char.

CATCH CX_SY_CONVERSION_OVERFLOW .

  write:/’overflow’.

ENDTRY.

  CHECK lv_p1 is NOT INITIAL.

  write:/ lv_p1, lv_num ,’Numbers and’, lv_dec,’ Decimals’.

ENDDO.



If we have to keep the length fixed for the  domain( declared length 16 decimal 9 ) , reduce the decimal points to hold more digits before the decimal .Below is a screenshot to show when the overflow will occur for the used domain reducing the decimal is reduced to 3 digits. Below is the output from the above code . This shows 14 Numbers are possible before decimal and 3 numbers after decimal.


/wp-content/uploads/2016/05/decimal_964591.png


So what we have to understand is the length defined in the domain is not the actual length of the packed decimal. if I declare a domain of length 20 and decimal 9 ,in debugger I could see the system converts it to a packed decimal of length 11 and decimal 9.The maximum allowed length of packed decimal is 16 which is 16 bytes .


So to understand maximum value possible, I have increased the local packed decimal variable to 16 and was able to see maximum number possible keeping decimals as 9 was huge number – in the help documentation – a formula is provided as well. For easy understanding below screen shot is given.

packed decimal max.png


So above code also support my understanding of 16*2 =  32 numbers possible in which 1 will be taken by +/- sign – which will be 22+9 = 31.


Hope this blog was useful.


You can also read more about predefined numeric type in in help.sap.com


To report this post you need to login first.

6 Comments

You must be Logged on to comment or reply to a post.

  1. Matthew Billingham

    What I like about this blog is that it is

    a) From a personal view point and

    b) Explains the process that was gone through to figure things out

    Well done.

    (0) 
  2. Suhas Saha

    Based on  definitions about packed decimal length 9 means 9 bytes and  2 digits forms 1 byte and so the actual length is 18 digits which includes one space for +/- sign.

    May be you should add the ABAP documentation to your post – Predefined Numeric Types – ABAP Keyword Documentation

    What I understand is  though I have declared my domain is of length 16 and dec 9 ,internally system converts into a packed decimal of length 9 and dec 9 .P(9) DECIMAL 9.

    Explained here – Overview of All Predefined Dictionary Types – ABAP Keyword Documentation

    (0) 
  3. Amit R M

    Good work, Neeta! The blog post solves a problem, is illustrated with screenshots and has the detailed code to help consultants.

    (0) 
  4. Kiran K

    Neeta,Thanks.

    Now, we have one blog with person exp which we can refer to when we need.

    But,did you find any explaination on what basis SAP considers the packed decimals

    In the below example :-

    For lv_p1 it considered P(9) Decimals 2.

    For lv_p2 it considered P(7) Decimals 2.

    *data type CURR Length 16 Decimal Places 2 Output length 21
    DATA:lv_p1 TYPE zfincr_usd_amt  VALUE '123456789123456.91'.
    *data type CURR Length 13 Decimal Places 2 Output length 16
    DATA:lv_p2 TYPE wrbtr VALUE '12345678912.12'.
    IF sy-subrc = 0.
    ENDIF.

    My understanding is 

    data type CURR, Length 16, Decimal Places 2, Output length 21.

    Can hold a max of 16 characters (including dot with 2 values after that, for saving in Database)

    Output length 21 is to accomodate the comma separators and +/- at the level of table display.

    P(9) Decimals 2 – indicates 9 bytes ie 18 characters.

    data type CURR Length 13 Decimal Places 2 Output length 16.

    Can hold a max of 13 characters (including dot with 2 values after that, for saving in Database)

    Output length 16 is to accomodate the comma separators  and +/- the level of table display.

    P(7) Decimals 2 – indicates 7 bytes ie 14 characters.

    Thanks,

    K.Kiran.

    (0) 

Leave a Reply