🐬【教學】Spotfire 執行按鈕報錯「The name is already used」完整排查與修復指南(含腳本示例)

摘要

本文以淺顯方式說明:在 TIBCO Spotfire 點擊自訂按鈕(例如 Run Rpt)後,出現錯誤

Could not execute script 'runrpt': The name 'FT_YIELD_RPT' is not a valid table name since the name is already used.

該如何快速定位問題與修復。文內提供三種安全做法(取代資料、先刪後建、自動避開撞名),並補充「資料來源帳密要求」常見排查清單,幫你從零搞懂發生原因與處理邏輯。



你遇到的狀況(白話版)

  • 開啟 DXP 後按下 Text Area 的按鈕(例如:Run Rpt)。

  • Spotfire 執行內嵌腳本(通常是 IronPythonData Function)去產生/更新一張報表資料表。

  • 第一次可能成功,但第二次就跳錯:「這個表名已被使用」。

  • 另外,有時開檔會跳出「請輸入資料來源帳密」的視窗,帳密看起來正確卻連不上。


為何會報「name already used」?

在 Spotfire 裡,每張資料表 名稱不可重複
如果腳本每次都用 CreateDataTable("FT_YIELD_RPT", ...) 或資料函數輸出固定表名,就會在文件已存在同名表時失敗。

一句話:你正在「再建立一次同名表」,所以撞名。



三種修法(依建議順序)

A. 推薦:保留視覺與欄位設定,改用「取代資料」

重點: 不要重建表,改為 ReplaceData,讓同名表「原位換資料」。

(示例:改良後的 IronPython 範例,已匿名化)

from Spotfire.Dxp.Data import DataManager from Spotfire.Dxp.Data.Import import TextFileDataSource, TextDataReaderSettings table_name = "FT_YIELD_RPT" # 假設你的資料來源是檔案;若是資料庫/查詢,改為對應的 DataSource 物件 settings = TextDataReaderSettings() settings.Separator = "\t" data_source = TextFileDataSource(r"C:\path\report.tsv", settings) dm = Application.GetService[DataManager]() if Document.Data.Tables.Contains(table_name): # 已存在 → 原位更新資料 Document.Data.Tables[table_name].ReplaceData(data_source) else: # 首次建立 dm.CreateDataTable(table_name, data_source)

優點

  • 保留視覺化設定、計算欄位、標籤、篩選、關聯。

  • 執行速度與使用者體驗佳。


B. 簡單粗暴:先刪同名,再新建

如果這張表給該報表用、刪除不會影響其它圖表,就可直接移除再新建。

from Spotfire.Dxp.Data import DataManager from Spotfire.Dxp.Data.Import import TextFileDataSource, TextDataReaderSettings table_name = "FT_YIELD_RPT" dm = Application.GetService[DataManager]() if Document.Data.Tables.Contains(table_name): Document.Data.Tables.Remove(Document.Data.Tables[table_name]) # 重新建立資料表 settings = TextDataReaderSettings() settings.Separator = "," data_source = TextFileDataSource(r"C:\path\report.csv", settings) dm.CreateDataTable(table_name, data_source)

注意

  • 可能需要重接關聯或重設視覺標籤(視你的 DXP 設計而定)。


C. 需要歷史快照?自動避開撞名(加尾碼)

如果你的需求是「每次產生一張新快照表」,那就不要固定表名,自動加數字尾碼。

base = "FT_YIELD_RPT" name = base i = 1 while Document.Data.Tables.Contains(name): i += 1 name = "{}_{}".format(base, i) # 用 name 建立新表,不會撞名 # ... data_source 準備同上 new_table = Application.GetService[DataManager]().CreateDataTable(name, data_source) print "Created table:", name

如果是 Data Function(R / TERR / Python)產生的表

  • 開啟 Edit ▸ Data Function Properties…

  • Output Parameters 把輸出表設定為:Replace existing(或是把輸出表名改為不重複)。

  • 確定資料函數每次執行不會硬要「新增同名表」。


