Delphi如何使用一个保存按钮保存3个数据源?

时间:2013-11-11 13:31:11

标签: delphi

我遇到了将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。 之后,网格需要重新加载所有数据。

2 个答案:

答案 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的结构来看,应该可以将现有的关系和地址分配给新生成的联系人,但那将是另一个问题。