Текущее время: Сб, авг 02 2025, 12:24

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


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


ВНИМАНИЕ!

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



Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Как присвоить массив свойству в Excel (OLE)?
СообщениеДобавлено: Вт, май 31 2005, 10:04 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Пн, янв 24 2005, 16:22
Сообщения: 749
Пол: Мужской
Здравствуйте!

Столкнулся с проблемой: надо присвоить свойству ( SET PROPERTY OF ole2_object 'PropertyName' = Array ) не отдельное значение, а массив. То есть в Excel VBA это было бы записано так
Code:
PropertyName = Array(1, 2, 3, 4)


Что-то сейчас у меня это не получается :(

Может быть есть у кого-нибудь идеи?
Буду рад любым советам!

P.S. кажется, что как-то надо отдельно создать массив, а уже потом его как ole2_object присваивать свойству, но как именно не знаю...

_________________
Счастье есть!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как присвоить массив свойству в Excel (OLE)?
СообщениеДобавлено: Вт, май 31 2005, 10:46 
Директор
Директор

Зарегистрирован:
Чт, май 12 2005, 11:10
Сообщения: 1038
Пол: Мужской
Tetty написал:
Здравствуйте!

Столкнулся с проблемой: надо присвоить свойству ( SET PROPERTY OF ole2_object 'PropertyName' = Array ) не отдельное значение, а массив. То есть в Excel VBA это было бы записано так
Code:
PropertyName = Array(1, 2, 3, 4)


Что-то сейчас у меня это не получается :(

Может быть есть у кого-нибудь идеи?
Буду рад любым советам!

P.S. кажется, что как-то надо отдельно создать массив, а уже потом его как ole2_object присваивать свойству, но как именно не знаю...


Думаю что я тебя огорчу до невозможности. Если мне память не изменяет, то объекту OLE-АВАР нельзя присваивать типы String, Array и TypeRef. Покрайней мере Ctrl+F2 именно об этом и говорит.
Такчто передать массив строк-солбцов неполучица! :evil:


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, май 31 2005, 10:48 
Гость
массивы в COM не передаются. Создавай свой COM класс - аналог нужного массива, или используй готовый, например ADO RS. В Excel пиши макрос, на входе которого объект созданного \ используемого вида. Внутри макроса - средствами VBA заполняешь массив и проч. В abap объявляешь объект, заполняешь его строками (это на примере ADO RS), вызываешь макрос Excel с передачей созданного объекта.


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, май 31 2005, 11:00 
Директор
Директор

Зарегистрирован:
Чт, май 12 2005, 11:10
Сообщения: 1038
Пол: Мужской
AnS1 написал(а):
массивы в COM не передаются. Создавай свой COM класс - аналог нужного массива, или используй готовый, например ADO RS. В Excel пиши макрос, на входе которого объект созданного \ используемого вида. Внутри макроса - средствами VBA заполняешь массив и проч. В abap объявляешь объект, заполняешь его строками (это на примере ADO RS), вызываешь макрос Excel с передачей созданного объекта.


ну положим СОМ тут совсем непричем :) в общем случае - например написав СОМ-объект на С++ - ничто не помешает тебе передать Array СОМ-объекту(SafeArray). Другое дело что АВАР "не понимает" этого. :evil:


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, май 31 2005, 12:00 
Гость
да-а уж, но оптимизм пока не теряю

я же не хочу перенести целый массив из ABAP в VBA (к тому же - что такое массив в ABAP? :))

Всего лишь надо присвоить небольшой массив одному из свойств. Можно присвоить массив от другого объекта через GET и SET PROPERTY, но мне его нужно создать, а как - не знаю :(

В Excel написано, что сам объект создается с помощью функции Array(), которая возвращает Variant, либо через последовательное наполнение массива элементами. К сожалению, у меня пока нет идей (и не получается) создать "чистый" вариант или вызвать внутреннюю функцию Array...

может еще как-нибудь исхитриться ?)


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, май 31 2005, 12:03 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Пн, янв 24 2005, 16:22
Сообщения: 749
Пол: Мужской
предыдущее сообщение мое (и куда только мои сессии деваются ?()

_________________
Счастье есть!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, май 31 2005, 14:43 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 13:16
Сообщения: 1790
А может DOI чем поможет? См. Exchanging Data Between R/3 and the Desktop Application
При помощи Link Server или Table Collection складываем данные, а потом на стороне Excel - достаем.
Или работа макроса на стороне Excel не предполагается?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт, май 31 2005, 15:17 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Пн, янв 24 2005, 16:22
Сообщения: 749
Пол: Мужской
Bully написал(а):
А может DOI чем поможет? См. Exchanging Data Between R/3 and the Desktop Application
При помощи Link Server или Table Collection складываем данные, а потом на стороне Excel - достаем.
Или работа макроса на стороне Excel не предполагается?


а можно быстро и динамически сделать макрос через abap?

на самом деле проблема встала в конкретном месте при использовании QueryTable: выгружаю внутреннюю таблицу из abap в dat файл. После чего открываю Excel и создаю QueryTable запрос к выгруженному файлу. Он отлично работает. НО для корректной обработки полей необходимо задавать свойство-массив TextFileColumnDataTypes, в котором описывается каким образом интерпретировать типы столбцов.

И сейчас у меня не получается даже прочитать значение VBA массива.

_________________
Счастье есть!


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 01 2005, 12:10 
Гость
Egal написал:
AnS1 написал(а):
массивы в COM не передаются. .


ну положим СОМ тут совсем непричем :) в общем случае - например написав СОМ-объект на С++ - ничто не помешает тебе передать Array СОМ-объекту(SafeArray). Другое дело что АВАР "не понимает" этого. :evil:

