🐬Spotfire 11 一按按鈕就閃退?用「白話」搞懂欄位改名、Linked Data 與 Script 崩潰的真正原因

前言:為什麼你「只是改個表頭」,Spotfire 就會自己關掉?

很多人在 Spotfire 做報表時,都會遇到這種很崩潰的情況:

  • 你改了欄位名稱(例如把「Test Qty」改成「Test Q’ty」或「TestQty」)

  • 你按了某個按鈕(例如「Query」或「Generate Summary」)

  • 然後 Spotfire 沒有給你很清楚的提示,甚至直接閃退關掉

如果你是完全不了解程式、也看不懂錯誤訊息的人,這篇會用最白話的方式帶你理解:

  1. 什麼是「欄位名」與「表頭」的差別

  2. 什麼是 Linked Data(連動資料)警告

  3. 為什麼 Script 會讓 Spotfire 直接閃退

  4. Spotfire 11 怎麼「直接修改表頭」

  5. 最穩定的修法:欄位命名統一 + 相容欄位(讓舊報表不會炸)



一、先搞懂:Spotfire 的「欄位名」≠「表頭」

很多人以為畫面上看到的文字就是欄位名,其實 Spotfire 有兩種東西:

1) 欄位名(Column Name)

  • 這是資料表真正的欄位代號

  • Script / 計算欄位 / Join / Pivot 都會用它

  • 一改就可能影響所有連動

2) 表頭(Header / Display Name)

  • 這是畫面顯示給人看的名字

  • 改它通常不會影響 Script(但要看你是不是「真的改到欄位名」)

✅ 白話比喻:
欄位名 = 身分證號(系統認人靠它)
表頭 = 暱稱(畫面給人看,改暱稱不該影響系統)


二、你看到的兩種錯誤,其實是兩種完全不同的問題

在 Spotfire 常見的「欄位不存在」會分兩種:

A. Script 錯誤(高風險,可能直接閃退)

錯誤會長得像:

  • The column '___' does not exist in the collection

  • 或按按鈕後提示 Script 執行失敗

📌 意思:
你的按鈕背後有程式(IronPython Script),它「硬抓」一個欄位,但現在資料表裡沒有那個欄位了。
所以程式直接爆炸,有些 DXP 甚至會直接關掉。


B. Linked Data report(低風險,多半只是警告)

錯誤會長得像:

  • Linked data report: columns are no longer valid

  • Missing columns: ___

  • Some columns matched, but not all

📌 意思:
Spotfire 記得以前有「連動加欄位」或「資料串接設定」,但你現在新資料來源裡找不到某些欄位。
這通常是警告,不一定會導致閃退,但會造成資料顯示不完整。

✅ 結論:

  • 閃退主因通常是 A(Script 硬抓欄位)

  • Linked Data 警告多半是 B(設定殘留)


三、為什麼「欄位改名」會引爆整個報表?

Spotfire 的報表不是只有一張表格,它通常有:

  • 一張「查詢結果表」(按 Query 產生)

  • 一張「選取結果表」

  • 一張「統計用中介表」(Pivot / Join 的結果)

  • 一張「最終摘要表」(Summary)

