星期五, 3月 25, 2011

[Win] 利用 NET USE 語法建立網路磁碟機

Windows NT 的電腦常常發生看不到區域網路內其他電腦的情況,但放段時間又抓的到,假如用 ping 去確定電腦是否存在,又都 ping 的到,每次臨時要重設網路磁碟時,遇上這問題,真的是會讓人抓狂,總不可能在那賭運氣,等電腦抓到。

利用 NET USE 即使看不到區域網路上的電腦,但只要 ping 的到,還是可以順利建立網路磁碟機。

命令提示字元內,打出下列語法就可以連結
-- 一:(*)不指定磁碟機名稱,電腦會自動指派一個可用名稱
NET USE * \\ComputerName\ShareName

-- 二:(DeviceName)則是自己指派,EX:Z:。
NET USE DeviceName \\ComputerName\ShareName

-- 三:輸入使用者帳密
NET USE * \\ComputerName\ShareName password /user:UserName

星期五, 3月 18, 2011

UNION

UNION 將兩個或更多查詢的結果集結合成單一結果集(縱向連結資料),個人覺得 UNION 最好用的地方在於連接歷史資料庫,尤其是習慣把每一年資料拆成一個 Table 來整理,EX:Order98、Order99。

    SQL UNION 使用限制:
  • 欄位數目和順序需要一致
  • 欄位資料型態必須相容(隱含式轉換)
    VFP UNION 使用限制:
  • 除了上述限制外,在 8.0 和 9.0 版本裡假如資料行有 Memo 資料型態,一定要用 UNION ALL,用 UNION 會錯誤,8.0 之前版本則是沒有這個限制。
    SQL、VFP UNION 使用上需要注意的地方:
  • UNION 和 UNION ALL的差異:UNION 會自動過濾重複資料,而 UNION ALL 則是會把全部資料都列出來;因為 UNION 會過濾重覆資料,所以在效率上,UNION ALL會比較快一些。
  • 欄位名稱以第一個資料集為依據。
  • Order By 必須放在整個 T-SQL 語法的最後。
-- 建立範例資料
DECLARE @NY table (EmployeeID char(4),Employee char(8),Birthday datetime)
DECLARE @TW table (EmployeeID char(4),Employee char(8),Birthday datetime)
 
-- Ray 和 Doris 這兩個人名,同時存在 @TW 和 @NY 中  
INSERT INTO @NY VALUES('NY01','Emma','19860606')
INSERT INTO @NY VALUES('NY02','Ray','19840404')
INSERT INTO @NY VALUES('NY03','Doris','19870707')
INSERT INTO @NY VALUES('NY04','Peggie','19890909')
INSERT INTO @NY VALUES('NY05','Angel','19810101')
INSERT INTO @TW VALUES('TW01','Terry','19901010')
INSERT INTO @TW VALUES('TW02','Ray','19820202')
INSERT INTO @TW VALUES('TW03','Doris','19830303')
INSERT INTO @TW VALUES('TW04','Fanny','19880808')
INSERT INTO @TW VALUES('TW05','Jarry','19850505')

星期五, 3月 11, 2011

[SQL] Trigger - inserted & deleted Table

deleted Table 和 inserted Table 為 Triiger 使用的兩個特殊暫存資料表(交易紀錄的檢視表),其欄位名稱、順序和資料型態都跟原來的 Table 一致,可以利用它們了解 INSERT、UPDATE 和 DELETE T-SQL 語法觸發 Triiger 時,插入、修改或是刪除哪些資料。

inserted Table 會儲存 INSERT 和 UPDATE 前的資料、deleted Table 則會儲存 UPDATE 後和 DELETE 的資料。
  •  利用表格表示
Trigger
  • 利用圖形表示
[SQL] Trigger - inserted & deleted Table - 2
SQL Server 會在 TempDB 中自動建立並管理,無法直接修改資料表內的資料或是修改其結構(EX:CREATE INDEX),當Trigger 結束時,暫存的 deleted Table 和 inserted Table 會自動消失。
  • 整合 inserted 和 deleted 並判斷類別(新增、更新或刪除)
利用 FULL JOIN 把 inserted Table 和 deleted Table 整合在一起,再透過判斷主要連結欄位是否為 NULL 或 相等,來判斷資料是新增、修改或是刪除。
SELECT 
  COALESCE(I.KeyFields,D.KeyFields) AS KeyFields, -- 利用 COALESCE() 來找出 KeyFields
  'Kind' = CASE
             WHEN D.KeyFields IS NULL THEN '新增' -- 利用 D.KeyFields IS NULL 來判斷是否為新增
             WHEN I.KeyFields IS NULL THEN '刪除' -- 利用 I.KeyFields IS NULL 來判斷是否為刪除
             WHEN I.KeyFields = D.KeyFields THEN '更新' -- 利用 I.KeyFields = D.KeyFields 來判斷是否為更新
           END
FROM 
  inserted AS I 
  FULL JOIN -- 利用 FULL JOIN 來連結兩個暫存資料表
  deleted AS D ON I.KeyFields AND D.KeyFields
  • 利用 EXISTS 來判斷資料是否存在 inserted 和 deleted
-- 新增  
IF EXISTS(SELECT 1 FROM inserted) AND NOT EXISTS(SELECT 1 FROM deleted)

-- 更新
IF EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)

-- 刪除
IF NOT EXISTS(SELECT 1 FROM inserted) AND EXISTS(SELECT 1 FROM deleted)

星期五, 3月 04, 2011

[VFP] GOMONTH() 應用

說明:
GOMONTH(dExpression | tExpression, nNumberOfMonths);
對於給定的日期或日期時間,傳回其指定之前或之後月份數目的日期。

參數說明:
  1. dExpression | tExpression:輸入 Date 或是 DateTime 資料型態
  2. nNumberOfMonths:正數表示加給個月份;負數代表減幾個月。
回傳值:Date 資料型態
備註: GOMONTH() 不支援 1753年01月01日之前的日期
  • 計算月份的最後一天、當月總共有幾天
邏輯:要計算當月份的最後一天,先找到下個月的第一天,再減一天就是當月的最後一天;最後一天同時也代表著當月份的總天數。
LOCAL dDate,dLastDay AS date
LOCAL iTotalDay AS integer 

dDate = DATE() -- 使用者自訂日期

-- 先利用DATE() 來找出自訂日期月份的第一天,
-- 然後利用GOMONTH() 加一個月找到下個月第一天,
-- 再減一天,找到自訂日期月份的最後一天。
dMonthLastDate = GOMONTH(DATE(YEAR(dDate),MONTH(dDate),1),1)-1

-- 邏輯同上,最後再利用DAY()函數把天數抓出來就行
iTotalDay = DAY(dMonthLastDate)