Al_Gonzales:
estuve viendo el hilo que me sugeriste y me parecio muy interesante, siguiendo los pasos de depuración, como mostrabas en el hilo, pude aclarar varias dudas, pero saltaron otras mas.
Primero, la propiedad UpdateMode de mi proveedor está establecida con
upWhereKeyOnly,
el campo de busqueda para el proveedor es mi ID que tiene la bandera
pfInKey, siguiendo las recomendaciones que dabas, añadí en la ventana (watches) una nueva propiedad para observación
Provider.UpdateMode,
ejecuto el programa en depuración y la propiedad añadida a (watches) se establece a
upWhereKeyOnly, mas no cambia a
upWhereAll, es mas, mire el valor de
SQL.Text que se muestra en código mas abajo y efectivamente dice:
delete from articulos '#$D#$A'where id_articulo = '#$D#$A', es decir que la consulta en la clausula
WHERE no anida los demas campos con el operador
AND, solo hace referncia al campo de búsqueda id_articulo (ID) que esta con
pfInKey, cosa que me parece perfecto.
Código Delphi
[-]
procedure TSQLResolver.DoExecSQL(SQL: TWideStringList; Params: TParams);
var
RowsAffected: Integer;
begin
RowsAffected := (Provider.DataSet as IProviderSupport).PSExecuteStatement(SQL.Text, Params);
if not (poAllowMultiRecordUpdates in Provider.Options) and (RowsAffected > 1) then
begin
(Provider.DataSet as IProviderSupport).PSEndTransaction(False);
Provider.TransactionStarted := False;
DatabaseError(STooManyRecordsModified);
end;
if RowsAffected < 1 then
DatabaseError(SRecordChanged);
end;
me di cuenta que error salta despues de la linea:
Código Delphi
[-]
if RowsAffected < 1 then
DatabaseError(SRecordChanged);
claro si es que el otro usuario ya lo borró previamente.
Bueno lo que pienso, es que por parte del rervidor (SQLServer), el proveedor recibe la notificación que ningun registro existe con ese valor, si es asi pues todo ya tiene lógica
en ese caso podria ignorar la actualizacion si esque RowsAffected es < 1 cierto?
como podria hacerlo???
lo único que me ha funcionado hasta ahora fue implementar el evento OnUpdateError de la siguiente manera:
Código Delphi
[-]
if UpdateKind in [ukModify, ukDelete] then
begin
Response := rrIgnore;
end;
pero como bien sabes se puede resolver un problema de mil maneras, la diferencia está en la manera mas apropiada!
Gracias denuevo, si veo algo nuevo al respecto lo comunicare
Saludos!!!