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

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


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

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


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

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