Текущее время: Чт, июн 19 2025, 22:02

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: ФМ работающий с ADO.CONNECTION
СообщениеДобавлено: Вт, дек 04 2007, 08:56 
Специалист
Специалист

Зарегистрирован:
Чт, апр 27 2006, 10:50
Сообщения: 132
Пол: Мужской
Была задача конектится сапом к БД Interbase, почитав форум понял что это возможнно(правда медленно) через ADO.CONNECTION. Почитав и по экспериментировав в конечном итоге родился ФМ, может конечно он и криворват, но работает. Может кому пригодится.

Code:
FUNCTION z_db_ado_connect.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     REFERENCE(SQL) TYPE  STRING
*"     REFERENCE(INITSTR) TYPE  STRING
*"     REFERENCE(FC) TYPE  SLIS_T_FIELDCAT_ALV
*"  TABLES
*"      INTAB_DB
*"----------------------------------------------------------------------
  CREATE OBJECT adoconnect 'ADODB.Connection'.
  CREATE OBJECT adors 'ADODB.RecordSet'.
  init = initstr.
  SET PROPERTY OF adoconnect 'ConnectionString' = init.
  CALL METHOD OF adoconnect 'Open'.
  SET PROPERTY OF adors 'CursorType' = 3.
  SET PROPERTY OF adors 'LockType' = 1.
  SET PROPERTY OF adors 'ActiveConnection' = adoconnect.
  CALL METHOD OF adors 'Open'
         EXPORTING
                 #1 = sql.
  GET PROPERTY OF adors 'EOF' = eof.
  REFRESH intab_db.
  ASSIGN ('intab_db[]') TO <fs_int>.
  ASSIGN ('fc[]') TO <fs_tab>.
  CREATE DATA dref LIKE intab_db.
  ASSIGN dref->* TO <fs_ref>.
  <fs_ref> = intab_db.
  WHILE eof = '0'.
    LOOP AT <fs_tab> ASSIGNING <fs_line>.
      field_name = <fs_line>-fieldname.
      CALL METHOD OF adors 'fields' = adofield
            EXPORTING
              #1 = field_name.
      GET PROPERTY OF adofield 'Value' = value.
      ASSIGN COMPONENT field_name OF STRUCTURE <fs_ref> TO <fs>.
      <fs> = value.
    ENDLOOP.
    APPEND <fs_ref> TO intab_db.
    FREE adofield.
    CALL METHOD OF adors 'MoveNext'.
    GET PROPERTY OF adors 'EOF' = eof.
  ENDWHILE.
  UNASSIGN <fs_tab>.
  UNASSIGN <fs_int>.
  FREE adoconnect.
  FREE adofield.
  FREE adors.
ENDFUNCTION.


Code:
FUNCTION-POOL zmelnikov.                    "MESSAGE-ID ..
TYPE-POOLS: slis.
TYPE-POOLS: ole2.
DATA: adoconnect      TYPE ole2_object,
      adors           TYPE ole2_object,
      adofield        TYPE ole2_object,
      init(400)       TYPE c,
      field_name(253) TYPE c,
      value(253)      TYPE c,
      eof(1)          TYPE c.

DATA: dref TYPE REF TO data.

FIELD-SYMBOLS: <fs_line> TYPE slis_fieldcat_alv,
               <fs_ref>  TYPE ANY,
               <fs>     TYPE ANY,
               <fs_tab>  TYPE slis_t_fieldcat_alv,
               <fs_int>  TYPE ANY TABLE.


Замечания приветствуются.


Последний раз редактировалось Mitya Вт, дек 04 2007, 13:09, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, дек 04 2007, 11:46 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 13:16
Сообщения: 1790
Скорее предложение, нежели замечание: опубликовать исходник на http://abapedia.org

_________________
/nex


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

Зарегистрирован:
Вт, дек 06 2005, 11:22
Сообщения: 72
Откуда: Krivoy Rog
Есть смысыл анализировать рекордсет не по полям, а сразу call method of rs 'GetString' = строка с разделителями. Это несколько быстрее работает.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: ФМ работающий с ADO.CONNECTION
СообщениеДобавлено: Вс, мар 28 2010, 13:31 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, мар 13 2007, 22:57
Сообщения: 71
Mitya написал:
Была задача конектится сапом к БД Interbase, почитав форум понял что это возможнно(правда медленно) через ADO.CONNECTION. Почитав и по экспериментировав в конечном итоге родился ФМ, может конечно он и криворват, но работает. Может кому пригодится.

Замечания приветствуются.


