Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   ADOQuery que devuelva campo booleano... (https://www.clubdelphi.com/foros/showthread.php?t=85289)

xalo 25-02-2014 10:35:30

ADOQuery que devuelva campo booleano...
 
Buenos dias a todos,
Estoy intentando que la siguiente consulta devuelva el campo 'Seleccionado' como booleano y no soy capaz:
Código SQL [-]
SELECT True as Seleccionado,Id,Nombre FROM Clientes

He probado lo siguiente, pero sigue sin identificar el campo como booleano
Código Delphi [-]
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.
Código Delphi [-]
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:
Cita:

...
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:
Código Delphi [-]
  ...
  CheckBox1.Checked:= Boolean(DM.Consulta.FieldByName('SELECCIONADO').AsInteger);
  ...

Saludos :)

xalo 25-02-2014 20:12:46

2 Archivos Adjunto(s)
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:
Código Delphi [-]
...
  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:
Código Delphi [-]
...
  { 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 :
Código Delphi [-]
DM.Consulta.fielddefs.Items[1].DataType := ftBoolean;

debería ser
Código Delphi [-]
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:
Código Delphi [-]
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 ;)


La franja horaria es GMT +2. Ahora son las 13:31:24.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi