07.07.2004, 16:04 | #1 |
Участник
|
Что надо сделать, чтобы пердать Variant Array как параметр в метод COM обекта?
|
|
07.07.2004, 16:12 | #2 |
Модератор
|
Передавать - не передавал, а получал через COMVariant.safeArray()
__________________
-ТСЯ или -ТЬСЯ ? |
|
07.07.2004, 16:14 | #3 |
Модератор
|
KERNDOC://Classes/COMVariant/safeArray
а тут пример с передачей
__________________
-ТСЯ или -ТЬСЯ ? |
|
08.07.2004, 08:14 | #4 |
Участник
|
Цитата:
Сообщение от Vadik
KERNDOC://Classes/COMVariant/safeArray
а тут пример с передачей Это первое, что я сделал - но это не работает. <div class='XPPtop'>X++</div><div class='XPP'> COMVariant a = [color=:blue]new[/color] ComVariant(COMVariantInOut::IN, COMVariantType::VT_SAFEARRAY); Array arr; arr = [color=:blue]new[/color] Array(Types::Integer); arr.value(1, 0); arr.value(2, 0); a.safeArray(arr, COMVariantType::VT_VARIANT); cell = cellSet.Item(a);</div> Имеем: [id(00000000), propget, vararg, helpcontext(0x00315634)] Cell* Item([in] SAFEARRAY(VARIANT)* idx); Обрати внимание, что idx передается по ссылке - может в этом проблема? |
|
08.07.2004, 11:21 | #5 |
Модератор
|
А можно привести кусок X++ кода целиком?
Иначе гадать я могу, а проверять - нет
__________________
-ТСЯ или -ТЬСЯ ? |
|
08.07.2004, 12:35 | #6 |
Участник
|
Цитата:
Сообщение от Vadik
А можно привести кусок X++ кода целиком?
Иначе гадать я могу, а проверять - нет Класс Cellset - это результат запроса к кубу OLAP, а самого куба у вас, естественно, нет. Насколько я понимаю, вы уже работали с какими-то COM объектами в Аксапте. Может среди этих объектов найдется объект, у которого есть метод, принимающий Variant Array в качестве входного параметра, тогда вы смело можете на нем проверять свои идеи. |
|
08.07.2004, 12:46 | #7 |
Модератор
|
Цитата:
Сообщение от TravellerInTime
Кусок кода привести я, конечно, могу, но работать он у вас не будет.
Класс Cellset - это результат запроса к кубу OLAP, а самого куба у вас, естественно, нет. Насколько я понимаю, вы уже работали с какими-то COM объектами в Аксапте. Может среди этих объектов найдется объект, у которого есть метод, принимающий Variant Array в качестве входного параметра, тогда вы смело можете на нем проверять свои идеи. Входных параметров COMVariantType::VT_SAFEARRAY не использовал. Проверить хочется, но не сейчас, попозже Ну и если решение отыщется - опубликуйте, если не жалко
__________________
-ТСЯ или -ТЬСЯ ? |
|
08.07.2004, 13:13 | #8 |
Участник
|
Написал Job, который использует демобазу в OLAPе.
Соответственно в connectionString имя сервера замениь надо. <div class='XPPtop'>X++</div><div class='XPP'> #define.ADOMDCellset([color=:red]"ADOMD.Cellset"[/color]) #define.ADODBConnection([color=:red]"ADODB.Connection"[/color]) [color=:blue]static[/color] [color=:blue]void[/color] Job1(Args _args) { COM connection = [color=:blue]new[/color] COM(#ADODBConnection); COM cellSet = [color=:blue]new[/color] COM(#ADOMDCellset); COM axes, axis0, axis1; COM positions0, positions1, position0, position1; COM members, member; COM cell; COMVariant a = [color=:blue]new[/color] ComVariant(COMVariantInOut::IN, COMVariantType::VT_SAFEARRAY); Array arr; [color=:blue]str[/color] connectionString = [color=:red]"Provider=msolap; Datasource=SQLTEST; Initial Catalog=FoodMart 2000"[/color]; [color=:blue]str[/color] selectString = [color=:red]"select\r\n"[/color]+ [color=:red]" {[Measures].[Unit Sales]} on columns,\r\n"[/color]+ [color=:red]" order(except([Promotion Media].[Media Type].members,{[Promotion Media].[Media Type].[No Media]}),[Measures].[Unit Sales],DESC) on rows\r\n"[/color]+ [color=:red]"from Sales"[/color]; [color=:blue]int[/color] i0, i1; [color=:blue]str[/color] printStr; ; connection.Open(connectionString); cellSet.Open(selectString, connection); axes = cellSet.Axes(); axis0 = axes.Item(0); axis1 = axes.Item(1); positions0 = axis0.Positions(); positions1 = axis1.Positions(); [color=:blue]for[/color] (i1 = 0; i1 < positions1.[color=:blue]Count[/color](); i1++) { position1 = positions1.Item(i1); members = position1.Members(); member = members.Item(0); printStr = member.Caption(); [color=:blue]for[/color] (i0 = 0; i0 < positions0.[color=:blue]Count[/color](); i0++) { arr = [color=:blue]new[/color] Array(Types::Integer); arr.value(1, i0); arr.value(2, i1); a.safeArray(arr, COMVariantType::VT_VARIANT); cell = cellSet.Item(a); printStr += [color=:red]" "[/color]+cell.FormattedValue(); } [color=:blue]print[/color] printStr; } cellSet.Close(); connection.Close(); [color=:blue]pause[/color]; }</div> |
|