在Spotfire Consumer中存储选择

时间:2016-04-05 11:50:07

标签: spotfire

我们尝试创建一个可视化,其中拥有消费者许可的人可以执行一些(基本)分析。他们需要对数据子集执行数据选择,按子集选择一个数据点,然后将所有选定的数据点一起分析。这很容易使用标签,但不幸的是,消费者许可证不支持编辑标签,是否有解决方法?

更长的故事:

我们使用试验数据,一个数据集包含10-200个试验,每个试验有5-50个评估,因此有很长的评估清单。我们目前使用Analyst许可证的方法是过滤每个试验(这是选择最佳评估所必需的),标记最佳评估,从试验中删除过滤器并过滤标记评估并执行分析。

如果没有标记,我们的解决方法可能是:为每个试用版过滤,选择最佳评估,然后在纸上记下它的ID(!),删除试验过滤器,然后滚动评估列表并手动选择所有在纸上已经注意到了什么。除了大量的额外工作外,在选择期间意外释放CTRL按钮还有很大的取消选择的风险。

有没有办法改善这个过程?

(我已经在Tibco社区网站上询问了same question,但似乎社区在那里并不活跃)

1 个答案:

答案 0 :(得分:1)

假设我正确理解你的情况,这将是我的建议:

有一个带有标有'追加'的按钮的文本区域,一个输入字段(多行)和一个刷新/继续按钮。

让用户过滤以查找试用版,标记所选评估,然后点击附加按钮,其脚本类似于以下内容:

from Spotfire.Dxp.Data import *

crossSource = Document.Data.Tables["TrialsAndAssessments"]

rowIndexSet=Document.ActiveMarkingSelectionReference.GetSelection(crossSource).AsIndexSet()
colCurs = DataValueCursor.CreateFormatted(crossSource.Columns["AssessmentID"])


x = Document.Properties["udPreSelectedAssessments"]
#x = ""
if rowIndexSet.IsEmpty != True:
    for row in crossSource.GetRows(rowIndexSet, colCurs):
        #print colCurs.CurrentValue
        if x == "":
            x += colCurs.CurrentValue
        else:
            x += ", " + colCurs.CurrentValue

Document.Properties["udPreSelectedAssessments"] = x

在他们想要将所有评估附加到此列表(他们也可以手动编辑)之后,用户可以点击“刷新/继续”按钮。然后,此按钮可以更改udSelectedAssessments属性,该属性链接到信息链接,该信息链接设置为自动更新而不是缓存,这将是一个存储过程,用于解析您的AssessmentID本身列表。 (我建议主要使用pre属性,以便在将任何内容传递到数据库之前删除或添加撇号等)

刷新/继续按钮:

strVals = Document.Properties["udPreSelectedAssessments"]

lst = ""

x = 0
y = 0
z = 0
for letter in strVals:
    if y == 1:
        if letter == " ":
            lst = lst + strVals[x:z] + ", "
            y = 0
        elif letter == ",":
            lst = lst + strVals[x:z] + ", "
            y = 0
        elif letter == "\n":
            lst = lst + strVals[x:z] + ", "
            y = 0
        elif letter == "\r":
            lst = lst + strVals[x:z] + ", "
            y = 0
        elif letter == "'":
            lst = lst + strVals[x:z] + ", "
            y = 0
        elif letter == '"':
            lst = lst + strVals[x:z] + ", "
            y = 0
        elif letter == '\t':
            lst = lst + strVals[x:z] + ", "
            y = 0
    else:
        if letter <> " " and letter <> "," and letter <> "\n" and letter <> "\r" and letter <> "'" and letter <> '"' and letter <> "\t":
            #print letter
            x = z
            y = 1
    z += 1
if y == 1:
    lst = lst + strVals[x:z] 

print lst

Document.Properties["udSelectedAssessments"] = lst

简单的T-SQL示例:

declare @run varchar(max) = '  
  select * from DataTableName where AssessmentID in (' + @AssessmentList + ')'

  execute (@run)

编辑:这是我用于大型数据集的方法,我不想在服务器上占用内存来缓存整个内容或让用户等待过长的时间分析开放。如果你不必担心这些中的任何一个,因为数据集很小或者你无论如何都要缓存整个事情以便更容易选择正确的评估,那么我建议进行以下调整。

将此代码附加到上面提供的刷新按钮代码:

lst = lst.upper()
if len(lst) > 0:
    Document.Properties["udSpecialCheck"] = 0
    Document.Properties["udSelectedAssessments"] = lst
else:
    Document.Properties["udSpecialCheck"] = 1

使用原始数据集,但通过以下代码限制数据表达式中的可视化:

Upper([Assessment]) in (${udSelectedAssessments) or ${udSpecialCheck} = 1