Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / OWC PivotTable: Программное получение списка отфильтрованных членов Field.ExcludedMembers / 7 сообщений из 7, страница 1 из 1
21.04.2004, 12:50
    #32489454
Phenimore_Cooper
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OWC PivotTable: Программное получение списка отфильтрованных членов Field.ExcludedMembers
Добрый день!

Вопрос такой. Мне необходимо программно получить список ExcludedMembers из фильтра (пройтись по ExcludedMembers для каждого наложенного фильтра). Делаю примерно так:

FilterAxis = PivotTable.ActiveData.FilterAxis;

for (long i = 0; i < FilterAxis.FieldSets.Count; i++) {

FieldSet = FilterAxis.FieldSets.Item(i);

for (long j=0; j<FieldSet.Fields.Count; j++) {

Field = FieldSet.Fields.Item(j);

// И здесь беру Field.ExcludedMembers и использую его


}
}

Иногда все работает нормально. А иногда Field.ExcludedMembers возвращает мне пустое место – нету ничего, хотя на самом деле фильтр по этому полю наложен, какие-то члены исключены. Причем в совершенно идентичных условиях (один и тот же куб, одна и та же структура сводной таблицы, одни и те же наложенные фильтры) то срабатывает, то нет.

Кто-нибудь подскажет, в чем дело?
...
Рейтинг: 0 / 0
21.04.2004, 14:41
    #32489836
Guestic
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OWC PivotTable: Программное получение списка отфильтрованных членов Field.ExcludedMembers
Ты не в ту сторону капаешь, Оно правильно не всегда будет работать

Тебе нужно делать так
Function RecGetStatus(ByVal oPM)
Dim oFUpd 'OWC10.PivotFilterUpdate
Dim nState
Dim c
Dim i As Int16
c = Pvt.Constants
oFUpd = oPM.Field.FieldSet.CreateFilterUpdate
nState = oFUpd.StateOf(oPM)
If nState = c.plMemberStateChecked Then
sResults = sResults & oPM.UniqueName & vbCrLf
lbFlt.Items.Add(" " & oPM.Name)
ElseIf nState = c.plMemberStateGray Then
For i = 0 To oPM.ChildMembers.Count - 1
RecGetStatus(oPM.ChildMembers(i))
Next
ElseIf nState = c.plMemberStateClear Then
End If
End Function
...
Рейтинг: 0 / 0
22.04.2004, 13:35
    #32491719
Phenimore_Cooper
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OWC PivotTable: Программное получение списка отфильтрованных членов Field.ExcludedMembers
Проблема все-таки остается в том, что для решения этим способом мне нужны PivotMember'ы, а я не пойму как из области фильтра (которая FilterAxis) получить PivotMember'ы.

Итак, проблема такая. Надо пройтись по Member'ам всех уровней измерений, которые помещены в область фильтра и узнать для каждого Member'а, включен он или исключен. Whether it is included or excluded, как написали бы где-нибудь в MSDN -)) Подскажите, как это можно сделать, а то я что-то туплю!..
...
Рейтинг: 0 / 0
22.04.2004, 16:30
    #32492319
Валек
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OWC PivotTable: Программное получение списка отфильтрованных членов Field.ExcludedMembers
'сначала из фильтра вытаскиваем все мемберы
For dimens = 0 To Main.PT.ActiveView.FilterAxis.FieldSets.Count - 1
StrCreateCube = StrCreateCube & "DIMENSION [" & CStr(Main.PT.ActiveView.FilterAxis.FieldSets.Item(dimens).Name) & "],"
StrCreateCube = StrCreateCube & "LEVEL [" & CStr(Main.PT.ActiveView.FilterAxis.FieldSets.Item(dimens).AllMember.Name) & "] TYPE ALL,"
'strCreateCube = strCreateCube & "LEVEL [" & CStr(Main.PT.ActiveView.FilterAxis.FieldSets.Item(dimens).Name) & "],"
For dimenslevel = 0 To Main.PT.ActiveView.FilterAxis.FieldSets.Item(dimens).Fields.Count - 1
StrCreateCube = StrCreateCube & "LEVEL [" & CStr(Main.PT.ActiveView.FilterAxis.FieldSets.Item(dimens).Fields.Item(dimenslevel).Name) & "],"
Next dimenslevel
Next dimens


надеюсь сможешь разобраться
...
Рейтинг: 0 / 0
23.04.2004, 17:00
    #32494712
Phenimore_Cooper
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OWC PivotTable: Программное получение списка отфильтрованных членов Field.ExcludedMembers
2 Валек:

Нет, это не то - таким образом мы всего лишь получаем список level'ов, но не member'ов
(в комментарии имеется в виду, что в запросе по созданию куба, для которого очевидно предназначен этот код, указав level, мы укажем брать все его мемберы).

Нашел интересную вещь. Для того, чтобы сделать способом, который предложил Guestic, надо, соответственно, получить все PivotMember'ы, которые есть в фильтре.

У каждого из FieldSet'ов в фильтре есть свойство AllMember, оно возвращает PivotMember уровня [All] для level'а, засунутого в фильтр. То есть, например, если у нас в измерении [Страна] есть единственный уровень [Страна], и мы засунем это измерение в область фильтра, то в FilterAxis будет 1 FieldSet, и его свойство FieldSets.Item(0).AllMember вернет PivotMember с именем [All Страна].

И тут я подумал, что у PivotMember есть свойство ChildMembers, которое вернет коллекцию мемберов-потомков - в данном случае это должны быть мемберы [Russia], [USA], [Canada] и т.п. И эти PivotMember'ы - как раз и будет то, что надо!

Попробовал.

' Мембер [All Страна]
PivotMember_All = FilterAxis.FieldSets.Items(0).AllMember;

' Мемберы потомки - [Russia], [USA],..
for i (...от начала и до PivotMember_All.Count )
child_member = PivotMember_All.Item(i);


Потрясающе! Count у PivotMember_All действительно соответствует числу потомков (стран), но когда мы получаем сам мембер-потомок... Там лежит какая-то фигня, без имени и без всяких опознавательных знаков! То есть Count правильный, а вот сами ChildMember'ы не дают!

Что такое? Почему не получаются мемберы?
...
Рейтинг: 0 / 0
23.04.2004, 17:15
    #32494757
Alex Fox
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OWC PivotTable: Программное получение списка отфильтрованных членов Field.ExcludedMembers
...
Рейтинг: 0 / 0
23.04.2004, 18:16
    #32494909
Phenimore_Cooper
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
OWC PivotTable: Программное получение списка отфильтрованных членов Field.ExcludedMembers
Гениально! Все получилось! :)


Function Button1_OnClick()
Dim oChildren
Dim sFS
sFS = lstFieldsets.options(lstFieldsets.selectedIndex).Text
Set oChildren = PTable.ActiveView.FieldSets(sFS).Member.ChildMembers
sResults = "State of All Members: " & vbCrLf & vbCrLf
For i = 0 To oChildren.Count - 1
Recurse1 oChildren(i), 0
Next
txtResults.innerText = sResults
End Function

Function Recurse1(oPM, nLevel)
Dim oFUpd 'OWC10.PivotFilterUpdate
Set oFUpd = oPM.Field.FieldSet.CreateFilterUpdate
sResults = sResults & aStates(oFUpd.StateOf(oPM)-1) & vbTab & _
Space(nLevel * 3) & "- " & oPM.Name & vbCrLf
For i = 0 To oPM.ChildMembers.Count - 1
Recurse1 oPM.ChildMembers(i), nLevel + 1
Next
End Function


И проблемы решены.
И знаете, что самое интересное? Я попытался сделать это через свойство FieldSet.AllMember, а в данном примере делается абсолютно то же самое, но через свойство FieldSet.Member. В доке по OWC описание свойств AllMember и Member - почти идентично!!! Там написано:

AllMember:
Returns a PivotMember object that represents the top member object IN the specified field set.

Member:
Returns a PivotMember object that represents the top member object FOR the specified field set.

Какова разница между предлогами IN и FOR для Microsoft??? Огромная. AllMember не работает, Member работает. Дух Microsoft. )

Алекс, с меня пиво! :)) Как раз буду в Киеве на следующих выходных! ;)
...
Рейтинг: 0 / 0
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / OWC PivotTable: Программное получение списка отфильтрованных членов Field.ExcludedMembers / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]