Текущее время: Вс, июл 20 2025, 20:11

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Достучаться до внешней базы
СообщениеДобавлено: Вт, фев 20 2007, 14:25 
Младший специалист
Младший специалист

Зарегистрирован:
Пн, сен 04 2006, 16:18
Сообщения: 85
Получил db link у админов. Взялся за native sql. Пишу:
Code:
  DATA:result TYPE i,
   err_txt                 TYPE string,
   oref                    TYPE REF TO cx_sy_native_sql_error.
  TRY.
    EXEC SQL.
*      SELECT link.ZUSR
*       INTO :RESULT
*       FROM DUAL;
       select count( * ) into :result from s_users@link;
    ENDEXEC.
    CATCH cx_sy_native_sql_error INTO oref.
      MESSAGE oref->sqlmsg TYPE 'I'.
      err_txt = oref->get_text( ).
      MESSAGE err_txt TYPE 'E'.
  ENDTRY.
На внешней Оракловой базе создал функцию zusr, которая должна тянуть кол. строк с таблицы s_users. А он мне оракловую ошибку " ORA-00911: Invalid character". Попыталься вытащить count на прямую из таблички, выдает тоже самое. Может кто работал с Native sql, может подскажет как правильно конектиться к внешней базе.


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

Зарегистрирован:
Чт, апр 07 2005, 05:27
Сообщения: 621
Откуда: Москва
Пол: Мужской
A napisat
SET CONNECTION 'link'
teper ne modno? :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, фев 20 2007, 15:16 
Младший специалист
Младший специалист

Зарегистрирован:
Пн, сен 04 2006, 16:18
Сообщения: 85
Вытащил с хелпа экзапл. убрал селект тянущий за собой данные с таблицы dbcon. (Кстати dbcon у меня пустой). <я не знать русский языка> запустить, тут начал ругаться на ошибку в native sql. Не хочет конектиться.

Code:
dbs = 'link'
DATA:result TYPE i.
TRY.
      EXEC SQL.
        CONNECT TO :dbs
      ENDEXEC.
      IF sy-subrc <> 0.
        RAISE EXCEPTION TYPE cx_sy_native_sql_error.
      ENDIF.
      EXEC SQL.
        OPEN dbcur FOR
          SELECT empl_code
                 FROM s_users
      ENDEXEC.
      DO.
        EXEC SQL.
          FETCH NEXT dbcur INTO :result
        ENDEXEC.
        IF sy-subrc <> 0.
          EXIT.
        ELSE.
          WRITE / result.
        ENDIF.
      ENDDO.
      EXEC SQL.
        CLOSE dbcur
      ENDEXEC.
      EXEC SQL.
        DISCONNECT :dbs
      ENDEXEC.
    CATCH cx_sy_native_sql_error.
      MESSAGE `Error in Native SQL.` TYPE 'I'.
  ENDTRY.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, фев 20 2007, 16:31 
Старший специалист
Старший специалист

Зарегистрирован:
Пт, ноя 12 2004, 10:44
Сообщения: 370
Откуда: Москва
eskars написал(а):
Вытащил с хелпа экзапл. убрал селект тянущий за собой данные с таблицы dbcon. (Кстати dbcon у меня пустой).


DBCON надо настроить. прописать логин, пароль...


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, фев 20 2007, 17:06 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, июл 28 2006, 08:32
Сообщения: 83
А как его настроить?

_________________
Если ты начал открывать пивные бутылки открывашкой - значит, ты мощно постарел!


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

Зарегистрирован:
Пн, сен 04 2006, 16:18
Сообщения: 85
Где db link настройть? Есть какая нибудь дока.


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

Зарегистрирован:
Чт, апр 13 2006, 12:32
Сообщения: 1503
Откуда: Питер
Цитата:
Configuration: table DBCON
Before you can open an additional DB connection, all connection data that is required to identify the target database and for authentication against this database must be communicated to the ABAP runtime environment. To do this, create an entry in the table DBCON that will contain all the required connection data for each database connection that you want to set up in addition to the R/3 default connection. The table DBCON is in the R/3 default database and can be maintained using the table maintenance tool (Transaction SM30) or, as of Release 4.6, using Transaction DBCO. For each connection you must enter the following information in this table:


