急用简单问题:关于dbedit录入数据问题!(50分)

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

windflower

Unregistered / Unconfirmed
GUEST, unregistred user!
现有一张承付单表,有以下字段:付款编号、应付金额、本次实际付款金额,
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
该怎么办呢?
请大家帮帮忙!谢谢!
 
问题紧急,快帮忙呀!
 
adoquery1.fieldvalues['应付金额']:=dbedit2.field.asfloat吧
 
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输入不行吗?
 
1、应该成dbedit4.edittext:=trim(formatfloat('#,##0.00',ye));
或adoquery1.fieldvalues['余额']:=ye;
2、去掉adoquery1.edit
 
to sbcnet:1、余额不是数据库的字段,也不是adoquery的计算字段。
2、adoquery1.edit去掉后,系统报错:adoquery not in edit or insert mode
请问dbedit.text与dbedit.edittext有什么区别?
另照样不能输入数据。
 
onchange事件很讨厌,有没有好的方法呀?
 
今天富翁们到哪里去了?
 
使用计算字段就很容易解决这个问题。根本不需要在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 任意改变“应付金额”“本次实际付款金额”余额都将随着改变。
 
to zzh0918:我给出的这段程序只是个例子,实际计算过程比较复杂,而且已经编好了,
没有使用计算字段,能不能在现有基础上进行修改达到目的呢?
 
紧急求助!
 
我的实际情况是:本次实际付款金额也是通过计算出来的,因此不能使用CalcFields,
否则因为我会给本次实际付款金额赋值,造成死循环的。
 
有没试过不用DBEDIT,而用EDIT来做呢?
 
我一向觉得dbedit不好用,所以我一直用edit自己同步和提交数据的。
其实你只要在一个同步过程和提交过程就可以了。
 
to turborabbit,小猪:能不能通过在dbedit中添加一些过程或采取什么方法来实现呢?我
实在不想换控件了。这个问题应该比较普遍吧,应该有办法的呀!
谢谢!
 
to windflower:
我还是建议用计算字段解决起来比较方便,而且不用处理诸如:onchange,onexit,
onenter等事件。我曾经开放过一个工资管理程序中间有应发工资,实发工资,扣款合计
其中应发工资为若干数据项之和,扣款合计为若干数据项之和,实发工资=应发工资-扣款合计
我就设了3个计算字段sfgz,yfgs,kkhj.ononcalc事件中我写了如下程序。没有出现循环应用的问题
procedure TForm1.ADOQuery1CalcFields(DataSet: TDataSet);
begin
adoquery1['yfgz']:=adoquery1['固定工资']+adoquery1['活动工资']
+adoquery1['粮贴']+adoquery1['护驾']+adoquery1['合同']
+adoquery1['补贴']+adoquery1['它补']+adoquery1['统筹'];
adoquery1['kkhj']:=adoquery1['房费']+adoquery1['水电费']
+adoquery1['气费']+adoquery1['医保']+adoquery1['缺勤']
+adoquery1['它扣']+adoquery1['公积金']+adoquery1['税金']+adoquery1['个调税']+adoquery1['其他'];
adoquery1['sfgz']:=adoquery1['yfgz']-adoquery1['kkhj'];
end
 
to zzh0918:我原来在计算余额时,调用了一个过程,在这个过程中又给query的字段赋了值,
所以就造成了循环调用。如果我把计算过程都放到oncalculate中,就可以了。谢谢!不过我
发现oncalculate好象经常被调用,这样效率是否会变低呢?
 
1.在KEYPRESS时,DB元件还没有把数据写入数据库缓冲中,要在EXIT时才执行
2.写一个函数去除千位分隔符并不困难吧
 
后退
顶部