国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

使用視圖 - 嘗試一

2024-07-21 02:10:26
字體:
來源:轉載
供稿:網友

第二節 使用視圖 - 嘗試一

第一種創建圖書館應用程序的方法是使用遠程視圖。視圖易于設置,可以參數化,因此可以一次只返回一個或少量的記錄,支持行緩存和表緩存以及事務處理。擁有這些內置的能力,只有在疏忽的的情況下你才不會考慮使用視圖來創建客戶服務器應用程序。

視圖

在圖書館數據庫中(visual foxpro 版) 你可以找到遠程視圖 vadultmember 和 vjuvenilemember。下面的 sql 語句用于定義這兩個視圖:

select member.member_no, member.lastname, member.firstname, ;       member.middleinitial, adult.street, adult.city, ;       adult.state, adult.zip, adult.phone_no, adult.expr_date ;from dbo.adult adult, dbo.member member ;where adult.member_no = member.member_no ;  and member.member_no = ?nmemberidselect member.member_no, member.lastname, member.firstname, ;       member.middleinitial, juvenile.adult_member_no, ;       juvenile.birth_date, adult.street, adult.city, adult.state, ;       adult.zip, adult.phone_no, adult.expr_date ;from dbo.adult adult, dbo.juvenile juvenile, ;     dbo.member member ;where adult.member_no = juvenile.adult_member_no ;  and juvenile.member_no = member.member_no ;  and member.member_no = ?nmemberid

兩個視圖是非常直截了當的。成員的名字在 member 表中地址在 adult 表中。少年的出生日期和擔保人可以在 juvenile 表中找到。兩個視圖基于相同的連接,并確定各表的主關鍵字、標記其它字段是可更新的以使它們是可修改的。這些出現在視圖設計器中的更新條件標簽中。

載入表單

表單 membview.scx 使用了這兩個視圖。以下是表單的 load 方法代碼。因為兩個視圖是用 nodata 選項打開,所以表單最初沒有載入數據。然后設置視圖游標為開放式行緩存。

