PDA

Ver la Versión Completa : ClientDataSet - ApplyUpdates


luchopriet
03-08-2004, 15:22:20
Hola amigos:

Les agradecería me ayuden en este problema:
Tengo una aplicación cliente servidor. En el servidor uso ADOConnection, ADOQUery's, DataSetProvider's.
En el cliente: DCOMConnection y CLientDataSet's.
Tengo por ejemplo mi tabla de "empleados" y abro una ventana por cada uno.
(EMpleado 1, Empleado 2, ..., EMpleado N). Abro dos ventanas : Empleado 1 y EMpleado 2 (en ese orden) vuelvo a la ventana EMpleado 1 , hago un cambio cualquiera en un dato. APLICO y me sale error "registro modificado por otro usuario" . ¿POR QUE? ¿COMO SOLUCIONO ESTO?

Si abro una ventana y modifico , no hay problema ahi.

PD: algun manual avanzado sobre estos componentes.

GRACIAS DE ANTEMANO

karocs
03-08-2004, 16:02:17
Saludos

Este error generalmente ocurre cuando hay problemas con la base de datos como por ej: llaves primarias, tablas desconocidas, llaves foraneas etc pero si quieres ver el error especifico puedes colocar el envento
OnReconcileError del ClientDataSet que maneja la tabla empleado la siguiente instruccion:

ApplicationShowException(E),estp te muestra el error especifico;

Espero te sea de ayuda...

guillotmarc
03-08-2004, 17:22:27
Hola.

Como dice el compañero, es probable que simplemente no encuentre el registro a modificar, y no sea realmente que el registro se haya modificado.

Para asegurar la detección del registro, pón la propiedad UpdateMode del DataSetProvider a upWhereKeyOnly. Ahora solo te queda indicar cual es el campo de clave primaria. Esto lo tienes que hacer en la parte servidora, es decir en el ADOQuery. Abre sus campos persistentes, y en el campo que corresponde a la clave primaria, activa el flag pfInKey en la propiedad ProviderFlags.

Saludos.

luchopriet
04-08-2004, 14:25:32
Hola amigos:

En primer lugar que DLBM y gracias por su respuesta pronta a mi consulta.
Atendiendo lo que me dijeron hice las pruebas pero me sale el mismo error
"record not found o changed by other user"
(asumiendo que apliqué su consejo al pie de la letra).

ApplicationShowException(E), me devolvió el mismo mensaje que me muestra la ventana del reconcilieerror del clientdataset.

Quisiera si puedan ahondar mas el asunto cuando se refiere a que hay problemas con la base de datos ( "llaves primarias, tablas desconocidas, llaves foraneas etc"). Uso access como base de datos. como probaria? quitando claves, indices, relaciones? :confused:

SIguiendo el consejo de que no encontraba el registro, hice :
propiedad UpdateMode del DataSetProvider a upWhereKeyOnly
propiedad ProviderFlags del campo que corresponde a la clave primaria a True.

ALGUNA OTRA SUGERENCIA? :(

PD: SI hay una forma de conversar en linea avisenme.

guillotmarc
04-08-2004, 14:30:35
En primer lugar que DLBM y gracias por su respuesta

:confused: :confused: ¿ DLBM ? :confused: :confused:


SIguiendo el consejo de que no encontraba el registro, hice :
propiedad UpdateMode del DataSetProvider a upWhereKeyOnly
propiedad ProviderFlags del campo que corresponde a la clave primaria a True.

¿ Has utilizado el campo persistente correspondiente a la clave primaria del ClientDataset o del ADOQuery ? Como ya comenté, es importante que sea el campo del ADOQuery.

Saludos.

luchopriet
05-08-2004, 04:28:24
Hola guillotmarc

"¿ Has utilizado el campo persistente correspondiente a la clave primaria del ClientDataset o del ADOQuery ? Como ya comenté, es importante que sea el campo del ADOQuery."

SI agregué a la lista de campos todos de la tabla empleado (para el caso) y al campo que es la clave le puse activo el flag pfInKey en la propiedad ProviderFlags. todo en el servidor.
Pero sigue igual

QUE PUEDO HACER?

GRacias

luchopriet
07-08-2004, 22:40:47
Hola amigos:

Logré resolver el problema de l mensaje de "registro no se encuentra o modificado por otro usuario". pero aparece uno en uncaso cuando hago applyupdates:

"[Microsoft][Controlador ODBC Microsoft Access] No se puede definir el atributo ahora"

A qué se refiere.?

Gracias

guillotmarc
23-08-2004, 20:37:40
Hola.

¿ Porqué utilizas el provider ODBC para acceder a Access ?, utiliza el nativo de Access, es decir el Jet 4.

Saludos.

darnaldo
17-11-2007, 09:19:21
Hola colega programador:

Para solucionar ese problema debes hacer lo siguiente si usas un datasetprovider debes de indicarle en las propiedades que actualize solo en la llave primaria, es decir en la siguiente ruta:

UpdateMode -> WhereKeyOnly

Luego debes de cargar en el componente que te trae la información todos los campos es decir darle un doble click al componente relacionado y en la lista de campos con el boton derecho del mouse en el menú seleccionar:

AddAllFields

Y en el campo que es llave en tu base de datos cambiar en las propiedades lo siguiente:

ProviderFlags -> pfInley

Y con eso resuelves el problema.

Con tablas que no tienen campos llave no cambies las opciones.

Saludos y suerte!!

Darnaldo