跳轉到

程式資訊

  • 程式 IDEXTDATA
  • 所屬子系統:L.聯絡傳訊
  • 狀態:stable

外部資料擷取

功能簡介

「外部資料擷取」把公開網站上的統計檔與行情數字自動抓回來,存成可追溯的原始檔並寫進資料庫,供後續報表(例如業務課報告表)與看板取用。它做兩件事:

  1. :查詢已經抓回來的資料——車輛公會銷售統計、金屬行情明細與各期已下載的檔案清單(不連外網,很快)。
  2. :需要時在查詢條件勾「順便取得最新資料」,查詢前先連一次外部網站抓最新的,抓完順便入庫。

本程式是查詢型程式,因此也可以被自訂查詢面板收進版面配置當看板區塊使用。主要使用者為業務助理、採購/成本人員與系統管理員。

2026-08-27 起:資料同時進資料庫

以前抓回來的東西只存成檔案,放在執行擷取那台電腦的 C:\dglibrary\ExternalData 底下——換一台電腦就看不到。現在車輛公會統計與金屬行情會同時寫進資料庫(集中自動化庫的 twork_auto_ttvmatwork_auto_metalprice 兩張表),畫面上的「車輛公會統計」與「金屬行情」兩區讀的都是資料庫,所以:

  • 誰查、在哪台電腦查,看到的都是同一份資料。
  • 查得到的期間不再受「這台機器有沒有抓過那個月」限制(車輛公會統計已一次載入 2002-08 以來的全部月份)。
  • 原始檔照舊落地保留,可以繼續拿來跟公會網站對帳;下方「已抓回的檔案」區列的仍然是這台電腦上的實體檔。

抓取與入庫是分開的兩件事

本程式先「把檔案抓回來存好」,再把內容解析後寫進資料庫。分開的好處是「抓得到」與「解得對」兩個問題可以各自查、各自修——擷取失敗與入庫失敗在訊息列上是分開講的。

目前有哪些來源

來源清單寫在程式裡,不需要(也無法)在畫面上自行新增;要接新的來源請提出需求。目前三個:

來源代碼 名稱 分類 內容 落地形式 入庫到
TTVMA_QTA1 車輛公會-汽車當月銷售統計 車輛公會 台灣區車輛工業同業公會(TTVMA)統計頁的汽車當月銷售統計檔 原始檔(Excel) twork_auto_ttvma(車輛別=汽車)
TTVMA_TTA1 車輛公會-機車當月及累計銷售統計 車輛公會 同上,機車當月及累計統計檔 原始檔(Excel) twork_auto_ttvma(車輛別=機車)
METALPRICE 基本金屬行情(銅/鋁/鋅…LME+SHFE 收盤) 原物料行情 公開行情頁的基本金屬收盤價(銅/鋁/鉛/鋅/鎳/錫/鋁合金/鋼鐵,含 LME/SHFE/COMEX) 整理後的 JSON(一列一報價) twork_auto_metalprice

為什麼金屬行情是 JSON 而不是原始檔

行情頁沒有可下載的檔案,數字直接寫在網頁裡。若原樣存整頁 HTML,下游每個使用者都要自己解讀,網頁改版時全部一起壞掉。因此這支來源在擷取當下就解析成一列一報價的 JSON(日期/金屬/名稱/交易所/報價單位/收盤價/漲跌/漲跌%/開高低/成交量),解析不到任何一列時直接記為失敗,不會存一個空檔騙人。

車輛公會統計每月 10~18 日以後才有上月數據

公會通常在每月 10~18 日之間才公布上月統計。太早抓會得到「來源無此期」,這不是系統故障。排程建議設在每月 18~20 日

前置需求

  • 權限:L.聯絡傳訊 → L-090 外部資料擷取 的瀏覽權限。
  • 程式登錄:新環境需由 IT 於該公司資料庫執行一次 sql/register-extdata-program.sql(只登錄選單與權限)。未執行時主選單看不到本程式。
  • 資料表與查詢登錄(2026-08-27 起新增):由 IT 執行 sql/extdata-table-deploy-20260827.sql(集中自動化庫 darb<客戶>auto1,建 2 表 5 支 proc)與 sql/extdata-procparam-log-20260827.sql(各 log 庫登錄)。沒跑的話畫面會顯示「查詢派發失敗」,那不是查無資料。細節見部署與注意事項
  • 存放位置可寫:預設 C:\dglibrary\ExternalData,執行擷取的那台電腦(或排程主機)需對該路徑有寫入權限。
  • 對外連線:只有在勾選「順便取得最新資料」時才需要;純查看已抓回的資料不需要連外。

