0

Firebirdデータベースに空白のレコードを作成するダイアログを作成し、そのダイアログのテキスト編集ボックスから取得した値をフィールドに入力することを計画しています。

私は以下を使用しています:dbExpress DataSnap Delphi XE2

多分それはこのようになるはずです:

DataSource.DataSet.Append;
(call the dialog with the db text boxes pointing to DataSource)
if ModalResult = mrOK then
    DataSource.DataSet.Post;

何か案は?使用するコンポーネント(ClientDataSet、SQLQuery、SQLDataSet)を知りたいのですが。私はこれについてどうやって行くのか分かりません。

編集:コードのフォーマット

4

3 に答える 3

1

つまり、データを認識しないコントロールを使用してダイアログを作成する必要があります。これを行うには、3つのTSQLQueriesが必要です。1つはダイアログに入るときにデータを取得するため(データを編集する場合)、1つは挿入するため、もう1つは更新するためです。

これは私が先日書いたそのようなダイアログからのいくつかの(編集された)コードです。パラメーター'n'は、編集するタプルのIDです。新しいレコードを挿入する場合、その値は-1になります。

Function TEditCashbox.Execute (n: longint): boolean;
var
 q: TSqlQuery;

begin
 if n = -1 then
  begin
   edDate.Text:= datetostr (date);
   edAmount.text:= '0';
  end
 else with qGetCashbox do
  begin
   params[0].asinteger:= n;
   open;
   edDate.text:= fieldbyname ('curdate').asstring;
   edAmount.text:= fieldbyname ('amount').asstring;
   edDetails.text:= fieldbyname ('details').asstring;
   close
  end;

 if showmodal = mrOK then
  begin
   if n = -1 then
    begin
     q:= qInsertCashbox;
     q.ParamByName ('p0').asinteger:= dm.GenerateID ('cashbox')
    end
   else
    begin
     q:= qUpdateCashbox;
     q.ParamByName ('p0').asinteger:= n
    end;

  with q do
   begin
    parambyname ('p1').asdate:= strtodate (edDate.text);
    parambyname ('p2').asinteger:= strtoint (edAmount.Text);
    parambyname ('p3').asstring:= edDetails.text;
    execsql
   end;
  end
end.

qGetCashboxは、キャッシュボックスからcurdate、amount、detailsを選択するように定義されたクエリです。id=:p1

qInsertCashboxは、キャッシュボックス(id、curdate、amount、details)の値(:p0、:p1、:p2、:p3)に挿入されます

qUpdateCashboxは、キャッシュボックスセットの更新ですcurdate =:p1、amount =:p2、details =:p3ここで、id =:p0

もちろん、「三位一体」を必要とするデータ対応コンポーネント(TSQLDataSet、TDataSetProvider、TClientDataSet)を使用することもできます。データ対応コンポーネントの使用は簡単ですが、このアプローチが適切でない場合があります。データ対応コンポーネントを使用する場合、私のテンプレートコードは次のとおりです

sdsEditDeposit.params[0].AsInteger:= n;   // this is the TSQLDataSet
with qEditDeposit do    // this is the clientdataset
 begin
  open;
  if n = -1 then        // new tuple
   begin
    insert;
    fieldbyname ('amount').asinteger:= 0;
    fieldbyname ('curdate').asdatetime:= date;
   end;

  edit;
  if showmodal = mrOK then
   begin
    if n = -1 then 
     begin
      n:= dm.GenerateID;
      fieldbyname ('id').asinteger:= n;
     end;
    result:= n;
    post;
    applyupdates (0)
   end
  else
   begin
    cancel;
    result:= 0
   end;
end;    
于 2012-05-01T05:59:51.037 に答える
1

キャンセルも許可することをお勧めします...

DataSource.DataSet.Append;
(call the dialog with the db text boxes pointing to DataSource)
if ModalResult = mrOK then
    DataSource.DataSet.Post
else 
    Datasource.Dataset.cancel;

私はMS-SQLでTADOQueryコンポーネントを使用しており、確実に機能します。

于 2012-04-30T17:34:03.087 に答える
0

データベース用にTSQLConnectionを構成し、(簡単にするために)TSQLTableを構成する必要があります。TSQLTableをTSQLConnectionにリンクし、TableNameプロパティで目的のテーブルを選択します。次に、TDataSetProviderをフォームにドロップし、TSQLTableに接続します。次に、TClientDataSetを取得し、そのプロバイダーをTDataSetProviderに設定し、データソースをTClientDataSetに接続します。

注意:実際にデータベースにデータを書き込むには、TClientDataSet.ApplyUpdatesを呼び出す必要があります。

詳細はこちら

于 2012-04-30T20:36:14.377 に答える