【问题标题】:Update property control value using another property control: Spotfire使用另一个属性控件更新属性控件值:Spotfire
【发布时间】:2018-02-28 01:26:35
【问题描述】:

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

这是我的方法:

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

问题:

第 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

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

【问题讨论】:

    标签: spotfire


    【解决方案1】:

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

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

    接下来,我将A 的值更改为3。[col] 更新为包含“Something3”等。附加到B 的下拉菜单现在显示“---”。

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

    Spotfire 中没有任何机制可以解决此问题;它需要一些脚本。

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

    # 导入 DataValueCursor 类 从 Spotfire.Dxp.Data 导入 DataValueCursor # 设置数据表引用 dt = Document.Data.Tables["数据表"] # 设置列引用 col = DataValueCursor.CreateFormatted(dt.Columns["col"]) # 将光标移动到列的第一行 # (GetRows() 返回一个可迭代对象,next() 将其推进到第一个结果) dt.GetRows(col).next() # 更新文档属性 Document.Properties["B"] = col.CurrentValue

    说了这么多,虽然这是一个有趣的案例,但我想知道您正在尝试做什么以及是否没有更好的方法。此解决方案适用于您提出的问题,但我很想知道您的最终目标是什么,以及是否有更适合该问题的解决方案。

    【讨论】:

    • Niko,这种方法背后的想法是为我的交叉表列找到一个动态标题。根据我的第一个下拉列表(即日期),我的目标是显示交叉表标题的季度/上一季度和年度信息。如果我让我的第二个下拉列表基于第一个动态更改,我将能够将其用作我的交叉表列标题。
    • @Shane,如果您只需要一个静态标题,我建议您使用标签控件并使用 Ironpython 脚本将值分配给B。或者,您可以创建一个层次结构列并将其设置为交叉表的列轴。当然,如果第二个下拉菜单是提供一些过滤功能,那么这种方法可能会起作用。
    • 创建层次结构不是一种选择,因为在交叉表列的自定义表达式中存在大量逻辑/过滤。将与标签。谢谢!
    【解决方案2】:

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

    下面是一个示例 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
    

    【讨论】:

    • 这段代码在我设置的测试文档中不起作用。问题不在于更新的 HTML 内容本身。将在答案中提供更多详细信息。
    猜你喜欢
    • 2021-05-14
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 2013-04-20
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多