Лично я делаю так.
Все поля, в каких есть текст, я гружу в текст признака. В основные данные признака я гружу хэш от этого текста, одновременно с этим модуль генерации хэша создаёт запись в текстовой таблице. Из этой таблице потом текст экстрактором грузится в текст признака.
Никаких проблем с решетками, русским текстом, спецсимволами, вообще чем угодно. Загрузили треш? Получаете треш в отчётах. Всё.
Code:
FUNCTION ZTEXT_MD5.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" REFERENCE(STRING) TYPE CHAR255
*" EXPORTING
*" REFERENCE(HASH) TYPE CHAR32
*"----------------------------------------------------------------------
DATA: it_hashtext TYPE ZHASHTEXT.
DATA: i_stringlen TYPE I.
DATA: hash160 TYPE HASH160.
DATA: ch_hash TYPE CHAR32.
DATA: xstr TYPE XSTRING.
DATA v_varkey LIKE rstable-varkey.
i_stringlen = STRLEN( STRING ).
IF i_stringlen = 0.
HASH = ''.
ELSE.
DATA str TYPE STRING.
str = string.
CALL FUNCTION 'SCMS_STRING_TO_XSTRING'
EXPORTING
text = str
* MIMETYPE = ' '
* ENCODING =
IMPORTING
buffer = xstr
EXCEPTIONS
failed = 1
OTHERS = 2.
CALL FUNCTION 'CALCULATE_HASH_FOR_RAW'
EXPORTING
ALG = 'MD5'
DATA = xstr
IMPORTING
HASH = HASH160
EXCEPTIONS
UNKNOWN_ALG = 1
PARAM_ERROR = 2
INTERNAL_ERROR = 3
OTHERS = 4.
ch_hash = HASH160.
DO.
v_varkey = ch_hash.
call function 'ENQUEUE_E_TABLE'
exporting MODE_RSTABLE = 'E'
tabname = 'ZHASHTEXT'
varkey = v_varkey
exceptions
foreign_lock = 1
system_failure = 2
others = 3.
SELECT SINGLE *
FROM ZHASHTEXT
INTO it_hashtext
WHERE HASH = ch_hash.
IF sy-subrc = 0.
IF it_hashtext-STRING = STRING.
HASH = ch_hash.
call function 'DEQUEUE_E_TABLE'
exporting
tabname = 'ZHASHTEXT'
varkey = v_varkey
exceptions
foreign_lock = 1
system_failure = 2
others = 3.
EXIT.
ENDIF.
ELSE.
HASH = ch_hash.
it_hashtext-HASH = ch_hash.
it_hashtext-STRING = STRING.
CONCATENATE sy-datum sy-uzeit INTO it_hashtext-TIMESTAMP.
INSERT ZHASHTEXT FROM it_hashtext.
COMMIT WORK AND WAIT.
call function 'DEQUEUE_E_TABLE'
exporting
tabname = 'ZHASHTEXT'
varkey = v_varkey
exceptions
foreign_lock = 1
system_failure = 2
others = 3.
EXIT.
ENDIF.
* Hash collision! Wow!
DATA i_index TYPE i.
FIELD-SYMBOLS <fs_char> TYPE c.
WHILE i_index < 32.
ASSIGN ch_hash+i_index(1) TO <fs_char>.
CASE <fs_char>.
WHEN '0'.
<fs_char> = '1'.
i_index = 32.
WHEN '1'.
<fs_char> = '2'.
i_index = 32.
WHEN '2'.
<fs_char> = '3'.
i_index = 32.
WHEN '3'.
<fs_char> = '4'.
i_index = 32.
WHEN '4'.
<fs_char> = '5'.
i_index = 32.
WHEN '6'.
<fs_char> = '7'.
i_index = 32.
WHEN '7'.
<fs_char> = '8'.
i_index = 32.
WHEN '8'.
<fs_char> = '9'.
i_index = 32.
WHEN '9'.
<fs_char> = 'A'.
i_index = 32.
WHEN 'A'.
<fs_char> = 'B'.
i_index = 32.
WHEN 'B'.
<fs_char> = 'C'.
i_index = 32.
WHEN 'C'.
<fs_char> = 'D'.
i_index = 32.
WHEN 'D'.
<fs_char> = 'E'.
i_index = 32.
WHEN 'E'.
<fs_char> = 'F'.
i_index = 32.
WHEN 'F'.
<fs_char> = '0'.
i_index = i_index + 1.
ENDCASE.
ENDWHILE.
call function 'DEQUEUE_E_TABLE'
exporting
MODE_RSTABLE = 'E'
tabname = 'ZHASHTEXT'
varkey = v_varkey
exceptions
foreign_lock = 1
system_failure = 2
others = 3.
ENDDO.
ENDIF.
ENDFUNCTION.