PDA

Ver la Versión Completa : Problemas con un TDBLookupComboBox dentro de un TDBCtrlGrid


David
24-10-2008, 17:17:08
Hola

tengo una tabla de incidencias, donde uno de los campos es operador de tipo integer. También tengo otra tabla de operadores, con la clave integer y el nombre varchar(90), estoy con firebird.

El caso es que tengo el control TBDCtrlGrid, ese que multiplica los controles en él insertado, enganchado a la tabla de incidencias, y he pensado en poner un DBLookupComboBox, que me cargue los operadores de la tabla de operadores, de manera que el usuario despliegue la lista con nombres y apellidos y al guardar se guarde el codigo en la tabla incidencias.

La forma de cargar los operadores es asignandole a la propiedad listSource el datasource de Operadores, pero no me deja hacer esta acción, me dice que no esta permitida para dicho control ¿Qué puedo hacer?

Un saludo

droguerman
24-10-2008, 18:05:10
Se puede hacer eso asociando el datasource a un ClientDataset y especificando el campo que quieres usar como ftLookup, el Grid ya tiene todo lo necesario para colocar un dblookup cuando encuentre un campo de ese tipo

David
26-10-2008, 14:19:54
Hola

Estoy utilizando clientDataSet y no me sale. Tengo la tabla incidencia, con el campo operador, he creado en el clientDataSet un campo lookup con otro clientDataSet(obviamente unido a un query con su provider), que tiene la tabla de operadores, así tengo en el clientDataSet cuyo datasource esta ligado al control DBCtrlGrid, el campo lookup OperadorNombre.

Si añado un DBLookupComboBox y le asigno en su propiedad FieldName el nuevo campo operadorNombre, me da un error.

Un saludo

David
26-10-2008, 18:27:32
nadie sabe la respuesta ?

StartKill
28-10-2008, 18:02:42
Holas,

Con ello no pretendo que cambies tu trabajo, o tu forma de diseño
solo deseo mostrar como lo hago y de ello prodrias obtener lo posiblemente
necesites.
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
*-*-*-* PRIMERA OPCION (creando a mano DBLoockupComboBox)*-*-*-*
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Tenemos dos tablas
Incidencias
1.-Codigo_principal as integer
2.-codigo_operador as integer
Operadores
1.-codigo_operador as integer
2.-nombre_operador as char(20)

Lo siguiente no es un codigo real, pero la logica es la correcta, espero ayude.

En un primer formulario (frm1)
°°°°°°°°°°°°°°°°°°°°°°
"ClientDataSet">>CDS_incidencias = tabla Incidencias
"ClientDataSet">>CDS_operadores = tabla Operadores
"DataSource">>DS_incidencias = con CDS_incidencias
"DataSource">>DS_operadores =con CDS_operadores

En cada ClientDaset dar doble click y saldrá una lista vacia,
en esa lista presionar click derecho y elejir la opcion "Add all fields"

"TDBGrid">>DBG_incidencias->DataSource-> DS_incidencias
Configuremos nuestra grilla para que llame al formulario2 (frm2) con dobleck click, un enter....


En un segundo Formulario (frm2)
°°°°°°°°°°°°°°°°°°°°°°°°
TDBEdit's para los campos del CDS_incidencias
"codigo_principal" y "codigo_operador"

"TDBloockupComboBox">>DBLCB_operadores
-- datos para la tabla incidencias ---
DBLCB_operadores->DataSource->DS_incidencias
DBLCB_operadores->DataField->codigo_operador (nombre campo/field)
-- datos para la tabla operador ----
DBLCB_operadores->ListSource->DS_operadores
DBLCB_operadores->ListField->nombre_operador (nombre campo/field)
DBLCB_operadores->KeyField->codigo_operador (nombre campo/field)

Sus botones de salvar , cancela... etc, etc.

----------------------------------------------------------------
Bueno, activamos nuestro ClientDaset's :)

Navegamos por la grilla, presionamos enter y en el segundo formulario
podemos elegir nuestro operador.


*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
*-*-*-* SEGUNDA OPCION (creando un campo Lookup)*-*-*-*
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
Teniendo las mismas tablas de la primera opción

En un primer formulario (frm1)
°°°°°°°°°°°°°°°°°°°°°°
"ClientDataSet">>CDS_incidencias = tabla Incidencias
"ClientDataSet">>CDS_operadores = tabla Operadores
"DataSource">>DS_incidencias = con CDS_incidencias
"DataSource">>DS_operadores =con CDS_operadores

En cada ClientDaset dar doble click y saldra una lista vacia,
en ella presionar click derecho y elejir la opcion "Add all fields"

