StartKill
07-03-2013, 06:46:33
Buenas con el foro.
Trabajo con SQLServer 2008
Delphi XE
Tengo un mantenimiento de una tabla y para que el ejemplo sea mas práctico lo eh reducido así:
Estoy utilizando adoQuery, DataSetProvider y ClientDataSet.
//ADOQUERY
adoQuery1.sql.text := 'select codigo, familia, flag from familias ';
Para la Columna código(PK).
ProviderFlags[pfInUpadate], [pfInWhere], [pfInKey] = true;
//------
DataSetProvider1.DataSet:= adoQuery1;
DataSetProvider1.Optios[poIncFieldProps]:= true;
DataSetProvider1.ResolveToDataSet:=false;
DataSetProvider1.UpdateMode:=pWhereKeyOnly;
ClientDataSet1.ProviderName:=DataSetProvider1.
Para actualizar a mi base de datos empleo la siguiente rutina
procedure TfrmFichaCenso.SpeedBtnNuevoClick(Sender: TObject);
begin
try
if ClientDataSet1.ApplyUpdates(0)<>0 then begin
ShowMessage('Error al grabar');
end
else begin
//otro codigo....
close;
end;
Except
on e: Exception do
begin
ShowMessage(e.ClassName + ', <-(Ficha familia)->, ' + e.Message);
ClientDataSet1.edit;
end;
end;
end;
ESTA ES LA PRUEBA QUE HAGO
cuando se digita una clave duplicada, la excepción que envía no es descriptiva:
EOleException, <-(Ficha familia)->, -214721789 is not valid value for field 'ERROR_CODE'. The allowed range is 0 to 4294967295
Pero si doy true a la propiedad....
DataSetProvider1.ResolveToDataSet:=true;
El mensaje es...:
Error al grabar
Y si implemento el metodo ReconcileError para el clientDataset:
procedure TfrmFichas.ClientDatset1ReconcileError(DataSet: TCustomClientDataSet; E: EReconcileError;
UpdateKind: TUpdateKind; var Action: TReconcileAction);
begin
ShowMessage('Reconcile Error: ' + E.Message);
end;
El error es mas descriptivo:
Reconcilie Error: Infracción de la restricción UNIQUE KEY 'codigo_uq'. No se puede insertar una clave duplicada...
Pero el método ReconcileError solo se lanza si la propiedad <DataSetProvider1.ResolveToDataSet> es true. Muchas veces eh leido que este siempre debería estar en false,...
Entonces como hago para poder enviar un mensaje de error mas decente...
- Podría hacer un búsqueda previa, por que este el mensaje también podría ser por otro motivo y deseo visualizar un mensaje mas descriptivo.
A la espera de sus experiencias.
Your friend
StartKill
Lima-Perú
//----
Trabajo con SQLServer 2008
Delphi XE
Tengo un mantenimiento de una tabla y para que el ejemplo sea mas práctico lo eh reducido así:
Estoy utilizando adoQuery, DataSetProvider y ClientDataSet.
//ADOQUERY
adoQuery1.sql.text := 'select codigo, familia, flag from familias ';
Para la Columna código(PK).
ProviderFlags[pfInUpadate], [pfInWhere], [pfInKey] = true;
//------
DataSetProvider1.DataSet:= adoQuery1;
DataSetProvider1.Optios[poIncFieldProps]:= true;
DataSetProvider1.ResolveToDataSet:=false;
DataSetProvider1.UpdateMode:=pWhereKeyOnly;
ClientDataSet1.ProviderName:=DataSetProvider1.
Para actualizar a mi base de datos empleo la siguiente rutina
procedure TfrmFichaCenso.SpeedBtnNuevoClick(Sender: TObject);
begin
try
if ClientDataSet1.ApplyUpdates(0)<>0 then begin
ShowMessage('Error al grabar');
end
else begin
//otro codigo....
close;
end;
Except
on e: Exception do
begin
ShowMessage(e.ClassName + ', <-(Ficha familia)->, ' + e.Message);
ClientDataSet1.edit;
end;
end;
end;
ESTA ES LA PRUEBA QUE HAGO
cuando se digita una clave duplicada, la excepción que envía no es descriptiva:
EOleException, <-(Ficha familia)->, -214721789 is not valid value for field 'ERROR_CODE'. The allowed range is 0 to 4294967295
Pero si doy true a la propiedad....
DataSetProvider1.ResolveToDataSet:=true;
El mensaje es...:
Error al grabar
Y si implemento el metodo ReconcileError para el clientDataset:
procedure TfrmFichas.ClientDatset1ReconcileError(DataSet: TCustomClientDataSet; E: EReconcileError;
UpdateKind: TUpdateKind; var Action: TReconcileAction);
begin
ShowMessage('Reconcile Error: ' + E.Message);
end;
El error es mas descriptivo:
Reconcilie Error: Infracción de la restricción UNIQUE KEY 'codigo_uq'. No se puede insertar una clave duplicada...
Pero el método ReconcileError solo se lanza si la propiedad <DataSetProvider1.ResolveToDataSet> es true. Muchas veces eh leido que este siempre debería estar en false,...
Entonces como hago para poder enviar un mensaje de error mas decente...
- Podría hacer un búsqueda previa, por que este el mensaje también podría ser por otro motivo y deseo visualizar un mensaje mas descriptivo.
A la espera de sus experiencias.
Your friend
StartKill
Lima-Perú
//----