понедельник, 28 июня 2010 г.

Get doc number from text

*&---------------------------------------------------------------------*
*& Form GET_DOC_NUMBERS
*&---------------------------------------------------------------------*
* Get doc numbers from text table
*----------------------------------------------------------------------*
* -->P_T_FEBRE text
* -->P_T_NUMS table of docnum
*----------------------------------------------------------------------*
FORM get_doc_numbers TABLES p_t_febre STRUCTURE febre
CHANGING p_t_nums TYPE yruisit_bs_numbers.

CONSTANTS c_maxlen TYPE int4 VALUE 10.

* Templates for translation
DATA: convert1(52) TYPE c VALUE
'A B C D E F G H I J K L M N O P Q R S T U V W X Y Z ',
convert2_norway(52) TYPE c VALUE
'. , < > & " % ! ( ) = ? : # * + / $ # _ ',
convert2(52) TYPE c VALUE
'. , < > & " % ! ( ) = ? : - # * + / $ # _ ; ',
convert3(02) TYPE c VALUE
' ;'.
* Data
DATA lv_text(65000) TYPE c.
DATA lv_head(70) TYPE c.
DATA ls_nums TYPE yrussit_bs_numbers.

RANGES lr_filter FOR bkpf-belnr.

FIELD-SYMBOLS TYPE ANY TABLE.

* Range from selection screen FF.5
ASSIGN ('(RFEBBU10)FILTER[]') TO .
IF sy-subrc EQ 0.
lr_filter[] = .
ENDIF.
*** Get full string
LOOP AT p_t_febre.
CONCATENATE lv_text p_t_febre-vwezw INTO lv_text.
ENDLOOP.
*** Prepare string - keep only digits
* Translate to latin and upper
CALL FUNCTION 'SCP_REPLACE_STRANGE_CHARS'
EXPORTING
intext = lv_text
IMPORTING
outtext = lv_text
EXCEPTIONS
OTHERS = 01.
TRANSLATE lv_text TO UPPER CASE.
* Keep only digits
TRANSLATE lv_text USING convert1.
TRANSLATE lv_text USING convert2.
CONDENSE lv_text.
TRANSLATE lv_text USING convert3.
* Get numbers
CLEAR p_t_nums[].
DO.
CALL FUNCTION 'STRING_SPLIT'
EXPORTING
delimiter = ';'
string = lv_text
IMPORTING
head = lv_head
tail = lv_text
EXCEPTIONS
not_found = 1
not_valid = 2
too_long = 3
too_small = 4.
IF lv_head = space OR sy-subrc NE 0.
EXIT.
ENDIF.
IF lv_head CO ' 0123456789' AND STRLEN( lv_head ) <= c_maxlen.
CLEAR ls_nums.
ls_nums-docnum = lv_head.
IF ls_nums IN lr_filter.
INSERT ls_nums INTO TABLE p_t_nums.
ENDIF.
ENDIF.
ENDDO.
* Delete dublicates
SORT p_t_nums BY docnum.
DELETE ADJACENT DUPLICATES FROM p_t_nums COMPARING docnum.
*
ENDFORM. " GET_DOC_NUMBERS

Комментариев нет: