線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3122
推到 Plurk!
推到 Facebook!

dbgrid 新增一筆時,都會將資料移到 dbgrid 之第一行讓我輸入

尚未結案
a123473119
一般會員


發表:19
回覆:46
積分:18
註冊:2002-08-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-17 23:52:18 IP:61.56.xxx.xxx 未訂閱
請教各位前輩: 我是用table--> datasource ---> dbgrid table 有設 indexfieldname= no; seq table newrecord 時,給與 no,seq 當dbgrid 往下(新增), 第一時間, seq 是對的( 有設 column 顯示) dbgrid 也是在最後一行讓我輸入其它資料 但當我打入其他資料,enter後,(應有自動post),dbgrid 卻把這整筆 record 移到 dbgrid 之第一行,等我輸入其他資料, 此時 seq 仍正確 如同 indexfieldnames 失效般, 每次新增,皆會移到第一行輸入 資料無錯誤,但輸入位置變成不是新增的最後一行,而是插在最前面 ,且一直在最前插入,求救於各位前輩,這樣實在是不行的. thanks.
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-03-18 09:33:06 IP:218.16.xxx.xxx 未訂閱
看狀況應是 no 比其他資料的 no 小。 因為你的 index 是先 no 後 seq ,所以若 no 空了或比其他小,即使 seq 較大,還是排在前面的。 你說你有給值 no ,但可否試試暫時設定 no 顯示,看看是否 no 的問題呢?
a123473119
一般會員


發表:19
回覆:46
積分:18
註冊:2002-08-08

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-03-18 14:54:59 IP:61.56.xxx.xxx 未訂閱
感謝justmade: no 值也沒錯, 我有將 no 加入 dbgrid 內檢視, 沒問題的. 這個問題, 以前用paradox 也會如此, 現用mysql, 用dbgrid 仍有此問題, dbgird 又是一般單據檔(進出貨..),最常用到的元件, 真不知道其他前輩 是如何控制dbgrid的新增問題, 還是有其他正確的控制dbgrid方法,願前輩們 指點迷津. thanks again.
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-03-18 16:36:12 IP:218.16.xxx.xxx 未訂閱
我剛試過以下的 MySQL->MyODBC->ODBC->TTable->TDataSources->TDBGrid TTable 設定了 indexfieldname Table.AfterInsert 自動設定 indexfieldname 的欄位,是屬於中間值以便測試何時跳位 TDBGrid 完全用預設選項 1. 移到最後一個記錄 2. 向下以新增一個記錄,indexfieldname欄位己自動填入 (位置:最後一筆) 3. 修改各個欄位,沒自動post,indicator 仍是 * (位置:最後一筆) 4. 所有欄位已輸入,游走各欄位之間沒自動post,indicator 仍是 * (位置:最後一筆) 5. 移到別筆記錄(自動Post)或手動 Post,即時跳到應在的位置 (按 indexfieldname 欄位) 所以你的情況似乎是 1. 你新增的 no ; seq 是比第一筆的 no ; seq 小 (若反向排序則較大) 2. 你有的程式碼去在修改中自動post,以至記錄立即跑到應在的位置
a123473119
一般會員


發表:19
回覆:46
積分:18
註冊:2002-08-08

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-03-19 10:27:27 IP:61.56.xxx.xxx 未訂閱
再謝Justmade 指導: 沒錯,在身檔未Post以前, dbgrid 是在最後一筆讓我輸入, 但只要一post 資料整筆就走位,不一定是跑到最前一筆,(應是插入於此批輸入之最前面) 即是每插入新筆時,會位移到舊資料(非此次輸入)最後面,新資料最前面 , 敢肯定key正確(有show出檢視). 真無法了dbgrid之排序作法. 今早我把table 之cachedupdate 設為 false, 好像不不會亂移位了, 但不用 cacheupdate 又如何作到放棄更正, 因為一般會用dbgrid做輸入動 作,可能是單據檔之身檔, 打完身檔後常會給 user 一個確認否之提示, 確認後才 applyupdate, 不用cacheupdate, 如何放棄更改之資料, 不曉得 Justmade之想法如何? 謝謝您不煩的教導.
T.J.B
版主


發表:29
回覆:532
積分:497
註冊:2002-08-14

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-03-19 11:01:47 IP:61.220.xxx.xxx 未訂閱
hi: 你在dataset的onafterpost事件是否做了什麼動作 天行健 君子當自強不息~~@.@
------
天行健
君子當自強不息~~@.@
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-03-19 11:14:04 IP:218.16.xxx.xxx 未訂閱
引言: 但不用 cacheupdate 又如何作到放棄更正, 因為一般會用dbgrid做輸入動 作,可能是單據檔之身檔, 打完身檔後常會給 user 一個確認否之提示, 確認後才 applyupdate, 不用cacheupdate, 如何放棄更改之資料,
有2個方法 1. 用 Transaction (MySQL 要用 InnoDB / BDB Tables),儲存便 Commit 不儲存便 rollback 2. 加入 TDataSetProvider 及 TClientDataSet 然後以 TClientDataSet 連接視覺化元件及作一般操作。 TClientDataSet 會記住所有在 applyupdate 前的異動,只要 Refresh 就可完全還原為資料庫現在的資料而不儲存,而且可以一步步 Undo 之前的修改。這樣會使架構變大,但好處是之後可以比較容易轉成多重架構,因為 TDataSetProvider 及 TclientDataSet 可以在不冋的程式不同的電腦互相構通,只是將 TDataSetProvider 以前的元件搬過 Application Server 程式,便可實現 三層架構。 你可考慮使用 dbExpress 或是使用 傳統的 BDE ODBC 甚或其他方式做中介連線,可參考小弟前幾天發表的 Delphi MySQL 的問題探討 http://delphi.ktop.com.tw/topic.php?TOPIC_ID=27168
a123473119
一般會員


