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

Dataset not in edit or insert mode

缺席
chi120
一般會員


發表:16
回覆:16
積分:6
註冊:2007-08-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-05-15 13:43:26 IP:210.202.xxx.xxx 訂閱
如附件檔所示
在dbGrid 新增一筆資料時,在TTable的OnCalcFields有判斷
IF Tbprdsir.Active = False THEN
Tbprdsir.Active := True;
key in 資料key到某欄位時,卻出現dataset not in edit or insert mode
@@ 一直找不出原因,請各位大大指點
謝謝
------
Aki..就算沒有明天
附加檔案:4a0d00fe7781e_debug.JPG
zhouying82
高階會員


發表:150
回覆:272
積分:189
註冊:2004-03-16

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-05-15 16:41:16 IP:218.80.xxx.xxx 訂閱
database1.connect:=false;
table1.edit

这2行有没有写。另外,DBGRID里面的READONLY属性有没有改为:false啊?
------
断断续续的学了几年,还是一个初学者,永远支持Delphi !
max5020
資深會員


發表:30
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-05-16 17:32:33 IP:122.146.xxx.xxx 訂閱
這個錯誤訊息, 
應該trace就可以找出錯誤所在,
一般而言, 是錯在類似 DataSet.FieldByName('FiledName').asString:= 'xxx'
但是並沒有DataSet.Insert 或DataSet.Edit

或者在OnCalcFields
對實體欄位給值, 就會產生錯誤!!
編輯記錄
max5020 重新編輯於 2009-05-16 17:37:33, 註解 無‧
chi120
一般會員


發表:16
回覆:16
積分:6
註冊:2007-08-28

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-05-18 10:48:56 IP:210.202.xxx.xxx 訂閱
max5020大大
沒錯,就是錯在類似 DataSet.FieldByName('FiledName').asString:= 'xxx'
但是我加了DataSet.Insert 或DataSet.Edit後,反而會出現錯誤
如果同時,在別的地方也有dataset.inert或datset.edit 是否也會引發錯誤?
------
Aki..就算沒有明天
max5020
資深會員


發表:30
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-05-18 10:59:36 IP:59.120.xxx.xxx 訂閱
在OnCalcFields,
只能針對CalcFileds給值,
而且, 並不需要DataSet.Edit;
因為OnCalcFields,是任一欄位的值有更改時,
就會執行OnCalcFields的程序,
當然不能用DataSet.Edit, DataSet.Insert之類的!!


編輯記錄
max5020 重新編輯於 2009-05-18 11:05:56, 註解 無‧
chi120
一般會員


發表:16
回覆:16
積分:6
註冊:2007-08-28

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-05-18 16:23:21 IP:210.202.xxx.xxx 訂閱
DBGrid其它欄位都可以輸入,唯獨某一欄位不行@@
單步執行後仍然找不出原因所在
------
Aki..就算沒有明天
max5020
資深會員


發表:30
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-05-18 17:05:50 IP:59.120.xxx.xxx 訂閱
不妨將妳的OnCalcFields事件的Code全部POST上來研究看看
chi120
一般會員


發表:16
回覆:16
積分:6
註冊:2007-08-28

發送簡訊給我
#8 引用回覆 回覆 發表時間:2009-05-19 09:22:45 IP:210.202.xxx.xxx 訂閱
procedure TDataModule1.TbprdsirCalcFields(DataSet: TDataSet);
var Vwgt,Vwgt1,Vwgt2,Vwgt3,Vwgt4,Vwgt5 : real;
xarea : array[1..5] of Real;
w,h1,h2 : real;
WT,HT1,HT2:string;
I,X : integer;
begin
IF TbBase.Active = False THEN
TbBase.Active := True;
IF Tbprdsir.Active = False THEN
Tbprdsir.Active := True;
IF Tbprdfigs.Active = False THEN
Tbprdfigs.Active := True;
Vwgt := 0; Vwgt1 := 0; Vwgt2 := 0; Vwgt3 := 0; Vwgt4 := 0; Vwgt5 := 0;
IF (Tbprdsir.FieldByName('area1').asstring <> '') THEN
if TbBase.Locate('factory;rubno',VarArrayOF([Tbprdsir.FieldByname('factory').asstring,
Tbprdsir.FieldByname('rub1').asstring]),[loCaseInsensitive]) then
Vwgt1 := DataModule1.TbBase.FieldByName('desity').AsFloat*0.01*Tbprdsir.FieldByName('area1').asfloat;
IF (Tbprdsir.FieldByName('area2').asstring <> '') THEN
if TbBase.Locate('factory;rubno',VarArrayOF([Tbprdsir.FieldByname('factory').asstring,
Tbprdsir.FieldByname('rub2').asstring]),[loCaseInsensitive]) then
Vwgt2 := DataModule1.TbBase.FieldByName('desity').AsFloat*0.01*Tbprdsir.FieldByName('area2').asfloat;
IF (Tbprdsir.FieldByName('area3').asstring <> '') THEN
if TbBase.Locate('factory;rubno',VarArrayOF([Tbprdsir.FieldByname('factory').asstring,
Tbprdsir.FieldByname('rub3').asstring]),[loCaseInsensitive]) then
Vwgt3 := DataModule1.TbBase.FieldByName('desity').AsFloat*0.01*Tbprdsir.FieldByName('area3').asfloat;
IF (Tbprdsir.FieldByName('area4').asstring <> '') THEN
if TbBase.Locate('factory;rubno',VarArrayOF([Tbprdsir.FieldByname('factory').asstring,
Tbprdsir.FieldByname('rub4').asstring]),[loCaseInsensitive]) then
Vwgt4 := DataModule1.TbBase.FieldByName('desity').AsFloat*0.01*Tbprdsir.FieldByName('area4').asfloat;
IF (Tbprdsir.FieldByName('area5').asstring <> '') THEN
if TbBase.Locate('factory;rubno',VarArrayOF([Tbprdsir.FieldByname('factory').asstring,
Tbprdsir.FieldByname('rub5').asstring]),[loCaseInsensitive]) then
Vwgt5 := DataModule1.TbBase.FieldByName('desity').AsFloat*0.01*Tbprdsir.FieldByName('area5').asfloat;
Vwgt := Rounda(Vwgt1 Vwgt2 Vwgt3 Vwgt4 Vwgt5);
if Vwgt > 0 THEN
BEGIN
Tbprdsir.FieldByname('uwgt').asfloat := Vwgt;
Tbprdsir.FieldByname('per1').asfloat := Roundb(Vwgt1/Vwgt);
Tbprdsir.FieldByname('per2').asfloat := Roundb(Vwgt2/Vwgt);
Tbprdsir.FieldByname('per3').asfloat := Roundb(Vwgt3/Vwgt);
Tbprdsir.FieldByname('per4').asfloat := Roundb(Vwgt4/Vwgt);
END;
end;
------
Aki..就算沒有明天
max5020
資深會員


發表:30
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#9 引用回覆 回覆 發表時間:2009-05-19 09:33:36 IP:59.120.xxx.xxx 訂閱

