MasteringVFP/4/9

出自VFP Wiki

在2005年4月18日 (一) 01:33由Elleryq (對話 | 貢獻)所做的修訂版本
跳轉到: 導航, 搜尋

個人是覺得 Trigger 很好用, 但是在不同的資料庫會有不同的語法,資料庫轉移上也會有問題, 而且也不是所有的資料庫都有 Trigger 功能, 例如 MySQL 就沒有(最新版有沒有不清楚, 有興趣至 MySQL 網站)。不少書藉不建議使用 Trigger, 不過如果只是小程式, 倒是可以寫寫看。 如果單純以 VFP 來說, Trigger 必須加進 DBC 內才有這功能。 一樣來舉個例子:

CREATE DATABASE 測試
CREATE TABLE 庫存 (No C(10),Qty I)
CREATE TABLE 進貨 (No C(10),Qty I)
CREATE TABLE 出貨 (No C(10),Qty I)

上述是建立一個 [測試.dbc]、[庫存.DBF]、[進貨.DBF]、[出貨.DBF], 接下來在 [測試.dbc] 內的 Store Procedure 輸入以下的 Code

* --------------------------------------------------
* 以下程式碼不考慮錯誤處理問題
* --------------------------------------------------
* 進貨時的 Insert Trigger
* --------------------------------------------------
FUNCTION 進貨_insert()
	SELECT 庫存
	LOCATE FOR No=進貨.No
	IF !FOUND()
		INSERT INTO 庫存 (No,Qty) VALUES (進貨.No,進貨.Qty)
	ELSE
		Replace Qty WITH 庫存.Qty+進貨.Qty IN 庫存
	ENDIF
	SELECT 進貨
ENDFUNC
* --------------------------------------------------
* 出貨時的 Insert Trigger
* --------------------------------------------------
FUNCTION 出貨_insert()
	SELECT 庫存
	LOCATE FOR No=出貨.No
	IF FOUND()
		Replace Qty WITH 庫存.Qty-出貨.Qty IN 庫存
	ENDIF
	SELECT 出貨
ENDFUNC

將 Store Procedure 存檔後在下一些命令

* -- 在進貨檔建立 Insert Trigger
CREATE TRIGGER ON 進貨 FOR INSERT as 進貨_insert()


* -- 在出貨檔建立 Insert Trigger
CREATE TRIGGER ON 出貨 FOR INSERT as 出貨_insert()

* -- 新增進貨檔一筆記錄: 產品代號為 A12345, 數量 10
INSERT INTO 進貨 (No,Qty) VALUES ("A12345",10)

* -- 新增出貨檔一筆記錄: 產品代號為 A12345, 數量 3
INSERT INTO 出貨 (No,Qty) VALUES ("A12345",3)

* -- 查看庫存檔
Select 庫存
Brow

您可以在庫存檔內看到 A12345 的數量剩 7

Trigger 的用途就是只要有 Insert、Update、Delete 的 Trigger Function, 針對這個資料做增刪修的命令即觸發這些 Function 如果要在 Trigger 處理不符合 Rule 的動作時, 下 Return .F., 這樣子配合 Tableupdate 時會回應 False