PDA

Ver la Versión Completa : AdoQuery no hace Post correctamente


joni88
26-10-2011, 17:31:55
Buenas! Mi primer consulta en el foro, espero que me puedan ayudar. Les comento:
Tengo un AdoQuery al cual lo lleno con los datos de una consulta SQL, ese AdoQuery tiene un TFieldBoolean y esta conectado a una grilla, la grilla tiene una columna de tipo check en la cual debería poder editar el valor de la FieldBoolean... la consulta se realiza correctamente y hasta me deja hacer click y cambiar el valor en la grilla, pero cuando cambio de registro este valor vuelve al que estaba anteriormente...

Para probar, a demás agregué la siguiente función que la llamo desde un botón:

function ChangeCorregir: Boolean;
begin
if aqErrores.State <> dsEdit then
aqErrores.Edit;
aqErroresCORREGIR.Value := not aqErroresCORREGIR.Value;
//aqErroresCORREGIR es la TFieldBoolean aqErrores.Post;
Result := aqErroresCorregir.Value; end;


y sigue sucediendo lo mismo... Si por ejemplo el valor estaba en false, cuando hago aqErroresCORREGIR.Value := not aqErroresCORREGIR.Value pasa a true; pero al hacer el post, el valor vuelve a falso...

Que puede estar pasando?

olbeup
27-10-2011, 09:00:30
Es posible que lo esté grabando, haz una prueba, cierra la DB y la abres de nuevo, comprueba el valor, si ha cambiado, tienes que refrescar el DBGrid, cerrando y abriendo de nuevo.

Un saludo.

Neftali [Germán.Estévez]
27-10-2011, 11:34:26
Por los datos que das no parece tener lógica, el problema es que es difícil saber qué puede estar pasando.
Supongo que ninguno de los componentes implicados estará en sólo lectura y que no utilizas transacciones.

Si no puedes dar más datos, lo más sencillo ta vez sería que prepararas un pequeño proyecto con un único formulario y lo subieras.
¿Qué base de Datos utilizas? No lo comentas.

Otra cosa que se me ocurre es que estés utilizando una consulta SQL "no-actualizable" (por ejemplo si tiene JOIN's)
¿Puedes poner la consulta?

P.D: Bienvenido a los foros.

joni88
27-10-2011, 14:32:02
La base de datos que utilizo es SQLServer 2008.
A demás, la consulta tiene JOINs; explico un poco más detallado el flujo del programa, creo una tabla temporal y la lleno con ciertos datos (estos datos salen de un archivo de texto, y los cargo en la tabla con la instrucción BULK INSERT), luego hago la consulta:


SELECT
CAST(0 AS BIT) AS CORREGIR,
SOCIO.cod_socio,
SOCIO.nro_socio,
SOCIO.nombre + ' ' + SOCIO.apellido AS [nombre],
#ERRORES.NRO_DOCUMENTO,
#ERRORES.COD_MOV,
#ERRORES.COD_ERROR,
ERRORES_SUPER.CAMPO_VALIDACION,
ERRORES_SUPER.DESCRIP_ERROR,
ERRORES_SUPER.ACCION
FROM #ERRORES
INNER JOIN TIPO_DTO ON TIPO_DTO.equiv_super = #ERRORES.TIPO_DOCUMENTO COLLATE Modern_Spanish_CI_AI
INNER JOIN SOCIO ON SOCIO.nro_dto = #ERRORES.NRO_DOCUMENTO AND
SOCIO.cod_tipdoc = TIPO_DTO.cod_tipdoc
INNER JOIN ERRORES_SUPER ON ERRORES_SUPER.CODIGO_ERROR = #ERRORES.COD_ERROR
GROUP BY
SOCIO.cod_socio,
SOCIO.nro_socio,
SOCIO.nombre + ' ' + SOCIO.apellido,
TIPO_DTO.des_tipdoc,
#ERRORES.NRO_DOCUMENTO,
#ERRORES.COD_MOV,
#ERRORES.COD_ERROR,
ERRORES_SUPER.CAMPO_VALIDACION,
ERRORES_SUPER.DESCRIP_ERROR,
ERRORES_SUPER.ACCION,
#ERRORES.COD_MOV,
SOCIO.nro_dto


CAST(0 AS BIT) AS [CORREGIR] es el campo que esta asociado a la columna tipo check de la grilla... yo no quiero actualizar nada en la base de datos, lo que quiero es que el usuario seleccione algunos registros de la grilla, para luego trabajar con ellos...
Otra cosa, la grilla es uns TdxDBGrid; de todas formas por lo que me comentan y por lo que probé no debe ser un problema de la grilla.
Con respecto a que los componentes esten en solo lectura, ninguno esta en esta condición... como expliqué en el mensaje anterior, me deja cambiar el valor en la grilla o en el AdoQuery, pero cuando cambio de registro o hago AdoQuery.Post vuelve al valor original.

Desde ya muchas gracias a ambos por las respuestas!!!!

Neftali [Germán.Estévez]
27-10-2011, 15:40:35
El problema es que no puedes hacer un POST sobre esa consulta no-actualizable.
Cuando tú marcas el check del Grid, que está "ligado" esa consulta,, el intenta actualizar el campo con el nuevo valor y eso es lo que no puede hacer.

Hay que decir, que hasta que no haces el Post no estás cambiando el valor en ningún sitio. Sí que ves el cambio en el Grid, pero no es un cambio real, simplemente es temporal hasta que se hace el POst; Cuando haces el POst y no se puede cambiar, te lo devuelve al valor anterior.

Tal vez no te estoy entendiendo.

joni88
27-10-2011, 16:16:05
Ok! Entonces mi duda ahora es si hay alguna forma de poder modificar esos datos que traigo en la consulta... teniendo en cuenta que esta actualización no tiene que ser a nivel de la base de datos; ya que lo único que necesito es que el usuario checkee en la grilla los registros que le interesan (en esta columna de tipo check que tiene asociada al campo que en la consulta viene: "CAST(0 AS BIT) AS CORREGIR"), para que después el programa pueda recorrer esos datos y ver cuales estan checkeados (mirando el campo aqErroresCORREGIR.Value)

Neftali [Germán.Estévez]
27-10-2011, 16:45:14
Lo primero que se me ocurre es utilizar un TClientDataSet.
Otra opción (que es la misma idea) es utilizar una tabla temporal, o incluso algún componente de tablas en memoria (pero para este último mejor el TCllientDataset).

Si estás utilizando DevExpress, esos mismos componentes traen un MemDataSet (no recuerdo el nombre).

joni88
27-10-2011, 17:43:05
Use un TClientDataSet y me funciona perfecto, permitiendome modificar los datos en memoria como quería!

Te agradezco muchísimo la ayuda!