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

Часовой пояс: 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 часа


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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