2007 Jun 11 5:58 PM
G'day all,
Hopefully an easy one.
I have a table of line type SOLI which contains a stream of text with Carriage Returns and Line Feeds (CR/LF) included.
I need to convert this table to TLINE format, which means that I want to break it up into 132 chunks and take the CR/LFs into account so that it remains logically formatted i.e. I want a new line in the table whenever a CR/LF is present.
I'm after a Function Module or Method to do this. I know I can scan the table text myself looking for the CR/LFs as hex characters and split it into 132 pieces, but I really don't want to.
I've played with CONVERT_STREAM_TO_ITF_TEXT which is really close to what I want. It will take a table of unspecified line length and convert it and return it in TLINE structure format. Unfortunately it goes a little too far and handles characters like & and < as special characters and in my case they're not special.
Further and possible unnecessary specifics about my scenario:
I'm recieving an inbound email via a class based on IF_INBOUND_EXIT_BCS which will give me access to the email body in a table based on BCSS_DBPC-CONT_TEXT. I need to convert this into TLINE (more specifically RFC_TLINE) format for a function call which creates Long Text against a document (specifically a Notification).
Many thanks,
Mark
Yes I will award points for useful answers, but please don't ask.
2007 Jun 11 6:02 PM
data: itab_d like swastrtab occurs 0 with header line.
data string type string.
string = 'pass ur text'.
CALL FUNCTION 'SWA_STRING_SPLIT'
EXPORTING
INPUT_STRING = string
MAX_COMPONENT_LENGTH = 132
TERMINATING_SEPARATORS =
OPENING_SEPARATORS =
TABLES
STRING_COMPONENTS = itab_d
EXCEPTIONS
MAX_COMPONENT_LENGTH_INVALID = 1
OTHERS = 2
.
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.
2007 Jun 12 9:21 AM
Thanks for the quick response. Unfortunately this function doesn't handle CR/LF and does perform special handling of < ( [ breaking the line at each. As my input is an email any of these characters could appear but should not be handled differently to any other standard characters.
At least it gives me some simple code to copy and paste if no else knows an existing function/method.
Thanks,
Mark
2007 Jun 12 9:23 AM
Hello Mark,
Try with this FM.
DATA DIGIT(11) VALUE '0123456789'.
PARAMETERS: VAR(16) DEFAULT '276,00'.
DATA VAR_NEW(16).
DATA S(2) VALUE ' 0'.
DATA: L_INT TYPE I,
L_INT1 TYPE I.
VAR_NEW = VAR.
CALL FUNCTION 'PREPARE_STRING'
EXPORTING
I_VALID_CHARS = DIGIT
I_XVALID_CHECK = 'X'
I_XCHAR_REPL = 'X'
I_XTOUPPER = 'X'
CHANGING
C_STRING = VAR_NEW.
REgards,
Vasanth
2007 Jun 12 9:39 AM
Sorry Vasanth, but I don't think you quite understood my requirement. That function is about stripping out unwanted characters from a string - not something I want to do. I need to keep the content as is, but split it into a smaller line length table taking CR/LF into account.
2007 Jun 12 10:58 AM
first convert the soli to string using
SOTR_SERV_TABLE_TO_STRING
and then
use
SOTR_SERV_STRING_TO_TABLE
to convert string to tline.
(in both the cases you have to option to retain line breaks and the option to specify line lengths.)
2007 Jun 12 11:21 AM
So close!
These functions looked great, but unfortunately they give the option of taking the CR/LF out or leaving it in, but if you leave them in SOTR_SERV_STRING_TO_TABLE doesn't actually interpret them and give you a new line when they occur.
Thanks,
Mark
2007 Jun 12 11:26 AM
2007 Jun 12 12:28 PM
Unfortunately this function only deals with Line Feed, but not carriage return.
I know realise that there are many variables in a requirement like this and a standard function to achieve what I wanted seems unlikely. It seemed a standard sort of a requirement to being with.
I've now got a solution I can live with - thanks for all responses.
Below is my very ugly and bodgy test code.... BTW in the end I changed my reqt to be 72 rather than 132 characters.
Have fun,
Mark
loop at ls_bodypart_content-CONT_TEXT into lv_bp_cont_line.
if lfl_space_reqd is initial.
concatenate lv_email_as_str lv_bp_cont_line into lv_email_as_str.
else.
concatenate lv_email_as_str lv_bp_cont_line into lv_email_as_str
SEPARATED by space.
clear lfl_space_reqd.
endif.
if lv_bp_cont_line+254(1) = space.
lfl_space_reqd = 'X'.
endif.
endloop.
split lv_email_as_str at cl_abap_char_utilities=>cr_lf
into table lt_paragraphs.
loop at lt_paragraphs into lv_paragraph.
if lv_paragraph is initial.
append space to lt_total_char72.
else.
shift lv_paragraph left deleting leading space.
CALL FUNCTION 'SOTR_SERV_STRING_TO_TABLE'
EXPORTING
TEXT = lv_paragraph
FLAG_NO_LINE_BREAKS = space
TABLES
TEXT_TAB = lt_tmp_char72.
append lines of lt_tmp_char72 to lt_total_char72.
clear lt_tmp_char72.
endif.
endloop.