Application Development Discussions
Join the discussions or start your own on all things application development, including tools and APIs, programming models, and keeping your skills sharp.
cancel
Showing results for 
Search instead for 
Did you mean: 

Material Number Formatting "Embed Dash after every 5 character"

Former Member
0 Kudos

Hey Specialists,

I have a requirement where I need to format the material number display.

For Eg. If Material Number is ABC DE TREYURTYU 1234 it should be displayed as ABCDE-TREYU-RTYU1-234 i.e. embedded dashes after every 5 characters.

Any help would be highly appreciated.

Thanks,

Abhinav.

1 ACCEPTED SOLUTION

Former Member
0 Kudos

data: lv_var type char21.

data: lv_matnr type matnr VALUE 'ABCDETREYURTYU1234'.

data: len type i.

len = strlen( lv_matnr ).

if len > 15.

CONCATENATE lv_matnr0(5) '-' lv_matnr5(5) '-' lv_matnr10(5) '-' lv_matnr15(3) into lv_var.

elseif len > 10.

CONCATENATE lv_matnr0(5) '-' lv_matnr5(5) '-' lv_matnr+10(5) into lv_var.

elseif len > 5.

CONCATENATE lv_matnr0(5) '-' lv_matnr5(5) into lv_var.

else.

lv_var = lv_matnr.

endif.

write: / lv_matnr.

write: / lv_var.

-


If your material has spaces in between and

1. you want to consider spaces while putting dash, use respecting blanks in concatenate.

2. you don't wish to consider spaces, use condense lv_matnr no-gaps before using strlen.

BR,

Diwakar

Edited by: Diwakar Aggarwal on Aug 11, 2011 4:01 PM

9 REPLIES 9

Former Member
0 Kudos

data: lv_var type char21.

data: lv_matnr type matnr VALUE 'ABCDETREYURTYU1234'.

data: len type i.

len = strlen( lv_matnr ).

if len > 15.

CONCATENATE lv_matnr0(5) '-' lv_matnr5(5) '-' lv_matnr10(5) '-' lv_matnr15(3) into lv_var.

elseif len > 10.

CONCATENATE lv_matnr0(5) '-' lv_matnr5(5) '-' lv_matnr+10(5) into lv_var.

elseif len > 5.

CONCATENATE lv_matnr0(5) '-' lv_matnr5(5) into lv_var.

else.

lv_var = lv_matnr.

endif.

write: / lv_matnr.

write: / lv_var.

-


If your material has spaces in between and

1. you want to consider spaces while putting dash, use respecting blanks in concatenate.

2. you don't wish to consider spaces, use condense lv_matnr no-gaps before using strlen.

BR,

Diwakar

Edited by: Diwakar Aggarwal on Aug 11, 2011 4:01 PM

0 Kudos

I already used this logic buddy but it gave a short dump saying " Illegal access to a string (offset+length too large)".

My Material Number is based on user Entry and the length of Material number can vary ....

Thanks,

Abhinav.

0 Kudos

Abhinav,

If I change material to anything which means on user-choice, then also same logic works for me.

-


data: lv_var type char21.

data: len type i.

PARAMETERS: lv_matnr type matnr DEFAULT 'ABCDETYURTYU1234'.

len = strlen( lv_matnr ).

if len > 15.

CONCATENATE lv_matnr0(5) '-' lv_matnr5(5) '-' lv_matnr10(5) '-' lv_matnr15(3) into lv_var.

elseif len > 10.

CONCATENATE lv_matnr0(5) '-' lv_matnr5(5) '-' lv_matnr+10(5) into lv_var.

elseif len > 5.

CONCATENATE lv_matnr0(5) '-' lv_matnr5(5) into lv_var.

else.

lv_var = lv_matnr.

endif.

write: / lv_matnr.

write: / lv_var.

-


How are you getting the dump ? Which material value you are entering which is not working ?

Just read my comment on the 'space consideration' in my earlier post and work accordingly but anyways it should work.

BR,

Diwakar

Former Member
0 Kudos

Hi amahul,

Do like below:

DATA val1 TYPE text VALUE 'ABCDETREYURTYU1234'.
DATA val2 type text.
DATA itab TYPE TABLE OF string WITH HEADER LINE.


DO.
val2 = val1+0(4).
APPEND val2 to itab.
SHIFT val1 LEFT DELETING LEADING val2.
IF val1 IS INITIAL.
exit.
ENDIF.
ENDDO.

LOOP AT itab.
WRITE  / itab.
ENDLOOP.

BR

Dep

0 Kudos

Hi,

Change this to the logic given by BR

val2 = val10(4). to val2 = val10(5).

Inside Loop ITAB.

CONCATENATE '-' ITAB into ITAB.

Thanks,

Anitha A

Edited by: Anitha A on Aug 11, 2011 4:49 AM

0 Kudos

Hi amahul,

check below code, I have made few changes, do check :

DATA val1 TYPE text VALUE 'ABCDETREYURTYU1234'.
DATA val2 type text.
DATA val3 type text.
DATA itab TYPE TABLE OF string WITH HEADER LINE.
DATA len TYPE i.
 
 
DO.
val2 = val1+0(5).
len = strlen( val2 ).
IF len = 5.
CONCATENATE val2 '-' INTO val2. " Include dash
ENDIF.
APPEND val2 to itab.
SHIFT val1 LEFT DELETING LEADING val2.
IF val1 IS INITIAL.
exit.
ENDIF.
ENDDO.

BR

Dep

0 Kudos

Hi Anitha,

Thank you for your reply I tried your code (LOOP part) it was printing reverse way and still the values should to be printed in single line I guess.

BR

Dep

Former Member
0 Kudos

It was my mistake I was using String instead of Char. For String it gives me dump , for char it works fine.

Full Points to Diwakar.

Thanks,

Abhinav.

Former Member
0 Kudos

Hi Abhinav,

Below code will surely work. I have tested at my end.

Report ZDEP.

DATA val1 TYPE string VALUE 'ABC DE TREYURTYU 1234'.
*DATA val1(100) TYPE c VALUE 'ABC DE TREYURTYU 1234'.
DATA off TYPE i.
DATA rep TYPE c.
DATA new TYPE string.
DATA count TYPE i.
DATA len TYPE i.
DATA ext TYPE string VALUE '-'.

CONDENSE val1 NO-GAPS.
len = strlen( val1 ).

DO .
IF count eq 0.
off = 4.
ENDIF.
rep = val1+off(1).
CONCATENATE rep '-' INTO new.
REPLACE SECTION OFFSET off LENGTH 1 of val1 WITH new .
off = off + 6.
len = len + 1. " Becasue "-" casuses  val1 length increase by 1
IF off gt len.
exit.
ENDIF.
count = count + 1.
ENDDO.

SHIFT val1 RIGHT DELETING TRAILING '-'.

WRITE / val1.

BR

Dep

Edited by: DeepakNandikanti on Aug 11, 2011 1:34 PM