PDA

Ver la Versión Completa : Problema con DBCheckBox


juggern
28-07-2022, 09:52:50
Buenas chicos,

Hoy os traigo un problemilla que no se si sabréis guiarme porque es difícil de ver sin tener el programa delante, pero bueno, es por si alguna respuesta me da alguna idea..

Tengo una ventana con opciones de productos, en la ventana hay dbedit... dbcheckbox... todos con opciones para activar, desactivar, configurar... todo funciona bien.
Los DBCheckBox están asociados a un DataSource y este DataSource está asociado a un TBetterAdoDataSet que se encuentra en un DM.
Hasta aquí todo bien, todo funciona.
Bien, el problema es que yo quiero añadir un campo que se configure con otro DBCheckBox en esa pantalla. He creado el campo, lo he incluido en la consulta y he creado un DBCheckBox nuevo vinculado a ese campo. El campo lo agrega bien y lo muestra en el CheckBox, aparece marcado o desmarcado automáticamente dependiendo del valor del campo. El problema es que no me deja hacer click en el checkbox, si hago click, no hace nada de nada, es como si el campo estuviera bloqueado por algo. Si le cambio la vinculación de ese campo nuevo a un campo que ya existía, el checkbox funciona perfectamente, lo que me lleva a pensar que es problema del campo. En algún lado tengo que desbloquearlo, añadirlo... no se, algo. Pero he revisado mil cosas y no lo veo.

No se si se os ocurre algo que pueda probar...

Muchas gracias

Neftali [Germán.Estévez]
28-07-2022, 13:24:45
1) ¿Cómo es la consulta que estás utilizando? ¿Directa sobre una tabla? ¿Varias tablas?
2) Revisa el DFm a ver si ves algo "raro" en ese componente (DBCheckBox)

