因为不断提前都没有解决问题, 再次诚恳邀请您帮忙:急用问题:关于dbedit录入数据问题! (原问题处还有50分)(100分)

  • 主题发起人 主题发起人 windflower
  • 开始时间 开始时间
W

windflower

Unregistered / Unconfirmed
GUEST, unregistred user!
问题:急用简单问题:关于dbedit录入数据问题! ( 积分:50, 回复:12, 阅读:71 )
分类:数据库 - C/S型 ( 版主:千中元, kucio )
来自:windflower, 时间:2001-5-18 11:34:50, ID:534180 [显示:小字体 | 大字体]
现有一张承付单表,有以下字段:付款编号、应付金额、本次实际付款金额,
adoquery1.text:='select * from 承付单表'
我是通过adoquery.append来录入新记录的.我使用了dbedit来录入以上数据(dbedit已与
数据库关联),我希望在输入完本次实际付款金额后敲回车键能计算出余额(余额等于
应付金额-本次实际付款金额),显示在dbedit4中。(dbedit4没和数据库关联)
我的adoquery.locktype为ltBatchOptimistic,我的主要程序如下:
procedure TForm1.DBEdit3KeyPress(Sender: TObject; var Key: Char);
//dbedit3为录入本次实际付款金额的 dbedit
var
ye:double; //余额
begin
if key=#13 then
begin
ye:=adoquery1.fieldvalues['应付金额']-adoquery1.fieldvalues['本次实际付款金额'];
dbedit4.text:=trim(formatfloat('#,##0.00',ye));
end;
end;
但是在调试中发现当输入完应付金额和本次实际付款金额桥回车键后,我用
if (adoquery1.fieldbyname('应付金额').isnull) then
showmessage('应付金额为空');
if (adoquery1.fieldbyname('本次实际付款金额').isnull) then
showmessage('本次实际付款金额为空');
发现应付金额和本次实际付款金额居然为空,更不用说计算余额了。
请问这是怎么回事?该怎么办呢?
我曾经在它们的onchange事件中添加如下代码:

procedure TForm1.DBEdit3Change(Sender: TObject);
begin
adoquery1.edit;
if trim(dbedit3.text)<>'' then
adoquery1.fieldvalues['本次实际付款金额']:=strtofloat(dbedit3.text);
end;

procedure TForm1.DBEdit2Change(Sender: TObject);
begin
adoquery1.edit;
if trim(dbedit2.text)<>'' then
adoquery1.fieldvalues['应付金额']:=strtofloat(dbedit2.text);
end;
但因为我使用了
TNumericField(querymaininfo.FieldByName('本次实际付款金额')).displayformat:='#,##0.00';
TNumericField(querymaininfo.FieldByName('应付金额')).displayformat:='#,##0.00';
来进行显示格式控制
在调试时,系统提示
'12,321.00' is not a valid floating point value
该怎么办呢?
请大家帮帮忙!谢谢!


来自:windflower, 时间:2001-5-17 16:06:46, ID:534216
问题紧急,快帮忙呀!


来自:djdsz, 时间:2001-5-17 16:36:47, ID:534249
adoquery1.fieldvalues['应付金额']:=dbedit2.field.asfloat吧


来自:windflower, 时间:2001-5-17 16:59:12, ID:534286
to djdsz:
如您所言,我将onchange事件作如下改动:
procedure TForm1.DBEdit3Change(Sender: TObject);
begin
adoquery1.edit;
if trim(dbedit3.text)<>'' then
begin
adoquery1.fieldvalues['本次实际付款金额']:=dbedit3.field.asfloat;
TNumericField(adoquery1.FieldByName('本次实际付款金额')).displayformat:='#,##0.00';
end;
end;

procedure TForm1.DBEdit2Change(Sender: TObject);
begin
adoquery1.edit;
if trim(dbedit2.text)<>'' then
begin
adoquery1.fieldvalues['应付金额']:=dbedit2.field.asfloat;
TNumericField(adoquery1.FieldByName('应付金额')).displayformat:='#,##0.00';
end;
end;
可是现在我却是怎么也不能输入应付金额和本次实际付款金额了,输入框里显示0.00,连del
都不行,这是怎么回事?
十万火急!难道用dbedit输入不行吗?


来自:sbcnet, 时间:2001-5-17 17:09:19, ID:534293
1、应该成dbedit4.edittext:=trim(formatfloat('#,##0.00',ye));
或adoquery1.fieldvalues['余额']:=ye;
2、去掉adoquery1.edit


来自:windflower, 时间:2001-5-17 17:22:54, ID:534315
to sbcnet:1、余额不是数据库的字段,也不是adoquery的计算字段。
2、adoquery1.edit去掉后,系统报错:adoquery not in edit or insert mode
请问dbedit.text与dbedit.edittext有什么区别?
另照样不能输入数据。


来自:windflower, 时间:2001-5-17 17:52:43, ID:534339
help!


来自:windflower, 时间:2001-5-17 17:54:09, ID:534341
onchange事件很讨厌,有没有好的方法呀?


来自:windflower, 时间:2001-5-17 18:22:05, ID:534364
今天富翁们到哪里去了?


来自:zzh0918, 时间:2001-5-17 21:12:02, ID:534512
使用计算字段就很容易解决这个问题。根本不需要在onchange事件中去处理。
使用方法:
在adoquery1上单击右键选择field editor 然后在弹出的form1.adoquery1窗口中单击
右键,选择add all fields,然后在同样的窗口中单击右键选择new field 马上会弹出一个
窗口,在窗口中填入字段名称“余额”,字段类型为float。在field type 中选择calculated
单机确定。
在adoquery1的oncalc事件中写下如下代码adoquery1['余额']=adoquery1['应付金额']-adoquery1['本次实际付款金额'];
将dbedit4和adoquery1关联。data field 选择“余额”
ok 任意改变“应付金额”“本次实际付款金额”余额都将随着改变。


来自:windflower, 时间:2001-5-18 8:55:58, ID:534774
to zzh0918:我给出的这段程序只是个例子,实际计算过程比较复杂,而且已经编好了,
没有使用计算字段,能不能在现有基础上进行修改达到目的呢?


来自:windflower, 时间:2001-5-18 10:19:13, ID:534924
紧急求助!


来自:windflower, 时间:2001-5-18 11:28:35, ID:535054
我的实际情况是:本次实际付款金额也是通过计算出来的,因此不能使用CalcFields,
否则因为我会给本次实际付款金额赋值,造成死循环的。

因为不断提前都没有解决问题,
 
procedure TForm1.DBEdit3KeyPress(Sender: TObject; var Key: Char);
//dbedit3为录入本次实际付款金额的 dbedit
var
ye:double; //余额
begin
if key=#13 then
begin
ye:=adoquery1.fieldvalues['应付金额']-adoquery1.fieldvalues['本次实际付款金额'];
// dbedit4.text:=trim(formatfloat('#,##0.00',ye));
adoquery1.fieldvalues[关联dbedit4的Field]:=ye;
end;
end;
 
to tinytao:
1、如果去掉dbedit2,dbedit3的onchange事件,则在dbedit3输入数据按下回车键后,出现“
本次实际付款金额为空”(我在计算余额之前作了一个判断:
if adoquery1.fieldbyname('').isnull then showmessage('本次实际付款金额为空');)
然后系统提示:invalid variant type conversion.
2、如果加上dbedit2,dbedit3的onchange事件,根本无法在 dbedit2中输入数据,它总是显
示0.00
3、adoquery1没有余额字段,好象也不能作为计算字段(原因如前所述)
谢谢tinytao!请再帮忙看看!

 
这种问题有好多解决方案的,首先估计你不是光有这几个字段要录入,所以你的总体思路就有问题
 
1、为何在每个onchange里要用edit?
2、既然使用dbedit并且关联为何还翻来覆去adoquery1.fieldvalues['本次实际付款金额']:=dbedit3.field.asfloat;。。。
 
直接用edit,几句代码搞定,不会出现这类情况

或者用缓存更新也可以
 
to sbcnet:为什么要用onchange事件呢?因为adoquery.locktype=ltBatchOptimistic,
所以刚输入数据按回车键时,adoquery.fieldvalues['本次实际付款金额']=null,无法计算
余额。您觉得应该用什么方案和思路呢?
to chenlh:为什么不用edit,因为有很多数据项,用edit太麻烦了。此外,怎样用缓存更新?
to all:这段代码很短的,请大家帮忙试试,我捣鼓了两天了都没有结果。
(因为实际应用中“本次实际付款金额”也需要计算,所以用计算字段存在问题。)
 
我以为你会试一下直接用edit的。
我只能给出这样的建议,因为我自从用dbedit做过一次项目后
就发誓再也不用了。
 
to 小猪:谢谢!我以前作的就是用edit做的,虽然不存在这样的问题,但是在显示记录的时候
也是非常不方便的。譬如在用滚动条显示上一条、下一条的时候就很麻烦。
 
靠,你也太懒了吧
afterscroll事件,写就是了
 
to chenlh:好几十个数据项,一个一个地给edit赋值,而且数据来自不同的表,很麻烦的。
不是懒惰与否的问题,我是想找到一个好的解决方案。谢谢!
 
最后,我将onchange中的事件放到onkeypress和onexit里,终于解决了问题。
非常感谢大家!
to 小猪:请问您发现dbedit有哪些不好的地方?我以后好尽量避免。谢谢!您回复之后,
我就要结束问题了。
 
多人接受答案了。
 
后退
顶部