Creando un campo "lookup" en el CDS_incidencias
Estando dentro de la lista de campos del CDS_inciencias, hacer click derecho,
y elegir la opción "New Field", aparece una caja de dialogo pidiendo datos
para el nuevo campo---..llenamos lo siguente...

en Field Properties
Name:= lk_operadores
Component:= CDS_incidenciaslk_operadores (es automatico)
Type:=String
Size:=20
En Field Type
Elijes el radiobutton "lookup"
En Lookup Definition Type
KeyFields:=codigo_operador
DataSet:=CDS_operador
LookupKey:= codigo_operador
ResultField:= nombre_operador

Prdsionar boton "OK", listo :)
----------------------------------------------------------------

"TDBGrid">>DBG_incidencias->DataSource-> DS_incidencias
Doble clik en la grilla, aparece una lista vacia...
elegimos el icono "Add all fields" es el tercer icono (parte superior)
Observa que el nuevo campo "lookup" -> lk_operadores tambien está

Configuremos nuestra grilla para que llame al formulario2 (frm2) con doble click, un enter....


En un segundo Formulario (frm2)
°°°°°°°°°°°°°°°°°°°°°°°°
se debe tener activo las lista de campos (el editor de propiedades campos),
aquel se activa con doble click en el CDS_incidencias.

Eliges un campo de la lista (del editor de propiedades de campos) y arrastras
al formulario 2 (frm2) y de forma automatica crea los dbedit's...
Cuando se arrastre el campo lk_operadores, de forma automatica es un
dblookupcombox.

Bueno, activamos nuestro ClientDaset's :)

Navegamos por la grilla --- y si tratamos de modificar la columna con el campo
lk_operadores -- aparece un combito y eligen su operador ...

Sigamos navegando -- presionamos enter en la grilla y en el segundo
formulario podemos elegir tambien nuestro operador.

*---------------------------------------------------
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
*-*-*-* TERCERA OPCION (la que se esta tratando de hacer ....)*-*-*-*
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

Hago los mismos paso s de la OPCION 2, pero sin considerar el frm2

-Tratando de utilizar un solo formulario,
-En vez de un DBGrid, utilizar un DBCtrlGrid..

Arrastro los campos del editor de propiedades de campos del CDS_incidencias
al control DBCtrlGrid.

En tiempo de diseño = correcto

En tiempo de ejecucion = puedo navegar sobre el DBCtrlGrid
Al tratar de cambiar un datos del dblookupcombobox me salta un error:
"Operation not Allowed in a DBCtrlGrid"
Operacion no permitida en un DBCtrlGrid

Parece ser que no funciona el dblookupcombobox dentro del componente
DBCtrlGrid...

Por que?, no estoy seguro, pero que creo que si uno trata de modificar el
dblookupcombobox de un registro de incidencias - este tratará de cambiar a
todos los registros de incidencias, ya que todos los registros de
CDS_incidencias apuntan a un mismo CDS_operadores.

Al final, voy a tratar de salir de esa duda, si tu la haces antes o alguien la
tiene, no DUDE en escribirlo en el foro :)

Your friend

StartKill
Lima-Perú
(startkill@hotmail.com)

StartKill
28-10-2008, 20:02:16
Saludos,

Aca hay una solucion, no es mia, pero funciona ;), la acabo de probar.

Utilizando :
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*
*-*-*-* TERCERA OPCION (la que se esta tratando de hacer ....)*-*-*-*
*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

Aca el enlace orignal :

http://groups.google.com/group/borland.public.delphi.database.desktop/msg/19aca7768f03afd8

procedure TFrm1.FormCreate(Sender: TObject);
var
I: Integer;
MyDataLink: TDataLink;
begin
for I := 0 to DBLookupComboBox1.ControlCount - 1 do
if DBLookupComboBox1.Controls[I] is TPopupDataList then
begin
MyDataLink := TDataLink(DBLookupComboBox1.Controls[I].Perform(CM_GETDATALINK, 0, 0));
if MyDataLink <> nil then
MyDataLink.DataSourceFixed := False;
MyDataLink.DataSource := nil;
end;
end;

Your friend,

StartKill
Lima-Perú
(startkill@hotmail.com)

zeta2
28-10-2008, 20:39:40
Como hago que el componente DBLookupComboBox se vacie? Es decir... Cuando termino un filtro no quiero que siga mas el nombre anterior y quiero poner en blanco todo. He intentado pero no he tenido exito ya que no tiene estas propiedades:

- DBLookupComboBox.TexT

- DBLookupComboBox1.Caption

...


Saludos amigos...

luisgutierrezb
28-10-2008, 21:52:25
DBLookupComboBox1.KeyValue := Null;