Функции работы со строками

Автор Uukrul, Жовтень 23, 2008, 11:10:21 ДП

Попередня тема - Наступна тема

0 Користувачі і 1 Гість дивляться цю тему.

Uukrul

В общем отдельно поскладываю тут ФМ, относящие к обработки строк в SAP R/3. Для начала ссылочка на то что уже как бы относится к этому разделу и уже было описано.

C147_REPLACE - Замена по маске, можно воспользоваться оператором REPLACE, ну а можно вызвать ФМ, как описано в этим разделе http://sapforum.biz/index.php/topic,88.0.html

Uukrul

#1
RKD_WORD_WRAP - Функция разбивает длинную строку по словам на строки заданной длины. При этом можно или вернуть просто 3 строки, ну если мы знаем что суммарная строка при разбивке будет не слишком длинной или же возвращается внутренняя таблица со строками заданной длины.

Пример вызова:

DATA: l_line(1000) TYPE c VALUE 'TEST LINE STRING OFF STOP GET ABAP'.
DATA: BEGIN OF lt_lines OCCURS 10,
  line(10) TYPE c,
END OF lt_lines.

CALL FUNCTION 'RKD_WORD_WRAP'
  EXPORTING
    textline                  = l_line
    delimiter                 = ' '
    outputlen                 = 10
* IMPORTING
*   OUT_LINE1                 =
*   OUT_LINE2                 =
*   OUT_LINE3                 =
  TABLES
    out_lines                 = lt_lines
EXCEPTIONS
   outputlen_too_large       = 1
   OTHERS                    = 2.

В общем на выходе в таблице lt_line будет содержаться 4 строки не длиннее 10 символов

TEST LINE           
STRING             
OFF STOP               
GET ABAP

Из особенностей если к примеру одно из слов будет длиннее чем 10 символов например TEST_ABAP_STRING, то функция разобъет такую строку на две, не зависимо от заданного разделителя в переменной delimiter.

TEST_ABAP_
STRING

Таким образом гарантируется, что ничего не потеряется, и что длина строки результата не привысит заданный размер.

Uukrul

TERM_CONTROL_EDIT - Функциональный модуль позволяющий добавить в программу вызов текстового редактора. Опять же можно нарисовать и свой экран с соответствующими экранными элементами, но уже есть готовое решение.

DATA: BEGIN OF lt_textlines OCCURS 10,
        lines(100) TYPE c,
END OF lt_textlines.

CALL FUNCTION 'TERM_CONTROL_EDIT'
     EXPORTING
          titel          = 'Небольшая заметка'
          langu          = space
     TABLES
          textlines      = lt_textlines
     EXCEPTIONS
          user_cancelled = 1
          OTHERS         = 2.

titel - Заголовок окна с редактором
langu - Вообще-то типа код языка, но если язык не задавать тогда будет редактор в модальном окне как на рисунке STERM_CONTROLS_1.png, а вот если задать код языка, тога будет выведен редактор форматного текста как на рисунке STERM_CONTROLS_2.png. Идентификатор текста GLOSSAR.
lt_textlines - Таблица содержащая введенный текст, кстати если таблица заполнить перед вызовом модуля, то текст выведется в редакторе.

В общем везде где надо быстро запросить у пользователя текстовую заметку, можно применять.

Uukrul

POPUP_TO_GET_VALUE - Запрос значения параметра у пользователя. Удобный ФМ, если нужно запросить у пользователя например код завода или какую-то строку данных. Функциональный модуль даже проводит некоторую проверку введенных значений на тип, т.е. если например поле ввода типа NUMC, то модуль ожидает ввода только цифр. На входе передаем имя таблицы и ссылочное поле, а так же можно значение по умолчанию и получаем окошко как в примере:

DATA: l_werks LIKE mseg-werks,
      l_answer(1) TYPE c.

l_werks = '2000'.
CALL FUNCTION 'POPUP_TO_GET_VALUE'
     EXPORTING
          fieldname           = 'WERKS'
          tabname             = 'MSEG'
          titel               = 'Ввод значения'
          valuein             = l_werks
     IMPORTING
          answer              = l_answer
          valueout            = l_werks
     EXCEPTIONS
          fieldname_not_found = 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.
