Текущее время: Пн, авг 04 2025, 07:29

Часовой пояс: UTC + 3 часа


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Проблемы с 'cl_abap_conv_obj'
СообщениеДобавлено: Вт, дек 18 2007, 12:51 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Пн, дек 04 2006, 05:56
Сообщения: 75
Откуда: Казахстан
Всем добрый день.

У меня проблема с использованием cl_abap_conv_obj.
Просмотрел другие темы, но что-то ничего объясняющего не понял.

В версии 4.6 был примерно код:
Code:
DATA c1(10).
DATA x(2) TYPE x VALUE '0D0A'.
DATA c2(255).
c1 = 'АБВ ГДЕ ЖЗ'.

TRANSLATE c1 TO CODE PAGE '1504'.
CONCATENATE c1 x INTO c2.


В версии 6.0 пытался реализовать такой код:

Code:
data C1(10).
data X(2) type X value '0D0A'.
data C2(255).

C1 = 'АБВ ГДЕ ЖЗ'.

perform TRANSLATE_CODEPAGE using '1504'
                        changing C1.


form TRANSLATE_CODEPAGE using P_C_UNICODECP
                     changing P_T143T.

data: CONVERTER type ref to CL_ABAP_CONV_OBJ.
data: L_OUT type STRING.
data: L_TOCODE type CPCODEPAGE.
L_TOCODE = P_C_UNICODECP.

create object CONVERTER
  exporting
    OUTCODE = L_TOCODE
  exceptions
    INVALID_CODEPAGE = 1
    INTERNAL_ERROR = 2.
if SY-SUBRC <> 0.
  case SY-SUBRC.
    when 1.
      message id 'FES' type 'E' number '024' raising UNKNOWN_ERROR.
    when 2.
      message id 'FES' type 'E' number '024' raising UNKNOWN_ERROR.
  endcase.
endif.

call method CONVERTER->CONVERT
  exporting
    INBUFF = P_T143T
    INBUFFLG = 0
    OUTBUFFLG = 0
  importing
    OUTBUFF = L_OUT
  exceptions
   INTERNAL_ERROR = 1
   others = 2.
if SY-SUBRC <> 0.
  case SY-SUBRC.
   when 1.
     message id 'FES' type 'E' number '024' raising UNKNOWN_ERROR.
   when 2.
     message id 'FES' type 'E' number '024' raising UNKNOWN_ERROR.
   endcase.
endif.
P_T143T = L_OUT.
endform. " translate_codepage


Но что-то не получилось. Что может быть не так?

Но как реализовать
Code:
CONCATENATE c1 x INTO c2
в 6.0 вообще представления не имею. :?:

Заранее благодарю за помощь.

_________________
С Уважением,
Начинающий


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, дек 19 2007, 09:31 
Ассистент
Ассистент

Зарегистрирован:
Ср, дек 19 2007, 09:07
Сообщения: 31
1) Проверил у себя в 4.7 работу подпрограммы TRANSLATE_CODEPAGE. Все работает правильно.
2) CONCATENATE c1 CL_ABAP_CHAR_UTILITIES=>CR_LF INTO c2.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, янв 21 2008, 07:54 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Пн, дек 04 2006, 05:56
Сообщения: 75
Откуда: Казахстан
Спасибо за помощь, но я работаю в шестерке.

Я в кодировке слаб и поэтому <я не знать русский языка>, если не правильно выражусь.
Но суть в следующем.

Допустим есть переменная со значением 'АБВГД'. Когда перекодируешь эту переменную (способ я указал выше, только перекодирую в 1503), то оно содержит значение три квадрата. И каждый квадрат получается содержит два символа, т.е. 1 - 'АБ', 2 - 'ВГ', 3 - 'Д '.
Проблема в том, что если в переменной не четное количество символов, то добавляется пробел к последнему символу (3 - 'Д ').

В 4.6. такого нет. Там каждый символ перекодируется отдельно, ни каких спариваний. Та же переменная в 4.6. будет иметь пять знаков решетки '#####'.

Как можно решить эту проблему, а то из-за этого пробела файл получается не корректный.

Заранее спасибо за помощь.

ЗЫ. Надеюсь я выразился понятливо.

