使用另一个属性控件更新属性控件值:Spotfire

时间:2018-02-28 01:26:36

标签: spotfire

我正在尝试实现一个功能,我想使用另一个属性控件更新属性控件的值。 下面是示例,我有一个名为AsOfDate的下拉列表属性控件,它保存日期信息。使用下拉列表中选择的值,我想以下拉列表或列表框的形式显示下拉列表旁边的相关季度信息(此字段稍后将用作我的报告的列标题)。

这是我的方法:

  1. 创建了一个下拉列表属性控件。
  2. 使用下拉列表中的值,使用创建计算列 季度信息。
  3. 在另一个属性中使用计算列(步骤2)中的值 控制。
  4. 问题:

    步骤3的值正在正确计算,但除非有用户输入,否则不会更新。如何根据仅选择AsofDate(没有任何进一步的用户输入)使属性控制的值更新。

    计算的列代码:

    case  
    when Quarter(DocumentProperty("AsofDate")) IN (1) then 
    Concatenate(Quarter(DocumentProperty("AsofDate")),Year(DocumentProperty("AsofDate"))) 
    when Quarter(DocumentProperty("AsofDate")) IN (2, 3, 4) then 
    Concatenate(Quarter(DocumentProperty("AsofDate")),Year(DocumentProperty("AsofDate")))
    end
    

    在附带的屏幕截图中,您可以看到当我们展开第二个下拉列表时,季度信息就在那里,但除非用户选择,否则它不会显示。

    enter image description here

2 个答案:

答案 0 :(得分:2)

假设您的两个下拉控件链接到一对名为AB的文档属性。 A的可能值为1-4。 B的可能值基于计算列[col]中的唯一值,该列是某个字符串与A值的串联。

当我最初将A的值设置为1时,[col]现在将包含“Something1”,“SomethingElse1”,“SomeThirdThing1”等值。附加到B的下拉列表现在包含这三个值,我选择“Something1”,从而将B的值设置为“Something1”。

接下来,我将A的值更改为3. [col]更新以包含“Something3”等。附加到B的下拉列表现在显示“---”。< / p>

发生这种情况的原因是文档属性 B未更新;它仍然设置为“Something1”,即使其附加的 Property Control 可接受的值现在是“Something3”等。

Spotfire中没有机制来解释这个问题;它需要一些脚本。

假设我在这里提出的示例,添加以下脚本,以便在A的值发生更改时执行。它会始终将B的值更新为[col]列中的第一个结果。

# import the DataValueCursor class
from Spotfire.Dxp.Data import DataValueCursor

# set up the data table reference
dt = Document.Data.Tables["Data Table"]
# set up the column reference
col = DataValueCursor.CreateFormatted(dt.Columns["col"])

# move the cursor to the first row of the column
# (GetRows() returns an iterable, and next() advances it to the first result)
dt.GetRows(col).next()

# update the document property
Document.Properties["B"] = col.CurrentValue

所有这些都说,虽然这是一个有趣的案例,但我想知道你要做的是什么,如果没有更好的方法。这个解决方案适用于您提出的问题,但我很想知道您的最终目标是什么,以及是否有更适合该问题的解决方案。

答案 1 :(得分:0)

认为您需要添加一个在更改属性控件时运行的脚本,并刷新这些下拉框所在的文本区域。

下面是一个示例python脚本,可以执行此操作(使用页面的参数。如果不会减慢脚本的速度,可以刷新所有页面上的所有文本区域):

from Spotfire.Dxp.Application.Visuals import Visualization, 
VisualTypeIdentifiers, HtmlTextArea

#Iterate through the page visualisations
for viz in page.Visuals:
        if viz.TypeId == VisualTypeIdentifiers.HtmlTextArea:
            viz.As[HtmlTextArea]().HtmlContent += " ";
        else:
            pass