星期五, 12月 30, 2011

CPU 風扇導風散熱裝置

公司同事把電腦搬來,請我幫忙看看是哪裡有問題,為什麼都無法開機,一看到 CPU 風扇導風散熱裝置,整個傻眼,第一次看到灰塵可以積成牽絲的,像是建築物外牆,爬滿藤蔓的感覺。
  • 故意把導風散熱裝置拆下來拍照
CPU 風扇 - 1
  • 整理過後導風散熱裝置原貌
CPU 風扇 - 2
大家都知道把機殼拿掉,可以提高電腦散熱,但往往忽略電腦內積滿灰塵,一樣會散熱不良啦,請定期清理啦 ~~ ^_^

星期五, 12月 23, 2011

[SQL] 流水號跳號

公司內客制的流水號,雖然號稱流水號,但因當時歷史背景和商業邏輯因素,導致會產生流水號不連續或稱跳號的情況下,因此利用 CTE 方式來尋找目前的最小號碼,是跳號的話就把它補齊,沒有跳號的話,就找出目前最小的流水號。

  • 利用 CTE 產生完整的流水號表,再去比對現有資料並找出最小流水號

DECLARE @Temp table (SeqNO smallint)
INSERT INTO @Temp VALUES(1)
INSERT INTO @Temp VALUES(3)
INSERT INTO @Temp VALUES(4)
INSERT INTO @Temp VALUES(9)

;
WITH CTE 
AS
  (
     SELECT 1 AS SeqNO
     UNION ALL 
     SELECT SeqNO + 1
     FROM CTE
     WHERE SeqNO < 5 
  )
SELECT MIN(T1.SeqNO) AS MinNO
FROM CTE AS T1
  LEFT JOIN @Temp AS T2 ON T1.SeqNO = T2.SeqNO
WHERE T2.SeqNO IS NULL 

此作缺點是跑 CTE 會耗費大量 CPU,流水號越多的情況下,此缺點會更明顯。


星期五, 12月 16, 2011

[Challenge] 找出各部門第二高薪人員

Beyond Relational TSQL Beginner's Challenge 1,個人是利用次序函數 RANK() 來做到,次序函數是從 SQL Server 2005 才開始有,在眾多的解法中,有找到非次序函數的解法,可以參考看看。^_^
  • 需求:找出各部門第二高薪人員,而且假如第二高薪有多個人員,也必須一併列出來。
  • 資料來源(題目內有資料來源的 script)
EmployeeID  EmployeeName    Department      Salary   
----------- --------------- --------------- ---------
1           T Cook          Finance         40000.00
2           D Michael       Finance         25000.00
3           A Smith         Finance         25000.00
4           D Adams         Finance         15000.00
5           M Williams      IT              80000.00
6           D Jones         IT              40000.00
7           J Miller        IT              50000.00
8           L Lewis         IT              50000.00
9           A Anderson      Back-Office     25000.00
10          S Martin        Back-Office     15000.00
11          J Garcia        Back-Office     15000.00
12          T Clerk         Back-Office     10000.00
  • 利用次序函數 RANK()
SELECT T.EmployeeID , T.EmployeeName, T.Department, T.Salary
FROM
  (
    SELECT EmployeeID , EmployeeName, Department, Salary ,
            RANK() OVER (PARTITION BY Department ORDER BY Salary DESC) AS RANKNO
     FROM @Employees
  ) AS T
WHERE RANKNO = 2
  • 值得參考的解法
SELECT EmployeeID,EmployeeName,Department,Salary
FROM @Employees e0
WHERE
      (
        SELECT Count(DISTINCT e1.Salary) 
        FROM @Employees e1 
        WHERE e1.Salary >= e0.Salary 
                AND e1.Department = e0.Department
      ) = 2
ORDER BY Department, EmployeeID
  • 結果
EmployeeID  EmployeeName    Department      Salary   
----------- --------------- --------------- ---------
10          S Martin        Back-Office     15000.00
11          J Garcia        Back-Office     15000.00
2           D Michael       Finance         25000.00
3           A Smith         Finance         25000.00
7           J Miller        IT              50000.00
8           L Lewis         IT              50000.00
    參考資料: 

星期五, 12月 09, 2011

[SQL] 利用 T-SQL 語法更改欄位名稱

利用 T-SQL 語法來處理 Table 欄位的需求,直覺會想到利用 ALTER TABLE 語法來處理,但更改欄位名稱無法利用 ALTER TABLE 來達成,必須利用系統預存程序 sp_rename。

-- 新增欄位
ALTER TABLE TableName ADD ColName DataType

-- 刪除欄位
ALTER TABLE TableName DROP COLUMN ColName 

-- 修改欄位資料型態
ALTER TABLE TableName ALTER COLUMN ColName DataType

-- 修改欄位名稱
EXEC sp_rename 'TableName.OldColName','NewColName','COLUMN' 

利用 sp_rename 來更改欄位名稱時,要注意其相依性,EX:函數、預存程序或觸發程序有用到該欄位,必須手動去更新其內容,sp_rename 無法自動更新。
  • 20190515 補述
該欄位存在預設值 (Default)、條件約束 (Check) 時,無法更名欄位,必須先移除相依性,錯誤訊息如下

[SQL] 利用 T-SQL 語法更改欄位名稱

星期五, 12月 02, 2011

[VFP] 判斷電腦是否安裝 AutoCAD

原本想利用 Automation 來判斷電腦是否有安裝 AutoCAD ,但是發現 Automation 好像沒有辦法判斷,下面兩種寫法都失敗,Automation 失敗後只好換個方向,利用 FindExecutable API 來判斷。

  • Automation 判斷 AutoCAD - 無論有沒有安裝 AutoCAD,都沒有辦法產生 Object
loObject = CREATEOBJECT("AutoCAD.Applicat­ion")
loObject = CREATEOBJECT("AutoCAD.AcadApplication")
  • FindExecutable API
-- 宣告 FindExecutable API
DECLARE INTEGER FindExecutable IN shell32 STRING lpFile, STRING lpDir, STRING @lpResult 

lcResult = SPACE(250) -- 接收 FindExecutable API 的回傳值,回傳值為執行檔完整路徑
lcTestFile = ADDBS(GETENV("TEMP")) + "Dummy.DWG" -- 建立測試檔案
STRTOFILE("",(lcTestFile)) -- 在 Windows Temp 資料夾內,建立一個沒有內容的 AutoCAD DWG 檔案
IF FindExecutable ((lcTestFile), "", @lcResult) > 32 -- 大於 32 代表執行成功,有 AutoCAD 軟體
     MESSAGEBOX(lcResult) -- 顯示 AutoCAD 執行檔路徑
ELSE
     MESSAGEBOX("沒有安裝 AutoCAD")
ENDIF
更改測試檔案副檔名(Excel XLS 或 XLSX、Word DOC 或 DOCX),就可以判斷軟體是否安裝在電腦上。