發表文章

目前顯示的是 8月, 2025的文章

🔎SQL Server 無法連線?完整解決「Connection timed out」教學

SQL Server 無法連線?完整解決「Connection timed out」教學 在使用 TIBCO、Spotfire 或其他工具連接 SQL Server 時,很多人會遇到以下錯誤: Could not establish contact with the database: [tibcosoftwareinc][SQLServer JDBC Driver] Error establishing socket to host and port: 220.133.47.3:1433. Reason: Connection timed out: connect 這段訊息其實代表 資料庫連線逾時 ,意思是:電腦試著打開一個「通道」連到 SQL Server,但等不到回應,就像打電話卻沒人接聽。下面我會用「軟體工程師」的角度,帶你一步步找出問題。 為什麼會出現 Connection timed out? 最常見的原因有: SQL Server 沒有啟用 TCP/IP 連線 資料庫沒有在 1433 埠 上監聽 防火牆阻擋了 SQL 連線 網路路由或 ISP 攔截封包 資料庫在內網,外部沒有設定 Port Forward 使用命名實例但連線字串錯誤 如何逐步檢查? 1. 測試本機是否能連上伺服器 在 Windows PowerShell 輸入: Test-NetConnection 220.133.47.3 -Port 1433 如果顯示 TcpTestSucceeded : True → 網路可達,問題可能在資料庫設定。 如果顯示 False → 網路被擋或伺服器沒有開放。 2. 檢查 SQL Server 設定 打開 SQL Server Configuration Manager 確認 TCP/IP 協定有啟用 檢查 IPAll → TCP Port 是否為 1433 在伺服器命令列輸入: netstat -ano | findstr :1433 確認有顯示 LISTENING 3. 防火牆與安全性設定 Windows 防火牆 → 建立「入站規則」,允許 TCP 1433...

🔎TIBCO Spotfire 連線資料庫錯誤排查:ORA-12505 與 No more data available to read 全面解析

  前言 在安裝與設定 TIBCO Spotfire Server 時,我們必須先正確連線到後端的 Repository 資料庫(通常是 Oracle 或 SQL Server)。但在實務中,許多人會遇到兩大常見錯誤: ORA-12505: Connection refused, the specified SID was not recognized by the Oracle server No more data available to read 這篇文章將以軟體工程師的角度,詳細解析這兩種錯誤發生的原因與解決方法,並且教你如何正確設定 Spotfire 與資料庫的連線參數。 常見錯誤 1:ORA-12505 錯誤訊息: ORA -12505 : Connection refused, the specified SID (spotfire) was not recognized by the Oracle server 原因解析: 你的 JDBC 連線字串中指定的 SID (例:spotfire)在 Oracle 伺服器中不存在 可能是搞混了 SID 與 Service Name Oracle Listener 沒有註冊該 SID / Service Name 連線到的 IP 與 Port 對應的不是該資料庫實例 排查方法: 在 Oracle 主機上執行: lsnrctl status 查看目前 listener 註冊的 SID 與 Service Name 用 sqlplus 測試連線: sqlplus username@//220.133.47.3:1521/ServiceName 如果 Service ...

🔎解決 SQL Server Named Pipe 連線失敗與 Spotfire 建表錯誤的完整指南

  前言 在安裝 TIBCO Spotfire 伺服器並執行資料庫初始化批次檔( create_actionlog_db.bat )時,有時會遇到 SQL Server 連線錯誤,例如: no named pipe instance matching '' returned from host 'SPFSDB01' Timed out waiting for pipe '\\.\pipe\SQLLocal\SQLEXPRESS' to come available 對不熟悉資料庫連線的人來說,這可能完全摸不著頭緒。其實,這是 SQL Server 連線通訊協定設定 與 批次檔連線參數 的組合問題。本文將用軟體工程師的角度,完整解釋原因並提供可行解法。 問題背景 Spotfire 安裝腳本會呼叫 sqlcmd 來建立 Action Log 資料表。然而: 找不到 sqlcmd : 系統未安裝 Microsoft SQL Server Command Line Utilities 或安裝後沒有設定 PATH Named Pipes 連線失敗 : SQL Server 沒開啟 Named Pipes 協定 批次檔沒有帶正確的伺服器與實例名稱 SQL Server Browser 沒啟動 TCP/IP 未啟用 : 批次檔默認使用 Named Pipes,若沒啟動就會失敗 沒設定固定 TCP 埠,導致命名...

