PDA

Ver la Versión Completa : ADOQuery que devuelva campo booleano...


xalo
25-02-2014, 10:35:30
Buenos dias a todos,
Estoy intentando que la siguiente consulta devuelva el campo 'Seleccionado' como booleano y no soy capaz:
SELECT True as Seleccionado,Id,Nombre FROM Clientes

He probado lo siguiente, pero sigue sin identificar el campo como booleano

DM.Consulta.Active := False;
DM.Consulta.SQL.Text := 'SELECT True as Seleccionado,Id,Nombre FROM Clientes';
DM.Consulta.FieldDefs.Update;
DM.Consulta.fielddefs.Items[1].DataType := ftBoolean;
DM.Consulta.Active := True;


He provado con CAST y varias combinaciones y nada. El resultado que se obtiene es un -1 o 0. Seguramente será algo trivial pero no he sido capaz de verlo.
Se os ocurre alguna alternativa?

Gracias de antemano

Casimiro Notevi
25-02-2014, 11:02:48
¿Y el campo "seleccionado" de qué tipo es y qué valores almacena?
Si es un campo numérico y contiene los valores 0 ó 1 (0.false 1.true) entonces tienes varias formas de hacerlo.
variablebooleana = "select seleccionado from clientes" = 1
Si seleccionado=1 entonces la variablebooleanda almacenará true, en caso contrario almacenará false.

xalo
25-02-2014, 12:26:38
El campo es de tipo boolean, para que salga un checkbox directo en un dbgrid sin tener que añadir más código. De hecho con sqlite lo tengo funcionando, ya que el wrapper que uso tiene un evento que cuando crea los campos el query (onInitFieldDef) donde le indicas que el campo Seleccionado sea de tipo ftBoolean.
En el caso del ADOQuery no veo la forma.

Gracias por tu interés

ecfisa
25-02-2014, 17:47:58
Hola xalo.

Según esta documentación Datatypes In SQLite (http://www.sqlite.org/datatype3.html):

...
1.1 Boolean Datatype

SQLite does not have a separate Boolean storage class. Instead, Boolean values are stored as integers 0 (false) and 1 (true).
...

Entonces, como te comenta Casimiro, si logras que te devuelva el valor como entero la asignación es tán simple como:

...
CheckBox1.Checked:= Boolean(DM.Consulta.FieldByName('SELECCIONADO').AsInteger);
...


Saludos :)

xalo
25-02-2014, 20:12:46
Buenas tardes,
Gracias por vuestras respuestas
Realmente lo que busco es que de forma directa reconozca el campo que creo en la consulta como boolean, para que al mostrar el dbgrid salga lo que se muestra en resultadodeseado.png
y no de la manera que se muestra en resultadoactual.png

Se que en el dbgrid se puede hacer que cambie el comportamiento, pero de la misma manera que hice con sqlite, intuyo que con adoquery habrá alguna forma más simple y directa también.

(Nota: En este ejemplo la columna en cuestion se llama SELE)

Gracias

ecfisa
25-02-2014, 20:50:26
Hola xalo.

La verdad es que como no vemos el código donde asignas el valor es dificil darte una respuesta acertada. Como comentas mas arriba estas usando los componentes ADO, por lo que podrías hacer directamente:

...
CheckBox1.Checked:=DM.Consulta.FieldByName('SELECCIONADO').AsBoolean;
...

No se me ocurre otra forma de asignar el valor de un campo a la propiedad Checked de un TCheckBox.

Me pregunto si no estarás hablando de un TDBCheckBox...:rolleyes: Por que si es el caso, este último posee las propiedades ValueChecked y ValueUnChecked que podes configurar con los valores que desees que considere como verdadero y falso.

Por ejemplo para que interprete los valores 0 y 1 como False y True respectivamente:

...
{ Ambas propiedades estan publicadas }
DBCheckBox1.ValueChecked := '1';
DBCheckBox1.ValueUnchecked:= '0';
...



Saludos :)

orodriguezca
26-02-2014, 02:50:40
No tengo mi entorno de desarrollo a la mano pero quizás sirva lo siguiente :

1. Escribir la sentencia select con valores permitidos por el motor específico de bases de datos : 'SELECT Cast(1 as integer) as Seleccionado, Id, Nombre FROM Clientes';

2. Crear campos persistentes en el adoquery y forzar el campo "Seleccionado" como un TBooleanField. La secuencia de pasos más o menos sería Click derecho sobre el AdoQuery -> Adicionar todos los campos -> de la lista borrar el campo "Seleccionado" -> Adicionar campo para adicionar un nuevo campo con nombre "Seleccionado" de tipo boolean.

Insisto, es solo una idea, pero podría funcionar.

Nota 1: Los pasos en el punto 2 suponen que el AdoQuery existe en tiempo de diseño.

Nota 2: El codigo del #1 :
DM.Consulta.fielddefs.Items[1].DataType := ftBoolean;

debería ser
DM.Consulta.fielddefs.Items[0].DataType := ftBoolean;

La colección de Items empieza en cero y no en uno.

xalo
26-02-2014, 13:12:05
Gracias orodriguezca y ecfisa,
He probado lo que me dices y continua identificando un smallint aunque lo fuerces muestra un -1 para un true o el numero que especifiques.
No hay código que mostrar, es tan simple como un adoquery->datasetprovider->clientdataset->jvDBUltimgrid y el único código es el de asignar consulta y abrir el adoquery como muestro en el primer post. Tienes razon orodriguezca en el elemento 0 del item por lo que quedaría:

DM.ADOQuery.Active := False;
DM.ADOQuery.SQL.Text := 'SELECT 0 as Seleccionado,Id,Nombre FROM Clientes';
DM.ADOQuery.FieldDefs.Update;
DM.ADOQuery.fielddefs.Items[0].DataType := ftBoolean; //probado tambien en clientdataset.fieldefs
DM.Clientdataset.Active := True;

y el objetivo es poder tener en el clientdataset los elementos seleccionados/no seleccionados marcando el checkbox que sale en el dbgrid y tratarlos (como ya dije en sqlite lo tengo implementado y funcionando) por eso me extraña este comportamiento.

Casimiro Notevi
26-02-2014, 13:14:39
Haz lo que te ha dicho ecfisa ;)