兩段快速自我檢查腳本

1) 目前文件有哪些資料表?

for t in Document.Data.Tables: print t.Name

2) 按鈕綁的腳本在哪?

  • 右鍵 Text Area → Edit HTMLEdit Script…

  • 找到 runrpt 或相關腳本,檢查是否有 CreateDataTable("FT_YIELD_RPT", ...) 或資料函數輸出的表名剛好一樣。


額外加碼:開檔時一直跳「請輸入資料來源帳密」怎麼辦?

這通常不是「登入 Spotfire」出錯,而是 DXP 裡的資料來源連線需要認證或連不到。以下是手順級檢查清單:

  1. 找出連的是誰
    Data ▸ Data Table Properties ▸ 選表 ▸ Source/Settings → 確認連線類型(SQL/Oracle/ODBC/檔案)、Server、Database、認證方式。

  2. 帳號格式

    • Windows/AD:試 DOMAIN\useruser@domain

    • 純資料庫帳號:只填帳號,不加網域。

  3. 同機測試連線

    • SQL Server:
      sqlcmd -S <server>,<port> -U <user> -P <password> -Q "SELECT 1"

    • Oracle:
      tnsping <TNS>sqlplus <user>/<password>@<TNS>

  4. 認證方式吻合

    • 連線設定若從「Windows/SSO」換成「Database/SQL Authentication」,原本能用的 AD 帳號會失效(反之亦然)。

    • 於連線頁按 Test Connection

  5. 驅動/位元數正確

    • Spotfire 64-bit → 驅動與 DSN 需 64-bit。

    • Oracle 要有對應版本 Client,TNS_ADMIN 指向正確 tnsnames.ora

  6. 網路/VPN/防火牆

    • ping <server>Test-NetConnection <server> -Port <port> 檢查可達性。

  7. 帳號鎖定/密碼過期

    • 請 DBA 查登入日誌,排除被鎖或密碼過期。

  8. Information Link 認證策略

    • Tools ▸ Information Designer → 該 Data Source 是否被設為 Prompt user;如能用 SSO/Trusted,改成不跳視窗。


常見問答(FAQ)

Q1:我想保留所有儀表板格式與計算欄,哪個做法最好?
A:ReplaceData。它只換資料,不動視覺設定。

Q2:我想「每次」產生一份報表快照怎麼辦?
A:用「自動加尾碼」避開撞名,並把快照日期或批次號塞進尾碼,方便管理。

Q3:按下按鈕就跳要帳密視窗,能不能別每次都輸入?
A:可在資料連線裡設定 Save password(注意公司資安政策)或採用 SSO/Trusted 方式;若是排程,建議在伺服器端用固定服務帳號執行。


結語

這個錯誤的本質其實很單純:同名表被重建
把「新增」改為「取代」,或在確定不影響的情況下「先刪再建」,就能優雅地解決。再搭配上方的資料來源連線檢查清單,你的 Spotfire 報表按鈕就能穩定跑起來。


下載小抄(Check List)

  • 用腳本列出目前所有資料表名稱

  • 檢查 runrpt 是否使用 CreateDataTable 固定表名

  • 優先改為 ReplaceData

  • 如需快照 → 自動加尾碼

  • Data Function 輸出設為 Replace existing

  • 連線帳密/認證方式/驅動/網路逐項測試

留言

這個網誌中的熱門文章

🔍Vue.js 專案錯誤排查:解決 numericFields is not defined 與合併儲存格邏輯最佳化

🖥️遠端桌面連線完整新手指南:Windows RDP、Chrome Remote Desktop、AnyDesk、TeamViewer 一次搞懂

🔎EF Core 連 Oracle 出現 ORA-00600 [kpp_concatq:2] 的完整排錯指南(含 EF Core ToString/CultureInfo 錯誤)