2015-12-04 2 views
3

В системе SAP, версия ABAP 7.40 SP05, я только что столкнулся с ошибкой в ​​модульных тестах при сравнении строк, но обе строки должны быть одинаковыми ?! Оказывается, это не так, поскольку предыдущее преобразование из i в строку, кажется, создает дополнительное конечное пространство в одной из строк.Пространственное пространство в преобразовании строки в ABAP

Этот бит кода:

DATA(i) = 111. 
DATA(s1) = CONV string(i). 
DATA(s2) = '111'. 
DATA(s3) = |111|. 

Производит (как показано в отладчик):

S1          111 3100310031002000 CString{4} 
S2          111 310031003100 C(3) 
S3          111 310031003100 CString{3} 

Преобразованный один имеет дополнительный замыкающий пробел. Как это происходит и как я могу предотвратить это в i для преобразования строк? Очевидно, что подобные вещи заставляют меня долго отлаживать, чтобы узнать, что происходит (потому что, если я не проверю шестнадцатеричные значения, debuger не показывает это дополнительное пространство ...).

ответ

4

Чтобы понять, почему пространство добавляется в первую очередь, проверьте documentation on the default conversion rules, которые применяются на CONV:

Символ «- "устанавливается в последней позиции для отрицательного значения, и пустая ячейка установлена ​​для положительного значения.

Поскольку вы не можете использовать formatting options строковые выражения с оператором CONV, я предложил бы изменить код, чтобы использовать |{ i }| (который может быть хорошей идеей для других ценностей, а также, так как вы, вероятно, нужны варианты форматирования при сравнении значений даты и времени в модульных тестах).

+0

Спасибо, я пропустил это в документах, и я смотрел на ту же страницу сегодня, pfff ... – dante4d

1

Вы не можете предотвратить это. Лучший способ я нашел до сих пор в ABAP является использование CONDENSE s1

DATA i type i VALUE 12. 
DATA idx TYPE string. 
idx = i.  " idx = '12 '. 
CONDENSE idx. " idx = '12'. 
+1

Я стараюсь избегать таких вещей, как CONDENSE, с момента создания более ориентированных на выражение выражений конструкций ABAP. AFAIK нет позиции операнда, эквивалентной CONDENSE, например, функции trim(). Дело в том, что мне нравится придумывать длинные и сложные выражения FOR, а CONDENSE не может быть частью этих ... – dante4d

+0

Теперь есть один из 7.50 (формат выглядит как 'condense (val = ...)': https://help.sap.com/doc/abapdocu_750_index_htm/7.50/en-US/abencondense_functions.htm – luolimao

Смежные вопросы