WRITE: / l_werks.

Если нажать кнопку "Отменить", тогда в параметре l_answer = 'C' иначе будет SPACE. Что хорошо заголовок и подпись к полю система вытаскивает сама из домена.

Uukrul

POPUP_TO_GET_ONE_VALUE - Еще одна вариация на тему запроса строки от пользователя, тут все проще строка может быть  длинной не более 30 символов, а так же можно задать три строки описания по требованиям к вводимому тексту, типа что мы ждем от пользователя на вводе.

DATA: l_answer(1) TYPE c,
      l_value1 LIKE spop-varvalue1.

CALL FUNCTION 'POPUP_TO_GET_ONE_VALUE'
     EXPORTING
          textline1      = 'Первая строка описания'
          textline2      = 'Вторая строка описания'
          textline3      = 'Третья строка описания'
          titel          = 'Ввод значения'
          valuelength    = 20
     IMPORTING
          answer         = l_answer
          value1         = l_value1
     EXCEPTIONS
          titel_too_long = 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.
WRITE: / l_value1, l_answer.

На выходе l_answer = 'A', значит пользователь отменил ввод, и строка l_value1 будет пустой. Если же пользователь подтвердил ввод тогда l_answer = 'J', а введенной значение находится в l_value1.

Uukrul

CLOI_PUT_SIGN_IN_FRONT - Функция из раздела, а чтобы было... короче находит положение минуса в числе и выводит этот самый минус перед числом. В общем-то все просто как пять копеек  ;)

DATA: ln_num TYPE d VALUE '100-'.

CALL FUNCTION 'CLOI_PUT_SIGN_IN_FRONT'
     CHANGING
          value = ln_num.

WRITE: / ln_num.

Короче результат на рисунке ниже... хотя конечно операторами WRITE, сейчас редко кто формирует или вообще умеет формировать отчеты, а на экранах и маской можно выдать положение числа  ::)

Паганель

тут коллега по работе наткнулся, по моему ничего так подборка....
http://help.sap.com/saphelp_erp60_sp/helpdata/EN/d6/0db8bb494511d182b70000e829fbfe/frameset.htm

Database   
READ_TEXT    Reads a text module and passes it to the specified work areas.
READ_TEXT_INLINE    Like READ_TEXT. In addition, it passes the first few text lines to a second lines table.
READ_REFERENCE_LINES    Reads the text lines of a reference text and passes them to the specified lines table.
SAVE_TEXT    Saves a text.
DELETE_TEXT    Deletes a text.
COPY_TEXTS    Copies a text.
SELECT_TEXT    Finds the texts for an application object.
   
Administration   
REFER_TEXT    Creates a reference to another text.
RENAME_TEXT    Renames the text in the text memory.
COMMIT_TEXT    Creates for all texts in the text memory the call of an appropriate update module.
INIT_TEXT    Initializes the internal work areas for a text.
   
Editor call   
EDIT_TEXT    Calls the text editor.
EDIT_TEXT_INLINE    Merges the inline lines with the other text lines and calls the text editor.
   
Consistency check   
CHECK_TEXT_AUTHORITY    Checks the authorization for standard texts.
CHECK_TEXT_ID    Checks whether the specified text ID is valid.
CHECK_TEXT_LANGUAGE    Checks whether the specified text language is valid.
CHECK_TEXT_OBJECT    Checks whether the specified text object is valid.
CHECK_TEXT_NAME    Checks whether the specified text name is valid.
   
Editing functions   
TEXT_SYMBOL_COLLECT    Finds the variable symbols that occur in a text.
TEXT_SYMBOL_PARSE    Checks whether a character string is a SAPscript symbol.
TEXT_SYMBOL_REPLACE    Replaces symbols in a text with their values.
TEXT_SYMBOL_SETVALUE    Defines the value of a text symbol.
TEXT_CONTROL_REPLACE    Replaces control statements in a text (IF, CASE...).
TEXT_INCLUDE_REPLACE    Replaces INCLUDE control statements by the text lines of the corresponding text.
   
