Текущее время: Чт, мар 28 2024, 15:17

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




Начать новую тему Ответить на тему  [ Сообщений: 4 ] 
Автор Сообщение
 Заголовок сообщения: Ora_CL8MSWIN1251 -> SAP_BW_WE8DEC convert\translate ???
СообщениеДобавлено: Пн, мар 14 2005, 14:59 
Гость
Уважаемые Гуру! К Вам вопрос:

Сформулируйте правильный выход из следующей ситуации :
Есть SAP BW (на Oracle 8.1.7), у него NLS_CHARACTERSET=WE8DEC, и NLS_NCHAR тоже. Когда хожу на этот оракл с NLS_LANG=WE8DEС, создаю в базе таблицу ручками заношу данные (пишу по русски ).
Потом в SAP BW - делаю подмену после которой, эта таблица выглядит как BW источник ( создаём в BW табл. происходит её регистрация в в АBAP словаре, потом в Оracle её удаляем и создаём с тем же название свою со своими данными). Потом с помошью подпрогаммы translate делаю преобразование из 1504 в 1500 (т.е. из CL8MSWIN1251 в CL8ISO8859P5) и загоняю эти данные куда-нибудь, и смотрю через клиент и всё нормально отображается - как и было внесено в таблицу.
(в переменных огружения моей win2k SAP_CODEPAGE=1504).

а теперь когда надо перетащить данные из другой Оracle (9.2.0.6) базы, происходит нехорошее, всё символы толи іііі, то ????.
Я не хочу выдвигать догадки почему так происходит, я знаю одно, что WE8DEС "не знает русского", т.е. CL8MSWIN1251 и перетаскивание данных через DB_link не будет корректным.

Может вы знаете достаточно простое решение этой проблемы, например создание некого file1000_WE8DEС_MY_SAP_BW.nlb в oracle, с помощью Locale Builder, который будет делать преобразование через convert('мой текст','desct_characterset','source_characterset'), таким образом, чтобы созданная CHARCTERSET=WE8DEС_MY_SAP_BW понимала русский при выполнение convert.

или же преобразовать на стороне оракла (источника) все VARCHAR(и CHAR) в бинарный\HEX вид, а потом BW заставить понимать "бинарный\HEX" и преобразовывать его как надо в "локали".
???????????? - КОНЕЦ ВОПРОСА Я ИДИЁТ, УБЕЙТЕ МИНЯ КТО-НИБУДЬ!Я ИДИЁТ, УБЕЙТЕ МИНЯ КТО-НИБУДЬ!

На сём кланяюсь, и буду с нетерпением ждать ответа.


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, мар 14 2005, 17:12 
Гость
ВСЁ придумал, помог этот форум - предыдущая тема.
Расказываю (вариант на половину сырой ):

На стороне BW в Oracle делаем функцию :
--------------------------------------------------------
create or replace function hex_to_raw(inhex varchar2) return varchar2 as
inhex_work varchar2(2000);
hex1 varchar2(2000);
hex2 varchar2(2000);
decimal_number number;
ascii_char varchar2(2000);
return_string varchar2(2000);
begin
inhex_work := rtrim(ltrim(inhex));
if length(inhex_work) is null then
return NULL;
end if;
hex1 := substr(inhex_work,1,1);
hex2 := substr(inhex_work,2,1);
loop
if instr(hex1,'A') = 1 Then
hex1 := '10';
elsif instr(hex1, 'B') = 1 Then
hex1 := '11';
elsif instr(hex1, 'C') = 1 Then
hex1 := '12';
elsif instr(hex1, 'D') = 1 Then
hex1 := '13';
elsif instr(hex1, 'E') = 1 Then
hex1 := '14';
elsif instr(hex1, 'F') = 1 Then
hex1 := '15';
end if;
if instr(hex2, 'A') = 1 Then
hex2 := '10';
elsif instr(hex2, 'B') = 1 Then
hex2 := '11';
elsif instr(hex2, 'C') = 1 Then
hex2 := '12';
elsif instr(hex2, 'D') = 1 Then
hex2 := '13';
elsif instr(hex2, 'E') = 1 Then
hex2 := '14';
elsif instr(hex2, 'F') = 1 Then
hex2 := '15';
end if;
decimal_number := to_number(hex1) * 16 + to_number(hex2);
ascii_char := chr(decimal_number);
return_string := concat(return_string, ascii_char);
inhex_work := substr(inhex_work, 3);
if inhex_work is null then
return return_string;
exit;
end if;
hex1 := substr(inhex_work,1,1);
hex2 := substr(inhex_work,2,1);
end loop;
end;
---------------------------------------------------------------------------
На строне базы источника делаем View на интересующие нас таблицы, по
примеру:
-------------------------------------
create or replace view scott.temp2 as
select
rawtohex(empno) empno,
rawtohex(ename) ename
from SCOTT.EMP
---------------------------------------
для примера, меня интересуют два поля : empno и ename.

Основное что мы делаем, это rawtohex ( см. select rawtohex('моё_слово') from dual ).


Потом на стороне BW делаем DB_link и смортим на эту "view scott.temp2" .

SELECT hex_to_raw(empno), hex_to_raw(ename) FROM temp2@ORCLDWH ,

где ORCLDWH - имя DB_link, он же мой SID ( я занёс в scott.emane - русские буквы )


Всё - проблема закрыта.

Всем спасибо, сегодня я себя угощаю пивом


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, мар 14 2005, 18:18 
Модератор
Модератор
Аватара пользователя

Зарегистрирован:
Ср, авг 18 2004, 10:59
Сообщения: 754
Откуда: Moscow
Ну и наворотил :lol:

_________________
Фарш невозможно провернуть назад,
И мясо из котлет не восстановишь


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, мар 15 2005, 12:47 
Гость
MakcuM написал(а):
Ну и наворотил :lol:

Тут всё чисто - у меня работает ( Волки сыты овцы целы)


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

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


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

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


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

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