SOS!SOS! 数据库没法修改老说:Dataset not in edit or insert(100分)

  • 主题发起人 主题发起人 xinjia
  • 开始时间 开始时间
X

xinjia

Unregistered / Unconfirmed
GUEST, unregistred user!
一个窗体有5个TTable和4个combobox,Table1,Table2用于提供Combobox的
item,另两个combox使用两个query提供item,3个Table存放修改内容,
table4执行到给字段赋值时就出现Table4:dataset not in edit or
insert mode,原先table3出这个毛病现在table4出这个毛病,table5一直正常。我检查其他窗体并没有调用这几个table,折腾了一天,请大侠救命。
 
再赋值前
用 table.insert 或 table.edit
等方法试试看
 
你的程序刚运行时众table们应调用自的Edit方法或insert方法。
在保存修改之前应执行
if table.State in [dsEdit,dsInsert] then
table.Post;
过后再table.edit;
 
老兄:
这样讲很乱的,让人听得一头雾水。你最好吧关键代码贴出来。
假如你开始设置进入了编辑或追加状态。后来又移动了当前纪录。
delphi会自动进入dsBrowse状态的。强烈建议你别用那么多的Table和Query;
并且跟踪一下程序。

 
出错程序段如下
table4.databasename='myku';
table4.tablename:='zgkc';
table4.Active :=true;
if table4.Locate('货号;颜色',VarArrayof([huohao,yanse]),[]) then
begin
ysl:=table4.fieldbyname('数量').Asinteger;
Table4.FieldByName('数量').Asinteger:=ysl+strtoint(edit4.text);
end;
Table4.post;
修改前加table4.edit也不行
 
错在Table4.post一句。
应该是if table.State=dsEdit then table.Post;

 
单步执行到
Table4.FieldByName('数量').Asinteger:=ysl+strtoint(edit4.text);
报出错信息;我即使用//把后面的post屏蔽掉仍然出错
 
对不起,干才写错了忘了写”Table4“的“4"字

错在Table4.post一句。
应该是if table4.State=dsEdit then table4.Post;
或者把Table4.post放在If语句里。
没有修改过的表是不能Post的。
并且在Table4.FieldByName('数量').Asinteger:=ysl+strtoint(edit4.text);
前加一句table4.edit;
 
你在
Table4.FieldByName('数量').Asinteger:=ysl+strtoint(edit4.text);
这句前面加 Table4.edit 也不行????

另外,有没有搞错?
你的table4.post为什么不放到if then语句块里面去? 如果
if table4.Locate('货号;颜色',VarArrayof([huohao,yanse]),[]) then
没有找到呢?
 
有没有改过Table的Exclusive属性或Readonly属性?
还有就是改表有几个Table相连?

 
是不是数据库仅仅以只读方式打开,没有提供足够权限的密码?
 
table4.tablename:='zgkc'; table4.Active :=true;
if table4.Locate('货号;颜色',VarArrayof([huohao,yanse]),[]) then
begin
table4.edit; //应当加上这一句
ysl:=table4.fieldbyname('数量').Asinteger;
Table4.FieldByName('数量').Asinteger:=ysl+strtoint(edit4.text); end;
// 这句去掉。 Table4.post

 
程序的错误有两点:
1、在IF 语句开始时加TABLE4.EDIT。
2、将TABLE4.POST移进IF语句中。否则的话,可能本来就没有找到记录,
也没做任何操作,POST当然出错。

修改后的语句如下:
table4.databasename='myku';
table4.tablename:='zgkc';
table4.Active :=true;
if table4.Locate('货号;颜色',VarArrayof([huohao,yanse]),[])
then
begin
if table4.State in [dsEdit,dsInsert]
then
table4.Post;

Table4.EDIT;

ysl:=table4.fieldbyname('数量').Asinteger;
Table4.FieldByName('数量').Asinteger:=
ysl+strtoint(edit4.text);
Table4.post;
end;
 