Print   
PRINT_TEXT    Formats a text for output.
PRINT_TEXT_ITF    Prints a text in the internal ITF format.
   
Form functions   
OPEN_FORM    Opens the form output.
CLOSE_FORM    Ends the form output.
START_FORM    Starts a new form.
WRITE_FORM    Calls a form element.
WRITE_FORM_LINES    Writes text lines into a form.
END_FORM    Ends the current form.
CONTROL_FORM    Sends a control statement to the form.
READ_FORM_ELEMENTS    Finds the elements of a form.
READ_FORM_LINES    Passes the lines of a form elements into an internal lines table.
   
Conversion   
CONVERT_TEXT    Converts texts between different formats.
CONVERT_TEXT_R2    Converts texts between SAPscript and the R/2 format.
CONVERT_OTF_MEMORY    Converts the formatted text (OTF format).
EXCHANGE_ITF    Exchanges the paragraph and character formats of a text with those of another style or form.
   
Transfer   
IMPORT_TEXT    Imports texts.
EXPORT_TEXT    Exports texts.
TRANSFER_TEXT    Uploads/Downloads texts.

Паганель

Искали как привести в верхний регистр .... куча функций .....
А реально вызывается одна конструкция

TRANSLATE i_input TO UPPER CASE.

Паганель

Видимо я ошибся.
Лучше использовать специализированный модуль, например AIPC_CONVERT_TO_UPPERCASE, либо получать текущую локаль (см. AIPC_CONVERT_TO_UPPERCASE)....

Вообщем посмотрел код функции и понял что все таки надо использовать нормальные функции, ниже с моими заключениями


* buffers for current locale setting
  DATA:  l_langu_tmp    TYPE spras,
         l_country_tmp  TYPE land1,
         l_modifier_tmp TYPE cpsublocal.

* get current locale settings
* Сохраняем в временную переменную, текущую локаль
  GET LOCALE LANGUAGE l_langu_tmp
             COUNTRY  l_country_tmp
             MODIFIER l_modifier_tmp.

* set locale for given language (needed for upper-case translation)
* Устанавливаем переданную в функцию локаль
  SET LOCALE LANGUAGE i_langu.

* translate to upper-case
* транслируем :-)
  TRANSLATE i_input TO UPPER CASE.
  e_output = i_input.

* restore old locale settings
" востанавливаем схраненную локаль
  SET LOCALE LANGUAGE l_langu_tmp
             COUNTRY  l_country_tmp
             MODIFIER l_modifier_tmp.


Вообщем как я понял, если вызывать TRANSLATE i_input TO UPPER CASE то испольузуется текущая локаль..

Дима/Уукрул я прав?

Uukrul

Цитата: Паганель від Листопад 25, 2009, 05:18:20 ПП
Вообщем как я понял, если вызывать TRANSLATE i_input TO UPPER CASE то испольузуется текущая локаль..
Да текущая локаль вроде как... из SY-LANGU

Uukrul

Цитата: Паганель від Липень 07, 2009, 05:53:57 ПП
тут коллега по работе наткнулся, по моему ничего так подборка....
Только пользы от него... вот если бы ты это дело оформил нормально по вызовам, а так друг я тебе подскажу как это получить. SE37 а дальше ввести *TEXT* и там еще даже больше может будет, но толку то...

Sed0Y

#11
Я тоже добавлю, нашел как-то - мне в некоторых случаях оказалась нужной:


DATA:
    ld_xvar1          TYPE string,
    ld_xvar2          TYPE string,
    lv_text            TYPE string.

       lv_text = cl_reca_string_services=>fill_text_with_vars(
         id_text = 'Текст с параметрами: кто = &1; час = &2; минута = &3; сколько лет = &4 '
         id_var1 = sy-uname
         id_var2 = sy-datum
         id_var3 = sy-uzeit
         id_var4 = 28 ).


или параметры отдельно
    ld_xvar1 = cl_reca_string_services=>write_field( sy-datum ).
    ld_xvar2 = cl_reca_string_services=>write_field( sy-uzeit ).