простите, а можно пример использования.

мне не понятны параметры вызова, где нужно прописывать местоположение БД, имя пользователя с паролем. здесь используется какой-то другой принцип


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ФМ работающий с ADO.CONNECTION
СообщениеДобавлено: Вс, мар 28 2010, 14:17 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Чт, мар 09 2006, 10:12
Сообщения: 565
Откуда: Волгодонск
Пол: Мужской
birds написал(а):
Mitya написал:
Была задача конектится сапом к БД Interbase, почитав форум понял что это возможнно(правда медленно) через ADO.CONNECTION. Почитав и по экспериментировав в конечном итоге родился ФМ, может конечно он и криворват, но работает. Может кому пригодится.

Замечания приветствуются.


простите, а можно пример использования.

мне не понятны параметры вызова, где нужно прописывать местоположение БД, имя пользователя с паролем. здесь используется какой-то другой принцип


если бы слегка напряглись и прочитали текст модуля то увидели бы что входной параметр ФМ INITSTR и есть ConnectionString

_________________
Изображение Попытка не пытка


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ФМ работающий с ADO.CONNECTION
СообщениеДобавлено: Пт, апр 02 2010, 11:50 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, мар 13 2007, 22:57
Сообщения: 71
[quote="Mitya"]Была задача конектится сапом к БД Interbase, почитав форум понял что это возможнно(правда медленно) через ADO.CONNECTION. Почитав и по экспериментировав в конечном итоге родился ФМ, может конечно он и криворват, но работает. Может кому пригодится.

FUNCTION z_db_ado_connect.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*" IMPORTING
*" REFERENCE(SQL) TYPE STRING
*" REFERENCE(INITSTR) TYPE STRING
*" REFERENCE(FC) TYPE SLIS_T_FIELDCAT_ALV
*" TABLES
*" INTAB_DB
*"----------------------------------------------------------------------
[/code]

использую Вашу функцию в своей программе
Code:
TYPE-POOLS: slis.
tables: ZNAME.
data: sql type STRING,
      FC TYPE  SLIS_T_FIELDCAT_ALV,
      initstr type string.
DATA:
ls_fieldcat TYPE slis_fieldcat_alv,
lt_fieldcat TYPE slis_t_fieldcat_alv
.

data: INTAB_DB type STANDARD TABLE OF ZNAME.
data:     wa like LINE OF INTAB_DB.

CLEAR ls_fieldcat.
ls_fieldcat-tabname = 'NAME'.
ls_fieldcat-fieldname = 'ID'.
APPEND ls_fieldcat TO lt_fieldcaT.

CLEAR ls_fieldcat.
ls_fieldcat-tabname = 'NAME'.
ls_fieldcat-fieldname = 'SHORT_NAME '.
APPEND ls_fieldcat TO lt_fieldcaT.

sql = 'SELECT  * FROM name'.

* ... понятно конкретные значения
concatenate
'Provider=LCPI.IBProvider.3.Free'
'Persist Security Info=False'
'User ID=....'
'Password=....'
'Location=.....FOREPF.IB'
into initstr  separated by ';'.


CALL FUNCTION 'Z_DB_ADO_CONNECT'
  EXPORTING
    SQL            =  sql
    INITSTR        =  initstr
    FC             =  lt_fieldcaT
  TABLES
     INTAB_DB       = INTAB_DB.


после connect SY-SUBRC = 0, а
строка
Code:
GET PROPERTY OF adors 'EOF' = eof.     

выполняется с SY-SUBRC = 2. и
eof пусто.

подскажите, пожалуйста, в чем ошибка


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ФМ работающий с ADO.CONNECTION
СообщениеДобавлено: Пт, апр 02 2010, 14:31 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Чт, мар 09 2006, 10:12
Сообщения: 565
Откуда: Волгодонск
Пол: Мужской
"sql = 'SELECT * FROM name'."
name - это у вас имя таблицы такое, странновато немного.. но бываетъ

гораздо интереснее какой sy-subrc после CALL METHOD OF adors 'Open' ....

рекомендую включить трассировку в Interbase да посмотреть былли коннект и т.д.

_________________
Изображение Попытка не пытка


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ФМ работающий с ADO.CONNECTION
СообщениеДобавлено: Пт, апр 02 2010, 15:18 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, мар 13 2007, 22:57
Сообщения: 71
DKiyanov написал:
"sql = 'SELECT * FROM name'."
name - это у вас имя таблицы такое, странновато немного.. но бываетъ

гораздо интереснее какой sy-subrc после CALL METHOD OF adors 'Open' ....

рекомендую включить трассировку в Interbase да посмотреть былли коннект и т.д.


после CALL METHOD OF adors 'Open'
sy-subrc = 0.

подскажите, как включить трассировку, пожалуйста

название таблиц было изменено, реально они другие, конечно


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ФМ работающий с ADO.CONNECTION
СообщениеДобавлено: Вт, апр 13 2010, 15:41 
Младший специалист
Младший специалист

Зарегистрирован:
Пт, янв 11 2008, 06:48
Сообщения: 94
У меня была другая задача-как выгрузить содержание внутр. таблицы на SQL-сервер. Предлагаю следующее решение:
Code:
FUNCTION ZSQL_INSERT_TAB.
*"----------------------------------------------------------------------
*"*"Локальный интерфейс:
*"  IMPORTING
*"     REFERENCE(CATALOG) TYPE  C DEFAULT 'CHMK'
*"     REFERENCE(DATA_SOURCE) TYPE  C DEFAULT 'UK-ECON-150'
*"     REFERENCE(SQL_TABLE) TYPE  C
*"  TABLES
*"      T_OUTTAB
*"  EXCEPTIONS
*"      SQLCMDERROR
*"      SQLNOCONNECT
*"----------------------------------------------------------------------

INCLUDE ole2incl.

Types:
  begin of abap_compdescr,
    lenght   type i,
    decimals type i,
    type_kid type c,
    name(30) type c,
  end of abap_compdescr.

FIELD-SYMBOLS: <l_struct> type abap_compdescr,
               <t_tab>    type any table,
               <val>.

Data:
  len       type i,
  l_line    type ref to cl_abap_structdescr,
  it_struct type table of abap_compdescr,
  wa_fcat   type lvc_s_fcat,
  it_fact   type lvc_t_fcat,
  table     type ref to data.

Data:
  oConn        type ole2_object,
  cmd          type ole2_object,
  conStr(500),
  state        type i,
  field_name(50),
  Value        type string,
  cmdTxt       type string,
  insTxt       type string,
  valTxt       type string.

concatenate 'Provider=SQLNCLI.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=' CATALOG ';Data Source=' DATA_SOURCE into conStr.
*write conStr.
create object oConn 'adodb.connection'.

* Установка соединения с SQL-сервером
set property of oConn 'ConnectionString' = conStr.
call method of oConn 'Open'.
if sy-subrc ne 0.
  raise SQLNoConnect.
endif.

* создение объекта SQL-команда
create object cmd 'adodb.command'.
set property of cmd 'ActiveConnection' = oConn.

*set property of cmd 'CommandText'      = 'INSERT TEST (ID) VALUES (2)'.

* определяем структуру внутренней таблицы и составляем заголовок
l_line ?= cl_abap_typedescr=>describe_by_data( p_data = t_outtab ).
it_struct[] = l_line->components.
insTxt = '('.
loop at it_struct assigning <l_struct>.
  concatenate insTxt <l_struct>-name into insTxt.
  concatenate insTxt ',' into insTxt.
endloop.
*shift insTxt right deleting trailing space.
*shift insTxt.
*shift insTxt right.
*shift insTxt up to '('.
len = strlen( insTxt ) - 1.
insTxt = insTxt+0(len).
concatenate insTxt ')' into insTxt.
* выгружаем таблицу на SQL-сервер
loop at t_outtab.
  cmdTxt = ''.
  valTxt = '('.
  loop at it_struct assigning <l_struct>.
    concatenate 't_outtab-' <l_struct>-name into field_name.
    assign (field_name) to <val>.

    if <l_struct>-TYPE_KID = 'I' or <l_struct>-TYPE_KID = 'P' or <l_struct>-TYPE_KID = 'F'.
      if <val> < 0.
        Value = <val> * -1.
        concatenate '-' Value into Value.
      else.
        Value = <val>.
      endif.
*      shift Value right deleting trailing space.
      concatenate valTxt '''' value ''',' into valTxt.
    elseif <l_struct>-TYPE_KID = 'C' or <l_struct>-TYPE_KID = 'N' or <l_struct>-TYPE_KID = 'D'.
* Удаляем символ ' из строки.
      value = <val>.
      translate value using '''"'.
      concatenate valTxt '''' value ''',' into valTxt.
