You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Spotfire中执行脚本时使用进度条触发SystemError问题求助

问题分析与解决

错误原因

你遇到的 SystemError 是因为 Document.Data.Tables.ReloadAllData() 执行时会自动创建一个文档事务,而在事务的上下文环境中,Spotfire不允许执行进度条相关操作(比如ExecuteSubtask),两者的上下文冲突导致报错。

修复方案

需要将进度条的更新操作放在文档事务之外,调整操作顺序,确保进度提示与数据刷新的逻辑不重叠在事务上下文里。以下是修正后的代码:

from Spotfire.Dxp.Framework.ApplicationModel import *
import traceback, time

proc = Application.GetService[ProgressService]()

def ex():
    try:
        # 先提示开始刷新,此时还未进入事务
        proc.CurrentProgress.ExecuteSubtask("开始刷新数据")
        time.sleep(2)  # 演示用,实际可移除
        
        # 执行数据刷新,此操作会自动开启事务,但此时不再调用进度操作
        Document.Data.Tables.ReloadAllData()
        
        # 刷新完成后,回到事务外提示完成
        proc.CurrentProgress.ExecuteSubtask("数据刷新完成")
        time.sleep(2)
    except:
        traceback.print_exc()

proc.ExecuteWithProgress("手动刷新数据", "正在刷新所有数据表", ex)

如果需要更精细的事务控制(比如自定义事务边界),也可以手动使用TransactionManager:

from Spotfire.Dxp.Framework.ApplicationModel import *
from Spotfire.Dxp.Application import TransactionManager
import traceback, time

proc = Application.GetService[ProgressService]()

def ex():
    try:
        proc.CurrentProgress.ExecuteSubtask("准备刷新数据")
        time.sleep(2)
        
        # 手动开启并管理事务,确保进度操作在事务外执行
        with TransactionManager.CreateTransaction(Document, "刷新数据") as transaction:
            Document.Data.Tables.ReloadAllData()
            transaction.Commit()
        
        proc.CurrentProgress.ExecuteSubtask("数据刷新完成")
        time.sleep(2)
    except:
        traceback.print_exc()

proc.ExecuteWithProgress("手动刷新数据", "正在刷新所有数据表", ex)

关键注意点

  • 所有CurrentProgress.ExecuteSubtask()调用必须放在文档事务的外部,包括事务启动前和提交/回滚后。
  • ReloadAllData()本身会隐式创建事务,无需手动开启,除非你需要自定义事务的名称或边界。

内容的提问来源于stack exchange,提问作者Zegher V

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 10:42:14