open database libraryuse vadultmember in 0 nodata= cursorsetprop("buffering", db_bufoptrecord, ;                "vadultmember")use vjuvenilemember in 0 nodata= cursorsetprop("buffering", db_bufoptrecord, ;                "vjuvenilemember"

定位一個成員

用戶可以輸入一個成員的 id 并按下定位按鈕。這樣做就向視圖所需的參數 nmemberid 提供一個值。以下是定位按鈕的 click 事件代碼:

nmemberid = val(thisform.txtmemberid.value)select vadultmember= requery()if reccount("vadultmember") = 0  select vjuvenilemember  = requery()  if reccount("vjuvenilemember") = 0    lcmessage = "設有該 id 成員。"    = messagebox(lcmessage , mb_iconinformation)<略去的代碼>

代碼首先檢查用戶是否修改了數據。然后保存輸入的 id 到變量 nmemberid 中。adult 視圖首先被請求。如果沒有找到該 id 則請求 juvenile 視圖。如果沒有找到該 id 的記錄則該 id 是無效的。如果找到了則該成員的信息顯示在表單中。

添加一個成員

當用戶單擊 add 按鈕時他們會得到一外空的表單。在用戶按下 save 按鈕前記錄并未被保存。add 按鈕的 click 事件中的代碼首先檢查用戶是否修改了當前成員的信息。如果沒有記錄改變則發布一個 tablerevert()。然后添加一個空記錄到視圖中并刷新表單。用戶可以在空的記錄上輸入成員信息。當用戶按政 save 時,visual foxpro 將發送新的記錄到 sql server。

保存修改

視圖的一個好的功能是后端為你處理這些。tableupdate() 函數用于保存對視圖的修改到源表中。visual foxpro 自動處理這一點。以下是 save 按鈕的 click 代碼:

if tableupdate()  = messagebox(lcmessage, mb_iconinformation)else  thisform.showerrorendif

取決于當前成員是成年人或少年 ,vadultmember 或 vjuvenilemember 視圖被選定。然后發布一個 tableupdate()。如果成功,數據被保存。否則向用戶顯示發生了什么問題。 注意因為使用了 tableupdate(),它可以處理新添加的成員或對成員信息的修改。

刪除一個成員

要刪除后端上的一條記錄只需在視圖中刪除它。以下是 delete 按鈕的 click 事件代碼:

select (thisform.cviewinuse)deleteif tableupdate()  = messagebox("this member has been deleted.", ;               mb_iconinformation)  append blank……else  thisform.showerror  =tablerevert()endif

在詢問用戶確認刪除選定視圖的記錄后,記錄從視圖中刪除并發布 tableupdate() 。如果成功,記錄從后端刪除。否則,向用戶顯示錯誤原因。

問題

visual foxpro 不是奇妙的嗎? 客戶服務器是多么的容易,你可能會想? 該表單是非常簡單和易于使用。但這里有三個問題。

不能添加新成員

要測試這些問題,單擊 add 按鈕,添加一個新成員并單擊 save。很快你會看到如圖2所示的信息。

圖 2 添加成員時的錯誤信息

在按下 add 按鈕時,一個空記錄添加到 vadultmember 視圖游標中。該視圖由兩個表組成,adult 和 member。在按下 save 按鈕時,visual foxpro 發送 name 信息到 member 表。sql server 自動提供 member id。因此很好。visual foxpro 也發送地址信息到 adult 表。但關于成員的 id,它沒有發送任何東西。該字段保持為空,這是非法的并造成 tableupdate() 失敗。

要處理這一問題,新記錄需要首先添加到 member 表,并且結果 id 需要根據地址信息放到 adult 表。沒有理由認為 visual foxpro 的視圖知道這些。為什么會這樣? visual foxpro 不知道是什么 id ,且不知道在 adult 表中發送它。

不能刪除成員

在圖書館數據庫中(sql server 版) 在 adult 和 juvenile 表及 member 和 loan 間有著參照完整性。如果一個成員負責有少年成員或她/他還有未還清的借書,你就不能刪除他/她。你可以期望 sql server 拒絕該刪除并發送加一個錯誤提示。

但是,如果一個成員沒在相關少年和借書,你可以刪除一個他/她。試著這樣做你會看到一條如下圖所示的錯誤信息。

圖 3 刪除成員時的錯誤信息

該錯誤,如果你理解 sql server 語言,它告訴你 adult 和 member 表間參照完整性沖突。這將會在試著在刪除 adult 記錄前刪除 member 記錄時發生。這明顯的是發生在視圖中。對于刪除處理記錄,必須首先刪除 adult 然后刪除 member。但是,visual foxpro 如何知道這些?

不可理解的錯誤信息

如果你想刪除一個負責有少年的成員,你會被終止。如果你想刪除一個借有圖書的成員,你會被終止。但是,sql server 將發送回 visual foxpro 一個類似于圖 3 的錯誤信息。這些信息對于用戶來說是完全不能理解的。

考慮另一個示例。adult 表具有以下約束檢查定義:

alter table adult  with nocheck  add constraint phone_no_rule check (phone_no like     '(206)[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]')

這些約束強制電話號碼以 206 區號開始。如果插入或更新的記錄的電話號碼違反了這個規則,數據將被拒絕。但是,用戶看到的怪異的提示信息如下圖所示。

圖 4 檢查約束違反錯誤信息

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 海南省| 浑源县| 定西市| 丁青县| 屏东市| 聂荣县| 朝阳市| 延安市| 若羌县| 旌德县| 东兰县| 常熟市| 乐清市| 右玉县| 沿河| 贵南县| 广元市| 抚松县| 山丹县| 潼南县| 西吉县| 土默特左旗| 湛江市| 杭锦后旗| 蒲城县| 措勤县| 岳池县| 化州市| 郸城县| 德化县| 义乌市| 昌平区| 西城区| 楚雄市| 广德县| 喜德县| 疏附县| 白沙| 岐山县| 通江县| 昌乐县|