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

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 22 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: таблица как импортируемый параметр метода OLE
СообщениеДобавлено: Пт, апр 21 2006, 15:14 
Старший специалист
Старший специалист

Зарегистрирован:
Пт, ноя 12 2004, 10:44
Сообщения: 370
Откуда: Москва
Есть метод одного объекта ActiveX, который возвращает массив в виде variant. Есть ли возможность его правильно принять? какие пути решения проблемы можно применить? :( единственное упоминание про variant встретил в AC_CALL_METHOD... но что-то никак не помогает сие. :(


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

Зарегистрирован:
Пн, окт 11 2004, 13:16
Сообщения: 1790
Думаю SAP Data Provider тебе поможет.
Посмотри класс разработки, к кторому относятся его ФМ - там много примеров.

_________________
/nex


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: таблица как импортируемый параметр метода OLE
СообщениеДобавлено: Вс, апр 23 2006, 21:44 
Директор
Директор

Зарегистрирован:
Чт, май 12 2005, 11:10
Сообщения: 1038
Пол: Мужской
holocron написал(а):
Есть метод одного объекта ActiveX, который возвращает массив в виде variant. Есть ли возможность его правильно принять? какие пути решения проблемы можно применить? :( единственное упоминание про variant встретил в AC_CALL_METHOD... но что-то никак не помогает сие. :(


Если мне не изменяет память, то хелп говорит примерно следущее(в вольном переводе):
"... в качестве параметра... вы не можете использовать таблицы, классы или reference на них ...". Другими словами параметры передаются ByVal. ByRef - нельзя.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: таблица как импортируемый параметр метода OLE
СообщениеДобавлено: Пн, апр 24 2006, 12:33 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 13:16
Сообщения: 1790
Egal написал:
Если мне не изменяет память, то хелп говорит примерно следущее(в вольном переводе):
"... в качестве параметра... вы не можете использовать таблицы, классы или reference на них ...". Другими словами параметры передаются ByVal. ByRef - нельзя.

В качестве параметра чего?

_________________
/nex


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: таблица как импортируемый параметр метода OLE
СообщениеДобавлено: Вт, апр 25 2006, 22:37 
Директор
Директор

Зарегистрирован:
Чт, май 12 2005, 11:10
Сообщения: 1038
Пол: Мужской
Bully написал(а):
Egal написал:
Если мне не изменяет память, то хелп говорит примерно следущее(в вольном переводе):
"... в качестве параметра... вы не можете использовать таблицы, классы или reference на них ...". Другими словами параметры передаются ByVal. ByRef - нельзя.

В качестве параметра чего?


А о чем шла речь? Помоему речь шла об ActiveX-е. Значит из АВАРа на него будет "смотреть" объект OLE. Так вот для вызовов методов объектов OLE из АВАР "нельзя использовать..." и далее по тексту.

В случае передачи в OLE-объект получите либо ошибку компилятора, либо дамп(можно обмануть компилятор неявным объявлением таблицы).

В случе передачи из OLE-объекта - дампа можно избежать, но получите только 1 строку из реального набора.


Выхода из данной ситуации вижу два:

1. напишите wrapper для этого ActiveX. У этого враппера должен быть метод, черпающий данные по-строчно.

2. можно попробовать через ADO-Recordset.
зная возвращаемую структуру можно через ASSIGN пробежаться по всем полям и всем строкам(примеры тут гдето пробегали по-моему).
Но это фактически будет тотже OLE - значит могут быть проблемы с performance.

MfG.


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

Зарегистрирован:
Пн, окт 11 2004, 13:16
Сообщения: 1790
Просто не понятно из какого хелпа да еще столь вольный перевод :)
ByRef и ByVal помоему тут ни при чем :)

Для работы с OLE есть решение Data Provider, на которое ссылка постом выше. В частности он позволяет обойти ограничение на размер передаваемых данных при вызове OLE-методов, а так же упрощает обработку данных некоторых типов (IStream, VARIANT и пр.)

Подробнее см. SAP Library, курс BC412 и примеры в системе. Там достаточно все понятно, единственное что меня смущает, что в вопросе спрашивается о массиве VARIANT.

Data Provider с VARIANT'ом работает - это 100%, но как при помощи него разбирать массивы - на вскидку не отвечу - давно юзал.

_________________
/nex


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, май 03 2006, 19:56 
Старший специалист
Старший специалист

Зарегистрирован:
Пт, ноя 12 2004, 10:44
Сообщения: 370
Откуда: Москва
долго искал примеры, читал доку с help.sap.com, так и не догнал, как data provider может помочь? если можно кой-нить простецкий пример? насколько я понял, dp позволяет обращаться к свойствам (properties) нужного компонента, но как с помощью него получить результат выполнения метода? похоже без wrapper'а никуда.. :(


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, май 03 2006, 21:02 
Младший специалист
Младший специалист
Аватара пользователя

Зарегистрирован:
Пн, окт 18 2004, 12:27
Сообщения: 93
holocron написал(а):
долго искал примеры, читал доку с help.sap.com, так и не догнал, как data provider может помочь? если можно кой-нить простецкий пример? насколько я понял, dp позволяет обращаться к свойствам (properties) нужного компонента, но как с помощью него получить результат выполнения метода? похоже без wrapper'а никуда.. :(


Посмотри как работают классы CL_GUI_*.
Я, в свое время, для взаимодействия с ActiveX делал класс - наследник CL_GUI_OBJECT и писал по аналогии со стандартными контролами.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, май 04 2006, 09:40 
Директор
Директор

Зарегистрирован:
Чт, май 12 2005, 11:10
Сообщения: 1038
Пол: Мужской
Bully написал(а):
Просто не понятно из какого хелпа да еще столь вольный перевод :)

Напишите код, в котором в вызов метода OLE подставьте таблицу.
Ctrl+F3 => Обработать ошибку => в низу редактора получаем окошко с ошибкой.

Bully написал(а):
ByRef и ByVal помоему тут ни при чем :)