我原来的程序是if-then-else,一种结果是修改字段内容,一钟结果是添加记录
后填写内容,所以把post放到if结构的外面。上贴把else的内容略掉了。
我在给字段赋值前加table4.edit 也不行,执行到字段赋值就报错。
将post 该成if table4.State=dsEdit then table4.Post;也不行。
我用的数据库是access,
先建立一个database,table4用database 的别名,同样建立的table5执行
字段赋值和post操作没问题。
小弟的一天时间都泡在可恶的table4上了。
 
你还是把你的完整代码贴出来,让大家帮你看看.
 
把这个可恶的table4:)
杀了
再重新来一个table,名字还取table4
其他的修改参照各位大虾的
 
源程序窗体中按保存按扭过程代码如下:
{table5:出货记录库}
{table3:主仓库}
{table4:分仓库}
{功能:将出货情况记录到出货记录中;从主仓库去掉出货,分仓库增加出货}
{修改table5时没问题,修改table4时出错}
procedure Tckdj.Button1Click(Sender: TObject);
begin
//修改出货记录
table5.Active :=true;
table5.Append;
table5.FieldByName('单据编号').AsString:=edit1.text;
table5.FieldByName('商场专柜').AsString:=ComboBox1.Items[ComboBox1.ItemIndex];
table5.FieldByName('出货日期').AsDatetime:=datetimepicker1.Date;
table5.FieldByName('货号').AsString:=huohao;
table5.FieldByName('颜色').AsString:=yanse;
table5.FieldByName('单价').AsInteger:=strtoint(edit3.text);
jine:=strtoint(edit3.text)*strtoint(edit4.text);
Table5.FieldByName('金额').AsInteger:=jine;
table5.FieldByName('数量').AsInteger:=strtoint(edit4.text);
table5.Post ;
table5.active:=false;
//修改分仓库库存
table4.Active :=false;
table4.tablename:='zgkc';
table4.Active :=true;
table4.Edit;
if table4.Locate('商场专柜;货号;颜色',VarArrayof([zhuangui,huohao,yanse]),[]) then
begin
ysl:=table4.fieldbyname('数量').Asinteger;
yjine:=Table4.FieldByName('金额').AsInteger;
Table4.FieldByName('数量').Asinteger:=ysl+strtoint(edit4.text);
Table4.FieldByName('金额').AsInteger:=yjine+jine;
end
else
begin
table4.Append;
table4.FieldByName('商场专柜').AsString:=zhuangui;
table4.FieldByName('进货日期').AsDatetime:=datetimepicker1.Date;
table4.FieldByName('货号').AsString:=huohao;
table4.FieldByName('单价').AsInteger:=strtoint(edit3.text);
table4.FieldByName('颜色').AsString:=yanse;
table4.FieldByName('数量').AsInteger:=strtoint(edit4.text);
Table4.FieldByName('金额').AsInteger:=jine;
end;
if table4.State=dsEdit then table4.Post;
// table4.Post ;
table4.active:=false;
//修改总仓库
table3.active:=false;
table3.tablename:='kck';
table3.active:=true;
if table3.locate('货号;颜色',VarArrayof([huohao,yanse]),[]) then
begin
ysl:=table3.FieldByName('数量').AsInteger;
ysl:=ysl-strtoint(edit4.text);
if ysl=0 then
Table3.Delete
else
table3.FieldByName('数量').AsInteger:=ysl;
table3.Post ;
end;
Table3.active:=false;
Table3.Active:=true;
//为下一输入记录置空
ComboBox3.text:='';
ComboBox4.text:='';
edit3.text:='';
edit4.text:='';
edit5.Text:='0';
end;
 
笨笨,不是告诉过你,table4.edit一定要放在if-then语句块里面吗??

你看看你的代码:
table4.Edit;
if table4.Locate...... then
table4.filedbyname('..'):=....
else
table4.append;
如果locate成功,纪录就会移动到找到的纪录上面去,那么你开始的那个edit就
自动失效了,这时你修改纪录当然不行了!!!!

一定要在locate之后edit!!!大家都说了你又不听!真没办法!!!
 
已经搞定,错误在于我把table.edit放在了locate的前边,大家辛苦了,
大分奉上。是不是自动locate 修改table的edit属性?。
 
后退
顶部