A logical connection name. The name entered here explicitly identifies a database connection.
The database type. This determines which DB platform will be used for this connection. In principle, you can enter all DB platforms supported by the R/3 System.
The database user under whose name you want to set up the connection.
The password of this user for authentication against the database. This password is stored in encrypted form.
The technical connection data required to set up the connection to the database. The connection data is DB platform-dependent and generally includes the database name as well as the DB host on which the database runs.


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

Зарегистрирован:
Пн, сен 04 2006, 16:18
Сообщения: 85
в DBCON ввел записи. А как проверить связь работает с внешней базой или нет. Мой db link был создан на уровне оракла sql-ом, в SAP-е все, что было настроено так это только таблица DBCON. Что системе нужно, чтобы нормально проработал программный код(см. выше).


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, фев 21 2007, 15:26 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Чт, окт 26 2006, 13:40
Сообщения: 25
Пол: Мужской
1. tnsnames.ora прописать записи про другую оракловую базу на уровне СУБД

2. В таблицу DBCON добавить запись об используемой базе и под каким юзером идет коннект типа:
Code:
CON_NAME - это логическое имя соединения будешь использовать в EXEC SQL, например 'TEST'
DBMS = 'ORA' (удаленная база ORACLE)
USER_NAME - логин под которым коннектишься к удаленной базе
PASSWORD  - ну это я думаю понятно :)
CON_ENV - TNSNAME твоего сервера (именно под этим именем он прописан в tnsnames.ora) например 'ORANT.SIM.COM'


3. Ну а далее EXEC SQL

Code:
EXEC SQL.
    SET CONNECTION :'TEST'
  ENDEXEC.
  if sy-subrc <> 0.
*   Connection not yet opened.
    EXEC SQL.
      CONNECT TO :'TEST'
    ENDEXEC.
    if sy-subrc <> 0.
      message e020.
    endif.
  endif.
EXEC SQL.
   open c1 for
    select * from vlasov.tr_sap_doc
                        where
                              IS_STORNO is not null and
                              num_doc_st is null
ENDEXEC.

do.
  EXEC SQL.
    FETCH NEXT c1 INTO :docum
  ENDEXEC.
  if sy-subrc <> 0.
    exit.
  else.
    append docum.
  endif.
enddo.

exec sql.
    commit :'TEST'
endEXEC.

exec sql.
    disconnect :'TEST'
endEXEC.

*  Надо закрыть форточку :)
EXEC SQL.
  CLOSE c1
ENDEXEC.



В результате во внутренней табличке docum будет данные из оракловой табличке vlasov.tr_sap_doc

Да, еще конечно надо не забыть дать полномочия в удаленном ORACLE на чтение необходимой табличке.

Возможны траблы с русской кодировкой (это зависит от кодовой странички SAPовского сервера ORACLE). Это тоже в принципе рашаемо


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

Зарегистрирован:
Пн, сен 04 2006, 16:18
Сообщения: 85
В DBCON -е запись завел. Но все равно на set connection sy-subrc = 4.
Логин и пороль с именем тнс правильны. Пробывал зайти во внешнию базу PLSQL-ой. Заходит. Меня озадачивает нужен ли мне линк который мне выдали админы, если все равно набираю имя тнс в DBCON. Или что я не так понимаю?


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

Зарегистрирован:
Пн, сен 04 2006, 16:18
Сообщения: 85
Вроде бы все сделал правильно, <я не знать русский языка> почти все варианты. Может кто знает, различие версий Оракла как нибудь влияет на соединение. САП сидит на 9-е, а вн. база на 8-ке?


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

Зарегистрирован:
Пн, сен 04 2006, 16:18
Сообщения: 85
Все работает, все дело было в линке. Линк был не рабочий. Спасибо bmonk-у за исчерпывающий ответ. :P


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, фев 27 2007, 08:31 
Начинающий
Начинающий

Зарегистрирован:
Вт, сен 19 2006, 13:20
Сообщения: 5
bmonk написал:

Возможны траблы с русской кодировкой (это зависит от кодовой странички SAPовского сервера ORACLE). Это тоже в принципе рашаемо


Можно по подробнее как победить "траблы" с русской кодировкой!
Был бы очень благодарен, так как есть такая проблемма, а решить её никак не получается! :oops:


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, мар 05 2007, 08:30 
Младший специалист
Младший специалист

Зарегистрирован:
Пн, сен 04 2006, 16:18
Сообщения: 85
Amid написал(а):
bmonk написал:

Возможны траблы с русской кодировкой (это зависит от кодовой странички SAPовского сервера ORACLE). Это тоже в принципе рашаемо


Можно по подробнее как победить "траблы" с русской кодировкой!
Был бы очень благодарен, так как есть такая проблемма, а решить её никак не получается! :oops:


Все дело в кодировке. Можно написать конвертор с we8dec в cl8mswin1251 и обратный с cl8mswin1251 в we8dec. Если на уровне Оракла, то будет выглядеть так:
Code:
create or replace function we8dec_cl8mswin1251(a in varchar2) return varchar2
is
vv  varchar2(2000) := '';
j   number;
jj  number;
dd  number := 16;
begin
   if a is null then
      return null;
   end if;
  for i in 1..length(a) loop
     j := ascii(substr(a,i,1));
    if (j >= 176 and j <= 239) then
      jj := j + dd;
    elsif j = 241 then
      jj := 184;
    elsif j = 240 then
      jj := 185;
    elsif j = 161 then
      jj := 168;
    else
      jj := j;
    end if;
    vv := vv||chr(jj);
  end loop;
  return vv;
end;
Обратный если будет нужен могу прописать. Но когда я выгружаю с приложения т.е. с САП-а, кодировка почемуто сбивается, поэтому сделал простой переводчик со стороны САП и конвертер с другой. В общем выглядет это, так: ФМ(в САП)
data i type i.
data outchar type c.
i = 0.