Обоснуйте.


Bully написал(а):
Для работы с OLE есть решение Data Provider, на которое ссылка постом выше. В частности он позволяет обойти ограничение на размер передаваемых данных при вызове OLE-методов, а так же упрощает обработку данных некоторых типов (IStream, VARIANT и пр.)

Подробнее см. SAP Library, курс BC412 и примеры в системе. Там достаточно все понятно, единственное что меня смущает, что в вопросе спрашивается о массиве VARIANT.

Вот именно - о массиве VARIANT-ов.
Как в общем случае такой массив будет передаваться из приложения в приложение - ByVal или ByRef ?

В нашей задаче мы имеем код на АВАРе который передает данные в OLE-объект, который не только не часть нашего кода, но и вообще может быть зарегистрирован на соседней машине.


Bully написал(а):
Data Provider с VARIANT'ом работает - это 100%, но как при помощи него разбирать массивы - на вскидку не отвечу - давно юзал.

Значит предложение немного не в кассу :wink:


Последний раз редактировалось Egal Чт, май 04 2006, 09:55, всего редактировалось 1 раз.

Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, май 04 2006, 09:53 
Директор
Директор

Зарегистрирован:
Чт, май 12 2005, 11:10
Сообщения: 1038
Пол: Мужской
holocron написал(а):
долго искал примеры, читал доку с help.sap.com, так и не догнал, как data provider может помочь? если можно кой-нить простецкий пример? насколько я понял, dp позволяет обращаться к свойствам (properties) нужного компонента, но как с помощью него получить результат выполнения метода? похоже без wrapper'а никуда.. :(


Если нужно вернуть в АВАР результат как таблицу - то можно попробовать определить возвращаемый OLE объект как ADO.Recordset. (в SOLE этот объект должен быть также зарегистрирован)

Зная структуру возвращаемой таблицы - ASSIGN в цикле должен помочь. У рекордсета есть EOF, и ассигн по каждому фиелду рекордсета. В цикле перемещайтие курсор рекордсета на следующую запись - Recordset.Next; свойства и методы объекта ADO.Recordset можно посмотреть в томже Excel-е (Alt+F11, добавить Reference и потом F2)

Успехов!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, май 04 2006, 10:02 
Старший специалист
Старший специалист

Зарегистрирован:
Пт, ноя 12 2004, 10:44
Сообщения: 370
Откуда: Москва
Egal написал:
Bully написал(а):
Просто не понятно из какого хелпа да еще столь вольный перевод :)

Напишите код, в котором в вызов метода OLE подставьте таблицу.
Ctrl+F3 => Обработать ошибку => в низу редактора получаем окошко с ошибкой.

легко! :) и ошибки нет :)
Code:
data mara type table of mara.

CALL FUNCTION 'CONTROL_CALL_METHOD'
  EXPORTING
    H_CONTROL               = object
    METHOD                  = 'Test'
IMPORTING
   RETURN                  = mara
EXCEPTIONS
   CNTL_SYSTEM_ERROR       = 1
   CNTL_ERROR              = 2
   OTHERS                  = 3
          .
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.


и все без ошибок... :)
судя по хелпу, есть 2 ситуации: когда ACtiveX знает что такое дата провайдер и когда не знает. У меня второй случай. причем метод, который я вызываю, не сохраняет результат в properties объекта, а просто возвращает его. в этом случае, я не очень понимаю, к чему я должен привязать data provider.. :( не приходят данные :( все методы работают, кроме тех, что что-то возвращают :(


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, май 04 2006, 12:36 
Директор
Директор

Зарегистрирован:
Чт, май 12 2005, 11:10
Сообщения: 1038
Пол: Мужской
holocron написал(а):
Egal написал:
Bully написал(а):
Просто не понятно из какого хелпа да еще столь вольный перевод :)

Напишите код, в котором в вызов метода OLE подставьте таблицу.
Ctrl+F3 => Обработать ошибку => в низу редактора получаем окошко с ошибкой.

легко! :) и ошибки нет :)
Code:
data mara type table of mara.