*      concatenate valTxt '''' <val> ''',' into valTxt.
    else.
      concatenate valTxt '''0'',' into valTxt.
    endif.
  endloop.
*  shift valTxt right deleting trailing space.
*  shift valTxt right.
*  shift valTxt up to '('.
  len = strlen( valTxt ) - 1.
  valTxt = valTxt+0(len).
  concatenate valTxt ')' into valTxt.
*  write valTxt.
  concatenate 'INSERT ' SQL_TABLE insTxt ' VALUES ' valTxt into cmdTxt separated by ' '.
*  write cmdTxt.
  set property of cmd 'CommandText' = cmdTxt.
* выполение SQL команды
  call method of cmd 'Execute'.
  if sy-subrc ne 0.
    write cmdTxt.
    raise SQLCmdError.
  endif.
endloop.
call method of oConn 'Close'.
ENDFUNCTION.

В качестве БД куда хотелось бы выгружать информацию можно использовать любую, главное правильно определить ConnectionString и конечно же струтура вн. таблицы должна быть такая же как и в БД


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ФМ работающий с ADO.CONNECTION
СообщениеДобавлено: Пт, сен 03 2010, 13:28 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, мар 13 2007, 22:57
Сообщения: 71
eremkin написал(а):
У меня была другая задача-как выгрузить содержание внутр. таблицы на SQL-сервер. Предлагаю следующее решение:
Code:

call method of oConn 'Close'.

В качестве БД куда хотелось бы выгружать информацию можно использовать любую, главное правильно определить ConnectionString и конечно же струтура вн. таблицы должна быть такая же как и в БД


после этого оператора на сервере остаются висящие Attachment'ы, которые закрывается только когда я выхожу из sap.

пара вопросов, в связи с этим:

Как проверить, что соединение уже есть.

Как закрыть соединение принудительно.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ФМ работающий с ADO.CONNECTION
СообщениеДобавлено: Пн, сен 06 2010, 01:38 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Чт, мар 09 2006, 10:12
Сообщения: 565
Откуда: Волгодонск
Пол: Мужской
eremkin написал(а):
У меня была другая задача-как выгрузить содержание внутр. таблицы на SQL-сервер. Предлагаю


Если у вас САП стоит на винде, то гораздо лучшим решением будет непосредственное обращение к MS SQL-серверу из САП сервера

_________________
Изображение Попытка не пытка


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ФМ работающий с ADO.CONNECTION
СообщениеДобавлено: Пн, сен 06 2010, 09:34 
Младший специалист
Младший специалист

Зарегистрирован:
Вт, мар 13 2007, 22:57
Сообщения: 71
DKiyanov написал:
eremkin написал(а):
У меня была другая задача-как выгрузить содержание внутр. таблицы на SQL-сервер. Предлагаю


Если у вас САП стоит на винде, то гораздо лучшим решением будет непосредственное обращение к MS SQL-серверу из САП сервера


у меня обращение идет к InterBase, а не к MS SQL-серверу. все работает, только коннект рвется когда я из SAP выхожу, и меня это не устраивает


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ФМ работающий с ADO.CONNECTION
СообщениеДобавлено: Вт, апр 03 2012, 15:40 
Ассистент
Ассистент

Зарегистрирован:
Ср, дек 02 2009, 14:37
Сообщения: 44
birds написал(а):
eremkin написал(а):
У меня была другая задача-как выгрузить содержание внутр. таблицы на SQL-сервер. Предлагаю следующее решение:
Code:

call method of oConn 'Close'.

В качестве БД куда хотелось бы выгружать информацию можно использовать любую, главное правильно определить ConnectionString и конечно же струтура вн. таблицы должна быть такая же как и в БД


после этого оператора на сервере остаются висящие Attachment'ы, которые закрывается только когда я выхожу из sap.

пара вопросов, в связи с этим:

Как проверить, что соединение уже есть.

Как закрыть соединение принудительно.


Привет всем! Кто-то знает как принудительно закрыть соединение?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: ФМ работающий с ADO.CONNECTION
СообщениеДобавлено: Ср, апр 04 2012, 10:49 
Специалист
Специалист
Аватара пользователя

Зарегистрирован:
Чт, ноя 13 2008, 13:40
Сообщения: 152
меня кстати тоже этот вопрос интересует.
Соединение окрывается и вивсит на сервере открытым, пока не закроется система SAP. :shock:


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ФМ работающий с ADO.CONNECTION
СообщениеДобавлено: Ср, апр 04 2012, 12:48 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
По идее следует последовательно выполнять закрытие: сперва у датасета, а потом уже у коннекшена.
Посмотрите пример в MSDN, он на VB, но достаточно прозрачный для понимания.

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


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

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


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

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


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

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