Текущее время: Чт, июл 24 2025, 01:45

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


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

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


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

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