CALL FUNCTION 'CONTROL_CALL_METHOD'
  EXPORTING
    H_CONTROL               = object
    METHOD                  = 'Test'
IMPORTING
   RETURN                  = mara
EXCEPTIONS
   CNTL_SYSTEM_ERROR       = 1
   CNTL_ERROR              = 2
   OTHERS                  = 3
          .
IF SY-SUBRC <> 0.
MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
         WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
ENDIF.


и все без ошибок... :)
судя по хелпу, есть 2 ситуации: когда ACtiveX знает что такое дата провайдер и когда не знает. У меня второй случай. причем метод, который я вызываю, не сохраняет результат в properties объекта, а просто возвращает его. в этом случае, я не очень понимаю, к чему я должен привязать data provider.. :( не приходят данные :( все методы работают, кроме тех, что что-то возвращают :(


Простите - Вы сейчас о чем вообще ?! :shock:

Речь вроде бы шла об объекте OLE, которому в параметр передают таблицу.

Чтото вроде:

Code:
CREATE OBJECT app 'Excel.Application'.
CALL METHOD OF app EXPORTING #1 = my_internal_table.


Или я чтото пропустил в вопросе?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Чт, май 04 2006, 12:38 
Старший специалист
Старший специалист

Зарегистрирован:
Пт, ноя 12 2004, 10:44
Сообщения: 370
Откуда: Москва
Egal написал:
holocron написал(а):
...bla...bla...bla


Простите - Вы сейчас о чем вообще ?! :shock:

Речь вроде бы шла об объекте OLE, которому в параметр передают таблицу.

Чтото вроде:

Code:
CREATE OBJECT app 'Excel.Application'.
CALL METHOD OF app EXPORTING #1 = my_internal_table.


Или я чтото пропустил в вопросе?


совершенно верно... я к тому, что при компиляции ошибок не будет. внутрь функции посмотри :)


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

Зарегистрирован:
Пн, окт 11 2004, 13:16
Сообщения: 1790
Egal написал:
Bully написал(а):
ByRef и ByVal помоему тут ни при чем :)

Обоснуйте.

Если говорить о взаимодействии ABAP программы и ActiveX, ByRef отпадает как понятие, т.к. между ABAP программой и ActiveX в таком случае всегда стоит прослойка в виде Automation Controller из SAP GUI services - это я и имел в виду. Подробнее BC412.
Egal написал:
Bully написал(а):
Data Provider с VARIANT'ом работает - это 100%, но как при помощи него разбирать массивы - на вскидку не отвечу - давно юзал.

Значит предложение немного не в кассу :wink:

Не в кассу так не в кассу - я идею дал, ваше дело ей воспользоваться :D .
holocron написал(а):
не приходят данные все методы работают, кроме тех, что что-то возвращают

Нет времени помочь, но информации о DP в виде примеров в системе и help.sap.com мне было достаточно.
Получение результатов методов я делал.

_________________
/nex


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, май 05 2006, 12:30 
Директор
Директор

Зарегистрирован:
Чт, май 12 2005, 11:10
Сообщения: 1038
Пол: Мужской
holocron написал(а):
Egal написал:
holocron написал(а):
...bla...bla...bla


Простите - Вы сейчас о чем вообще ?! :shock:

Речь вроде бы шла об объекте OLE, которому в параметр передают таблицу.

Чтото вроде:

Code:
CREATE OBJECT app 'Excel.Application'.
CALL METHOD OF app EXPORTING #1 = my_internal_table.


Или я чтото пропустил в вопросе?


совершенно верно... я к тому, что при компиляции ошибок не будет. внутрь функции посмотри :)


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

Обмануть компилятор я тоже могу - без всяких ФМ. ;-)

Моя идея заключалась в следующем.
Создать объект типа ADO.Recordset и попробовать сунуть его в вызов метода ActiveX-a как возвращаемый параметр. Если пропарит - то можно попробовать побегать по рекордсету... хотя это помоему чушь какаято ( возвращаемый параметр ведь необязательно этого типа, это может быть чтото аля string[][] ).

Если во всей цепочке используется скажем MS SQL то прицепившись к нему из под OLE "ADO.Recordset" точно можно вызвать stored_procedure, в ней создать ActiveX, дернуть метод, а вот сторед процедура и вернёт обратно массив, по которому точно можно бегать из АВАР-а, тоесть потому самому ADO.Recordset. Но это тоже какойто изврат.

Я бы просто написал врапеер.


Последний раз редактировалось Egal Пт, май 05 2006, 12:46, всего редактировалось 1 раз.

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

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


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

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


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

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