while i < strlen( str ).
  case str+i(1).
    WHEN 'А'.
     outchar = 'A'.
    WHEN 'Б'.
     outchar = 'B'.
    WHEN 'В'.
     outchar = 'C'.
    WHEN 'Г'.
     outchar = 'D'.
    WHEN 'Д'.
     outchar = 'E'.
    WHEN 'Е'.
     outchar = 'F'.
    WHEN 'Ё'.
     outchar = ')'.
    WHEN 'Ж'.
     outchar = 'G'.
    WHEN 'З'.
     outchar = 'H'.
    WHEN 'И'.
     outchar = 'I'.
    WHEN 'Й'.
     outchar = 'J'.
    WHEN 'К'.
     outchar = 'K'.
    WHEN 'Л'.
     outchar = 'L'.
    WHEN 'М'.
     outchar = 'M'.
    WHEN 'Н'.
     outchar = 'N'.
    WHEN 'О'.
     outchar = 'O'.
    WHEN 'П'.
     outchar = 'P'.
    WHEN 'Р'.
     outchar = 'Q'.
    WHEN 'С'.
     outchar = 'R'.
    WHEN 'Т'.
     outchar = 'S'.
    WHEN 'У'.
     outchar = 'T'.
    WHEN 'Ф'.
     outchar = 'U'.
    WHEN 'Х'.
     outchar = 'V'.
    WHEN 'Ц'.
     outchar = 'W'.
    WHEN 'Ч'.
     outchar = 'X'.
    WHEN 'Ш'.
     outchar = 'Y'.
    WHEN 'Щ'.
     outchar = 'Z'.
    WHEN 'Ъ'.
     outchar = '['.
    WHEN 'Ы'.
     outchar = '\'.
    WHEN 'Ь'.
     outchar = ']'.
    WHEN 'Э'.
     outchar = '^'.
    WHEN 'Ю'.
     outchar = '_'.
    WHEN 'Я'.
     outchar = '`'.

    WHEN 'а'.
     outchar = 'a'.
    WHEN 'б'.
     outchar = 'b'.
    WHEN 'в'.
     outchar = 'c'.
    WHEN 'г'.
     outchar = 'd'.
    WHEN 'д'.
     outchar = 'e'.
    WHEN 'е'.
     outchar = 'f'.
    WHEN 'ё'.
     outchar = '9'.
    WHEN 'ж'.
     outchar = 'g'.
    WHEN 'з'.
     outchar = 'h'.
    WHEN 'и'.
     outchar = 'i'.
    WHEN 'й'.
     outchar = 'j'.
    WHEN 'к'.
     outchar = 'k'.
    WHEN 'л'.
     outchar = 'l'.
    WHEN 'м'.
     outchar = 'm'.
    WHEN 'н'.
     outchar = 'n'.
    WHEN 'о'.
     outchar = 'o'.
    WHEN 'п'.
     outchar = 'p'.
    WHEN 'р'.
     outchar = 'q'.
    WHEN 'с'.
     outchar = 'r'.
    WHEN 'т'.
     outchar = 's'.
    WHEN 'у'.
     outchar = 't'.
    WHEN 'ф'.
     outchar = 'u'.
    WHEN 'х'.
     outchar = 'v'.
    WHEN 'ц'.
     outchar = 'w'.
    WHEN 'ч'.
     outchar = 'x'.
    WHEN 'ш'.
     outchar = 'y'.
    WHEN 'щ'.
     outchar = 'z'.
    WHEN 'ъ'.
     outchar = '['.
    WHEN 'ы'.
     outchar = '|'.
    WHEN 'ь'.
     outchar = '}'.
    WHEN 'э'.
     outchar = '~'.
    WHEN 'ю'.
     outchar = '#'.
    WHEN 'я'.
     outchar = '$'.
  WHEN OTHERS.
     outchar = str+i(1).
  endcase.
  if outchar = space.
  CONCATENATE outstr outchar into outstr SEPARATED BY '&'.
  else.
    CONCATENATE outstr outchar into outstr.
  endif.
  add 1 to i.
ENDWHILE.

И конвертор на базе Оракла:
create or replace function en_ru(str in varchar2) return varchar2 is
  Result varchar2(2000);
  i integer;
  temp integer;
  r varchar2(1);
  j integer;
begin
    for i in 1..length(str) loop
SELECT ASCII(substr(str,i,1)) into temp FROM dual;
if temp = 35 then temp := 127; end if;
if temp = 36 then temp := 128; end if;
if temp = 38 then temp := -95; end if;
  j := temp+127;
r := chr(j);
result := result||r;
--result := result||substr(str,i,1)||'-'||r||'.';
  end loop;
  return(Result);
end en_ru;

Сделал, работает. Но думаю можно было бы на много короче. Но пока для тестирования пойдет, если какие будуд грейды, напишу. Надеюсь поможет :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн, мар 05 2007, 17:30 
Старший специалист
Старший специалист
Аватара пользователя

Зарегистрирован:
Пн, мар 05 2007, 15:30
Сообщения: 261
Откуда: Москва
Если уж совсем такая кодировка что в САПе нету в таблицах начинающихся на "TCP" и потому нельзя воспользоваться стандартной перекодировкой, то такая конструкция выглядет лучше
Code:
DATA text TYPE string.
text = `Barbcbdbarb`.
TRANSLATE text USING 'ABBAabba'.
Я чесно сказать бы замучался это ифом или кейзом описывать, ну или создай таблицу перекодировки можно внутреннюю можно прозрачную, ну незнаю есть еще куча методов.


Принять этот ответ
Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.

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


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

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


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

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