當你把欄位改名時,很可能造成:

  1. Script 還在找舊欄位名(例如 OldQtyName

  2. 但資料表已經變成新欄位名(例如 NewQtyName

  3. Script 一執行就爆炸 → 按鈕按下去就壞


四、Spotfire 11:如何「直接修改表頭」而不是改欄位名?

如果你只是想把顯示文字改漂亮(例如 TestQ_ty 顯示成 Test Qty),建議用「表頭顯示名稱」方式,而不是動資料欄位。

方法 1:Table Visualization 直接改(最直覺)

  1. 在表格上 右鍵

  2. Properties(屬性)

  3. 進到 Columns(欄位)

  4. 在右側選到你要改的欄位

  5. 找「Display name / Column title(顯示名稱)」

  6. 把它改成你想顯示的文字(例如 Test Qty

如果你找不到 Display name,可能是版本或視覺化類型不同;那就用方法 2。


方法 2:用 Expression / Calculated Column 做「別名欄位」

如果你的 Spotfire 不讓你直接改表頭,最穩的方式是:
新增一個「顯示專用欄位」,名稱固定,讓報表永遠都用它。

例如你新增一個計算欄位:

  • 新欄位名:Qty_Display

  • 表達式:直接引用原本欄位(不改資料)

這樣畫面永遠顯示 Qty_Display,就不怕來源欄位名稱變動。


五、工程師最推薦的穩定解法:做「欄位相容層」

如果你的報表已經很大、很多按鈕很多 Script,最佳做法不是「到處改 Script」,而是:

✅ 在資料進來的時候就統一欄位名
✅ 或建立一個「相容欄位」讓舊名字、新名字都能用

白話說法

你以前叫小明,現在改名叫阿明。
但親戚朋友都還叫你小明。
最好的做法不是叫大家全部改口,
而是你自己知道:「叫小明也會回應」


六、匿名示意:如何寫「不會炸」的 Script(欄位存在才用)

以下是示意版概念(已去識別化、欄位與表名均為假名):

# 示意:安全取得欄位名稱(避免欄位不存在就爆炸) def get_existing_column(table, candidates): for name in candidates: if name in [c.Name for c in table.Columns]: return name return None tbl = Document.Data.Tables["RESULT_TABLE"] qty_col = get_existing_column(tbl, ["Qty", "Qty_Total", "QTY_VALUE"]) if qty_col is None: print("找不到數量欄位,請確認資料來源") else: print("目前使用的數量欄位是:", qty_col)

✅ 這樣即使欄位改名,Script 也不會直接爆。


七、Linked Data report 要怎麼處理?(不讓它一直跳)

當 Spotfire 出現:

Linked data table 'XXX': The following columns are no longer valid…


代表你曾經在某張表做過「Add Columns / Join / Linked」
但來源已經換掉或欄位不見了。

乾淨修法(推薦)

  1. Data → Data table properties

  2. 選那張被警告的表(例如 TEMP_TABLE

  3. 找到「Add Columns」或「Linked data」的設定頁

  4. 把已經不存在的欄位移除/清除

  5. 存檔

✅ 這樣警告就不會再跳,也不會影響後續 ReplaceData。


八、你遇到的「按 Generate 就閃退」通常是哪個原因?

以維運經驗來說,Spotfire 按按鈕就關掉,常見原因是:

  1. Script 直接用 Columns["某欄位"] 硬抓,但欄位已不存在

  2. ReplaceData 後欄位被改名,Linked Data / Pivot 仍依賴舊欄位

  3. 某些視覺化(Table/Chart)仍指向舊欄位

  4. 連動資料表之間「欄位對不上」造成連鎖崩潰

✅ 最優先排查順序:

  1. 先讓 Script 不會爆(欄位相容層)

  2. 再清掉 Linked Data 殘留

  3. 最後才整理視覺化的欄位顯示


九、最佳實務:Spotfire 報表維運的「命名規範」建議

如果你不想每次改欄位都爆炸,建議建立規範:

  • 資料欄位名固定(系統用)

  • 表頭顯示名稱可調整(給人看)

  • 改版時新增「相容欄位」,不要直接刪舊欄位

  • Script 永遠用「安全取欄位」函式,不要硬抓


結語:你要的是「顯示一致」,不是「到處改到炸」

如果你的目標是:
✅ 讓畫面永遠顯示同一個字(例如 Test Qty
✅ 讓按鈕永遠能跑
✅ 不要因為欄位改名就整份 DXP 爆掉

那最穩的方式是:

  1. 不要直接改資料欄位名

  2. Display name / Calculated Column 統一表頭

  3. Script 做「欄位相容層」

  4. 清掉 Linked Data 殘留設定


常見問題(FAQ)

Q1:Spotfire 11 可以直接 rename 表頭嗎?

可以,通常在 Table 的 Properties → Columns 裡有 Display name / Column title。若沒有,改用新增計算欄位做顯示別名。

Q2:為什麼我 Match Columns 之後還是會壞?

因為你 Match 只是當下對應一次,但 Script/Join/Pivot/Visualization 可能仍引用舊欄位名,下一次 ReplaceData 又會失配。

Q3:Linked Data report 一直跳會怎樣?

不一定會閃退,但可能造成某些欄位不再更新、或資料顯示不完整。建議清掉殘留設定。

留言

這個網誌中的熱門文章

🔍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 錯誤)