🔎如何在 Oracle PL/SQL 儲存過程中為文字欄位加入換行符號(CHR(10))——以 Updlcmremark 為例

  前言 在企業級系統開發中,我們常會將複雜的商業邏輯封裝成 Oracle PL/SQL 的儲存過程(Stored Procedure),以便重複使用並確保邏輯一致性。 這次的案例是 修改 Updlcmremark 儲存過程 ,目的是讓產出的 REMARK 欄位在資料庫中具有「換行」格式,而不只是用逗號分隔,方便報表與前端顯示。 問題背景 原本的 Updlcmremark 過程中,對於某些資料(例如來自 APS_Z_LCM_CHECK 的 process_step 與 eq ),是直接用字串拼接的方式: v_remark := NVL(v_process_step, '') || '' || NVL(v_eq, ''); 這種寫法的缺點是: 資料之間沒有任何分隔符號,閱讀性差。 若要在前端或報表中換行,必須額外處理,不方便。 如果一個 SEQ_NO 有多筆資料,這種寫法只會取到第一筆( FETCH 單筆),其他資料會被忽略。 改進需求 參考同系統的另一支儲存過程 Updmremark ,該過程在拼接文字時不僅使用逗號分隔,還加上換行符號: || ' ,' || CHR(10) 這樣在資料庫中儲存的內容,就會自帶換行,即使直接查詢或匯出到 Excel 報表,也能保有可讀性。 解決方案 方案一:簡單版(單筆取值加換行) 如果 unknown 游標一次只需要取一筆資料,可以直接在原本字串後加上逗號與換行符號: v_remark := NVL(v_process_step, '') || ' ' || NVL(v_eq, '') || ' ,' || CHR(10); 這樣每筆 remark 都會以「逗號 + 換行」結尾。 方案二:完整版(多筆累加加換行) 如果 unknown 游標可能有多筆資料,則應該使用 FOR rec_...

🌐Vue 3 表格欄位換行處理:如何保留逗號並換行顯示(含 LCM1 與 MATERIAL1 實作範例)

前言 在企業內部系統或資料分析工具中,我們經常需要在表格中顯示大量文字資料,例如產品編號、客戶資訊、或製造流程代碼。 有時候,資料來源會以 逗號 ( , ) 或 分號 ( ; ) 作為分隔符號,但在表格顯示時,如果全部內容擠在同一行,不僅不易閱讀,也容易造成橫向捲動條過長的問題。 今天,我要分享一個 Vue 3 的實作方法,可以讓表格欄位(例如 LCM1 與 MATERIAL1 )在遇到逗號或分號時自動換行,並且 保留逗號 (方便辨識資料的原本分隔)。 需求說明 假設資料來源是這樣的: AAA,BBB;CCC,DDD 我們希望在表格中顯示成這樣: AAA, BBB CCC, DDD 規則如下: 逗號 ( , ) → 保留逗號後換行。 分號 ( ; ) → 直接換行,不保留分號。 保留原本的資料順序與內容。 核心解法: toMultiline() 函式 // 將資料依規則換行:保留逗號換行,分號直接換行 function toMultiline ( val ) { if (val == null ) return '' return String (val) . split ( /([,;])/g ) // 分割同時保留分隔符 . reduce ( ( acc, part ) => { if (part === ',' ) { acc. push ( ',' ) // 保留逗號 acc. push ( '\n' ) // 再換行 } else if (part === ';' ) { acc. push ( '\n' ) // 分號直接換行 } else { acc. push (part. trim ()) // 其...

