全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2284
推到 Plurk!
推到 Facebook!

ADOQuery疑問

答題得分者是:kevin2004
lasterliu
一般會員


發表:38
回覆:57
積分:19
註冊:2007-11-05

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-08-15 10:53:51 IP:139.223.xxx.xxx 訂閱
請問各位大大,小弟在設計程式時,碰到一個困擾已久的問題,煩請知道的大大可以教導一下小弟....謝謝。

就是在使用ADOQuery的新增或修改時,以DBEdit or DBGrid來輸入資料,編輯至一半,不知什麼原因有時會出現說資料庫不是在編輯或新增模式。
1、所以想請問大大有沒有方法可以偵測線在資料庫的模式是如何
2、還有另一個問題是如何進入編輯模式呢?(是用ADOQuery.EDIT嗎?)
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-08-15 13:34:09 IP:61.66.xxx.xxx 訂閱
原因不是出在ADOQuery
而是DBEdit or DBGrid
其實知道資料庫是否LOCKED比較重要
可以看 HELP 文件
===================引 用 lasterliu 文 章===================
請問各位大大,小弟在設計程式時,碰到一個困擾已久的問題,煩請知道的大大可以教導一下小弟....謝謝。

就是在使用ADOQuery的新增或修改時,以DBEdit or DBGrid來輸入資料,編輯至一半,不知什麼原因有時會出現說資料庫不是在編輯或新增模式。
1、所以想請問大大有沒有方法可以偵測線在資料庫的模式是如何
2、還有另一個問題是如何進入編輯模式呢?(是用ADOQuery.EDIT嗎?)
------
======================
昏睡~
不昏睡~
不由昏睡~
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-08-15 18:34:59 IP:61.219.xxx.xxx 未訂閱
if AdoQuery1.State <> dsEdit then
AdoQuery.Edit ;

if Not (AdoQuery1.State in [dsEdit,dsInsert] )then
AdoQuery1.Edit ;
===================引 用 lasterliu 文 章===================
1、所以想請問大大有沒有方法可以偵測線在資料庫的模式是如何
2、還有另一個問題是如何進入編輯模式呢?(是用ADOQuery.EDIT嗎?)
------
Kevin
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-08-15 18:41:52 IP:61.219.xxx.xxx 未訂閱
我猜你的狀況應該是在MasterDetail的主要明細關係
如果是如此的話,那你可能就錯過了一個很重要的觀念沒有先弄通。你
才會『..困擾已久...』,這觀念沒先建好,你將來還是有苦頭吃的。
先確定你是否是在MD環境?再談。
===================引 用 lasterliu 文 章===================
...碰到一個困擾已久的問題....
就是在使用ADOQuery的新增或修改時,以DBEdit or DBGrid來輸入資料,編輯至
一半,不知什麼原因有時會出現說資料庫不是在編輯或新增模式。

------
Kevin
lasterliu
一般會員


發表:38
回覆:57
積分:19
註冊:2007-11-05

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-08-15 22:49:04 IP:123.192.xxx.xxx 訂閱
謝謝Kevin與ko的說明,非常感激。
小弟不知道這是不是MasterDetail,小弟的程式有兩個ADOQuery兩個DataSource兩個DBGrid,ADOQuery2的DataSource為DataSource1,與ADOQuery作關聯,
但在新增修改ADOQuery2的資料時就常會出現此種情況,不知可不可以煩請Kevin大大能把您說的MasterDetail的主要明細關係觀念跟小弟大概說一下,
讓小弟有個方向,謝謝,麻煩您了~~
ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-08-17 11:19:25 IP:61.66.xxx.xxx 訂閱
不懂~
>>ADOQuery2的DataSource為DataSource1,與ADOQuery作關聯
這是啥咪意思!?!?

