程式資訊
- 程式 ID:
EXTDATA - 所屬子系統:L.聯絡傳訊
- 狀態:stable
外部資料擷取¶
功能簡介¶
「外部資料擷取」把公開網站上的統計檔與行情數字自動抓回來,存成可追溯的原始檔並寫進資料庫,供後續報表(例如業務課報告表)與看板取用。它做兩件事:
- 看:查詢已經抓回來的資料——車輛公會銷售統計、金屬行情明細與各期已下載的檔案清單(不連外網,很快)。
- 抓:需要時在查詢條件勾「順便取得最新資料」,查詢前先連一次外部網站抓最新的,抓完順便入庫。
本程式是查詢型程式,因此也可以被自訂查詢面板收進版面配置當看板區塊使用。主要使用者為業務助理、採購/成本人員與系統管理員。
2026-08-27 起:資料同時進資料庫
以前抓回來的東西只存成檔案,放在執行擷取那台電腦的 C:\dglibrary\ExternalData 底下——換一台電腦就看不到。現在車輛公會統計與金屬行情會同時寫進資料庫(集中自動化庫的 twork_auto_ttvma/twork_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,執行擷取的那台電腦(或排程主機)需對該路徑有寫入權限。 - 對外連線:只有在勾選「順便取得最新資料」時才需要;純查看已抓回的資料不需要連外。
操作步驟¶
步驟① 設定查詢條件¶
條件區由上而下五段:

- 期別:決定看(或抓)哪一個月的資料,預設今天。只取年與月。
- 來源:以資料表格勾選要看的來源,可複選;不勾任何一個=全部來源。日後新增的來源會自動被涵蓋。
- 車輛別:
全部/汽車/機車,只影響下方「車輛公會統計」要列哪一種,預設全部。 - 順便取得最新資料:預設不勾。勾選後按查詢會先連線抓一輪、抓完寫進資料庫再列資料(慢,會下載檔案);不勾就只讀資料庫裡已經有的(快)。
- 強制重抓(本期已有也重新下載):只有在上一項勾選時才可用。預設不勾——本期已抓過的來源不會重新下載。
「本期已有」的來源仍然會補入庫
被跳過的只有「下載」這一步。檔案在本機不代表內容已經進資料庫(可能是舊版程式抓的),所以跳過的來源照樣會解析入庫;重複入庫不會長出重複資料。
當看板用的時候,條件就是唯一的控制面板
把本程式收進自訂查詢面板當區塊時,看板上只會顯示條件與結果,沒有按鈕。這也是「取得最新資料」被設計成條件而不是畫面按鈕的原因——看板上按不到按鈕,但條件存得下來。
步驟② 查詢並讀結果¶
按工具列 查詢,畫面分三塊,各自「有資料才顯示」:

- 金屬行情:讀資料庫,列出該期的行情明細(日期/金屬/名稱/交易所/報價單位/收盤價/漲跌/漲跌%/開盤/最高/最低/成交量)。
- 車輛公會統計:讀資料庫,列出該期公會公布的銷售統計,一列一個數字(資料月份/車輛別/銷售別/期別/規格/廠牌/數量),受條件區的 車輛別 過濾。
- 已抓回的檔案:該期已下載的檔案清單(
開啟鈕/來源/抓取時間/檔案大小/檔名;滑鼠停在列上可看完整路徑)——這一區看的是這台電腦上的實體檔,不是資料庫。 - 訊息列:一行摘要,例如「行情 69 筆、公會統計 234 筆、檔案 2 個(最近一次擷取:…)」。
全部空白時,訊息列會直接提示「勾選『取得最新資料』再查一次」。
本期公會還沒公布時,會自動改顯示最新的一期
車輛公會通常在每月 10~18 日之後才公布上月數據。查詢的期別還沒有資料時,畫面不會給一張空白表,而是改列資料庫裡最新的一個月,並在訊息列註明「顯示 2026-07(本期尚無資料)」。看到這行字就知道現在看的不是你指定的月份。
看到「查詢派發失敗」不是查無資料
訊息列若出現紅字「查詢派發失敗(proc 未部署或跨庫權限鏈未開,不是查無資料)」,表示這個環境的資料庫端尚未部署完成,請洽 IT 依部署與注意事項補跑腳本。系統刻意把「連不到/沒登錄」與「真的沒有資料」分開講,避免把設定問題誤判成沒資料。
步驟③ 需要最新資料時¶
- 回條件區勾 順便取得最新資料,按
查詢。系統會依「期別」去抓勾選的來源。 - 已經抓過的來源不重複下載(本期已有),但仍會補入庫;真的要重新下載請再勾 強制重抓。
- 抓完會把內容寫進資料庫,結果即時反映在三張清單與訊息列上,訊息列會附上入庫筆數,例如「TTVMA_QTA1 入庫 234 筆(新增 234/更新 0)」。
- 入庫失敗時訊息列會明講(例如「入庫失敗:取不到資料庫連線」),不會靜默略過。
每個統計檔約 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」)。一個來源失敗不會影響其他來源,其餘來源照抓。
怎麼掛成自動排程¶
擷取可以掛成背景排程,不必有人記得按。掛法與其他自動化任務相同,完整操作步驟見 排程事件(專案),此處只列本任務的設定值。
- 到 L 聯絡傳訊 → 排程事件(專案),
新增一筆專案主檔後儲存。 - 編輯狀態按
批次新增,於「新增事件範本」視窗設定:
| 範本欄位 | 本任務要設的值 |
|---|---|
| 預定時間 | 建議每月 18~20 日(車輛公會公布上月數據之後) |
| 日期類別 | 每月 |
| 是否自動執行 | 必須勾選;不勾排程器不會跑 |
| 執行項目 | 下拉選「擷取外部網站資料(車輛公會統計)」(單據別 SALESDASH、執行方法 ExternalDataFetch) |
| 參數 | 見下表 |
- 按確定展開事件 →
儲存→審核。
排程參數¶
| 參數 | 預設 | 說明 |
|---|---|---|
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_ttvma/twork_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.exe/AutoPilot.dll)。 - 兩支腳本都沒跑之前,畫面查詢會顯示紅字「查詢派發失敗」,擷取與落地檔功能不受影響。
常見問題¶
查詢結果整片都是空的?
先看訊息列寫什麼:寫「查詢派發失敗」是資料庫端還沒部署(見上方部署與注意事項);寫「勾選『取得最新資料』再查一次」才是真的沒有資料——請勾 順便取得最新資料 再查一次;若是排程負責抓的環境,請確認排程事件已建立並審核。
狀態顯示「來源無此期」,是不是壞了?
通常不是。車輛公會每月 10~18 日之後才公布上月數據,太早抓就會是這個狀態。過了公布期仍如此,才可能是網站改版導致抓不到連結,請回報。
同一期再抓一次,怎麼沒有重新下載?
每個檔 2~5 MB,本期已抓過的預設會跳過。要重新下載請同時勾 順便取得最新資料 與 強制重抓。
金屬行情的日期天天不同,會不會被當成「本期已有」而漏抓?
不會。行情來源的比對依據帶了日期,所以每天的行情都會被視為新的一份照抓;車輛公會那種「同一個檔」才會被跳過。
抓回來的檔案可以刪嗎?
可以,但不建議刪當年度的。留著舊檔才查得出「當時的報表是根據哪一份資料算的」;公會月中修正數據重新上檔時,這一點特別重要。
想加抓別家公會或別的行情網站?
來源寫在程式裡,需由開發端新增(多數網站只要加一行設定即可)。請提出網站網址與要抓的檔案特徵。
業務儀表板下面也有一區外部資料,兩邊有什麼不同?
資料完全相同(讀同一份紀錄)。業務儀表板那一區是給業務課順手看/順手抓的小面板;本程式則可以查已抓回的資料內容(車輛公會統計、金屬行情明細),也能被收進看板。
查的是這個月,怎麼列出來的是上個月的資料?
表示這個月公會還沒公布,系統改顯示資料庫裡最新的一期,訊息列會註明「顯示 2026-07(本期尚無資料)」。過幾天再查一次即可。
在別台電腦查,看得到資料嗎?
「車輛公會統計」與「金屬行情」兩區看得到(讀資料庫,全公司共用一份);「已抓回的檔案」看不到,因為那一區列的是這台電腦上的實體檔。
車輛公會統計為什麼有「合計」的廠牌,加起來會不會重複計?
公會原表就有合計欄與合計列,系統照原樣存下來(方便核對)。自己做統計時請排除廠牌=「合計」與銷售別=「合計」,只取各廠牌的內銷/外銷,否則會重複計算。
公會月中修正了上個月的數字,資料庫會跟著改嗎?
會。每次擷取的增量範圍固定含「已入庫的最大月份的前一個月」,就是為了接住公會回頭修正的那一次;比對到既有資料時是更新而不是新增。
相關功能¶
- 業務儀表板(含業務課報告表產生):車輛公會統計的主要下游
- 排程事件(專案):把擷取掛成每月自動執行
- 自訂查詢面板:把本程式收進版面配置當看板區塊
- 排程作業:排程器本身的部署與疑難排解
- L 通訊與行事曆 概述
需補截圖清單
以下截圖尚未拍攝,請補上並放置於 docs/L-Communication/images/:
extdata-step2b.png— 「車輛公會統計」表格特寫(七欄:資料月份/車輛別/銷售別/期別/規格/廠牌/數量;含合計列,數量顯示千分位)extdata-step2c.png— 訊息列顯示「顯示 2026-07(本期尚無資料)」的情形(本期公會尚未公布時自動退到最新一期)extdata-step3.png— 排程事件(專案)的「新增事件範本」視窗,紅框標示執行項目「擷取外部網站資料(車輛公會統計)」與參數 JSON(Period={-d1}、FullHistory=false)
拍攝規格:1280×800 以上、PNG;請使用測試資料(公司以「岩月」示意)。