Текущее время: Пт, июл 18 2025, 12:43

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: Как извлечь данные из внешней БД
СообщениеДобавлено: Ср, май 14 2014, 12:50 
Начинающий
Начинающий

Зарегистрирован:
Пн, авг 30 2010, 15:37
Сообщения: 15
Проблема:

Есть внешняя БД на ORACLE и в ней таблица, например tbl, одно из полей которой, например txt содержит русские тексты.
Надо извлечь в SAP строки, в которых txt похоже на некоторое заданное значение. Что-то типа:

Code:
EXEC SQL.
  OPEN C FOR SELECT a, b, с FROM tbl WHERE txt LIKE 'что-то%'
ENDEXEC.
DO.
  EXEC SQL.
    FETCH NEXT C INTO :ls-a, :ls-b, :ls-c
  ENDEXEC.
  IF sy-subrc <> 0.
    EXIT.
  ENDIF.
  APPEND ls TO lt.
ENDDO.

Проблема в том, что если писать в точности так, то из-за несоответствия кодировок ничего не находится.

Вопрос: какие пляски с бубном надо добавить, чтобы все заработало?

Заранее спасибо за любую помощь


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Как извлечь данные из внешней БД
СообщениеДобавлено: Ср, май 14 2014, 13:13 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
можно попробовать LIKE :var / не oracle: [s]или EXEC SQL PREPARE, DECLARE, OPEN из переменной,
т.е. подбирать кодировку в переменной:
Working with UNICODE Data[/s]


Последний раз редактировалось trop Чт, май 15 2014, 10:45, всего редактировалось 1 раз.

Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Как извлечь данные из внешней БД
СообщениеДобавлено: Чт, май 15 2014, 05:41 
Начинающий
Начинающий

Зарегистрирован:
Пн, авг 30 2010, 15:37
Сообщения: 15
pikarus написал(а):
можно попробовать LIKE :var или EXEC SQL PREPARE, DECLARE, OPEN из переменной,
т.е. подбирать кодировку в переменной:

Может просто ниасилил, но по-моему как-то это сложно/громоздко. Думаю, должен быть какой-то более простой способ - с вызовом оракловских ф-ий преобразования кодировок, вопрос только в том - каких. Мои эксперименты с utl_raw.cast_to_raw, utl_raw.cast_to_varchar2 к успеху не привели, но такое впечатление, что решение где-то близко (скорее всего не учитываю какую-то тонкость)

PS: вариант char_convert.char_to_sap(txt) = utl_raw.cast_to_raw('искомый текст')
работает, но это (не говоря уж о неоптимальности поиска) только на точное совпадение текстов, а мне нужно по LIKE


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Как извлечь данные из внешней БД
СообщениеДобавлено: Чт, май 15 2014, 09:33 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
так надо же наоборот, не поле конвертировать, а маску


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Как извлечь данные из внешней БД
СообщениеДобавлено: Чт, май 15 2014, 10:33 
Начинающий
Начинающий

Зарегистрирован:
Пн, авг 30 2010, 15:37
Сообщения: 15
В идеале (при поиске по LIKE) да, надо конвертировать маску (из строки в саповской кодировке в строку в кодировке ORACLE), только не знаю каким преобразованием.

А в приведенном в PS примере и левая и правая часть равенства конвертируются к RAW и это работает


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Как извлечь данные из внешней БД
СообщениеДобавлено: Чт, май 15 2014, 11:03 
Специалист
Специалист

Зарегистрирован:
Вт, дек 30 2008, 18:10
Сообщения: 171
Пол: Мужской
pikarus написал(а):
В идеале (при поиске по LIKE) да, надо конвертировать маску (из строки в саповской кодировке в строку в кодировке ORACLE), только не знаю каким преобразованием.

А в приведенном в PS примере и левая и правая часть равенства конвертируются к RAW и это работает

если сап не юникод
Code:
translate mask_string from code page '1500' to code page '1504'.

в противном случае

Note

These variants of the statement TRANSLATE are not allowed in Unicode programs. Their functions are replaced with methods of the following conversion classes:

CL_ABAP_CONV_IN_CE
Reading data from a byte-like data object and converting from an external format to the system format.


CL_ABAP_CONV_OUT_CE
Converting data from the system format to an external format and writing in a byte-like data object.


CL_ABAP_CONV_X2X_CE
Converting data from an external format to another external format.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Как извлечь данные из внешней БД
СообщениеДобавлено: Чт, май 15 2014, 11:56 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
data: like1 type char40 value 'текст%'. " CL8MSWIN1251, RU8PC866
Code:
select a,b,c from tbl where txt like convert(:like1,'UTF8','CL8MSWIN1251')


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Как извлечь данные из внешней БД
СообщениеДобавлено: Пт, май 16 2014, 07:43 
Начинающий
Начинающий

Зарегистрирован:
Пн, авг 30 2010, 15:37
Сообщения: 15
Ну не знаю уже, все рекомендации перепробовал - не выходит цветок каменный.

И чарсеты вроде правильные указываю - CL8MSWIN1251 для ORACLE, WE8DEC для SAP (пробовал и UTF8 и RU8PC866, но в
V&NLS_PARAMETERS именно WE8DEC) - не ищет зараза и все...

Может есть у кого полностью рабочий пример?


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Как извлечь данные из внешней БД
СообщениеДобавлено: Пт, май 16 2014, 08:54 
Начинающий
Начинающий

Зарегистрирован:
Чт, дек 12 2013, 03:27
Сообщения: 5
Если оно того стоит, между сапом и ораклом можно поставить "посредника". Гарантировано решение проблем кодировок и появится возможность кидаться запросами из обоих систем (когда обмен выгодней инициировать от оракла например). Но, требуется закупка и установка нового ПО, пусть и "дешевого" по стоимости и ресурсным требованиям. Еще плюс - никакого exec sql, весь обмен будет управляем и запротоколен, это к вопросу безопасности.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Как извлечь данные из внешней БД
СообщениеДобавлено: Пт, май 16 2014, 09:46 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
если ерунда какая-то, значит упускаете какую-то мелочь


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Как извлечь данные из внешней БД
СообщениеДобавлено: Пт, май 16 2014, 10:09 
Начинающий
Начинающий

Зарегистрирован:
Пн, авг 30 2010, 15:37
Сообщения: 15
trop написал(а):
если ерунда какая-то, значит упускаете какую-то мелочь

Мысль конечно глубокая :) но боюсь, что мне она ничем не поможет


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Как извлечь данные из внешней БД
СообщениеДобавлено: Пт, май 16 2014, 10:55 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пт, сен 23 2005, 11:11
Сообщения: 963
ну попробуйте в отладке сравнить в виде hex извлеченное в переменную поле txt (в виде симв. или raw)
с переменной в которую предварительно присвоен такой же текст,
и перебирать кодировки как советовал andry_moz пока не совпадёт, затем вставить в like

можно ещё сравнить NLS_CHARACTERSET в st04 и оттуда,
и ещё вопрос, откуда взялось - char_convert.char_to_sap(txt) и как он работает?
такое ощущение что вы пытаетесь сделать like на rawstring


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Как извлечь данные из внешней БД  Тема решена
СообщениеДобавлено: Пн, май 19 2014, 09:28 
Специалист
Специалист

Зарегистрирован:
Вт, дек 30 2008, 18:10
Сообщения: 171
Пол: Мужской
pikarus написал(а):
Ну не знаю уже, все рекомендации перепробовал - не выходит цветок каменный.

И чарсеты вроде правильные указываю - CL8MSWIN1251 для ORACLE, WE8DEC для SAP (пробовал и UTF8 и RU8PC866, но в
V&NLS_PARAMETERS именно WE8DEC) - не ищет зараза и все...

Может есть у кого полностью рабочий пример?


еще был вариант для древнего оракла.
самописная функция
Code:
CREATE OR REPLACE FUNCTION shema."HEXTORUS" (str in varchar2) return varchar2 is
  Result varchar2(8192);

  chrx  int;
  curr  int;
  indx  int := 1;

Begin
  while indx < length(str) LOOP
    if SUBSTR(str, indx, 2) = '00' then exit; end if;
    curr := ASCII(SUBSTR(str, indx, 1));
    chrx := curr-48;  if chrx > 9 THEN chrx := chrx-7; END IF;

    curr := ASCII(SUBSTR(str, indx+1, 1))-48;
    if curr > 9 THEN curr := curr-7; END IF;
    chrx:=chrx*16+curr;
    result := result || CHR(chrx);
      indx := indx+2;
  END LOOP;
  return(RTRIM(Result,' '));
end hextorus;


в SAP ФМ
Code:
FUNCTION ZC2X.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     VALUE(P_STRING)
*"  CHANGING
*"     REFERENCE(P_VALUE)
*"----------------------------------------------------------------------
*DATA l_type TYPE c.
  DATA lc_conv TYPE REF TO cl_abap_conv_out_ce.
  DATA l_len TYPE i.
  DATA l_string TYPE string.

  DATA l_endia TYPE abap_endia.

  l_string = p_string.
  l_endia = 'B'.

  CALL METHOD cl_abap_conv_out_ce=>create
    EXPORTING
      endian      = l_endia
      encoding    = '1504'
      replacement = space
      ignore_cerr = abap_true
    RECEIVING
      conv        = lc_conv.
  TRY.
      CALL METHOD lc_conv->write
        EXPORTING
          data = l_string
        IMPORTING
          len  = l_len.
* Should ignore errors in code conversions
    CATCH cx_sy_conversion_codepage.
    CATCH cx_sy_codepage_converter_init.
    CATCH cx_parameter_invalid_type.
    CATCH cx_parameter_invalid_range.
  ENDTRY.
  p_value = lc_conv->get_buffer( ).
ENDFUNCTION.


а работало все это таким образом
Code:
report z_report.
data: in_string(20), out_string(20) type x.

...
CALL FUNCTION 'ZC2X'
     EXPORTING
        P_STRING = in_string
     CHANGING
         P_VALUE = out_string.
...

exec sql.
  update shema.table1@base
     set
     ... bla bla bla
  where field1 = shema.hextorus@base(:out_string)
endexec.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Как извлечь данные из внешней БД
СообщениеДобавлено: Ср, май 21 2014, 13:21 
Начинающий
Начинающий

Зарегистрирован:
Пн, авг 30 2010, 15:37
Сообщения: 15
Пардон за задержку, были другие дела, удалось вернуться к этому вопросу только сегодня.

И огромное спасибо, с самописной функцией все отлично получилось! :pivo:


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

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


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

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


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

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