Ver Mensaje Individual
  #10  
Antiguo 19-11-2007
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 30
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Hola!

¿Ya echaste un ojo a los métodos que mencioné? Empecemos por revisar el código fuente de ApplyUpdates y Reconcile de Delphi 7 (quizá sea igual o muy parecido en versiones cercanas):

Código Delphi [-]
function TCustomClientDataSet.ApplyUpdates(MaxErrors: Integer): Integer;
var
  RootDataset: TCustomClientDataset;
begin
  CheckBrowseMode;
  RootDataset := Self;
  while RootDataset.FParentDataSet <> nil do
    RootDataset := RootDataset.FParentDataset;
  with RootDataset do
    if ChangeCount = 0 then
      Result := 0 else
      Reconcile(DoApplyUpdates(Delta, MaxErrors, Result));  { <--- Esta llamada a Reconcile es la que debemos condicionar
                                                              (ojo: DoApplyUpdates debe ser llamado siempre)  }
end;

Código Delphi [-]
function TCustomClientDataSet.Reconcile(const Results: OleVariant): Boolean;
var
  RCB: Pointer;
  I: Integer;
  AField: TField;
begin
  if VarIsNull(Results) then MergeChangeLog else
  begin
    ...
  end;
  Result := (ChangeCount = 0);
end;

Efectivamente, DoApplyUpdates es un método función:
Código Delphi [-]
function TCustomClientDataSet.DoApplyUpdates(Delta: OleVariant; MaxErrors: Integer;
  out ErrorCount: Integer): OleVariant;
Pero su dato de resultado no es un entero que indica la cantidad de errores (eso lo regresa en el parámetro por variable ErrorCount), sino un variante arreglo conteniendo información detallada sobre los errores ocurridos. Cuando ese resultado es Null, significa que no ocurrieron errores al enviar los cambios al servidor.

ApplyUpdates llama directamente a Reconcile dándole dicho variante como parámetro:
Código Delphi [-]
      Reconcile(DoApplyUpdates(Delta, MaxErrors, Result));

Cuando ese parámetro es Null, lo único que hace Reconcile es llamar a MergeChangeLog:
Código Delphi [-]
  if VarIsNull(Results) then MergeChangeLog else
De ahí que, sin ninguna preocupación, podemos evitar la llamada al método Reconcilie cuando no haya errores, colocando, efectivamente, una condición dentro del nuevo ApplyUpdates.

¿Vamos captando la idea?

Por aquí seguimos.

Al González.

Última edición por Al González fecha: 19-11-2007 a las 22:28:38.
Responder Con Cita