0

私は Delphi の初心者で、次の問題について助けが必要です。フォームに編集可能な DBGrid を実装する必要があります。DBGrid は、3 つのテーブルを結合するクエリの結果を表示します。DBGrid を編集可能にすることができましたが、編集はデータベースに影響しません。DBGrid で行を挿入、編集、または削除できますが、これらの変更はデータベースに保存されません。次の設定があります。

Query2.DatabaseName=Test
Query2.SQL=SELECT cd.hourstart, cd.hourfinish, o.objname, cd."work", cd.worktime  
           FROM Card c JOIN CardDetail cd ON c.N=cd.card  
           JOIN objects o ON cd.project=o.N  
           WHERE c.worker=5 AND c.data=CONVERT(DATE, GETDATE())
Query2.UpdateObject=UpdateSQL2  
Query2.CachedUpdates=True  
Query2.RequestLive=True

UpdateSQL2.DeleteSQL=delete from CardDetail  
                     where hourstart = :OLD_houerstart and  
                     hourfinish = :OLD_houerfinish and  
                     work = :OLD_work and  
                     worktime = :OLD_worktime
UpdateSQL2.InsertSQL=...  
UpdateSQL2.ModifySQL=...  

DataSource2.DataSet=Query2  
DBGrid2.DataSource=DataSource2 

私はおそらく何かを見逃していますが、何がわかりません。どんな助けでも大歓迎です!

4

2 に答える 2

2
// Have a look at the below code, it uses an AdoCommand
procedure DoSomething(DataSet: TDataSet);
var
  ADOCommand : TADOCommand;
begin
  ADOCommand:=TADOCommand.Create(nil);
  try
  try
    ADOCommand.Connection:=Conn;
    ADOCommand.Parameters.Clear;
    Conn.BeginTrans;
    if dataset.State = dsinsert then
    begin
      ADOCommand.CommandText := //Your insert statement
      ADOCommand.ParamCheck:=False;
      ADOCommand.Execute;
    end
    else
    if DataSet.State = dsEdit then
    begin
      ADOCommand.CommandText := //Your edit statement
      ADOCommand.ParamCheck:=False;
      ADOCommand.Execute;
    end
    else
    Begin
      ADOCommand.CommandText := //Your delete statement
      ADOCommand.ParamCheck:=False;
      ADOCommand.Execute;
    End;
    Conn.CommitTrans;
  except
    on E : Exception do
    begin
      Conn.RollbackTrans;
      MessageDlg('An exception occured, Error Class: ' + E.ClassName         +#13+                      'ErrorMessage: '+ E.Message , mtError, [mbOK], 0);
      Abort;
    end;
  end;
  finally
    ADOCommand.Free;
  end;
end;
于 2012-12-05T09:30:55.420 に答える
1

テーブルごとに 1 つ、複数の UpdateSQL オブジェクトが必要であると主張されています http://docwiki.embarcadero.com/RADStudio/XE3/en/Using_Multiple_Update_Objects_Index

通常のデータを参照するために、これらの各オブジェクトにはベース TDataSet がバインドされている必要があります。 http://docwiki.embarcadero.com/Libraries/en/Bde.DBTables.TDataSetUpdateObject.DataSet

ApplyUpdates/Commit/CommitUpdates は、適切な順序で異なるオブジェクトに対して呼び出す必要があると主張されています。 http://docwiki.embarcadero.com/RADStudio/en/Applying_Cached_Updates_with_Dataset_Component_Methods

PS。BDE は推奨されておらず、最近の Windows および最近の db サーバーとの互換性が悪いです。

于 2012-09-17T12:01:06.553 に答える