操作步驟

步驟① 設定查詢條件

條件區由上而下五段:

外部資料擷取條件區

  1. 期別:決定看(或抓)哪一個月的資料,預設今天。只取年與月。
  2. 來源:以資料表格勾選要看的來源,可複選;不勾任何一個=全部來源。日後新增的來源會自動被涵蓋。
  3. 車輛別全部汽車機車,只影響下方「車輛公會統計」要列哪一種,預設 全部
  4. 順便取得最新資料:預設不勾。勾選後按查詢會先連線抓一輪、抓完寫進資料庫再列資料(慢,會下載檔案);不勾就只讀資料庫裡已經有的(快)。
  5. 強制重抓(本期已有也重新下載):只有在上一項勾選時才可用。預設不勾——本期已抓過的來源不會重新下載。

「本期已有」的來源仍然會補入庫

被跳過的只有「下載」這一步。檔案在本機不代表內容已經進資料庫(可能是舊版程式抓的),所以跳過的來源照樣會解析入庫;重複入庫不會長出重複資料。

當看板用的時候,條件就是唯一的控制面板

把本程式收進自訂查詢面板當區塊時,看板上只會顯示條件與結果,沒有按鈕。這也是「取得最新資料」被設計成條件而不是畫面按鈕的原因——看板上按不到按鈕,但條件存得下來。

步驟② 查詢並讀結果

按工具列 查詢,畫面分三塊,各自「有資料才顯示」:

查詢結果(金屬行情+車輛公會統計+已抓回的檔案)

  1. 金屬行情:讀資料庫,列出該期的行情明細(日期/金屬/名稱/交易所/報價單位/收盤價/漲跌/漲跌%/開盤/最高/最低/成交量)。
  2. 車輛公會統計:讀資料庫,列出該期公會公布的銷售統計,一列一個數字(資料月份/車輛別/銷售別/期別/規格/廠牌/數量),受條件區的 車輛別 過濾。
  3. 已抓回的檔案:該期已下載的檔案清單(開啟 鈕/來源/抓取時間/檔案大小/檔名;滑鼠停在列上可看完整路徑)——這一區看的是這台電腦上的實體檔,不是資料庫。
  4. 訊息列:一行摘要,例如「行情 69 筆、公會統計 234 筆、檔案 2 個(最近一次擷取:…)」。

全部空白時,訊息列會直接提示「勾選『取得最新資料』再查一次」。

本期公會還沒公布時,會自動改顯示最新的一期

車輛公會通常在每月 10~18 日之後才公布上月數據。查詢的期別還沒有資料時,畫面不會給一張空白表,而是改列資料庫裡最新的一個月,並在訊息列註明「顯示 2026-07(本期尚無資料)」。看到這行字就知道現在看的不是你指定的月份。

看到「查詢派發失敗」不是查無資料

訊息列若出現紅字「查詢派發失敗(proc 未部署或跨庫權限鏈未開,不是查無資料)」,表示這個環境的資料庫端尚未部署完成,請洽 IT 依部署與注意事項補跑腳本。系統刻意把「連不到/沒登錄」與「真的沒有資料」分開講,避免把設定問題誤判成沒資料。

步驟③ 需要最新資料時

  1. 回條件區勾 順便取得最新資料,按 查詢。系統會依「期別」去抓勾選的來源。
  2. 已經抓過的來源不重複下載(本期已有),但仍會補入庫;真的要重新下載請再勾 強制重抓
  3. 抓完會把內容寫進資料庫,結果即時反映在三張清單與訊息列上,訊息列會附上入庫筆數,例如「TTVMA_QTA1 入庫 234 筆(新增 234/更新 0)」。
  4. 入庫失敗時訊息列會明講(例如「入庫失敗:取不到資料庫連線」),不會靜默略過。

每個統計檔約 2~5 MB

「跳過已抓過的」是刻意的節流設計。除非確定公會在月中修正過數據,否則不需要勾強制重抓。

步驟④ 找出實體檔案