===================引 用 chi120 文 章===================
procedure TDataModule1.TbprdsirCalcFields(DataSet: TDataSet);
var Vwgt,Vwgt1,Vwgt2,Vwgt3,Vwgt4,Vwgt5 : real;
xarea : array[1..5] of Real;
w,h1,h2 : real;
WT,HT1,HT2:string;
I,X : integer;
begin
IF TbBase.Active = False THEN
TbBase.Active := True;
IF Tbprdsir.Active = False THEN
Tbprdsir.Active := True;
IF Tbprdfigs.Active = False THEN
Tbprdfigs.Active := True;
Vwgt := 0; Vwgt1 := 0; Vwgt2 := 0; Vwgt3 := 0; Vwgt4 := 0; Vwgt5 := 0;
IF (Tbprdsir.FieldByName('area1').asstring <> '') THEN
if TbBase.Locate('factory;rubno',VarArrayOF([Tbprdsir.FieldByname('factory').asstring,
Tbprdsir.FieldByname('rub1').asstring]),[loCaseInsensitive]) then
Vwgt1 := DataModule1.TbBase.FieldByName('desity').AsFloat*0.01*Tbprdsir.FieldByName('area1').asfloat;
IF (Tbprdsir.FieldByName('area2').asstring <> '') THEN
if TbBase.Locate('factory;rubno',VarArrayOF([Tbprdsir.FieldByname('factory').asstring,
Tbprdsir.FieldByname('rub2').asstring]),[loCaseInsensitive]) then
Vwgt2 := DataModule1.TbBase.FieldByName('desity').AsFloat*0.01*Tbprdsir.FieldByName('area2').asfloat;
IF (Tbprdsir.FieldByName('area3').asstring <> '') THEN
if TbBase.Locate('factory;rubno',VarArrayOF([Tbprdsir.FieldByname('factory').asstring,
Tbprdsir.FieldByname('rub3').asstring]),[loCaseInsensitive]) then
Vwgt3 := DataModule1.TbBase.FieldByName('desity').AsFloat*0.01*Tbprdsir.FieldByName('area3').asfloat;
IF (Tbprdsir.FieldByName('area4').asstring <> '') THEN
if TbBase.Locate('factory;rubno',VarArrayOF([Tbprdsir.FieldByname('factory').asstring,
Tbprdsir.FieldByname('rub4').asstring]),[loCaseInsensitive]) then
Vwgt4 := DataModule1.TbBase.FieldByName('desity').AsFloat*0.01*Tbprdsir.FieldByName('area4').asfloat;
IF (Tbprdsir.FieldByName('area5').asstring <> '') THEN
if TbBase.Locate('factory;rubno',VarArrayOF([Tbprdsir.FieldByname('factory').asstring,
Tbprdsir.FieldByname('rub5').asstring]),[loCaseInsensitive]) then
Vwgt5 := DataModule1.TbBase.FieldByName('desity').AsFloat*0.01*Tbprdsir.FieldByName('area5').asfloat;
Vwgt := Rounda(Vwgt1 Vwgt2 Vwgt3 Vwgt4 Vwgt5);
if Vwgt > 0 THEN
BEGIN
// 只要確定以下五個欄位都是計算欄位, 而不是實體欄位, 就不會錯了
Tbprdsir.FieldByname('uwgt').asfloat := Vwgt;
Tbprdsir.FieldByname('per1').asfloat := Roundb(Vwgt1/Vwgt);
Tbprdsir.FieldByname('per2').asfloat := Roundb(Vwgt2/Vwgt);
Tbprdsir.FieldByname('per3').asfloat := Roundb(Vwgt3/Vwgt);
Tbprdsir.FieldByname('per4').asfloat := Roundb(Vwgt4/Vwgt);

END;
end;
chi120
一般會員


發表:16
回覆:16
積分:6
註冊:2007-08-28

發送簡訊給我
#10 引用回覆 回覆 發表時間:2009-05-19 10:20:57 IP:210.202.xxx.xxx 訂閱
如果是實體欄位,也不會發生錯誤吧?@@
其實之前這個地方一直都沒問題,也沒動過
後來我改了其他地方,出錯的地方就指向這邊了
卻一直找不到問題何在 >"<
------
Aki..就算沒有明天
max5020
資深會員


發表:30
回覆:277
積分:321
註冊:2003-06-04

發送簡訊給我
#11 引用回覆 回覆 發表時間:2009-05-19 10:41:49 IP:59.120.xxx.xxx 訂閱
因為OnCalcFields事件,
是在任何資料顯示或更動時,
就會執行,
例如DataSet.Open,
因此在這裡來更動實體欄位的值並不洽當,

依照OO的觀念,
應該是放在某個欄位的OnValid,
來更動其他欄位的值, 會不會好一點?
ps.因為某個欄位的值變動, 而要更動另一欄位的值

妳會產生錯誤的原因是,
例如資料查詢出來,
就會執行OnCalcFields,
但是這個時候並沒有DataSet.Edit
所以就錯了!!
這樣說明, 能明白嗎??
系統時間:2024-05-16 20:49:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!