PDA

Ver la Versión Completa : Como se asigna el index del checklistbox....


ronimaxh
09-07-2007, 14:57:55
Hola amigos del club, aquí les planteo lo que pretendo hacer para que mes den una ayudita: Tengo una tabla con los tipos de nominas lleno el checklistbox y quiero asignarle el id_nomina de la tabla para cuando marque un tipo saber que id tiene mi codigo es el siguiente:

//Con esto lleno el CheckListBox1begin
with CheckListBox1 do
begin
st.SQL.Text:='';
st.SQL.Text:='select * from nf_cuentasnom order by descripcion';
st.Open;
st.First;
while not st.Eof do
begin
Items.Add(st.fieldbyname('descripcion').AsString);
Items.Index:=(st.FieldByName('nomina').AsInteger); //Este es el indice que quiero
st.Next;
end;
end;
end;
// con este código consigo cuales tienen cotejo;
var i:integer;
begin
with CheckListBox1 do
begin
for i:=0 to Items.Count-1 do
begin
if Checked[i]then
begin
id_nom:=ItemIndex; //Este index no es el que esta en la tabla de nomina
end;
end;
end;
end;



Nota: uso sql Server 2000, delphi 7 y ado

gabrielkc
09-07-2007, 16:28:44
Código Delphi [-] (http://www.clubdelphi.com/foros/#)
//Con esto lleno el CheckListBox1
begin
with CheckListBox1 do
begin
st.SQL.Text:='';
st.SQL.Text:='select * from nf_cuentasnom order by descripcion';
st.Open;
st.First;//Esto no es necesario, porque acabas de abrir el query
while not st.Eof do
begin
Items.Add(st.fieldbyname('descripcion').AsString);
Items.Index:=(st.FieldByName('nomina').AsInteger); //Este es el indice que quiero
st.Next;
end;
end;
end;

// con este código consigo cuales tienen cotejo;
var i:integer;
begin
with CheckListBox1 do
begin
for i:=0 to Items.Count-1 do
begin
if Checked[i]then
begin
id_nom:=ItemIndex; //Este index no es el que esta en la tabla de nomina
end;
end;
end;
end;




1.- st.SQL.Text:='';//esto no es necesario, porque en la siguiente linea le asignas un valor
2.-st.First;//Esto no es necesario, porque acabas de abrir el query.

2.- La propiedad ItemIndex del CheckListBox determina cual item está seleccionado, aunque en tu código
si entendí bien cambiarías dicho ItemIndex con cada registro, además la propiedad
Index no existe en los TStings
Items.Index:=(st.FieldByName('nomina').AsInteger); //Este es el indice que quiero

4.-

with CheckListBox1 do
begin
for i:=0 to Items.Count-1 do
begin
if Checked[i]then
begin
id_nom:=ItemIndex; //Este index no es el que esta en la tabla de nomina
end;
end;


En el anterior código haces un for y asignas al id_nom el ItemIndex del
item seleccionado, pero como es un for si hay más de 1 item seleccionado
solo obtendrías el último, me parece que estás conciderando que solo se seleccionaría 1,
por lo tanto yo creo que el CheckListBox no es el componente ideal para esa operación,
probablememte un ComboBox te funcionaría mejor (es incluso más estandar)

ContraVeneno
09-07-2007, 16:48:54
Lo más cómodo cuando se trata de seleccionar un valor de la base de datos ( en este caso el tipo de nómina), es utilizar un DBLookupCombo. Solo haces una consulta, aplicas dos o tres propiedades y listo.

ronimaxh
10-07-2007, 01:54:36
Gracias por las correcciones, tomeré eso en cuenta;
hay más de 1 item seleccionado siempre
la situación es, si hay varios selecionados necesito el id_nomina de la tabla que lo llena para guardalo en otra tabla y el DBLookupCombo resuelve (si fuera uno, pero siempre seran varios), pero la lista ayudaría más al usuario que use el programa.

Nota: Si hay otro componente que se pueda usar para esto les agradeceré.

ContraVeneno
10-07-2007, 15:26:48
¿que tal un TDBLookUpListBox?

adfa
10-07-2007, 17:00:54
En realidad estas cerca usando el checklistbox...
En vez de hacer:

Items.Add(st.fieldbyname('descripcion').AsString);
Items.Index:=(st.FieldByName('nomina').AsInteger);

Podes hacer:

Items.AddObject(st.fieldbyname('descripcion').AsString,Pointer(st.FieldByName('nomina').AsInteger));


Luego para recuperarlo: (usando tu mismo código)

// con este código consigo cuales tienen cotejo;
var i, id_nom:integer;
begin
with CheckListBox1 do
begin
for i:=0 to Items.Count-1 do
begin
if Checked[i]then
begin
id_nom:= integer(Items.objects[i]);
end;
end;
end;
end;

gabrielkc
10-07-2007, 20:04:28
Luego para recuperarlo: (usando tu mismo código)
Código Delphi [-] (http://www.clubdelphi.com/foros/#)
// con este código consigo cuales tienen cotejo;
var i, id_nom:integer;
begin
with CheckListBox1 do
begin
for i:=0 to Items.Count-1 do
begin
if Checked[i]then
begin
id_nom:= integer(Items.objects[i]);
end;
end;
end;
end;



El problema que veo yo en ese código es que si hay varios seleccionados es que se sobreescribe el valor de la variable id_nom en cada paso del bucle en el cual esté checado el item en cuestion:

Item1 Valor 1 checked
Item2 Valor 2 checked
Item3 Valor 3 checked

el id_nom quedaría como 3, pero el 1 y el 2?? tambien están checked

ronimaxh
10-07-2007, 20:09:48
Gracias a todos por la ayuda, con eso está resuelto.

Nota: un comentario para grabrielkc, dentro del bucle for se lo paso a la varialbe id_nomina y luego llama a una rutina para insertarla, excusemen por no poner la llamada de la rutina.

adfa
10-07-2007, 20:17:14
El problema que veo yo en ese código es que si hay varios seleccionados es que se sobreescribe el valor de la variable id_nom en cada paso del bucle en el cual esté checado el item en cuestion:

Item1 Valor 1 checked
Item2 Valor 2 checked
Item3 Valor 3 checked

el id_nom quedaría como 3, pero el 1 y el 2?? tambien están checked

Si, supongo que faltara algo de código alli. Yo solo puse el código que habia posteado ronimaxh y le agregue como recuperar el valor del item, que era el problema en cuestión.
Creo que ronimaxh ya entendió el truco.

Saludos