juggern
28-07-2022, 13:37:43
En el dfm no he visto nada raro, todo parece correcto.
La consulta es sobre una vista (SQL server) que implica varias tablas, añadí el campo a la vista y a la hora de mostrarlo va bien, el checkbox aparece marcado si el campo tiene una S y desmarcado si tiene una N (que es como configuré para seguir la estructura del programa), el problema es que al hacer click en el checkbox, no hace nada, tiene que ser algo del campo yo creo, porque si en lugar de ese campo nuevo, le pongo otro campo, entonces si que funciona el checkbox.
¿Puede que el problema sea directamente del campo o la vista de SQL en lugar de en delphi? no se :(

Neftali [Germán.Estévez]
28-07-2022, 13:48:30
¿Puede que el problema sea directamente del campo o la vista de SQL en lugar de en delphi? no se :(

Por ahí iba mi pregunta.
Revisa sobre "Vistas actualizables". Entiendo que tu vista está formada por JOINs, y si es así, no todos los campos de la JOIN son actualizables.
¿El resto de campos (DBCheckbox) son de la tabla principal o son de las otras tablas de la vista? ¿Y este que has añadido?

Vistas actualizables
Es posible modificar los datos de una tabla base subyacente mediante una vista, siempre que se cumplan las siguientes condiciones: Cualquier modificación, incluidas las instrucciones UPDATE, INSERT y DELETE, debe hacer referencia a las columnas de una única tabla base.

juggern
28-07-2022, 14:18:10
Pues acabo de estarlo revisando y tiene todo left join pero el campo que he agregado es a la tabla principal, los otros campos que veo que se actualizan, también son de esta tabla.

También he probado a hacer un update vista set Campo = 'N' donde el campo es el que he creado y me lo actualiza bien desde SQL.

duilioisola
28-07-2022, 15:18:40
Comprueba si el TField tiene las propiedades correctas (ReadOnly?).
Comprueba que no tenga ningún evento indeseado (OnSetText?)

No conosco el componente TBetterAdoDataSet.
Tiene alguna forma de establecer el UpdateSQL?

juggern
28-07-2022, 16:26:13
Ya lo miré pero lo estoy repasando por si acaso, todo parece correcto, no tiene readonly, ni ningún evento el Field.
El DataSet tiene varios eventos pero el único que podría afectar es el BeforeUpdate, porque el resto son para el post, delete o cancel, y el beforeupdate solo coge un valor y lo mete en una variable global, asique no afecta.
El DataSource sin embargo si que tiene los eventos DataChange, StateChange y UpdateDate vinculados, pero para verificar que no fuera por estos, probé a quitarlos todos y seguía igual, por eso me hace pensar que tiene que ser algo del Field o de la propia vista. El field lo he quitado y lo he agregado al DataSet a mano copiándolo de uno que si funciona y es igual y nada, tampoco.

La vista tiene esta estructura, donde CAMPONUEVO es el campo que he añadido yo a la tabla1:


SELECT A.Campo1, A.Campo2, A.Campo3, A.Camp4o, A.Campo5, A.Campo6, A.Campo7, A.Campo8, A.CAMPONUEVO,
P.Nombre AS NombreAct, T.Nombre AS NombrePas,
CASE WHEN A.Campo1 = 'M' THEN 'MMM' WHEN A.Campo1 = 'I' THEN 'III' WHEN A.Campo1 = 'C' THEN 'CCC' ELSE 'Indefinido' END AS Tipo
FROM dbo.tabla1 AS A LEFT OUTER JOIN
dbo.tabla2 AS P ON A.clave1 = P.clave1 LEFT OUTER JOIN
dbo.tabla2 AS T ON A.clave2 = T.clave2 LEFT OUTER JOIN


Sigo probando cosas pero nada.

El comportamiento a la hora de hacer click en el CheckBox es como si no tuviera un campo vinculado, pero si que lo tiene ya que si en la bd tiene un valor 'S' lo muestra marcado y si tiene un valor 'N' lo muestra desmarcado.

kuan-yiu
29-07-2022, 08:40:20
En versiones antiguas de Delphi he tenido problemas similares y eran porque tenía definidos de forma parcial campos persistentes (tablas monstruosamente grandes) en algunas consultas.
Daba problemas de este estilo con los componentes visuales tener algunos campos persistentes y otros no en el mismo dataset: o todo o nada.

juggern
29-07-2022, 09:18:57
Hola kuan,

No acabo de entender lo que me comentas. :(

kuan-yiu
29-07-2022, 10:06:31
Los campos persistentes de un tQuery, por ejemplo, se ven haciendo doble click sobre el componente y en esa lista tienen que aparecer todos los campos que usas de la consulta o ninguno. Si los campos que ya tenías estaban dados de alta como persistentes (para referenciarlos directamente con un nombre en lugar de con 'FieldByname' o similares) pero el nuevo no está puede fallar por eso en versiones antiguas de Delphi, las nuevas no sé como se comportan al respecto.

juggern
29-07-2022, 10:51:40
Ah, no te entendía, si si, están todos añadidos, además los coge bien en teoría, porque conecto el dataset y lo añado, lo coge todo bien, la verdad, no entiendo donde puede estar el problema. :(:(

He tirado atrás todos los cambios y lo he vuelvo a hacer de 0 pero nada, no lo se, es como si lo leyera pero no pudiera editarlo, y aunque hagas click no responde, no se. Yo entiendo que algo me falta por configurar pero el campo está editable, el checkbox funciona si le pongo otro campo, el dataset me muestra bien el campo en la lista... ni idea

juggern
29-07-2022, 11:07:10
Hola de nuevo chicos,

Parece que lo he solucionado.
En el Create del formulario, he puesto el readonly del campo a False.
Con esto lo soluciono, parece que de alguna manera el readOnly del campo se pone a False, pero no veo donde, en el componente está bien configurado y ninguno de los otros campos ha habido que ponerlo a False por código, no lo entiendo, pero bueno, parece que con eso tiro.