title: Obtain Trigger generated values after ApplyUpdates with a TClientDataSet
body: <p>I have a (Firebird) DB.  For most of my tables I have a trigger which fires before insert which will create the Primary Key (PK) for me via a generator as well as write to the newly inserted records a Created Date value and a Created By value.  I also have an update trigger which writes to an Updated Date field and an Updated By field.</p>
  
  <p>eg (Client is a table in my DB):</p>
  
  <pre><code>create trigger t_client_id for client
  active before insert
  as begin
    new.client_id = gen_id(gen_client_id, 1);
    new.created = current_timestamp;
    new.created_by = current_user;
    new.lock_vn = 1;
  end ^
  
  create trigger t_client_update for client
  active before update
  as begin
    new.updated = current_timestamp;
    new.updated_by = current_user;
  end ^   
  </code></pre>
  
  <p>When I apply updates thru my ClientDataSet (CDS) - which are attached to remote TDataSetProviders via a TDSProviderConnection, how can I "retrieve" these generated values?  If I edit an existing one (which will in turn call the t_client_update trigger, calling RefreshRecord will get the updated and updated_by fields.  However, the Doco says to use that method cautiously, so that may not be the correct way to achieve this.  I call it straight after I've called ApplyUpdates(-1).</p>
  
  <p>The CDS I use only contains the one record I am attempting to Edit.  For a New record, the CDS is in dsInsert mode.  Everything is written to the DB ok so I just need to get this new data back out again.  I have also tried using a CDS which contains ALL records in the table too to see if it was any simpler but didn't make any difference - unsurprisingly.  The reason I need this information is simply to show to the user in DB Aware controls these values.  They are read only.</p>
  
  <p>I could call a Get on the record I guess when editing an existing record, using the PK, but that won't help for an Insert as I don't know what the new PK is.  </p>
  
  <p>Example of where I attempt to ApplyUpdates to my CDS (actDSSave is a TDataSetPost action)</p>
  
  <pre><code>  dsState := actDSSave.DataSource.DataSet.State;
    DoApplyUpdates(-1);
    if dsState = dsEdit then
      TClientDataSet(actDSSave.DataSource.DataSet).RefreshRecord;
  </code></pre>
  
  <p>I am using TIBQuery for my dataset attached to the remote DataSetProvider.  This query SQL is a simple <strong>select * from client where client_id = :client_id</strong>.  I have tried associating this query with a TIBUpdateSQL too as well as trying to set poAutoRefresh to true in the DataSetProvider.</p>
  
  <p>So is it possible to obtain these Trigger generated values this way or do I need to approach it in a different way? Another way I can think of, is to create stored procedures which do CRUD against each table and use that instead (with appropriate in/out params to return this new data) but hopefully I don't have to go down that track. Hopefully I have provided sufficient info here to explain and replicate the issue.  </p>
  
  <p>Thanks</p>
  
  <p><strong>EDIT</strong>
  Realised in above, DoApplyUpdates(-1) is my own method.  It's implementation at the moment is simply:</p>
  
  <pre><code>FdatCommon.cdsClient.ApplyUpdates(MaxErrorCount);
  </code></pre>
  
  <p>FdatCommon is a TDataModule containing my CDS.</p>