Buenas,
Al Gónzalez ¡cuánto honor! que seas quien trate de guiarme entre este mar de sombras.
Cita:
Empezado por Al González
Para eliminar el registro, el componente proveedor necesita identificarlo de algún modo. Normalmente es mediante el campo que tenga la bandera pfInKey en ProviderFlags. Pero eso depende de qué valor tenga la propiedad UpdateMode del proveedor. Por lo general se recomienda upWhereKeyOnly.
|
No sé a que te refieres con eliminar. Solamente he obtenido un registro de la tabla 'clientes' y muestro sus datos en el formulario con controles 'data-aware'. El error me sale al editar. La consulta no cruza tablas, y la propiedad en el provider (TDataSetProvider) está UpdateMode=upWhereKeyOnly y creo que no debe dar problemas, ¿cierto?
Bien, ahora paso a intentar dar más información porque no soy capaz de aclararme viendo el debug de todo lo que me has recomendado.
Esto es lo que veo:
En la unit DBClient ejecutando el método 'TCustomClientDataSet.GetDelta', en la última línea 'DataPacketToVariant(TempPacket, Result);' Tras ejecutarla y ponerse sobre el 'end', llama posteriormente a una serie de código ensamblador en la unit 'System', tras lo cual es dónde se muestra la excepción. Creo entender que el código ensamblador ese es lo que lanza la expceción, pero no puedo sacar nada en claro.
La líneas de ensamblador que comento. Unit 'System':
Código Delphi
[-]
function _IntfClear(var Dest: IInterface): Pointer;
{$IFDEF PUREPASCAL}
var
P: Pointer;
begin
Result := @Dest;
if Dest <> nil then
begin
P := Pointer(Dest);
Pointer(Dest) := nil;
IInterface(P)._Release;
end;
end;
{$ELSE}
asm
MOV EDX,[EAX]
TEST EDX,EDX
JE @@1
MOV DWORD PTR [EAX],0
PUSH EAX
PUSH EDX
MOV EAX,[EDX]
CALL DWORD PTR [EAX] + VMTOFFSET IInterface._Release
POP EAX
@@1:
end;
¿Podemos avanzar con esta nueva información?
Un saludo y gracias por la ayuda.