Ver Mensaje Individual
  #5  
Antiguo 23-05-2014
gustavosv gustavosv is offline
Miembro
 
Registrado: mar 2008
Posts: 51
Reputación: 17
gustavosv Va por buen camino
bueno después de investigar y leer en varios artículos, lo he resuelto de la siguiente manera:
1. en lugar de dejar el campo Id (AutoIncr) sin valor, he dispuesto ponerle un valor único a cada registro usando para ello un número entero negativo garantizando que no se me confunda con algún otro número por ahí

Código Delphi [-]
K := -1;
....
begin
  ClientDataSet1.FieldByName('Id').AsInteger := K;
  ClientDataSet1.Post;
  Dec(K);
end;

2. el evento BeforeUpdateRecord del TDataSetProvider se ejecuta con la instrucción ApplyUpdates antes de hacer la actualización física en el servidor, allí se implementa un mecanismo para conocer cuál sería el próximo número del Id y se actualiza usando la propiedad NewValue, para que llegue al servidor con el número que corresponde

Código Delphi [-]
procedure TDM.Provider1BeforeUpdateRecord(Sender: TObject;
  SourceDS: TDataSet; DeltaDS: TCustomClientDataSet; UpdateKind: TUpdateKind;
  var Applied: Boolean);
var
  NroRgtro: Integer;
begin
  if UpdateKind = TUpdateKind.ukInsert then
  begin
    spIdMAX.ExecProc;  // procedimiento almacenado que obtiene el último número asignado al AutoInc
    NroRgtro := spIdMAX.Params.ParamByName('IdMAX').AsInteger;
    DeltaDS.FieldByName('Id').NewValue := NroRgtro + 1;
  end;
end;
Responder Con Cita