===================引 用 lasterliu 文 章===================
謝謝Kevin與ko的說明,非常感激。
小弟不知道這是不是MasterDetail,小弟的程式有兩個ADOQuery兩個DataSource兩個DBGrid,ADOQuery2的DataSource為DataSource1,與ADOQuery作關聯,
但在新增修改ADOQuery2的資料時就常會出現此種情況,不知可不可以煩請Kevin大大能把您說的MasterDetail的主要明細關係觀念跟小弟大概說一下,
讓小弟有個方向,謝謝,麻煩您了~~
------
======================
昏睡~
不昏睡~
不由昏睡~
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-08-17 12:10:14 IP:61.219.xxx.xxx 未訂閱
小弟的程式有兩個ADOQuery兩個DataSource兩個DBGrid,ADOQuery2的DataSource
為DataSource1,與ADOQuery作關聯,但在新增修改ADOQuery2的資料時就常會出
現此種情況...
====>最近新案子主力都移到Java及.NET去了,好久沒寫Delphi新案子了。最多
====> 只是維護舊的DelphiAP,初看你寫的這段,我也要翻翻書確認一下。
====>沒錯,這就是標準的MasterDetail,也就是大家常講的一對多,或主從關
====> 係。
====>這在商業應用AP中是很常見的,如課室與課員、發票與明細、如業務員與
====> 客戶。無處無之。
兩個DBGrid,ADOQuery2的DataSource為DataSource1,與ADOQuery作關聯,但在新
增修改ADOQuery2的資料時就常會出現此種情況
====>這是你不知道當Delphi遇到這些問題時是如何作處理所致
====>而且你的架構基本上是有問題的,後患將會源源不絕的,你可以考慮修改
====> 一下。
====>由於MD實在太重要了,我建議你仔細花點功夫研究一下。
====>以往在深度論壇時,我們對這個相關問題討論了很多很多,你應該去看看
====>李維在Delphi4/5時寫了好幾本書,有詳細講到Delphi對MD是如何設計的
====> 你該找來看看。
====>由於Delphi實在是設計的太好太體貼了,當然這是較卓越的DeskTop軟體
====> 的通病。這在前幾年公司轉型到Java時,我們這些老傢伙在用JDBC
====> 作原始的一再重覆的資料處理差點要發瘋時,才知道原先Delphi把我
====> 慣壞到如何的程度。才萬分懷念以往用Delphi的快樂日子有多消遙自
====> 在。當然,也必需加一句,Java一日千里,今日用Java快活的多了。
------
Kevin
編輯記錄
kevin2004 重新編輯於 2008-08-17 12:53:37, 註解 無‧
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-08-17 12:20:44 IP:61.219.xxx.xxx 未訂閱
前些時候,在站了看了好幾篇文章,都不約而同的看到這些句子『...不知為何...
這種情況就會不定時出現...』。小弟看了,好想大喊一聲:『就是MD...』。
可是往往我看到這些題目時,這些題目都已被結案了。原提問者可能都不會再
再回來看這些題目了。不像古早時,通常一個題目會累積到三十或五十個討論
帖子。提問人會問到他絕對滿意才會停下來。那像現在,一個題目能有個三五
個帖子就好好了。
當然,現在人往往都有速食的惡習,再加上草莓的性情,及不肯誠肯苦學的態度,
碰到愛罵人出名的KTop,往往...
------
Kevin
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-08-17 12:46:05 IP:61.219.xxx.xxx 未訂閱
言歸正傳。
以往在Delphi2/3時,我們常會手動作MD關聯。所以這些問題,我們非常清楚,從
來不會碰到類似的情況。後來到Delphi5以後,Delphi處理的很好了,我們就
很少管這些東西了。如果又沒人告訴你『Delphi是如何作你的MD』時,那你就
很可能會出問題。這些你可以看李維的書,要不站裏以往討論個的文章也是很
多。
你是兩個DBGrid,一個是MDBGrid,一個是DDBGrid。當你在作DDBGrid作新增時,如
果你又點改到了MDBGrid的另一筆記錄時,Delphi會從新載入另一筆Master﹝即
主要記錄﹞記錄的相關Detail記錄﹝請參見你的DDBGrid﹞。這時你的
DetailAdoQuery的State就會由dsEdit或dsInsert自動改為dsBrowse,就會造成
你講的情況。即如果你的MasterAdoQuery只要移位,你的DetailAdoQuery正新
增的資料就會丟掉﹝假設你沒有用可自動處理這個問題的ClientDataSet﹞,或
你的DetailAdoQuery.State就會改變。這就是原因了。
改善之道,可以改用dbX/clientdataset。不過這個可能工程太大。
較好的還是就你原先架構改良。如Detail的新增是單筆單筆下令後新增;異動
Detail某筆時,一定將Master鎖住、或鎖住某Master後,對此Master的Detail
作批次異動多筆新增修改,此時因Master沒移動所以不怕丟了Detail...
如果客戶堅持要以DBGridBatchUpdate方式作Detail多筆異動,甚至要涉及三層或四
層甚或五層的MD作DBGrid異動時,你就要更小心了。這時程式的規模可能就會
從一兩千行,漲到一兩萬行一個Form的規模了。那時就要很小心及虔誠祈禱。
------
Kevin
kevin2004
資深會員


發表:18
回覆:463
積分:416
註冊:2005-05-29

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-08-17 12:51:48 IP:61.219.xxx.xxx 未訂閱
主要的原理就在以上所講的。你細細看看就會處理了。
小弟今晚飛機去美國,站裏還有幾篇文章未回。就講到這了。
我要下下週才會回來,中間是不會回站裏的。
祝你好運。
------
Kevin
lasterliu
一般會員


發表:38
回覆:57
積分:19
註冊:2007-11-05

發送簡訊給我
#11 引用回覆 回覆 發表時間:2008-08-17 21:20:49 IP:123.192.xxx.xxx 訂閱
謝謝Kevin大大的回答,您一次回覆這麼多,讓小弟真的真的很感激,
因為遇到不會的東西時,有高手或前輩的詳細指點,真的是一件很幸福的事情,
再次謝謝Kevin大大的指點。^^

KO大大:
不好意思,小弟少打一個數字。
小弟的程式有兩個ADOQuery兩個DataSource兩個DBGrid,ADOQuery2的DataSource為DataSource1,與ADOQuery1作關聯
ADOQuery的數字1忘了打,問題描述不詳進真是不好意思。

謝謝兩位大大的解說^^。
系統時間:2024-05-03 6:01:45
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!