Я смог приблизить минимальную функциональность, которая мне понадобилась, с помощью приведенного ниже кода. Это невероятно грязно. Я был бы очень признателен за отзывы о коде, чтобы сделать его лучше. В частности, я бы хотел сохранить каскадный фильтр. Спасибо.
import Spotfire.Dxp.Application.Filters as filters
from Spotfire.Dxp.Data import DataPropertyClass
from Spotfire.Dxp.Application.Filters import FilterTypeIdentifiers
aProp= Document.Properties["DistinctReasons"]
thePanel = Document.ActivePageReference.FilterPanel
theFilter = thePanel.TableGroups[0].GetFilter("Reason")
theFilter2 = thePanel.TableGroups[1].GetFilter("Reason")
theFilter.FilterReference.TypeId = FilterTypeIdentifiers.ListBoxFilter
theFilter2.FilterReference.TypeId = FilterTypeIdentifiers.ListBoxFilter
thelistboxFilter = theFilter.FilterReference.As[filters.ListBoxFilter]()
thelistboxFilter2 = theFilter2.FilterReference.As[filters.ListBoxFilter]()
thelistboxFilter.IncludeAllValues = False
thelistboxFilter2.IncludeAllValues = False
thelistboxFilter.SetSelection(aProp)
thelistboxFilter2.SetSelection(aProp)
У меня есть панель с двумя таблицами с соответствующими столбцами. Я хотел бы иметь возможность фильтровать обе таблицы без создания стандартных отношений, так как это создает искусственный паритет между таблицами.
Код ниже может решить эту проблему, но я не знаю, как это реализовать. Я нашел это здесь . У меня есть два конкретных c вопроса:
Каким образом переменная myColNames должна быть заполнена? И как я должен правильно назначить это для свойства do c. Вот что я сделал:
Я создал свойство документа с именем DocPropMultiList: Свойство Control и назначил скрипт. Чтобы заполнить myColNames, я передал строку с именем столбца, которая, похоже, что-то делает, но сценарий все еще не работает '' 'Traceback (последний вызов был последним): файл "Spotfire.Dxp.Application.ScriptSupport", строка неизвестна, в файле ExecuteForDebugging "", строка 83, в файле "", строка 78, в Clear_or_Filter NameError: имя 'DocPropMultiList' не определено ''
Полное раскрытие: я на четвертом месяце обучения Python, что помогло, и я почти ничего не знаю о реализации Iron Python в Spotfire. Любая помощь приветствуется. Спасибо.
from Spotfire.Dxp.Data import *
import Spotfire.Dxp.Application.Filters as filters
from Spotfire.Dxp.Application.Filters import FilterTypeIdentifiers
from System import String
def ChangeFilterstoListBox():
#CHANGE ALL FILTERS TO LISTS BOX
for aPage in Document.Pages:
aFilterPanel = aPage.FilterPanel
for aTableGroup in aFilterPanel.TableGroups:
for aFilterHandle in aTableGroup.FilterHandles:
if aFilterHandle.FilterReference.Name == myColName:
aFilterHandle.FilterReference.TypeId = FilterTypeIdentifiers.ListBoxFilter
def DocPropertyList():
# Set Values As List from Document Property
mySelection = list(Document.Properties[DocPropMultiList])
return mySelection
def GetCurrentDict():
d = dict()
for x in Document.Data.Tables:
#Check Column Name vs List of Columns from Table
if myColName in [str(item) for item in x.Columns] :
# get filter
filter = Document.FilteringSchemes[0][x][x.Columns[myColName]]
# get current filter type
filterType = filter.TypeId
# change to checkbox to easily access unique value
filter.TypeId = FilterTypeIdentifiers.CheckBoxFilter
# Capture List of Items from CheckBoxFilter
mycountry_list = [value for value in filter.As[filters.CheckBoxFilter]().Values]
# return to old filter type
filter.TypeId = filterType
#Append to Dict
for item in mycountry_list:
d.setdefault(x.Name, []).append(item)
return d
def GetMyUpdateDict():
d = GetCurrentDict()
mySelection =DocPropertyList()
for i in d:
#Combine With DocPoperty List
combined = list(set(mySelection) & set([x for x in d[i]]))
#Update Dictonary With Matching Values Only
d.update({i:combined})
return d
def RunFilters():
MyDict = GetMyUpdateDict()
myPanel = Document.ActivePageReference.FilterPanel
for item in myPanel.TableGroups:
#print(item.Name)
if item.GetFilter(myColName):
myString = ",".join(MyDict[item.Name] )
myFilter = item.GetFilter(myColName)
lbFilter = myFilter.FilterReference.As[filters.ListBoxFilter]()
lbFilter.IncludeAllValues=False
strVals = myString
if strVals!=String.Empty:
print(myString, item.Name )
lbFilter.SetSelection(strVals.split(','))
else:
print(myString, item.Name )
lbFilter.IncludeAllValues=False
def ClearFilters():
myPanel = Document.ActivePageReference.FilterPanel
for item in myPanel.TableGroups:
if item.GetFilter(myColName):
myFilter = item.GetFilter(myColName)
lbFilter = myFilter.FilterReference.As[filters.ListBoxFilter]()
lbFilter.Reset()
def Clear_or_Filter():
ChangeFilterstoListBox()
if Document.Properties[DocPropMultiList] != None:
RunFilters()
else:
ClearFilters()
Clear_or_Filter()