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

Вопрос такой. Мне необходимо программно получить список 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
OWC PivotTable: Программное получение списка отфильтрованных членов Field.ExcludedMembers
    #32489836
Guestic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ты не в ту сторону капаешь, Оно правильно не всегда будет работать

Тебе нужно делать так
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
OWC PivotTable: Программное получение списка отфильтрованных членов Field.ExcludedMembers
    #32491719
Phenimore_Cooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема все-таки остается в том, что для решения этим способом мне нужны PivotMember'ы, а я не пойму как из области фильтра (которая FilterAxis) получить PivotMember'ы.

Итак, проблема такая. Надо пройтись по Member'ам всех уровней измерений, которые помещены в область фильтра и узнать для каждого Member'а, включен он или исключен. Whether it is included or excluded, как написали бы где-нибудь в MSDN -)) Подскажите, как это можно сделать, а то я что-то туплю!..
...
Рейтинг: 0 / 0
OWC PivotTable: Программное получение списка отфильтрованных членов Field.ExcludedMembers
    #32492319
Фотография Валек
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
'сначала из фильтра вытаскиваем все мемберы
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
OWC PivotTable: Программное получение списка отфильтрованных членов Field.ExcludedMembers
    #32494712
Phenimore_Cooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
OWC PivotTable: Программное получение списка отфильтрованных членов Field.ExcludedMembers
    #32494757
Alex Fox
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
OWC PivotTable: Программное получение списка отфильтрованных членов Field.ExcludedMembers
    #32494909
Phenimore_Cooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гениально! Все получилось! :)


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


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