_________________
С Уважением,
Начинающий


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, янв 21 2008, 09:19 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Дело не в том, что у Вас ECC 6.0, а в том, что активирован юникод.
Описанное спаривание происходит тогда, когда строку в кодировке cp1251 пытаются интерпретировать как юникод. Так что проблемы, видимо, никакой нет, просто надо смотреть в дебаггере на строку в HEX-представлении.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, янв 21 2008, 09:40 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Пн, дек 04 2006, 05:56
Сообщения: 75
Откуда: Казахстан
Спасибо, что быстро ответили. Но на самом деле продлема есть.

Дело в том, что в файле переход на следующую строку должен осуществляться сразу после последнего символа. А из-за того, что при нечетном количестве символов ставится пробел (при перекодировке), то переход на новую строку происходит не сразу после последнего символа. Из-за этого файл некорректный.

_________________
С Уважением,
Начинающий


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, янв 21 2008, 09:50 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Ср, ноя 23 2005, 13:37
Сообщения: 1805
Откуда: ECC 6.0
Пол: Мужской
Марат написал(а):
Дело в том, что в файле переход на следующую строку должен осуществляться сразу после последнего символа. А из-за того, что при нечетном количестве символов ставится пробел (при перекодировке), то переход на новую строку происходит не сразу после последнего символа. Из-за этого файл некорректный.

Вы сначала сконвертировали строку из юникода в cp1251, а потом добавляете конец строки, работая с ней, как с Юникодной.
Однажды закодировав (в cp1251), дальше нужно работать с ней как с бинарными данными (в т.ч. и выгружать в файл).

Вообще, правило хорошего тона — после кодирования хранить текст в X или XSTRING. Тогда ABAP компилятор позаботится о том, чтобы Вы не сделали неправильных действий. Поэтому лучше использовать CL_ABAP_CONV_OUT_CE.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, янв 21 2008, 11:58 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Пн, дек 04 2006, 05:56
Сообщения: 75
Откуда: Казахстан
Большое спасибо.

Правильно ли я понял?
Беру свою переменную типа С, переприсваиваю переменной типа string. Потом с помощью CL_ABAP_CONV_OUT_CE преобразую в xstring.
Code:
data c1(10) VALUE 'АБВГД'.
data: ce type ref to CL_ABAP_CONV_OUT_CE.
data s1 TYPE string.
data s2 TYPE xstring.
s1 = c1.
ce = CL_ABAP_CONV_OUT_CE=>create( encoding = '1503' ).
ce->convert(
    exporting DATA = s1
    importing BUFFER  = s2
  ).

Затем добавляю конец строки
Code:
DATA: HX(2) TYPE X VALUE '0D0A'.
CONCATENATE s2 HX INTO s2 in BYTE MODE.


А дальше я не совсем понял. Что потом нужно делать с S2, чтобы передать в файл?

Заранее спасибо

_________________
С Уважением,
Начинающий


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, янв 22 2008, 10:47 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Пн, дек 04 2006, 05:56
Сообщения: 75
Откуда: Казахстан
Всем большое спасибо за помощь.
У меня получилось выгрузить данные в файл.
Code:
data: F_XTAB like SDOKCNTBIN occurs 1 with header line.
data: F_SIZE type I.
data: F_VALUE(120).
data: HX(2) type X value '0D0A'.
data: G_STRING type STRING.
data: G_BUFFER type XSTRING.
data: GCL_CONV_TO_X type ref to CL_ABAP_CONV_OUT_CE.

G_STRING = F_VALUE.
call method CL_ABAP_CONV_OUT_CE=>CREATE
  exporting
    ENCODING = F_UNICODECP
  receiving
    CONV     = GCL_CONV_TO_X.

call method GCL_CONV_TO_X->WRITE
  exporting
    DATA = G_STRING.

call method GCL_CONV_TO_X->GET_BUFFER
  receiving
    BUFFER = G_BUFFER.

concatenate G_BUFFER HX into G_BUFFER in byte mode.

call function 'SCMS_XSTRING_TO_BINARY'
  exporting
    BUFFER               = G_BUFFER
importing
   OUTPUT_LENGTH         = F_SIZE
  tables
    BINARY_TAB           = F_XTAB.

А потом F_XTAB выгружаю в файл.

_________________
С Уважением,
Начинающий


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 8 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB