求救 table1:cannot perform this operation on a closed dataset!

oneal3417 2008-08-30 10:41:46
近日用delphi写了如下代码,运行也成功!可是输完数据后点保存按钮就提示table1:cannot perform this operation on a closed dataset! 数据库是access,table1,query1连接正常。如果注释掉以下代码则运行正常!!望高手们指教
procedure Taddfrm.FormCreate(Sender: TObject);
var
maxNO,tmp:integer;
begin
rydate.Date:=now;
cydate.Date:=now;
with table1 do
begin
Open;
First;
maxNO:=FieldByName('hz_num').AsInteger;
while not eof do
begin
tmp:=FieldByName('hz_num').AsInteger;
if maxNO<tmp then maxNO:=tmp;
next;
end;
close;
end;
edit1.Text:=inttostr(maxNO+1);
end;
全部代码如下:
unit Unit3;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ComCtrls, StdCtrls, ExtCtrls, DB, DBTables, Grids, DBGrids;

type
Taddfrm = class(TForm)
PageControl1: TPageControl;
TabSheet1: TTabSheet;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Edit3: TEdit;
ComboBox1: TComboBox;
Edit4: TEdit;
ComboBox2: TComboBox;
ComboBox3: TComboBox;
Edit5: TEdit;
rydate: TDateTimePicker;
cydate: TDateTimePicker;
Edit6: TEdit;
Button2: TButton;
Table1: TTable;
Query1: TQuery;
Bevel1: TBevel;
Bevel2: TBevel;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Edit2: TEdit;
Edit7: TEdit;
Edit8: TEdit;
DBGrid1: TDBGrid;
DataSource1: TDataSource;
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);


private
{ Private declarations }
public
{ Public declarations }
end;

var
addfrm: Taddfrm;

implementation

{$R *.dfm}

procedure Taddfrm.Button2Click(Sender: TObject);
var
flag:boolean;
begin
flag:=true;
if edit2.Text='' then flag:=false;
if edit3.Text='' then flag:=false;
if edit4.Text='' then flag:=false;
if edit5.Text='' then flag:=false;
if edit6.Text='' then flag:=false;
if edit7.Text='' then flag:=false;
if flag then
with table1 do
begin
Append;
FieldValues['hz_num']:=edit1.Text;
FieldValues['hz_name']:=edit2.Text;
FieldValues['hz_sex']:=combobox1.Text;
FieldValues['hz_age']:=edit3.Text;
FieldValues['hz_class']:=combobox2.Text;
FieldValues['jb_class']:=combobox3.Text;
FieldValues['ry_date']:=rydate.Date;
FieldValues['cy_date']:=cydate.Date;
FieldValues['fz_doc']:=edit4.Text;
FieldValues['lx_name']:=edit5.Text;
FieldValues['lx_phone']:=edit6.Text;
FieldValues['lx_address']:=edit7.Text;
FieldValues['bz']:=edit8.Text;
Post;
showmessage('添加信息成功!');
end
else begin
showmessage('请补全信息!');
edit2.SetFocus;
end;
with query1 do //同步刷新dbgrid
begin
Close;
SQL.Clear;
SQL.Add('select * from hz_msg');
try
Open;
FieldByName('hz_num').DisplayLabel:='患者编号';
FieldByName('hz_name').DisplayLabel:='姓名';
FieldByName('hz_sex').DisplayLabel:='性别';
FieldByName('hz_age').DisplayLabel:='年龄';
FieldByName('hz_class').DisplayLabel:='病人类别';
FieldByName('jb_class').DisplayLabel:='疾病类型';
FieldByName('ry_date').DisplayLabel:='入院时间';
FieldByName('cy_date').DisplayLabel:='出院时间';
FieldByName('fz_doc').DisplayLabel:='负责医生';
FieldByName('lx_name').DisplayLabel:='联系人';
FieldByName('lx_phone').DisplayLabel:='联系电话';
FieldByName('lx_address').DisplayLabel:='联系地址';
FieldByName('bz').DisplayLabel:='备注';
except
ExecSQL;
end;
end;
edit2.Text:='';
edit3.Text:='';
combobox1.ItemIndex:=0;
edit4.Text:='';
combobox2.ItemIndex:=0;
combobox3.ItemIndex:=0;
edit5.Text:='';
edit6.Text:='';
edit7.Text:='';
edit8.Text:='';
edit1.SetFocus;
end;


procedure Taddfrm.FormCreate(Sender: TObject);
var
maxNO,tmp:integer;
begin
rydate.Date:=now;
cydate.Date:=now;
with table1 do
begin
Open;
First;
maxNO:=FieldByName('hz_num').AsInteger;
while not eof do
begin
tmp:=FieldByName('hz_num').AsInteger;
if maxNO<tmp then maxNO:=tmp;
next;
end;
close;
end;
edit1.Text:=inttostr(maxNO+1);
end;
end.
...全文
1053 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
oneal3417 2008-09-03
  • 打赏
  • 举报
回复
谢谢楼上各位了!!问题就是处在append前面少了个open;
iamduo 2008-09-02
  • 打赏
  • 举报
回复
草,有没有搞错。
这种代码,你们还有兴趣看啊?
设置一个断点,运行到断点的时候,按F8,一个个看过来。
xjcheng 2008-09-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 qian_longN1 的回复:]
begin
tmp:=FieldByName('hz_num').AsInteger;
if maxNO <tmp then maxNO:=tmp;
next;
end;
close; 十有八九它的问题了,好好看看吧,肯定循环中给关了。。。
end;
edit1.Text:=inttostr(maxNO+1);
end;
[/Quote]
支持6楼,还要注意语法格式.
qian_longN1 2008-09-01
  • 打赏
  • 举报
回复
begin
tmp:=FieldByName('hz_num').AsInteger;
if maxNO <tmp then maxNO:=tmp;
next;
end;
close; 十有八九它的问题了,好好看看吧,肯定循环中给关了。。。
end;
edit1.Text:=inttostr(maxNO+1);
end;
JeffChung 2008-09-01
  • 打赏
  • 举报
回复
在保存按钮的 Append; 前面加一个open;

4楼的被错误的代码缩进忽悠了,呵呵
支持中文哦 2008-08-31
  • 打赏
  • 举报
回复
begin
tmp:=FieldByName('hz_num').AsInteger;
if maxNO <tmp then maxNO:=tmp;
next;
end;
close; //----------------看这行,循环完毕后,你把table1关闭了
end;
edit1.Text:=inttostr(maxNO+1);
end;
oneal3417 2008-08-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 qingyingnxu 的回复:]
table1所连接的数据表你设置好了没,出现这种错误,一般都是因为,数据集控件没有被激活或是表没设置好.
[/Quote]

table1.active:=true;
这个都设置好了!!!结果是一样的!运行没问题!一点按保存行程序就报错!!
删除掉这个代码就正常!!
procedure Taddfrm.FormCreate(Sender: TObject);
var
maxNO,tmp:integer;
begin
rydate.Date:=now;
cydate.Date:=now;
with table1 do
begin
Open;
First;
maxNO:=FieldByName('hz_num').AsInteger;
while not eof do
begin
tmp:=FieldByName('hz_num').AsInteger;
if maxNO <tmp then maxNO:=tmp;
next;
end;
close;
end;
edit1.Text:=inttostr(maxNO+1);
end;
RoverX 2008-08-31
  • 打赏
  • 举报
回复
数据集没有打开。
qingyingnxu 2008-08-31
  • 打赏
  • 举报
回复
table1所连接的数据表你设置好了没,出现这种错误,一般都是因为,数据集控件没有被激活或是表没设置好.

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