Результат будет такой:
    lv_text = Текст с параметрами: кто = Sed0Y; час = 13.06.2011; минута = 10:44:15; сколько лет = 28
    ld_xvar1 = 13.06.2011
    ld_xvar2 = 10:44:15


Uukrul

#12
ISHMED_SPLIT_STRING - Разбивает длинную строку  на подстроки заданной длины с заданным разделителем.

DATA: lt_substrings LIKE rn1text OCCURS 1 WITH HEADER LINE,
      l_string(1204) TYPE c VALUE 'qwerqwer qwerqwer qwerqwer t sdgsdf sfhdf twe fsdgdfg wertyer gsdfhg wert aasdfgsdfg sasdfgadf 2345 agadsga asdfasdf'.

CALL FUNCTION 'ISHMED_SPLIT_STRING'
  EXPORTING
    string        = l_string
    length        = 72
    delimiter     = ' '
  TABLES
    t_substrings  = lt_substrings
  EXCEPTIONS
    can_not_split = 1
    OTHERS        = 2.


Кстати в эту же копилку ФМ: ISH_N2_SPLIT_TEXTSTRING - разделяет сразу строку на строки по 72 символа.

PS 03.12.2013: Модуль содержит проблемы, почему-то в последней строке добавляет символ @ при обработке. В общем лучше остановится на использовании ранее описанного CALL FUNCTION 'RKD_WORD_WRAP'

Uukrul

MESSAGE_TEXT_BUILD - Позволяет на основании класса сообщения, номера и параметров, сформировать текстовую строку сообщения для вывода например пользователю. Вызов довольно простой, передаем класс и номер сообщения с параметрами. На выходе получаем message_text_output в виде сформированной строки для вывода пользователям. Функция довольно простая, можно и самому написать, оператор REPLACE никто не отменял, но если уже есть... то почему бы и нет.

    CALL FUNCTION 'MESSAGE_TEXT_BUILD'
      EXPORTING
        msgid               = gs_return-id
        msgnr               = gs_return-number
        msgv1               = gs_return-message_v1
        msgv2               = gs_return-message_v2
        msgv3               = gs_return-message_v3
        msgv4               = gs_return-message_v4
      IMPORTING
        message_text_output = gs_return-message.

Aleksey

#14
Вот простой способ разделить строку на подстроки по разделителю
пример  с ";"
DATA:a TYPE string,   
     itab TYPE TABLE OF string.
a = '111;2222;33333;444444;555555;6666666'.
split a AT ';' INTO TABLE itab.


Результат во вложении:

Uukrul

#15
CATSXT_SIMPLE_TEXT_EDITOR - Вывод редактора ввода длинных текстов в диалоговом окне, а так же отображение уже введенных текстов в режиме просмотра. В общем-то фактически аналог описанного модуля из этой ссылки: http://sapforum.biz/index.php/topic,343.msg1727.html#msg1727 .Отличия, это немного меньше по размеру и позволяет задать позицию вывода окна редактора. По праметрам все достаточно просто:

IM_TITLE - Заголовок окна редактора
IM_DISPLAY_MODE = space - режим редактирования, любой другой символ, режим просмотра
IM_START_COLUMN - Колонка вывода окна редактора
IM_START_ROW - Строка вывода окна редактора

Изменяемые параметры

CH_TEXT[] - Таблица выводимого текста или результата обработки текста после закрытия окна.

Из недоработок в данном модуле следует отменить, что вы не получаете никакой информации о том, подтвердил пользователь изменения или вышел без подтверждения по кнопке CANCEL. Вам будет возвращен результат работы пользователя в виде измененного текста, т.е. я что-то поменял, нажал отменить и на выходе получил все изменения в CH_TEXT[], хотя вроде как пользователь вызвал отмену ввода. Поэтому для изменяемого параметра CH_TEXT[] используем локальную копию, а после завершения модуля проверяем системную переменную SY-UCOMM. Если она равноа CX_CANC, значит была нажата кнопка отмены, а если  нажали кнопку ОК, тогда значение переменной будет CX_CONT.

Пример вывода окна на рисунке ниже: