PDA

Ver la Versión Completa : ayuda combobox anidado


Rofocale
26-10-2010, 17:25:31
hola a todos.. espero que esten bien... tengo una nueva pregunta jeje
tengo dos combobox:

combobox1 combobox2
bebidas jugos
licores cervezas
gaseosa
vino


lo que quiero hacer es que si en el combobox esta puesto bebidas solo me muestre en el 2do combobox cervezas, jugos y no toda la lista y si es licores: cervezas, vino

la info la saco de una BD hecha en firebird

gracias espero me puedan ayudar otra vez
cuidense

ecfisa
26-10-2010, 18:04:10
Hola Rofocale.

Una forma podría ser:

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
if ComboBox1.ItemIndex = 0 then
begin
if ComboBox2.Items.IndexOf('JUGOS')= -1 then
ComboBox2.Items.Add('JUGOS');
if ComboBox2.Items.IndexOf('GASEOSAS')= -1 then
ComboBox2.Items.Add('GASEOSAS');
ComboBox2.Items.Delete(ComboBox2.Items.IndexOf('CERVEZA'));
ComboBox2.Items.Delete(ComboBox2.Items.IndexOf('VINO'));
end
else
begin
if ComboBox2.Items.IndexOf('CERVEZA')= -1 then
ComboBox2.Items.Add('CERVEZA');
if ComboBox2.Items.IndexOf('VINO')= -1 then
ComboBox2.Items.Add('VINO');
ComboBox2.Items.Delete(ComboBox2.Items.IndexOf('JUGOS'));
ComboBox2.Items.Delete(ComboBox2.Items.IndexOf('GASEOSAS'));
end;
end;



Saludos. :)

Caral
26-10-2010, 18:04:22
Hola
Necesitas un campo tipo asi con solo definir el tipo saldra lo que necesitas.
Saludos

Rofocale
26-10-2010, 18:23:52
si las categorias en los combobox crecen osea les inserto mas, el codigo seria enorme.. otra forma de hacerlo si es que en cada combobox hubiera unas 60 categorias ?

gracias

ecfisa
26-10-2010, 19:26:11
si las categorias en los combobox crecen osea les inserto mas, el codigo seria enorme.. otra forma de hacerlo si es que en cada combobox hubiera unas 60 categorias ?

gracias

Bueno, yo sólo me limité a responder a tu consulta, no sabía si era para un ejercicio... ;)
¡ No quiero ni imaginar 60 items en cada ComboBox con ese código... cinco días tecleando!!! :D

Me parece que si la lista puede crecer de forma indefinida, es más fácil hacer las inserciones, relaciones y mantenimiento
usando dos TDataSet.

Saludos. :)

Rofocale
27-10-2010, 17:40:21
lo se.. solo que estoy practicando y queria una forma de anidar 2 combobox con codigo pero de una mejor manera de la que se muestra arriba porque el codigo se agrandaria demasiado si en un combobox se listara items

ElDioni
27-10-2010, 18:35:20
Pues como te dice ecfisa, (http://www.clubdelphi.com/foros/member.php?u=7718)tendrás que hacerte dos tablas, maestro y otra detalle, en la primera pondrás las familias de bebidas y en la segunda rellenaras la bebida con la familia a la que pertenece, entonces enlazas estas tablas con un adoquery1 a un dblookcombobox, por ejemplo, y cuando selecciones la familia en el primero que te filtre en el segundo las bebidas que pertenecen a esa familia.

Un saludo.

Rofocale
28-10-2010, 05:12:16
de esta manera utilizo el codigo para cargar leer los datos desde la base de datos y cargarlos a los combobox.. ahora quiero filtrar de la tabla categoria que hay bebidas y licores y en la tabla unidades hay cervezas,jugos,vinos,gaseosas

se que es una manera facil como me han dicho haciendo un maestro/detalle.. pero estoy practicando y lo estoy haciendo con codigo.. utilizo combobox en vez de dbcombobox y bueno no se como poder hacer el anidamiento mediante codigo

alguna idea ? gracias


with dmDatos.qryConsulta do begin
Close;
SQL.Clear;
SQL.Add('SELECT nombre FROM categorias WHERE tipo = ''A'' ORDER BY nombre');
Open;
cmbCategorias.Properties.Items.Clear;
cmbCategBusq.Properties.Items.Clear;
while (not Eof) do begin
cmbCategorias.Properties.Items.Add(Trim(FieldByName('nombre').AsString));
cmbCategBusq.Properties.Items.Add(Trim(FieldByName('nombre').AsString));
Next;
end;
Close;
end;
with dmDatos.qryConsulta do begin
Close;
SQL.Clear;
SQL.Add('SELECT nombre FROM unidades WHERE tipo = ''A'' ORDER BY nombre');
Open;
cmbTipo.Properties.Items.Clear;
cmbTipoBusq.Properties.Items.Clear;
while (not Eof) do begin
cmbTipo.Properties.Items.Add(Trim(FieldByName('nombre').AsString));
cmbTipoBusq.Properties.Items.Add(Trim(FieldByName('nombre').AsString));
Next;
end;
Close;
end;

ecfisa
28-10-2010, 08:47:20
Hola Rofocale.

No pusiste la estructura de los datos, así que voy a tratar de inferir ...
Supongamos que declaraste:

CREATE DOMAIN IN_AB CHAR(1) CHECK(VALUE IN('A','B')) NOT NULL;
CREATE DOMAIN VARCHAR20 VARCHAR(20) NOT NULL;

CREATE TABLE TBCATEGORIAS(
Categoria IN_AB,
Nombre VARCHAR20
);

CREATE TABLE TBUNIDADES(
Categoria IN_AB,
Nombre VARCHAR20
);


Y tenes ingresado:
TBCATEGORIAS
------------
A BEBIDAS
B LICORES

TBUNIDADES
----------
A GASEOSAS
A JUGOS
B VINOS
B LICORES
A LICUADOS
B AGUARDIENTES

Siendo cbCategorias y cbUnidades de tipo TComboBox, una forma de hacerlo puede ser:

procedure TForm1.FiltrarComboBox;
begin
with IBQuery1 do
begin
Close;
SQL.Text:= 'SELECT CATEGORIA, NOMBRE FROM TBCATEGORIAS C1, TBUNIDADES C2 '+
'WHERE (C1.CATEGORIA = C2.CATEGORIA) AND '+
'C2.CATEGORIA = (SELECT CATEGORIA FROM TBCATEGORIAS WHERE NOMBRE = '+
QuotedStr(cbCategorias.Text)+')';
Open;
cbUnidades.Clear;
while not Eof do
begin
cbUnidades.Items.Add(FieldByName('NOMBRE').AsString);
Next;
end;
cbUnidades.ItemIndex:= 0;
Close
end;
end;



procedure TForm1.FormShow(Sender: TObject);
begin
with IBQuery1 do
begin
Close;
SQL.Text:= 'SELECT * FROM TBCATEGORIAS ORDER BY NOMBRE';
Open;
while not Eof do
begin
cbCategorias.Items.Add(FieldByName('NOMBRE').AsString);
Next;
end;
cbCategorias.ItemIndex:= 0;
Close;
SQL.Text:= 'SELECT * FROM TBUNIDADES ORDER BY NOMBRE';
Open;
while not Eof do
begin
cbUnidades.Items.Add(FieldByName('NOMBRE').AsString);
Next;
end;
cbUnidades.ItemIndex:= 0;
Close;
end;
FiltrarComboBox
end;



procedure TForm1.cbCategoriasChange(Sender: TObject);
begin
FiltrarComboBox;
end;


Saludos. :)

Rofocale
12-05-2011, 23:33:46
Filtro


procedure TfrmArticulos.FiltrarComboBox;
begin
with dmDatos.qryConsulta do
begin
Close;
SQL.Text:= 'SELECT nombre, nombre2 FROM categorias c1, unidades c2 '+
'WHERE (c1.nombre = c2.nombre2) AND '+
'c2.nombre2 = (SELECT nombre FROM categorias WHERE nombre = '+
QuotedStr(cmbCategorias.Text)+')';
Open;
cmbUnidadTipo.Clear;
while not Eof do
begin
cmbUnidadTipo.Properties.Items.Add(FieldByName('nombre').AsString);
Next;
end;
cmbUnidadTipo.ItemIndex:= 0;
Close
end;
end;







procedure TfrmArticulos.FormShow(Sender: TObject);
begin

with dmDatos.qryConsulta do
begin
Close;
SQL.Add('SELECT nombre FROM categorias ORDER BY nombre');
Open;
while not Eof do
begin
cmbCategorias.Properties.Items.Add(FieldByName('nombre').AsString);
cmbCategBusq.Properties.Items.Add(Trim(FieldByName('nombre').AsString));
Next;
end;
cmbCategorias.ItemIndex:= 0;
Close;
SQL.Text:= 'SELECT nombre FROM unidades ORDER BY nombre';
Open;
while not Eof do
begin
cmbUnidadTipo.Properties.Items.Add(FieldByName('nombre').AsString);
cmbUnidadTipoBusq.Properties.Items.Add(Trim(FieldByName('nombre').AsString));
Next;
end;
cmbUnidadTipo.ItemIndex:= 0;
Close;
end;
FiltrarComboBox;


end;




procedure TfrmArticulos.cmbCategoriasPropertiesChange(Sender: TObject);
begin
FiltrarCombobox;
end;

Hola estoy retomando el ejemplo de hace tiempo.. debido a que estuve ocupado trabajando
ahora lo he probado y no filtra el combobox sigue apareciendome todo en el segundo combobox
espero puedas ayudarme

Rofocale
12-05-2011, 23:50:29
siendo
]
categorias unidades
clave clave
nombre nombre
fecha fecha
nombre2


combobox1-categorias combobox2-unidades
nombre nombre nombre2
---------- ------------- ---------
bebidas gaseosa bebidas
licores gaseosa bebidas
cerveza licores

Rofocale
13-05-2011, 01:12:13
alguien que pueda saber por ahi como puedo filtrar los datos de 2 combobox ? mediante codigo tal como menciono arriba ?
gracias de antemano

ecfisa
13-05-2011, 04:02:27
Hola Rofocale.
Hola estoy retomando el ejemplo de hace tiempo.. debido a que estuve ocupado trabajando
ahora lo he probado y no filtra el combobox sigue apareciendome todo en el segundo combobox
espero puedas ayudarme

Y tenés razón, no hacía el filtrado. :(

Cambié los nombres de los campos de las tablas anteriores, quedaron así:
TABLA CATEGORIAS
CCATEGORIA CHAR(1)
CNOMBRE VARCHAR(20)

TABLA UNIDADES
UCATEGORIA CHAR(1)
UNOMBRE VARCHAR(20)


En mi prueba usé estos datos:
TABLA CATEGORIAS
CAT - NOMB.
-----------------------
A - BEBIDAS
B - LICORES

TABLA UNIDADES
CAT - NOMB.
--------------------
A - GASEOSAS
A - JUGOS
B - VINOS
A - LICUADOS
B - LICORES
B - CHAMPAGNES
A - AGUA MINERAL
B - CERVEZAS


El código Delphi:

...
procedure TForm1.FiltrarComboBox;
begin
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('SELECT UNOMBRE FROM UNIDADES, CATEGORIAS');
IBQuery1.SQL.Add('WHERE UCATEGORIA = CCATEGORIA AND UCATEGORIA =');
IBQuery1.SQL.Add('(SELECT CCATEGORIA FROM CATEGORIAS WHERE CNOMBRE =:NOMB)');
IBQuery1.ParamByName('NOMB').AsString:= cbCategorias.Text;
IBQuery1.Open;
cbUnidades.Clear;
while not IBQuery1.Eof do
begin
cbUnidades.Items.Add(IBQuery1.FieldByName('UNOMBRE').AsString);
IBQuery1.Next;
end;
cbUnidades.ItemIndex:= 0;
IBQuery1.Close
end;

procedure TForm1.FormShow(Sender: TObject);
begin
IBQuery1.Close;
IBQuery1.SQL.Text:= 'SELECT * FROM CATEGORIAS ORDER BY CNOMBRE';
IBQuery1.Open;
while not IBQuery1.Eof do
begin
cbCategorias.Items.Add(IBQuery1.FieldByName('CNOMBRE').AsString);
IBQuery1.Next;
end;
cbCategorias.ItemIndex:= 0;
IBQuery1.Close;
IBQuery1.SQL.Text:= 'SELECT * FROM UNIDADES ORDER BY UNOMBRE';
IBQuery1.Open;
while not IBQuery1.Eof do
begin
cbUnidades.Items.Add(IBQuery1.FieldByName('UNOMBRE').AsString);
IBQuery1.Next;
end;
cbUnidades.ItemIndex:= 0;
IBQuery1.Close;
FiltrarComboBox
end;

procedure TForm1.cbCategoriasChange(Sender: TObject);
begin
FiltrarComboBox;
end;


Al seleccionar la categoria en cbCategorias filtra el combo cbUnidades acorde a la categoría seleccionada.

Saludos.

Rofocale
14-05-2011, 08:23:07
no me filtra :( me siguen apareciendo en el combobox unidades.. los datos de forma triplicada

necesito ayuda :(

ecfisa
14-05-2011, 16:12:30
Hola Rofocale.

Acabo de probarlo de nuevo y funciona perfectamente.

¿ Estas seguro que asignaste el evento OnChange a cbCategorias y dentro de él llamas a FiltrarComboBox ?

Por otro lado, ¿Reproduciste la totalidad del ejemplo (incluídas las tablas) o sólo copiaste/pegaste sobre tus datos ? por que si es del último modo y los datos difieren bíen podría no funcionar.

Saludos.

ecfisa
14-05-2011, 16:42:07
Hola de nuevo.

Para disipar toda duda y ante la imposibilidad de enviarte la base de datos te adjunto imágenes del funcionamiento:
BEBIDAS:
http://www.imagengratis.org/images/rofocale1ed4qe.jpg

LICORES:
http://www.imagengratis.org/images/rofocale2.jpg

Nota: Puse la propiedad del segundo combo a csSimple y lo estiré para una mejor visualización.

Saludos.

Rofocale
14-05-2011, 17:12:47
hola mira en mi table categorias y unidades tengo lo sgte

categorias
----------

clave
nombre
fecha
ccategorias


unidades
-----------
clave
nombre
fecha
nombre2 ( este ultimo es como si fuera en el tuyo ucategorias)




procedure TfrmArticulos.FiltrarComboBox;
begin
with dmDatos.qryConsulta do
begin
Close;
SQL.Clear;
SQL.Add('SELECT u.nombre AS unombre FROM unidades u ,categorias c');
SQL.Add('WHERE u.nombre2 = c.ccategorias AND u.nombre2 =');
SQL.Add('(SELECT c.ccategorias FROM categorias c WHERE c.nombre = :nomb)');
ParamByName('nomb').AsString := cmbCategorias.Text;
Open;
cmbUnidadTipo.Clear;
while not dmDatos.qryConsulta.Eof do
begin
cmbUnidadTipo.Properties.Items.Add(FieldByName('unombre').AsString);
Next;
end;
cmbUnidadTipo.ItemIndex:= 0;
Close
end;
end;


ah y uso combobox de devexpress seria en el evento propertieschange

procedure TfrmArticulos.cmbCategoriasPropertiesChange(Sender: TObject);
begin
FiltrarCombobox;
end;

y en el formshow


begin
with dmDatos.qryConsulta do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM categorias ' ORDER BY nombre');
Open;
while not Eof do
begin
cmbCategorias.Properties.Items.Add(FieldByName('nombre').AsString);

Next;
end;
cmbCategorias.ItemIndex:= 0;
Close;
end;
with dmDatos.qryConsulta do
begin
Close;
SQL.Clear;
SQL.Add('SELECT * FROM unidades ORDER BY nombre');
Open;
while not Eof do
begin
cmbUnidadTipo.Properties.Items.Add(FieldByName('nombre').AsString);

Next;
end;
cmbUnidadTipo.ItemIndex:= 0;
Close;
end;
FiltrarComboBox;
end;


algo debo estar haciendo mal porque porque al seleccionar licores no me filtra y mas bien ya aparecen triplicados todos en el segundo combobox :(

ecfisa
14-05-2011, 20:11:10
Hola.

Mirá, vamos a simplificar la cosa, renombrá los campos de tus tablas (o crealas nuevamente) para que queden así:

CATEGORIAS
CLAVE_CA
NOMBRE_CA
FECHA_CA
CATEGORIA_CA

UNIDADES
CLAVE_UN
NOMBRE_UN
FECHA_UN
CATEGORIA_UN


Con esos nombres el código Delphi es:

procedure TForm1.FiltrarComboBox;
begin
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('SELECT NOMBRE_UN FROM UNIDADES, CATEGORIAS ');
IBQuery1.SQL.Add('WHERE CATEGORIA_UN = CATEGORIA_CA AND CATEGORIA_UN = ');
IBQuery1.SQL.Add('(SELECT CATEGORIA_CA FROM CATEGORIAS WHERE NOMBRE_CA = :NOMB)');
IBQuery1.ParamByName('NOMB').AsString:= cbCategorias.Text;
IBQuery1.Open;
cbUnidades.Clear;
while not IBQuery1.Eof do
begin
cbUnidades.Items.Add(IBQuery1.FieldByName('NOMBRE_UN').AsString);
IBQuery1.Next;
end;
cbUnidades.ItemIndex:= 0;
IBQuery1.Close
end;

procedure TForm1.FormShow(Sender: TObject);
begin
IBQuery1.Close;
IBQuery1.SQL.Text:= 'SELECT * FROM CATEGORIAS ORDER BY NOMBRE_CA';
IBQuery1.Open;
while not IBQuery1.Eof do
begin
cbCategorias.Items.Add(IBQuery1.FieldByName('NOMBRE_CA').AsString);
IBQuery1.Next;
end;
cbCategorias.ItemIndex:= 0;
IBQuery1.Close;
IBQuery1.SQL.Text:= 'SELECT * FROM UNIDADES ORDER BY NOMBRE_UN';
IBQuery1.Open;
while not IBQuery1.Eof do
begin
cbUnidades.Items.Add(IBQuery1.FieldByName('NOMBRE_UN').AsString);
IBQuery1.Next;
end;
cbUnidades.ItemIndex:= 0;
IBQuery1.Close;
FiltrarComboBox
end;

procedure TForm1.cbCategoriasChange(Sender: TObject);
begin
FiltrarComboBox
end;


Está probado y al igual que el código anterior funciona correctamente. Siempre que los datos sean coherentes, es decir, si las bebidas sin alcohol son categoría A y las que tienen alcohol B, no guardes 'GASEOSAS' poniendo en el campo CATEGORIA_UN una 'B'.

Fijate que remarque en negrita los campos de la consulta en el código Delphi, debes ponerlos textualmente así. Ya que así están definidos en la declaración de la tabla. (No califiques los campos con C1 y C2, tampoco es necesario el uso de AS)

Resumiendo, si copias textualmente este ejemplo desde la creación de las tablas, te tiene que funcionar.


Saludos.

Rofocale
14-05-2011, 20:24:18
mis categorias no son A Y B son asi

categorias unidades

nombre ccategorias nombre nombre2
bebidas bebidas gaseosa bebidas
licores licores cerveza licores
agua mineral bebidas


ahora el codigo que tu me has puesto que funciona bien en el tuyo no me funciona implementandola a mi base de datos... no puedo renombrar los campos
ya que algunos son utilizados en otras partes del programa para poder seguir creando mas categorias y unidades etc.. pero en resumidas cuentas los campos asi tengan el mismo nombre u otro deberia de funcionar
no se que este mal en mi casa hay problema con lo mio :( y no se como solucionarlo ya que efectivamente si solo me hago un programa chikito con 2 combobox y la base de datos como me lo has puesto si funciona, no se que hacer :(

ecfisa
14-05-2011, 22:04:36
Hola Rofocale.

Modifique los nombres de campos en las tablas que utilicé en la prueba por los que pusiste en tu mensaje.

Esta consulta funciona correctamente:

procedure TForm1.FiltrarComboBox;
begin
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('SELECT C1.NOMBRE FROM UNIDADES C1, CATEGORIAS C2');
IBQuery1.SQL.Add('WHERE NOMBRE2 = CCATEGORIAS AND NOMBRE2 =');
IBQuery1.SQL.Add('(SELECT CCATEGORIAS FROM CATEGORIAS C2 WHERE C2.NOMBRE =:NOMB)');
IBQuery1.ParamByName('NOMB').AsString:= cbCategorias.Text;
IBQuery1.Open;
cbUnidades.Clear;
while not IBQuery1.Eof do
begin
cbUnidades.Items.Add(IBQuery1.FieldByName('NOMBRE').AsString);
IBQuery1.Next;
end;
cbUnidades.ItemIndex:= 0;
IBQuery1.Close
end;

procedure TForm1.FormShow(Sender: TObject);
begin
IBQuery1.Close;
IBQuery1.SQL.Text:= 'SELECT * FROM CATEGORIAS ORDER BY NOMBRE';
IBQuery1.Open;
while not IBQuery1.Eof do
begin
cbCategorias.Items.Add(IBQuery1.FieldByName('NOMBRE').AsString);
IBQuery1.Next;
end;
cbCategorias.ItemIndex:= 0;
IBQuery1.Close;
IBQuery1.SQL.Text:= 'SELECT * FROM UNIDADES ORDER BY NOMBRE';
IBQuery1.Open;
while not IBQuery1.Eof do
begin
cbUnidades.Items.Add(IBQuery1.FieldByName('NOMBRE').AsString);
IBQuery1.Next;
end;
cbUnidades.ItemIndex:= 0;
IBQuery1.Close;
FiltrarComboBox
end;

procedure TForm1.cbCategoriasChange(Sender: TObject);
begin
FiltrarComboBox
end;


Saludos.

Rofocale
14-05-2011, 23:01:32
hola eficsa gracias por ponerle empeño para ver si me funciona pero hasta ahora me sigue duplicando los items ese codigo si lo quito aparece nombre todo osea

bebidas gaseosa
licores agua mineral
cerveza
vinos
energizantes


ahora si lo vuelvo a poner sale asi


bebidas gaseosa
licores agua mineral
cerveza
vinos
energizantes
gaseosa
agua mineral
cerveza
vinos
energizantes
gaseosa
agua mineral
cerveza
vinos
energizantes



alguna idea que haya hecho mal en mi programa para que no me filtre ?
gracias

ecfisa
15-05-2011, 00:55:33
Hola Rofocale.
pero hasta ahora me sigue duplicando los items ese codigo
Con el código y los datos que te adjunte no es posible.

Como no me es viable enviarte el código de ejemplo con la BD de Firebird, tuve la ingrata tarea de pasarlo a Paradox :mad:.

Tál como esperaba funciona correctamente. Te va a servir para que puedas controlar los datos ingresados en las tablas, cosa que hasta
ahora no podías. Tal vez así puedas encontrar donde está el problema.

Para probarlo create una carpeta temporal, descomprimí el archivo .zip allí (fuentes y tablas), y ejecutalo.

Un saludo.

Rofocale
15-05-2011, 02:31:39
eficsa debido a que no hice esto desde un principio no podia saber que era lo que fallaba... y lo que falla hasta ahora son los combobox de devexpress, los quite y puse los combobox normales y estos me filtran perfectamente...
a que se debera :S

Rofocale
15-05-2011, 16:54:48
una pregunta debido a este filtrado como te digo ahora funciona bien con los combobox normales me filtra los datos de mi base de datos..

ahora te explico es un formulario pequeño el que tengo donde lleno unos datos en unos edit sobre bebidas galletas etc.. de una tienda y mediante los combobox los selecciono por categorias y los guardo

ahora a la hora de si quiero modificar el articulo lo selecciono pongo modicar me muestra todos los datos en los edit a excepcion de los combobox
siempre aparecen en blanco alguna opcion para que tambien me aparecesa en los combobox al momento de recuperar los datos

bebidas gaseosa


?
gracias

ecfisa
15-05-2011, 21:37:59
Hola.

En algún punto de tu código deberás indicarle al combo donde debe situarse, algo como:

with ComboBox1 do
ItemIndex:= Items.IndexOf(DataSet.FieldByName('CAMPO').AsString);


Nota: El ejemplo es para darte una idea como poner en el ComboBox el item actualmente seleccionado en un DataSet. Ignoro el nombre del DataSet y del campo; así como también la organización del código.

Saludos.

Rofocale
16-05-2011, 00:03:07
hola tambien lo hago similar


cmbCategorias.ItemIndex := cmbCategorias.Items.IndexOf(Trim(sCateg));

y funcionaba perfecto antes de que se filtrar
cuando todo estaba sin filtrar este al recuperar los datos se mostraban perfectamente..
ahora probando cada linea del filtrado


IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('SELECT C1.NOMBRE FROM UNIDADES C1, CATEGORIAS C2');
IBQuery1.SQL.Add('WHERE NOMBRE2 = CCATEGORIAS AND NOMBRE2 =');
IBQuery1.SQL.Add('(SELECT CCATEGORIAS FROM CATEGORIAS C2 WHERE C2.NOMBRE =:NOMB)');
IBQuery1.ParamByName('NOMB').AsString:= cbCategorias.Text;
IBQuery1.Open;
cbUnidades.Clear; <------- justo esta linea al quitarla hace que ya no filtre y siga como siempre lo tenia y tambien me muestre la posicion perfecta de cada item guardado en el combobox


ahora con el filtrado no tengo mucha idea de como hacer que tambien se muestre la posicion guardada cuando lo recupero para modificarlo

gracias

ecfisa
16-05-2011, 00:17:46
ahora con el filtrado no tengo mucha idea de como hacer que tambien se muestre la posicion guardada cuando lo recupero para modificarlo

Hola.

No entiendo muy bién la situación. Es decir no veo la relación de la consulta que hemos venido trantando que sólo te devuelve el campo NOMBRE de la tabla UNIDADES para llenar un ComboBox y la asignacion de los valores de los campos a los Edits.

Tal vez si explicaras un poco más como traes los datos para que sean asignados a los Edits y como realizás la modificación...

Saludos.

Rofocale
16-05-2011, 02:13:37
procedure TfrmArticulos.RecuperaDatosBusq;
var
sCateg, sUnis: String;

begin
iClave := dmDatos.cdsArticulos.FieldByName('Clave').AsInteger;

with dmDatos.qryConsulta do begin
Close;
SQL.Clear;
SQL.Add('SELECT o.codigo, a.desc_corta, a.desc_larga, a.precio1,');
SQL.Add('a.existencia, a.clave,a.minimo, a.maximo,');
SQL.Add('a.categoria,a.unidades, a.fecha_cap,');
SQL.Add('a.estatus,a.fotosart, c.nombre AS categorias,');
SQL.Add('d.nombre AS unidades FROM articulos a ');
SQL.Add('LEFT JOIN codigos o ON a.clave = o.articulo AND o.tipo = ''P''');
SQL.Add('LEFT JOIN categorias c ON a.categoria = c.clave ');
SQL.Add('LEFT JOIN unidades d ON a.unidades = d.clave ');
SQL.Add('WHERE a.clave = ' + IntToStr(iClave));
Open;
if(not Eof) then begin
pgeGeneral.ActivePage := tabDatos;
txtCodigo.Text := Trim(FieldByName('codigo').AsString);
txtDescripCorta.Text := Trim(FieldByName('desc_corta').AsString);
txtDescripLarga.Text := Trim(FieldByName('desc_larga').AsString);
txtFechaCap.Text := FormatDateTime('dd/mm/yyyy',FieldByName('fecha_cap').AsDateTime);
txtPrecio1.text := FormatFloat('#,##0.00',FieldByName('precio1').AsFloat);
txtExis.text := floattostr(FieldByName('existencia').AsFloat);
txtMax.text := floattostr(FieldByName('maximo').AsFloat);
txtmin.text := floattostr(FieldByName('minimo').AsFloat);

if FieldByName('estatus').AsString ='A' then
cmbEstatus.ItemIndex := 0
else
cmbEstatus.ItemIndex := 1;

sUnis := BuscaNombre(FieldByName('unidades').AsInteger, 'unidades');
sCateg := BuscaNombre(FieldByName('categoria').AsInteger, 'categorias');
cmbUnidadTipo.ItemIndex := cmbUnidadTipo.Items.IndexOf(Trim(sUnis));
cmbCategorias.ItemIndex := cmbCategorias.Items.IndexOf(Trim(sCateg));

MaxMin;

end;
end;
end;



function TfrmArticulos.BuscaNombre(iValor:Integer; sTabla:string):String;
begin
with dmDatos.qryModifica do begin
Close;
SQL.Clear;
SQL.Add('SELECT nombre FROM ' + sTabla + ' WHERE clave = ' + IntToStr(iValor));
Open;
Result := FieldByName('nombre').AsString;
Close;
end;
end;


con esto recuperaba los edits y combobox..
ahora con el filtrado se recupera todos los edits normal pero los combobox no se muestra lo recuperado solo salen limpios.. como para seleccionar y elegir de nuevo.. aunque claro las posiciones estan guardadas solo que no se muestran..
si le quito el filtrado si se muestran normal

ecfisa
16-05-2011, 04:08:56
Hola.

Supongo que podrías encapsular la carga de los combos dentro de un procedimiento:

// Filtrar los combos
procedure TfrmArticulos.FiltrarComboBox;
begin
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('SELECT C1.NOMBRE FROM UNIDADES C1, CATEGORIAS C2');
IBQuery1.SQL.Add('WHERE NOMBRE2 = CCATEGORIAS AND NOMBRE2 =');
IBQuery1.SQL.Add('(SELECT CCATEGORIAS FROM CATEGORIAS C2 WHERE C2.NOMBRE =:NOMB)');
IBQuery1.ParamByName('NOMB').AsString:= cbCategorias.Text;
IBQuery1.Open;
cbUnidades.Clear;
while not IBQuery1.Eof do
begin
cbUnidades.Items.Add(IBQuery1.FieldByName('NOMBRE').AsString);
IBQuery1.Next;
end;
cbUnidades.ItemIndex:= 0;
IBQuery1.Close
end;

// Cargar los combos ( Ahora dentro de un procedimiento )
procedure TfrmArticulos.CargarComboBox;
begin
IBQuery1.Close;
IBQuery1.SQL.Text:= 'SELECT * FROM CATEGORIAS ORDER BY NOMBRE';
IBQuery1.Open;
while not IBQuery1.Eof do
begin
cbCategorias.Items.Add(IBQuery1.FieldByName('NOMBRE').AsString);
IBQuery1.Next;
end;
cbCategorias.ItemIndex:= 0;
IBQuery1.Close;
IBQuery1.SQL.Text:= 'SELECT * FROM UNIDADES ORDER BY NOMBRE';
IBQuery1.Open;
while not IBQuery1.Eof do
begin
cbUnidades.Items.Add(IBQuery1.FieldByName('NOMBRE').AsString);
IBQuery1.Next;
end;
cbUnidades.ItemIndex:= 0;
IBQuery1.Close;
FiltrarComboBox;
end;

// FormShow ahora quedaría así:
procedure TfrmArticulos.FormShow(Sender: TObject);
begin
CargarComboBox;
FiltrarComboBox;
end;


Luego al principio del procedimiento RecuperaDatosBusq, podrías hacer:

procedure TfrmArticulos.RecuperaDatosBusq;
var
sCateg, sUnis: String;

begin
CagarComboBox;
iClave := dmDatos.cdsArticulos.FieldByName('Clave').AsInteger;
...

Creo que debería funcionar. Pero vas a tener que probarlo vos, yo no tengo modo de comprobarlo.

Saludos.

Rofocale
16-05-2011, 17:15:39
hola eficsa solo recupera el primer combobox el segundo el de unidades sale en blanco :S

ecfisa
16-05-2011, 17:50:56
Hola Rofocale.

Con tanta ida y venida de código se me olvidó borrar una línea ... :o

Probá quitando la última línea de código del procedimiento CargarComboBox:

FiltrarComboBox; // <- Eliminar


Saludos.

Caral
16-05-2011, 17:59:33
Hola
Y yo pense que tenia paciencia.
Amigo, eres un santo (San ecfisa), lo que no aseguro es que seas virgen y mártir :D:D
Saludos

Rofocale
16-05-2011, 22:24:01
si le quito ya no filtra aparecen repetidos todos :S

ecfisa
16-05-2011, 23:12:43
Hola
Y yo pense que tenia paciencia.
Amigo, eres un santo (San ecfisa), lo que no aseguro es que seas virgen y mártir :D:D
Saludos
jajaja :D:D:D

Saludos.:)

ecfisa
16-05-2011, 23:19:21
Amigo Rofocale, creo que ahora vas a tener que empezar a hacer un seguimiento del código...

No quiero que me terminen canonizando (o peor aún ) ... :)

Saludos.

Rofocale
17-05-2011, 00:01:57
caral entro y malogro mi aprovechamiento hacia ti jeje :p
gracias eficsa de todas maneras me ayudaste en lo que realmente queria que funcionara el filtrado con el codigo que me pusiste.. ya ire viendo que es lo que falla
gracias

ecfisa
17-05-2011, 00:15:15
Hola Rofocale.

En realidad no tiene nada que ver la intervención del amigo Caral, es que no puedo continuar con las pruebas ya que se involucran otras tablas y datos a los cuales obviamente no puedo acceder...

Y no hay problema por que nos aprovechen mientras tengamos un poco de tiempo libre, estamos aquí por gusto. ;)

Un saludo.:)