Те же уши, вид сбоку. С точки зрения программиста SAFEARRAY - всего лишь еще одна структура со своим набором функций, принципиально не отличающаяся от рекордсета или своего объекта. В любом случае hResult=SafeArrayGetElement(my_array, index, &my_var) не настолько изящно как my_var=my_array[index]. Т.о., постулат остается прежним - в COM массивов нет.


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 01 2005, 12:32 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 13:16
Сообщения: 1790
Tetty написал:
а можно быстро и динамически сделать макрос через abap?

Вопрос должен звучать так: "Возможно ли динамическое создание макросов?"
Да возможно, а через ABAP или нет - это не важно.
Используй объектную модель VBA и вперед. (Смотри MSDN)
К стати при отображении ALV в ракурсе Excel, на сколько я помню, именно этот механизм и используется - динамически создаются макросы, а потом убираются.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср, июн 01 2005, 13:02 
Менеджер
Менеджер
Аватара пользователя

Зарегистрирован:
Пн, янв 24 2005, 16:22
Сообщения: 749
Пол: Мужской
Bully написал(а):
Tetty написал:
а можно быстро и динамически сделать макрос через abap?

Вопрос должен звучать так: "Возможно ли динамическое создание макросов?"
Да возможно, а через ABAP или нет - это не важно.
Используй объектную модель VBA и вперед. (Смотри MSDN)
К стати при отображении ALV в ракурсе Excel, на сколько я помню, именно этот механизм и используется - динамически создаются макросы, а потом убираются.


Спасибо за подсказки!

попытаюсь разобраться...

_________________
Счастье есть!


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

Зарегистрирован:
Вт, апр 05 2005, 17:02
Сообщения: 70
AnS1 написал(а):
Egal написал:
AnS1 написал(а):
массивы в COM не передаются. .


ну положим СОМ тут совсем непричем :) в общем случае - например написав СОМ-объект на С++ - ничто не помешает тебе передать Array СОМ-объекту(SafeArray). Другое дело что АВАР "не понимает" этого. :evil:

Те же уши, вид сбоку. С точки зрения программиста SAFEARRAY - всего лишь еще одна структура со своим набором функций, принципиально не отличающаяся от рекордсета или своего объекта. В любом случае hResult=SafeArrayGetElement(my_array, index, &my_var) не настолько изящно как my_var=my_array[index]. Т.о., постулат остается прежним - в COM массивов нет.

Ну, это совсем не верно... :)
Цитата:
С точки зрения программиста SAFEARRAY - всего лишь еще одна структура
со своим набором данных, в т.ч. с указателем на массив. Этот указатель можно получить и работать с ним как с обычным массивом. Пример из МСДН:
Code:
Example
The following example sorts a safearray of one dimension that contains BSTRs by accessing the array elements directly. This approach is faster than using SafeArrayGetElement and SafeArrayPutElement.

long i, j, min;
BSTR bstrTemp;
BSTR HUGEP *pbstr;
HRESULT hr;

// Get a pointer to the elements of the array.
hr = SafeArrayAccessData(psa, (void HUGEP**)&pbstr);
if (FAILED(hr))
goto error;

// Selection sort.
for (i = 0; i < psa->rgsabound.cElements-1; i++)
{
   min = i;
   for (j = i+1; j < psa->rgsabound.cElements; j++)
   {
      if (wcscmp(pbstr[j], pbstr[min]) < 0)
         min = j;
   }

   // Swap array[min] and array[i].
   bstrTemp = pbstr[min];
   pbstr[min] = pbstr[i];
   pbstr[i] = bstrTemp;

}

SafeArrayUnaccessData(psa);

А предлагаемые системой функции просто позволяют контролировать данные, например, границы массива.
Так что всё-таки имеем проблемы САПа, а не COMа :)


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, июн 03 2005, 13:50 
Гуру-модератор
Гуру-модератор
Аватара пользователя

Зарегистрирован:
Пн, окт 11 2004, 13:16
Сообщения: 1790
:lol:
Что-то вы увлеклись ребята!
Мы же здесь говорим на ABAP'е а не на C


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, июн 03 2005, 14:12 
Гость
точнее, о недостатках АБАПа. :)


Принять этот ответ
Вернуться к началу
  
 
 Заголовок сообщения:
СообщениеДобавлено: Пт, июн 03 2005, 14:50 
Директор
Директор

Зарегистрирован:
Чт, май 12 2005, 11:10
Сообщения: 1038
Пол: Мужской
Вольдемар написал(а):
SafeArrayUnaccessData(psa);
А предлагаемые системой функции просто позволяют контролировать данные, например, границы массива.
Так что всё-таки имеем проблемы САПа, а не COMа :)


вотвот! :lol: товрищъ путает тёплое с мягким ;-)


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

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


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

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


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

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