按「已抓回的檔案」區右上的 開啟資料夾,或按某一列的 開啟 鈕,即可在檔案總管中開啟(並選取)該檔。

資料存放在哪裡

資料存兩份:資料庫(給畫面與下游報表讀)與原始檔(給人對帳、追溯)。

資料庫(2026-08-27 起)

放在集中自動化庫 darb<客戶>auto1,兩張表:

資料表 內容 一列是什麼
twork_auto_ttvma 車輛公會銷售統計 一個數字:資料月份+車輛別+銷售別(內銷/外銷/合計)+期別(本期/去年同期)+規格+廠牌 → 數量
twork_auto_metalprice 金屬行情 一筆報價:日期+交易所+名稱 → 收盤價/漲跌/開高低/成交量…

重複抓同一份不會長出重複資料

兩張表都以「自然鍵」比對後更新(公會統計是資料月份+車輛別+銷售別+期別+規格+廠牌;行情是日期+交易所+名稱),同一份檔重跑幾次結果都一樣。公會月中回頭修正數字時,重抓即為更新。

車輛公會統計已載入 2002-08 以來的全部月份

首次啟用時一次載進全部歷史(288 個月,汽車約 6.7 萬列/機車約 21.8 萬列),趨勢與同比才有底。之後每次擷取只更新最近的月份(見排程參數FullHistory)。

原始檔

存放位置預設 C:\dglibrary\ExternalData,底下的結構是固定的:

路徑 內容
<存放位置>\<來源代碼>\yyyy-MM\<時間戳>-<原檔名> 抓回來的原始檔(行情來源為整理後的 JSON)
<存放位置>\<來源代碼>\yyyy-MM\manifest.json 該期的下載清冊(網址 → 檔名),也是「本期已抓過」的判斷依據
<存放位置>\_log\fetch-<時間戳>.json 每一次執行的完整紀錄
<存放位置>\_log\latest.json 最近一次執行的紀錄(檔名固定,供業務儀表板等畫面讀取)

同一期抓幾次就留幾份,不覆蓋

檔名帶時間戳,同一期重抓不會蓋掉舊檔。公會會在月中修正數據重新上檔,留著舊檔才查得出「上個月的報表當時是根據哪一份資料做的」。

排程與手動看到的是同一份紀錄

背景排程與畫面上的擷取寫的是同一個 latest.json,所以業務儀表板下方的「外部資料擷取」區塊永遠反映最近一次真實結果,不會出現「排程抓到了但畫面說沒有」的落差。

狀態怎麼讀

不論是本程式、業務儀表板還是排程紀錄,每個來源每次執行都會落在下列四種狀態之一:

狀態 意義 該做什麼
已擷取 這次真的連線下載並存檔成功 正常,無需處理
本期已有 該期已抓過同一份資料,這次直接跳過(顯示的抓取時間是原本那次的時間,不是這次檢查的時間) 正常;確定要重新下載才勾強制重抓
來源無此期 網站連得上,但找不到該期的檔案 多半是公會尚未公布(每月 10~18 日後才有上月數據);隔幾天再抓。若過了公布期仍如此,可能是網站版面改版,請回報
失敗 連線、下載或存檔過程出錯(行情來源解析不到任何資料也算) 檢查該台電腦的對外連線與存放位置權限;仍失敗請回報訊息內容

「來源無此期」和「失敗」要分開看

兩者都是紅字,但意思完全不同:前者是對方還沒公布(不是我們壞了),後者才是我們這邊有問題。訊息欄會寫出判斷依據(例如「統計頁 19 個連結中命中代碼 QTA1」)。一個來源失敗不會影響其他來源,其餘來源照抓。

怎麼掛成自動排程

擷取可以掛成背景排程,不必有人記得按。掛法與其他自動化任務相同,完整操作步驟見 排程事件(專案),此處只列本任務的設定值。

  1. L 聯絡傳訊 → 排程事件(專案)新增 一筆專案主檔後 儲存
  2. 編輯狀態按 批次新增,於「新增事件範本」視窗設定:
