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

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


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

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


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

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