FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Trying to modify a Read-Only Field (ClientDataSet)
Saludos amigos, a ver si me pueden ayudar, estoy teniendo un pequeño problema con un clientdataset, al intentar editar los datos de un campo mediante un bucle While, solo me modifica el registro la primera vez, luego al intentar modificar la segunda linea siempre me dispara el error 'Tryin to Modify a Read-Only Field'.
He verificado que el ClientDataSet no este Read-Only, ni el campo a modificar tampoco lo esta, y ya no se me ocurre nada que pueda ser. Si alguien sabe algo al respecto que me pueda hechar una mano please. |
#2
|
||||
|
||||
Hola Dclase.
¿ Un poco de código por favor ? Saludos. |
#3
|
|||
|
|||
Cuando entra al bucle por primera vez edita el primer registo, pero el siguiente ya me dispara el mensaje de que no puede modificar.. |
#4
|
||||
|
||||
Hola DClase, así como esta tu codigo, recorres el ClientDataSet1 y actualizas el registro actual del ClientDataSet2 pero siempre el mismo (para hacer eso no necesitas un ciclo, actualizas directamente el registro actual). Puedes probar de poner un Post:
Saluditos
__________________
Disfruten cada minuto de su vida a lado de sus seres queridos como si fuese el ultimo, uno nunca sabe lo que puede pasar. |
#5
|
|||
|
|||
Perdon, me falto algo de codigo, previamente lleno el ClienteDataSet2 con campos de una tabla, (TablaA), luego lo recorro y actualizo un registro X de otra tabla (TablaB).
Intento editar el campo si lo encuentra. No creo que sea por usar locate, porque tambien lo intente poniendo un While al ClientDataSet2 para recorrerlo y comparar registro por registro, pero igual me da el mismo error. |
#6
|
||||
|
||||
El ciclo esta bien, pero nunca haces post, el Post debe quedar dentro del ciclo previo al Next.
__________________
AKA "El animalito" ||Cordobés a mucha honra|| |
#7
|
||||
|
||||
Cita:
El método Post, llama a InternalPost, el cual, en el caso de TClientDataSet, llama a su vez al método ModifyRecord de su interfaz DSCursor. Este método verifica que ninguno de los campos que estén marcados como de sólo lectura haya sufrido cambios. Si pasa esta validación, el registro es guardado en la memoria del conjunto de datos, de lo contrario arrojará la excepción "Trying to modify read-only field". El origen del problema es que antes de la operación de guardado el campo en cuestión fue marcado como read only. Dices que ya revisaste eso, pero ¿podrías mostrarnos cómo estás creando el objeto ClientDataSet2 y definiendo sus campos? Saludos. Al. |
#8
|
|||
|
|||
Bueno, no se si en la forma en que lo utilizo sea la correcta, el ClientDataSet2, es un componente TClientDataSet que lo agrego en modo de diseño, lo conecto a un Provider el cual a su vez esta conectado a un TADODataSet (a este ultimo le paso un String con los campos k rekiero de una tabla en especifico), al activar el ClientDataSet, me trae los campos resultantes de la consulta, limpio la propiedad ProviderName, y ya tengo el ClientDataSet2 con los campos k requiero. Bueno y si vienen campos onla propiedad read-only = True, los cambio a False
Antes de trabajar con el ClientDataSet2 siempre lo limpio primero:
Luego entonces le inserto datos con Append; y despues es que intento editarlo. Siempre lo habia utilizado asi pero solo para modificar un registro a la vez y lo enviaba directamente a la tabla con ApplayUpdate(0), pero en este caso solo me interesa modificar en el CDS en memoria para fines de reporte. Última edición por Dclase fecha: 25-08-2010 a las 23:41:59. |
#9
|
||||
|
||||
Hola de nuevo Dclase.
Lo primero sería comentarte que hay una mejor manera de crear un TClientDataSet bajo una estructura de campos específica. Para ello puedes hacer uso de su propiedad FieldDefs y de su método CreateDataSet. La ayuda de Delphi viene con un buen ejemplo y seguramente en este foro encontrarás varios ejemplos más. Allende de lo anterior, me llamó la atención esto que comentaste: Cita:
Estos descriptores son elementos que definen a cada uno de los campos del cursor, como su tipo, tamaño y si son de lectura y escritura o sólo lectura. Cuando el conjunto de datos es abierto, el cursor inicializa sus descriptores de campos con base en la información obtenida de parte del proveedor. Así pues, si el conjunto de datos que es servido por el proveedor (el TADODataSet en tu caso) viene con un campo cuya propiedad ReadOnly es True, el respectivo descriptor en el interior del cursor cliente quedará marcado con un atributo de sólo lectura (constante fldAttrReadOnly). Algo curioso de este atributo es que solamente tiene efecto en las modificaciones, pero no en las inserciones de registros (por ello has podido agregar filas, pero no cambiarlas). Viendo tu caso, me dediqué un rato a investigar y hacer pruebas de cómo se podría quitar ese atributo del descriptor, considerando que este es un objeto interno de la propiedad interfaz DSCursor del conjunto de datos. La clave está en llamar al método SetProp de esa interfaz con una constante que no aparece en Delphi (al menos no hasta la versión 7), pero que al parecer existe en MIDAS desde hace tiempo: curpropFLD_MAKERW; además de proporcionar el número de campo en cuestión. Creé esta rutina que sirve para quitar el atributo de sólo lectura de un campo, tanto a nivel de la propiedad ReadOnly como a nivel de su respectivo descriptor en el interior del cursor:
Hice la prueba y funciona, el conjunto de datos cliente permite hacer y guardar modificaciones hechas sobre campos que venían marcados como de sólo lectura. Lo anterior puede sernos útil en algún momento, pero no está demás recordarle a Dclase mi sugerencia de usar el método CreateDataSet, ya que además de emplear menos memoria de programa, no tendrá que hacer consulta alguna a la base de datos. Saludos a FGarcia, por quien supe que existía la constante curpropFld_MakeRW. Un abrazo. Al González. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Cannot Modify | mantraxer21 | Varios | 8 | 26-08-2010 18:17:22 |
Error 'Cannot modify a read-only dataset' | karaoke | Varios | 8 | 10-12-2007 06:38:31 |
Al intentar modificar un campo me dice "Cannot modify a read-only dataset" | raulahol | SQL | 1 | 22-01-2007 05:16:53 |
error cannot modify a read-only dataset | Renees | Varios | 2 | 30-09-2006 00:39:27 |
Query1 cannot modify a read-only dataset | Nbull | SQL | 14 | 14-12-2004 10:29:35 |
|