PDA

Ver la Versión Completa : Controlar insert del DataSetProvider


rarratia
05-02-2011, 03:22:56
amigos, tengo un componente TADOSQl en donde leo los datos de una tabla, pero entre esos datos leo un dato de otra tabla con un Left Outer Join

Ahora bien, el TADOSql está conectado con DataSetProvider y este a un clientdataset luego todo bien, pero cuando hago el ApplyUpdate(0) entonces arroja un error, en el insert trata de insertar el campo que viene de la otra tabla y que no existe. Son nuevo en esto. ¿Hay alguna forma de cambiar los capos a insertar en el DataSetProvider? ¿Existe alguna propiedad para eso?

rgstuamigo
07-02-2011, 19:21:10
Creo que estas confudiendo las cosas...;)
Si tienes una consulta SQL que trae los datos de dos o mas tablas de tu base de datos(Inner join, Left join, Right join,etc), es lógico que eso sólo te sirve como vista (http://es.wikipedia.org/wiki/Vista_%28base_de_datos%29) o visualizacion de Datos y no para Insertar, editar, o elimnar registros...(a no ser que tu Servidor tengas esas cualidades);)
Si estas tratando de insertar, o editar nuevos registros lo que se debe hacer es hacerlo por parte, es decir, si se tratase de tablas maestra detalle, entonces es logico que al tratar de insertar nuevos registros, debes hacer la insercion primero a la tabla maestra y luego a la tabla detalle, eso se hace para que el servidor de Base de dato no te mande una excepcion al verificar la Integridad referencial (http://es.wikipedia.org/wiki/Integridad_referencial).;)
Saludos...:)

rarratia
07-02-2011, 19:46:48
Amigo, mi consulta iba dirigida a que tenía una actualización de aplicación en tres capas:

un TAdoConnection
un TAdoQuery
un TAdoProvider
un TClientDataSet
un TDAtaSource

La idea es que la consulta del TAdoQuery tiene un Left Outer Join entre sus cláusulas, por lo tanto un campo de otra tabla que no figura en la actualización. Si uno hace varios cambios en el TClientDataSet y quiere actualizar los datos en el motor de datos, entonces se hace un ApplyUpdate y este generaba un error porque uno de los campos no es actualizable. La solución era sencilla, no necesitaba interceptar el insert, bastaba, en la definición de campos en el TAdoQuery, en la propiedad ProviderFlags, definir este campo como: pfInUpdate a False Con esto el DataSetProvider no toma este campo cuando se ejecuta el ApplyUdate(0)

Gracias a los amigos por las ideas, saludos

rgstuamigo
07-02-2011, 19:56:33
Me alegra que hayas solucionado tu problema sin embargo quizas puedas hecharle una mirada a estas cincos partes ( 1 (http://delphiallimite.blogspot.com/2007/09/la-potencia-de-los-clientdataset-i.html), 2 (http://delphiallimite.blogspot.com/2007/09/la-potencia-de-los-clientdataset-ii.html), 3 (http://delphiallimite.blogspot.com/2007/09/la-potencia-de-los-clientdataset-iii.html), 4 (http://delphiallimite.blogspot.com/2007/10/la-potencia-de-los-clientdataset-iv.html) y 5 (http://delphiallimite.blogspot.com/2007/10/la-potencia-de-los-clientdataset-y-v.html)) que te pueden ayudar a mejorar la calidad de tu aplicacion.;)
Básicamente por que en esos artículos no se utiliza un solo Query (TAdoQuery) como segun entiendo lo haces tú, sino mas bien dos Query y eso se hace por motivos de mantenimiento.;) Pero mejor dale una hojeada y vé si te puede ayudar en algo.;)
Saludos...:)

rarratia
07-02-2011, 20:37:31
Muchas gracias, he guardado los artículos para estudiarlos.