範本欄位 本任務要設的值
預定時間 建議每月 18~20 日(車輛公會公布上月數據之後)
日期類別 每月
是否自動執行 必須勾選;不勾排程器不會跑
執行項目 下拉選「擷取外部網站資料(車輛公會統計)」(單據別 SALESDASH、執行方法 ExternalDataFetch
參數 見下表
  1. 按確定展開事件 → 儲存審核

排程參數

參數 預設 說明
Sources 空白 要抓哪些來源(來源代碼,逗號分隔);空白=全部,日後新增的來源自動涵蓋
RootDir C:\dglibrary\ExternalData 存放位置;排程主機上要能寫入
Period {-d1} 期別,決定存進哪一個月的資料夾。{-d1}=上個月,於觸發當下展開成實際年月
Force false 是否連本期已抓過的也重新下載
FullHistory false 車輛公會統計全歷史重載false=只更新最近的月份(已入庫的最大月份往前一個月起——公會會在月中回頭修正上個月數字,所以固定多重抓一個月);true=把落地檔裡 2002-08 以來的 288 個月全部重新解析入庫

FullHistory 只在首次啟用時跑一次

全歷史一次要寫入約 22 萬列(機車)+ 6.7 萬列(汽車),並在派發稽核紀錄留下約 44 MB 資料。請安排在離峰時段執行,跑完把參數改回 false。平時的增量同步每次只有 2~3 個月,很輕。

部分來源失敗會讓整筆排程記為失敗

只要有任一來源不是成功,該次排程結果就會記為失敗(狀態 F)——這是刻意的,讓人在排程紀錄上看得到、去看一眼是「公會還沒公布」還是「真的壞了」。任一來源入庫失敗也一樣(其他來源照做,不會因為一個壞掉就整批不做)。判讀方式見上方狀態怎麼讀

欄位說明

查詢條件

欄位 必填 預設 說明
期別 今天 只取年與月;決定看/抓哪一期
來源 全部 勾選資料表格,可複選;不勾=全部來源
車輛別 全部 全部汽車機車;只影響「車輛公會統計」區
順便取得最新資料 不勾 勾選=查詢前先連線抓一輪並寫進資料庫
強制重抓 不勾 忽略「本期已有」重新下載;僅在上一項勾選時可用

金屬行情

欄位 說明
日期 該筆報價的日期
金屬/名稱 金屬別(銅/鋁/鋅…)與行情品項名稱
交易所 LME/SHFE/COMEX
報價單位 例如「美元/噸」
收盤價/漲跌/漲跌% 該品項的收盤價與漲跌
開盤/最高/最低/成交量 當日行情其餘欄位

車輛公會統計

欄位 說明
資料月份 公會統計的資料月份(顯示 yyyy/MM)。由來源工作表名稱的民國年月換算,例如「115七月份」= 2026/07
車輛別 汽車/機車
銷售別 內銷/外銷/合計(汽車表尾的「總計」區塊)
期別 本期/去年同期
規格 汽車:小客車/商用車(3.5噸以下)/商用車(3.5噸以上)/合計;機車:50CC~1350w/合計
廠牌 各車廠(例:福特六和、台灣五十鈴、台灣山葉、摩特動力…);公會表上的合計欄顯示為「合計」
數量 該格的台數(千分位)。公會原表留空的格不會列出來

為什麼是一列一個數字

公會的表格版面歷年會變(機車 CC 數級距、汽車商用車噸級都調整過)。攤成「一列一個數字」之後,2002 年到今天的資料可以放在同一張表裡,畫圖、比同期都不必先對版面。要看原本那張表的樣子,開落地的原始 xls,或看業務課報告表檢核模式的「TTVMA 原始」分頁。

百分比不存,用算的

公會表上的 % 欄與 % 列不會進資料庫(它們是由數量算出來的)。需要百分比的地方(例如業務課報告表的 TTVMA 原始頁)一律由數量重新計算。

已抓回的檔案

欄位 說明
開啟 在檔案總管中選取該檔
來源 來源顯示名稱
抓取時間 該檔實際被抓下來的時間(跳過時顯示原本那次的時間)
檔案大小 下載檔大小
檔名 存檔檔名(帶抓取時間戳);滑鼠停留可看完整路徑

部署與注意事項

2026-08-27 起本程式需要資料庫端配合,由 IT 執行下列兩支腳本(沿用既有連線,不必另外設定):

腳本 跑在哪 內容
sql/extdata-table-deploy-20260827.sql 集中自動化庫 darb<客戶>auto1 twork_auto_ttvmatwork_auto_metalprice 兩張表與 5 支預存程序,可重複執行
sql/extdata-procparam-log-20260827.sql 各 log 庫(log1~log5) 登錄上述預存程序,程式才呼叫得到

正式機部署前先確認資料庫版本

腳本用到 OPENJSON,資料庫相容等級需 ≥ 130(SQL Server 2016 以上)。腳本開頭會實查,不足時直接中止不建任何物件。朝陽(CY)本次不部署——其正式機為 SQL 2008。

  • 用 sqlcmd 執行兩支腳本都要加 -f 65001(檔案含中文、UTF-8 無 BOM),跑完看腳本最後的驗證結果。
  • 需要新版程式(TsERP.exeAutoPilot.dll)。
  • 兩支腳本都沒跑之前,畫面查詢會顯示紅字「查詢派發失敗」,擷取與落地檔功能不受影響。

常見問題

查詢結果整片都是空的?

先看訊息列寫什麼:寫「查詢派發失敗」是資料庫端還沒部署(見上方部署與注意事項);寫「勾選『取得最新資料』再查一次」才是真的沒有資料——請勾 順便取得最新資料 再查一次;若是排程負責抓的環境,請確認排程事件已建立並審核。

狀態顯示「來源無此期」,是不是壞了?

通常不是。車輛公會每月 10~18 日之後才公布上月數據,太早抓就會是這個狀態。過了公布期仍如此,才可能是網站改版導致抓不到連結,請回報。

同一期再抓一次,怎麼沒有重新下載?

每個檔 2~5 MB,本期已抓過的預設會跳過。要重新下載請同時勾 順便取得最新資料強制重抓

金屬行情的日期天天不同,會不會被當成「本期已有」而漏抓?

不會。行情來源的比對依據帶了日期,所以每天的行情都會被視為新的一份照抓;車輛公會那種「同一個檔」才會被跳過。

抓回來的檔案可以刪嗎?

可以,但不建議刪當年度的。留著舊檔才查得出「當時的報表是根據哪一份資料算的」;公會月中修正數據重新上檔時,這一點特別重要。

想加抓別家公會或別的行情網站?

來源寫在程式裡,需由開發端新增(多數網站只要加一行設定即可)。請提出網站網址與要抓的檔案特徵。

業務儀表板下面也有一區外部資料,兩邊有什麼不同?

資料完全相同(讀同一份紀錄)。業務儀表板那一區是給業務課順手看/順手抓的小面板;本程式則可以查已抓回的資料內容(車輛公會統計、金屬行情明細),也能被收進看板。

查的是這個月,怎麼列出來的是上個月的資料?

表示這個月公會還沒公布,系統改顯示資料庫裡最新的一期,訊息列會註明「顯示 2026-07(本期尚無資料)」。過幾天再查一次即可。

在別台電腦查,看得到資料嗎?

「車輛公會統計」與「金屬行情」兩區看得到(讀資料庫,全公司共用一份);「已抓回的檔案」看不到,因為那一區列的是這台電腦上的實體檔

車輛公會統計為什麼有「合計」的廠牌,加起來會不會重複計?

公會原表就有合計欄與合計列,系統照原樣存下來(方便核對)。自己做統計時請排除廠牌=「合計」與銷售別=「合計」,只取各廠牌的內銷/外銷,否則會重複計算。

公會月中修正了上個月的數字,資料庫會跟著改嗎?

會。每次擷取的增量範圍固定含「已入庫的最大月份的前一個月」,就是為了接住公會回頭修正的那一次;比對到既有資料時是更新而不是新增。

相關功能


需補截圖清單

以下截圖尚未拍攝,請補上並放置於 docs/L-Communication/images/

  1. extdata-step2b.png — 「車輛公會統計」表格特寫(七欄:資料月份/車輛別/銷售別/期別/規格/廠牌/數量;含合計列,數量顯示千分位)
  2. extdata-step2c.png — 訊息列顯示「顯示 2026-07(本期尚無資料)」的情形(本期公會尚未公布時自動退到最新一期)
  3. extdata-step3.png — 排程事件(專案)的「新增事件範本」視窗,紅框標示執行項目「擷取外部網站資料(車輛公會統計)」與參數 JSON(Period{-d1}FullHistoryfalse

拍攝規格:1280×800 以上、PNG;請使用測試資料(公司以「岩月」示意)。