2012-04-30 23 views
0

Firebirdデータベースに空白のレコードを作成するダイアログを作成し、そのフィールドにテキストエディットボックスそのダイアログ。空の行を追加して、Delphi/DataSnap/dbExpressのダイアログを使用してデータを入力してください。

私は、次を使用しています: の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)を使用するかを知りたい。私はこれについてどうやって行くのか分かりません。

EDIT:コード

答えて

1

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

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

qInsertCashbox金庫に インサートである(ID、CURDATE、量、詳細) 値(:

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、量、ID =が金庫から詳細として定義されたクエリーです。 P0:P1:P2:P1、 量=:P2、 詳細= P3 ID P3)

qUpdateCashboxが 更新金庫が CURDATE =に設定されています=: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;  
+0

これはスポットに当たった!ありがとうございました。 –

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コンポーネントを使用し、それが確実に動作します。

+0

ありがとう、どのコンポーネントをダイアログに配置しますか? CDS、またはSQLQueryまたはSQLDataSet?私は混乱しています。 –

+0

申し訳ありません、編集しました。 TADOQueryコンポーネントはほとんどの場合使用します。 –

0

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

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

詳細情報here

+0

ありがとうございます。私はApplyUpdatesを使用しています。 Postの後にこのメソッドを呼び出す必要がありますか? –

+0

各投稿の後ではなく、変更をFirebirdに送信したいとき。だから、PostとCloseの間に少なくとも1回は問題ありません。 –

関連する問題