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

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


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

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


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

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