08-11-2011 8:25 AM
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.
08-11-2011 9:00 AM
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
08-11-2011 9:00 AM
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
08-11-2011 9:27 AM
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.
08-11-2011 11:07 AM
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
08-11-2011 9:36 AM
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
08-11-2011 9:49 AM
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
08-11-2011 10:17 AM
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
08-11-2011 10:20 AM
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
08-11-2011 11:25 AM
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.
08-11-2011 12:25 PM
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