Скрипт Spotfire для фильтрации нескольких таблиц без связей - PullRequest
1 голос
/ 05 февраля 2020

Я смог приблизить минимальную функциональность, которая мне понадобилась, с помощью приведенного ниже кода. Это невероятно грязно. Я был бы очень признателен за отзывы о коде, чтобы сделать его лучше. В частности, я бы хотел сохранить каскадный фильтр. Спасибо.

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()

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Элемент управления свойства DocPropMultiList должен быть свойством документа из нескольких списков со значениями фильтрации.

Переменная MyColName должна быть добавлена ​​в параметры скрипта в виде строки (например, «Column_Name»), которая является именем столбца, который вы фильтруете. Имя столбца одинаково для обеих таблиц.

Я полагаю, что я написал оригинальный скрипт довольно долго, потому что при попытке установить оба фильтра могут возникнуть проблемы, когда одно значение присутствует в одной таблице, а другое нет.

0 голосов
/ 26 февраля 2020

Рассматривали ли вы создание элемента управления свойством и использование выражений ограничения данных? Это позволит вам отфильтровать две визуализации, не создавая отношения между ними, без необходимости в сценарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...