我遇到了将3个数据源中的所有值保存到另一个数据源的SMDBGrid中的问题。
我有AdressID,ContactpersonID和RelationID。
那些都不匹配。
问题是我的SMDBGrid有另一个数据源,然后是那些3。 我想用一个按钮保存它们。
尝试了很多方法但却找不到好结果。
这是我现在用于Insert
按钮的代码:
procedure TFRelatiebeheer.ToolButton1Click(Sender: TObject);
begin
DRelatiebeheer.ContactpersonID.Insert;
DRelatiebeheer.RelationID.Insert;
DRelatiebeheer.AdressID.Insert;
end;
这是我现在用于保存按钮的代码
if (DRelatiebeheer.ContactpersonID.State in dsEditModes) then
if not (DRelatiebeheer.ContactpersonID.State in [dsInsert]) then
begin
KJSMDBGrid1.RefreshData;
KJPanel4.Visible := True;
end
else
begin
if (DRelatiebeheer.ContactpersonID.State IN dsEditModes) then
DRelatiebeheer.ContactpersonID.Post;
if (DRelatiebeheer.AdressID.State IN dsEditModes) then
DRelatiebeheer.AdressID.Post;
end;
希望你对我现在正在做的事情有一个良好的认识,如果没有,请通知。
我遇到了需要在1次点击时保存的数据源的问题,然后在数据库和网格中刷新。 这意味着当我插入联系人时,需要一个AdressID和一个与之相关的RelationID。 之后,网格需要重新加载所有数据。
答案 0 :(得分:2)
这段代码对我来说有点随机。那里应该发生什么?
if (DRelatiebeheer.ContactpersonID.State in dsEditModes) then
// remember this check (1)
if not (DRelatiebeheer.ContactpersonID.State in [dsInsert]) then
// this check better written as "...State = dsInsert"
begin
// why don't you call DRelatiebeheer.ContactpersonID.Post to save chanegs ?
KJSMDBGrid1.RefreshData;
KJPanel4.Visible := True;
end
else
begin
if (DRelatiebeheer.ContactpersonID.State IN dsEditModes) then
// you already checked this above (1), why check again ?
DRelatiebeheer.ContactpersonID.Post;
if (DRelatiebeheer.AdressID.State IN dsEditModes) then
DRelatiebeheer.AdressID.Post;
end;
// so what about DRelatiebeheer.RelationID ?
对于我可能推断的内容,你不必制作任何复杂的if-ladder,你只需要将你的单词翻译成Delphi。您想要保存三个表,然后刷新网格。然后就去做吧。
procedure TFRelatiebeheer.SaveButtonClick(Sender: TObject);
begin
DRelatiebeheer.ContactpersonID.Post;
DRelatiebeheer.RelationID.Post;
DRelatiebeheer.AdressID.Post;
DatabaseConnection.CommitTrans;
KJSMDBGrid1.RefreshData;
KJPanel4.Visible := True;
end;
就像你在其他问题中被告知一样。
PS。 ToolButton1Click
- 请重新命名按钮。相信我,当你有10个名为Button1,Button2,... Button10的按钮时,你永远不会确定每个按钮应该做什么,并且会混合所有内容并使所有可能的程序逻辑错误。
答案 1 :(得分:2)
专注于给定的问题 根据预期的行为(如果只能发布一个或两个表或者是否需要发布所有表),首先要做的是确保可以发布表。你可以为每个表创建一个函数,例如CanAdressIDBePosted:Boolean,用于检查是否已输入必填字段。表ContactpersonID的条件将包含其他条件:输入所需字段AND CanAdressIDBePosted和CanRelationIDBePosted。您可以使用OnUpdate事件创建一个绑定在按钮上的Action,该事件可能如下所示:
procedure TForm1.PostActionUpdate(Sender: TObject);
begin
TAction(Sender).Enabled := CanAdressIDBePosted and CanContactpersonIDBePosted and CanRelationIDBePosted;
// depending on your requirements (e.g. no need to post RelationID if not entered) it also could be
TAction(Sender).Enabled := CanAdressIDBePosted or CanContactpersonIDBePosted ;
end;
procedure TForm1.PostActionExecute(Sender: TObject);
begin
if CanAdressIDBePosted then AdressID.Post; // ensure ID fields will be generated
if CanRelationIDBePosted then RelationID.Post; // ensure ID fields will be generated
if CanContactpersonIDBePosted then
begin
ContactpersonID.FieldByName('AdressID').value := AdressID.FieldByName('ID').Value;
ContactpersonID.FieldByName('RelationID').value := RelationID.FieldByName('ID').Value;
end;
DateSetBoundToTheGrid.Requery;
// furthor actions you need
end;
Function TForm1.CanAdressIDBePosted:Boolean;
begin
// example implementation
Result := (AdressID.State in [dsEdit,dsInsert]) and (not AdressID.FieldByName('NeededField').IsNull);
end;
Function TForm1.CanContactpersonIDBePosted:Boolean;
begin
// example implementation
Result := (ContactpersonID.State in [dsEdit,dsInsert]) and (not ContactpersonID.FieldByName('NeededField').IsNull)
and CanAdressIDBePosted and CanRelationIDBePosted;
end;
如果需要,应创建一个addidtional Action来取消:
procedure TForm1.CancelActionExecute(Sender: TObject);
begin
AdressID.Cancel;
RelationID.Cancel;
ContactpersonID.Cancel;
end;
procedure TForm1.CancelActionUpdate(Sender: TObject);
begin
TAction(Sender).Enabled := (AdressID.State in [dsEdit,dsInsert])
or (RelationID.State in [dsEdit,dsInsert])
or (ContactpersonID.State in [dsEdit,dsInsert]);
end;
一般来说,我不确定你采取的方法是否是最好的方法,因为从IMHO的结构来看,应该可以将现有的关系和地址分配给新生成的联系人,但那将是另一个问题。