3
3h
Unregistered / Unconfirmed
GUEST, unregistred user!
有一个数据库,使用主—零结构联系两个表。现想用事务处理一批数据。由于在开
始修改之前需要预览,所以采用让Table的ReadOnly:=True。在按下某个按钮之后,两
个Table的ReadOnly均为 False,并开始事务,见下代码所述。其中DataModu是一个数
据模块,内有1个DataBase,2个Table和2个DataSource;ModifyDataForm 窗口有若干
DBTEXT 之类的组件各有一半分别指向两个DataSource。关于此数据库的一些内容与定
义可参见我的另一个问题所述:<a href="http://www.gislab.ecnu.edu.cn/delphibbs/dispq.asp?LID=145539
">关于数据表的几个问题</a>
private
FEditing: Boolean;
Procedure SetEditState(Es: Boolean);
Procedure ShowData;
public
Property Editing: Boolean Read FEditing Write SetEditState;
procedure TModifyDataForm.FormShow(Sender: TObject);
begin
ShowData;
end;
procedure TModifyDataForm.ShowData;
begin
Editing := False;
MainForm.Enabled := False;
With DataModu do
begin
Table2.Close;
With Table1 do
begin
Close;
Filter := 'TeleNo=''' + EditTeleNo.Text + '''';
Filtered := True;
ReadOnly := True;
Open;
end;
With Table2 do
begin
MasterFields := 'UserID';
MasterSource := DataSource1;
ReadOnly := True;
Open;
end;
end;
end;
procedure TModifyDataForm.BtnUpdataClick(Sender: TObject);
begin
If Editing then
// 取消事务
DataModu.Database1.Rollback;
Editing := Not Editing;
end;
procedure TModifyDataForm.BtnOKClick(Sender: TObject);
begin
If Editing then
begin
// 确认事务
DataModu.Database1.Commit;
Editing := False;
end
else
Close
end;
procedure TModifyDataForm.SetEditState(Es: Boolean);
begin
If FEditing = Es then
Exit;
FEditing := Es;
If FEditing then
begin
BtnUpdata.Caption := '取消';
BtnOk.Caption := '保存';
// 进入事务状态
With DataModu do
begin
Table2.Close;
With Table1 do
begin
Close;
ReadOnly := False;
Open;
end;
With Table2 do
begin
ReadOnly := False;
Open;
end;
Database1.StartTransaction;
end;
end
else
begin
With DataModu do
begin
With Table1 do
begin
Close;
ReadOnly := True;
Open;
end;
With Table2 do
begin
Close;
ReadOnly := True;
Open;
end;
end;
BtnUpdata.Caption := '修改...';
BtnOk.Caption := '关闭';
end;
end;
此窗口运行状态还算良好,结果是正确是,表明查询是准确的。但是想要进入编辑
状态,按下BtnUpdata按钮,能进入编辑状态。修改一些内容,按BtnOK,发现凡是
Table1属下的DBTEXT均不能得到修改!修改SetEditState的else后面那一段,将
With Table2 do提到With Table1 do的前面,发现两个表均不能修改。
<font color=red><b>求救!</b></font>
始修改之前需要预览,所以采用让Table的ReadOnly:=True。在按下某个按钮之后,两
个Table的ReadOnly均为 False,并开始事务,见下代码所述。其中DataModu是一个数
据模块,内有1个DataBase,2个Table和2个DataSource;ModifyDataForm 窗口有若干
DBTEXT 之类的组件各有一半分别指向两个DataSource。关于此数据库的一些内容与定
义可参见我的另一个问题所述:<a href="http://www.gislab.ecnu.edu.cn/delphibbs/dispq.asp?LID=145539
">关于数据表的几个问题</a>
private
FEditing: Boolean;
Procedure SetEditState(Es: Boolean);
Procedure ShowData;
public
Property Editing: Boolean Read FEditing Write SetEditState;
procedure TModifyDataForm.FormShow(Sender: TObject);
begin
ShowData;
end;
procedure TModifyDataForm.ShowData;
begin
Editing := False;
MainForm.Enabled := False;
With DataModu do
begin
Table2.Close;
With Table1 do
begin
Close;
Filter := 'TeleNo=''' + EditTeleNo.Text + '''';
Filtered := True;
ReadOnly := True;
Open;
end;
With Table2 do
begin
MasterFields := 'UserID';
MasterSource := DataSource1;
ReadOnly := True;
Open;
end;
end;
end;
procedure TModifyDataForm.BtnUpdataClick(Sender: TObject);
begin
If Editing then
// 取消事务
DataModu.Database1.Rollback;
Editing := Not Editing;
end;
procedure TModifyDataForm.BtnOKClick(Sender: TObject);
begin
If Editing then
begin
// 确认事务
DataModu.Database1.Commit;
Editing := False;
end
else
Close
end;
procedure TModifyDataForm.SetEditState(Es: Boolean);
begin
If FEditing = Es then
Exit;
FEditing := Es;
If FEditing then
begin
BtnUpdata.Caption := '取消';
BtnOk.Caption := '保存';
// 进入事务状态
With DataModu do
begin
Table2.Close;
With Table1 do
begin
Close;
ReadOnly := False;
Open;
end;
With Table2 do
begin
ReadOnly := False;
Open;
end;
Database1.StartTransaction;
end;
end
else
begin
With DataModu do
begin
With Table1 do
begin
Close;
ReadOnly := True;
Open;
end;
With Table2 do
begin
Close;
ReadOnly := True;
Open;
end;
end;
BtnUpdata.Caption := '修改...';
BtnOk.Caption := '关闭';
end;
end;
此窗口运行状态还算良好,结果是正确是,表明查询是准确的。但是想要进入编辑
状态,按下BtnUpdata按钮,能进入编辑状态。修改一些内容,按BtnOK,发现凡是
Table1属下的DBTEXT均不能得到修改!修改SetEditState的else后面那一段,将
With Table2 do提到With Table1 do的前面,发现两个表均不能修改。
<font color=red><b>求救!</b></font>