我正在尝试实现一个功能,我想使用另一个属性控件更新属性控件的值。 下面是示例,我有一个名为AsOfDate的下拉列表属性控件,它保存日期信息。使用下拉列表中选择的值,我想以下拉列表或列表框的形式显示下拉列表旁边的相关季度信息(此字段稍后将用作我的报告的列标题)。
这是我的方法:
问题:
步骤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
在附带的屏幕截图中,您可以看到当我们展开第二个下拉列表时,季度信息就在那里,但除非用户选择,否则它不会显示。
答案 0 :(得分:2)
假设您的两个下拉控件链接到一对名为A
和B
的文档属性。 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