添加一个空行,然后使用Delphi / DataSnap / dbExpress中的对话框填充

时间:2012-04-30 17:28:31

标签: delphi datasnap dbexpress

我打算创建一个对话框,在Firebird数据库中创建一个空白记录,然后使用该对话框中文本编辑框中的值填充字段。

我使用以下内容: 的dbExpress 的DataSnap 德尔福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)。我不知道如何解决这个问题。

编辑:代码格式

3 个答案:

答案 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;

我将TADOQuery组件与MS-SQL一起使用,它可靠地工作。

答案 1 :(得分:1)

换句话说,您希望创建一个包含非数据感知控件的对话框。为此,您需要三个TSQLQueries:一个用于在进入对话框时检索数据(在编辑数据的情况下),一个用于插入,一个用于更新。

这是我前几天写的对话框中的一些(编辑过的)代码。参数'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,金额,来自钱箱的详细信息,其中id =:p1

qInsertCashbox是     插入钱箱(id,curdate,amount,details)     值(:p0,:p1,:p2,:p3)

qUpdateCashbox是     更新钱箱套装     curdate =:p1,     金额=:p2,     details =:p3     其中id =:p0

当然,您也可以使用数据感知组件,它们需要'trinity' - 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;    

答案 2 :(得分:0)

您需要为数据库配置TSQLConnection,并且(为了简化)TSQLTable。将TSQLTable链接到TSQLConnection并在TableName属性中选择所需的表。接下来将TDataSetProvider拖放到表单上并将其与TSQLTable连接。现在取一个TClientDataSet,将其Provider设置为TDataSetProvider,并将DataSource连接到TClientDataSet。

记住:要将数据实际写入数据库,您必须调用TClientDataSet.ApplyUpdates。

更多信息here