發表:19
回覆:46
積分:18
註冊:2002-08-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-03-22 23:45:24 IP:61.56.xxx.xxx 未訂閱
對不起二位前輩,現在才回應. 因無法處理,所以身檔部份全改成用一temp table來處理.其實T.J.B說對了, 我在table post 後,自行更改了 seq (no seq 為 key),重排身檔每筆之seq 只為了讓 seq好看些,所以造成 dbgrid 亂掉了,經再三測試, 只要 table->datasource->dbgrid 此關係存在, 自行對table進行 insert, delete, 或更改 key 值, 皆有可能使 dbgrid 之內容重覆,排序不對,無法新增 ...很多怪狀況皆可能發生, table.disableControls 也無法避免dbgrid錯亂, 只能對 table 下 close,再open (有時也不見得能恢復正常). 看來小弟對 dbgrid,table.disablecontrols 之觀念真的太差了,很難駕馭它. 真汗顏.再次感謝二位前輩相助.
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-03-23 11:19:37 IP:211.23.xxx.xxx 未訂閱
終極解法 全部不要用資料感知元件 dbgrid改用stringgrid
a123473119
一般會員


發表:19
回覆:46
積分:18
註冊:2002-08-08

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-03-25 16:13:38 IP:61.56.xxx.xxx 未訂閱
感謝hahalin建議,其實剛重dos轉過來時,就一直有這種想法,但一直找不到適當 學習範例,不得已作罷. 不想再開版佔大家空間, 近常碰到,insert 一筆, dbgrid 卻出現二筆, table close 後,才會正確, 這只是我單檔之維護畫面,上面左方擺dbgrid讓 使用者檢視,右方放 dbedit,下方有一個 dbnavigator 使用者按新增,到右方打資料,後 post,dbgrid 就會出現重覆二筆, 一定要 close table 才會出現正確資料. 如果直接取消這二筆,只有一筆可取消,另一筆就會出現有另外使用者已更改此筆 資料之錯誤訊息. 不曉得各位前輩誰有相同經驗. help !!
a123473119
一般會員


發表:19
回覆:46
積分:18
註冊:2002-08-08

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-03-26 00:07:38 IP:61.56.xxx.xxx 未訂閱
Hey: 或許跟 primary key 有關, 身檔一般我都用 mysql 之 row_id auto_increment 當 primary key table 時用 indexfieldname 為 no;seq ,雖為key 但不是 primary key 此時 dbgrid 運作起來,相當奇怪, 如insert 顯示2 筆, 若indexfieldnames 引用 primary key 之 field (不可用 auto_increment ) 則沒有怪問題, 不曉得 dbgrid為何有如此限制???? 有心得再向各位前輩報告.
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-03-26 15:29:55 IP:218.16.xxx.xxx 未訂閱
我沒見過這種情形。 可否舉一實際例字,列出create 那個 Table 的語法 (你可用 show create table MyTableName 語法得出 create 該 table 的語法然後剪貼出來),幾筆資料的內容及新做一個專案可做出該問題的步驟。 建議你另開一個問題因為很多人不看已結案的問題的。
a123473119
一般會員


發表:19
回覆:46
積分:18
註冊:2002-08-08

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-03-29 00:08:53 IP:61.56.xxx.xxx 未訂閱
To Justmade前輩: show create table testmu 之顯示 |testmu| CREATE TABLE 'testmu' ( 'au' int(11) NOT NULL auto_increment, 'no' char(10) default NULL, 'dt' char(6) default NULL, 'my' int(11) default NULL, PRIMARY KEY ('au'), KEY 'i1' ('no','dt'), key 'i2' ('dt','no') ) TYPE=MyISAM | //------------------------------------------------ form 的內容,一個dbgrid,一個DBNavigator,三個 dbedit unit Testdup; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Mask, DBCtrls, Db, ExtCtrls, Grids, DBGrids, DBTables; type TForm1 = class(TForm) Table1: TTable; DataSource1: TDataSource; DBGrid1: TDBGrid; DBNavigator1: TDBNavigator; Table1no: TStringField; Table1dt: TStringField; Table1my: TIntegerField; DBEdit1: TDBEdit; DBEdit2: TDBEdit; DBEdit3: TDBEdit; private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.DFM} end. //---------------------------------------------- 由於這檔no dt不用唯一, 所以我用了一個 'au' 為 auto_increment 當 primary key. form 上之table1 有設 indexfieldnames= dt;no dbgrid 上有三個column //---------------------------------------- 測試步驟: 1)在 DBNavigator 按新增,到 dbedit 輸入資料, 再到 DBNavigator 按 post,---->dbgrid 就會出現雙筆 我用 paradox (在 local 上), 將 au 設為 autoincrement 欄,且為key 將 no dt,dt no 接設為 secondary index Table1 設 indexfieldnames= dt;no 測試則無問題. //------------------------------------------------------------------- 煩請前輩試試! (我用的是 delphi c/s 4.0 win98 mysql myodbc 3.51) thanks.
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-03-29 10:56:02 IP:218.16.xxx.xxx 未訂閱
測試結果如下 : ODBC + BDE 如你所說,post 後有沒 au 欄的重覆資料,refresh 後消失    ZEOS 6.05 沒重覆問題,但 post 後看不到 au 的值,要 refresh 後才看到    Borland dbExpress Driver au 值一定要埴入資料, 可與現有資料重覆,
a123473119
一般會員


發表:19
回覆:46
積分:18
註冊:2002-08-08

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-03-29 21:52:17 IP:61.56.xxx.xxx 未訂閱
再次感謝 justmade 測試如此詳細. 我會好好學習.
系統時間:2024-07-03 3:55:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!