现在的问题是当我按下INSERT键后不管有无对应信息,程序都说没找到对应信息,只有外加一个BUTTON的事件,才能正确返回信息(似乎在判断时必须离开当前列),怎么回事?附代码:
procedure Twhrkgl_rkForm.dxDBGrid2Column1ButtonClick(Sender: TObject;
AbsoluteIndex: Integer);
begin
if (dxdbgrid2.FocusedField.fieldname='物品代码') then //dxdbgrid2为一个类似于DBGRID 的控件
begin
dataunit.DataModule1.adoquery5.edit;
dxdbgrid2.FocusedField.Text:=trim(dxdbgrid2.FocusedField.Text);
dataunit.DataModule1.adoquery3.close;
dataunit.DataModule1.adoquery3.sql.clear;
dataunit.DataModule1.adoquery3.SQL.Add('select * from 库存物品表 where 物品代码=:物品代码 ');
dataunit.DataModule1.adoquery3.Parameters.ParamByName('物品代码').value:=dxdbgrid2.FocusedField.Text;
dataunit.DataModule1.adoquery3.open;
if dataunit.DataModule1.adoquery3.RecordCount=0 then
begin
application.MessageBox('此库存信息不存在!','提示',mb_ok+mb_iconinformation);
dxdbgrid2.FocusedField.Clear;
dataunit.DataModule1.adoquery5.Cancel;
end
else
begin
dataunit.DataModule1.adoquery5.fieldbyname('物品名称').asstring:=dataunit.DataModule1.adoquery3.fieldbyname('物品名称').asstring;
dataunit.DataModule1.adoquery5.post;
end;
end;
end;
5 个解决方案
#1
你关键在以下语句后
dataunit.DataModule1.adoquery5.edit;
dxdbgrid2.FocusedField.Text:=trim(dxdbgrid2.FocusedField.Text);
数据赋值后,没有进行存盘操作,就进行查询操作。在上面语句后面加上:
dataunit.DataModule1.adoquery5.post;
进行存盘试试。
dataunit.DataModule1.adoquery5.edit;
dxdbgrid2.FocusedField.Text:=trim(dxdbgrid2.FocusedField.Text);
数据赋值后,没有进行存盘操作,就进行查询操作。在上面语句后面加上:
dataunit.DataModule1.adoquery5.post;
进行存盘试试。
#2
dataunit.DataModule1.adoquery3.RecordCount=0
改成dataunit.DataModule1.adoquery3.isempty
改成dataunit.DataModule1.adoquery3.isempty
#3
query从数据库中取得的是一个数据流,在没传完recordcount永远是0,你在其他事件中读recordcount时已经传完了,也就有值。上面看了一下判断recordcount=0主要是判断是否为空用isempty要好些,而且没有传输限制。
Query有其他属性可以调整我还不能确定是不是上面的问题,大家可以讨论一下
Query有其他属性可以调整我还不能确定是不是上面的问题,大家可以讨论一下
#4
你的猜想是对的,如果没有移开焦点,事实上还在编辑状态时(光标还在一闪一闪),编辑的内容还没有进入dxdbgrid2.FocusedField中。你可以试一下回车后再Insert,应该就跟用按钮一样了。
所以可能的办法是接到Insert后,让DBGrid虚拟执行一下回车。(DBGrid.Perform(...))。然后再进行处理。
所以可能的办法是接到Insert后,让DBGrid虚拟执行一下回车。(DBGrid.Perform(...))。然后再进行处理。
#5
也可以用TDBGridInplaceEdit取回当前没有存盘的数据
#1
你关键在以下语句后
dataunit.DataModule1.adoquery5.edit;
dxdbgrid2.FocusedField.Text:=trim(dxdbgrid2.FocusedField.Text);
数据赋值后,没有进行存盘操作,就进行查询操作。在上面语句后面加上:
dataunit.DataModule1.adoquery5.post;
进行存盘试试。
dataunit.DataModule1.adoquery5.edit;
dxdbgrid2.FocusedField.Text:=trim(dxdbgrid2.FocusedField.Text);
数据赋值后,没有进行存盘操作,就进行查询操作。在上面语句后面加上:
dataunit.DataModule1.adoquery5.post;
进行存盘试试。
#2
dataunit.DataModule1.adoquery3.RecordCount=0
改成dataunit.DataModule1.adoquery3.isempty
改成dataunit.DataModule1.adoquery3.isempty
#3
query从数据库中取得的是一个数据流,在没传完recordcount永远是0,你在其他事件中读recordcount时已经传完了,也就有值。上面看了一下判断recordcount=0主要是判断是否为空用isempty要好些,而且没有传输限制。
Query有其他属性可以调整我还不能确定是不是上面的问题,大家可以讨论一下
Query有其他属性可以调整我还不能确定是不是上面的问题,大家可以讨论一下
#4
你的猜想是对的,如果没有移开焦点,事实上还在编辑状态时(光标还在一闪一闪),编辑的内容还没有进入dxdbgrid2.FocusedField中。你可以试一下回车后再Insert,应该就跟用按钮一样了。
所以可能的办法是接到Insert后,让DBGrid虚拟执行一下回车。(DBGrid.Perform(...))。然后再进行处理。
所以可能的办法是接到Insert后,让DBGrid虚拟执行一下回车。(DBGrid.Perform(...))。然后再进行处理。
#5
也可以用TDBGridInplaceEdit取回当前没有存盘的数据