🌐【教學】把 Vue + Pinia 程式交付給甲方:用淺顯語言說明程式目的、結構與使用說明

  為誰而寫(目標讀者) 這篇文章適合: 非軟體背景的甲方/專案負責人,想快速理解前端程式在做什麼與如何部署或使用。 需要審閱交付物(deliverables)的PM或驗收單位。 初階工程師或新進同仁想學習如何撰寫清楚的程式說明以利交付。 概覽 — 這份程式在做什麼? 我們討論的是一個前端專案中,用來「管理全域版本與每個頁面狀態」的 Pinia Store( apsPlanStore ),以及如何在檔案頂端加入 專業的檔案說明(header comment) ,以利日後維護、交付與甲方驗收。 重點功能簡述(以非技術語言) : 這個 Store(儲存區)主要保存「使用者在各頁面選的版本、查詢到的表頭與資料、以及頁面篩選條件」。 有「全域版本」供所有頁面共用(例如:當你在某一頁選擇了 APS 版本,其他頁面可以同步使用)。 支援把每一頁的狀態儲存起來(例如 page1...page6),切換頁面時不會遺失使用者設定。 提供設定、清除與更新資料的幾個方法,以便前端元件呼叫。 為什麼在程式上方要寫註解(給甲方能看懂的理由) 想像一份工程交付物像一台機器,程式的上方註解就是操作說明書。甲方或未參與開發的人看這段文字可以快速知道: 檔案用途:這個檔案是做什麼的? 使用方式:要如何在專案中使用或呼叫? 注意事項:部署、相依性、版本、誰負責、建立時間等。 驗收準則:甲方在驗收時該看哪些行為是否正常(例如:切換版本後所有頁面同步、分頁資料保留)。 若沒有清楚註解,甲方在測試或上線時會花更多時間確認行為是否正確,甚至造成誤解或退工。 檔案頭註解範例(實務可直接貼在 .ts 檔最上方) (這段要放在 apsPlanStore.ts 最上方) /** * 檔案名稱 : apsPlanStore.ts * 功能說明 : Pinia Store,管理 APS 版本與每頁(page1~page6)之狀態: * - 全域 APS 版本 (globalApsVersion) * - 全域通用篩選 (globalCommonFilters) * - 各頁面之 selectedVersio...

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

  前言 在前端開發專案中,處理表格數據與 Excel 匯出是常見的需求。 最近在專案中,遇到一個常見但讓人頭痛的錯誤訊息: Uncaught ReferenceError: numericFields is not defined 本文將用簡單的方式,帶你了解這個錯誤的成因、如何修改程式碼,以及如何最佳化「合併儲存格」與「數值加總」的邏輯。 問題場景:表格合併與數值加總 專案中需要達成以下功能: 同一個 APS_PLAN_NO 下,若 TFT4 相同,則 TFT5 欄位要合併。 數值欄位要加總,並以千分位格式輸出。 匯出到 Excel 時,也要套用相同邏輯。 在 Vue 的 rowSpans 計算邏輯中,初始版本如下: const rowSpans = computed ( () => { const rows = filteredData. value const spans = rows. map ( () => { const obj = {} tableHeaders. value . forEach ( key => obj[key] = 0 ) return obj }) ... return spans }) 但是,當我們在 exportToExcel() 使用時,出現了以下錯誤: Uncaught ReferenceError: numericFields is not defined 錯誤原因 這個錯誤訊息代表: 👉 numericFields 在程式中根本沒有宣告,所以瀏覽器不知道它是什麼。 舉例來說,假設我們在程式裡寫了這樣的判斷: if (numericFields. includes (key)) { // 處理數值欄位 } 但其實 numericFields 沒有定義,程式就會直接報錯。 解決方案:定義 numericFields ...

🧾Excel 合併儲存格為何不會自動加總?用 SheetJS(XLSX)正確輸出合併與數值格式的完整指南

  摘要(SEO 重點) 很多人把前端資料匯出成 Excel 後,做了「合併儲存格」卻發現: 合併後只顯示一個數字 ,沒有像狀態列「加總/平均」那樣自動統計,導致畫面顯示與底部加總不一致。本文用 軟體工程師 的角度說清楚 Excel 合併的本質、在 SheetJS(XLSX) 中如何處理兩種需求: 合併後要顯示 小計/總和 ;2) 合併後只顯示 其中一個值 。 文末給你可直接套用的程式碼範例與常見坑位清單。 一、觀念釐清:Excel 合併≠加總 合併儲存格只保留左上角(Top-Left)那格的值 ,其餘被合併的格子值會被隱藏(並非相加)。 Excel 視窗底部的 狀態列「總和/平均/計數」 是針對 選取範圍的原始值 計算,與你合併後顯示的單一值無關。 👉 因此, 若要在合併格顯示加總,必須在程式中自己算好,寫回合併起始格。 二、專案背景(情境) 前端:Vue + SheetJS( xlsx ) 需求: 多層表頭(群組/子表頭) 匯出的數值要有 千分位 (但儲存為數值,Excel 仍可計算) 依特定欄位群組合併儲存格(例如同一 APS_PLAN_NO 內、相同值連續列合併) 合併後的數值欄: 要嘛顯示總和,要嘛只顯示其中一個 三、資料型別與格式:數值要「真數字」 把千分位字串還原成數字,並設定 Excel 格式( #,##0 ),讓 顯示 與 可計算 兼得: // 數值欄位 const numericFields = [ 'APS_PLAN_LIST' , 'APS_PLAN_SEQ' , 'DEMAND_QTY...