dbgrid 新增一筆時,都會將資料移到 dbgrid 之第一行讓我輸入 |
尚未結案
|
a123473119
一般會員 發表:19 回覆:46 積分:18 註冊:2002-08-08 發送簡訊給我 |
請教各位前輩:
我是用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 發送簡訊給我 |
|
a123473119
一般會員 發表:19 回覆:46 積分:18 註冊:2002-08-08 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
我剛試過以下的
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 發送簡訊給我 |
再謝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 發送簡訊給我 |
|
Justmade
版主 發表:94 回覆:1934 積分:2030 註冊:2003-03-12 發送簡訊給我 |
引言: 但不用 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 發送簡訊給我 |
對不起二位前輩,現在才回應.
因無法處理,所以身檔部份全改成用一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 發送簡訊給我 |
|
a123473119
一般會員 發表:19 回覆:46 積分:18 註冊:2002-08-08 發送簡訊給我 |
感謝hahalin建議,其實剛重dos轉過來時,就一直有這種想法,但一直找不到適當
學習範例,不得已作罷.
不想再開版佔大家空間, 近常碰到,insert 一筆, dbgrid 卻出現二筆,
table close 後,才會正確, 這只是我單檔之維護畫面,上面左方擺dbgrid讓
使用者檢視,右方放 dbedit,下方有一個 dbnavigator
使用者按新增,到右方打資料,後 post,dbgrid 就會出現重覆二筆,
一定要 close table 才會出現正確資料.
如果直接取消這二筆,只有一筆可取消,另一筆就會出現有另外使用者已更改此筆
資料之錯誤訊息.
不曉得各位前輩誰有相同經驗. help !!
|
a123473119
一般會員 發表:19 回覆:46 積分:18 註冊:2002-08-08 發送簡訊給我 |
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 發送簡訊給我 |
|
a123473119
一般會員 發表:19 回覆:46 積分:18 註冊:2002-08-08 發送簡訊給我 |
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 發送簡訊給我 |
|
a123473119
一般會員 發表:19 回覆:46 積分:18 註冊:2002-08-08 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |