PDA

Ver la Versión Completa : ID como primera columna en tabla


Ramsay
20-03-2016, 19:52:11
Hola , tengo una duda sobre como organizar una tabla , tengo un listview con columnas de una tabla de la base de datos , como primera columna tengo el ID , el tema es que puede ser un dato que el usuario no necesite pero si no pongo ese ID no puedo saber que fila de la BD es cuando se selecciona un item de la tabla , eh visto en varios programas y muchos dejan el codigo del producto o el ID como primera columna , ¿ es correcto dejar el id como primera columna o esta mal hacer esto ?

AgustinOrtu
20-03-2016, 20:27:22
Que version de Delphi estas usando? Dispones de Livebindings?

Ramsay
21-03-2016, 19:24:20
Hola AgustinOrtu , gracias por responder , en realidad solo quiero saber si es correcto o no , porque muchos programas que eh visto hacen lo mismo.

AgustinOrtu
21-03-2016, 19:51:42
Esta bien que un listview o cualquier control presente datos
Esta mal pedirle datos al listview para hacer x cosa

EJ: Listar productos en un listview. De donde vienen los productos? Puede ser un TList, o un TDataSet, para el caso es lo mismo

Ahora, se usa el listview para presentar al usuarios los productos, seleccione uno y luego con ese seleccionado hacer x (aumentar stock, cambiar precio, etc)

Si necesitas tener la columna ID en el listview para saber cual es el producto seleccionado está mal. Esa informacion la tenes en el DataSet/TList. Por eso la pregunta del LiveBindings. LiveBindings te permite crear una clase que se encarga de sincronizar los controles con objetos (desde listas a datasets), asi que cada vez que te mueves en el control el dataset tambien se actualiza y se mueve al mismo registro (tal y como funciona el DBGrid por ejemplo)

Ramsay
21-03-2016, 20:00:34
ok , gracias por dar tu opinion.

ecfisa
21-03-2016, 20:27:10
Hola Ramsay.

Visualizar el código del producto podría o no ser relevante para el cliente... Pero en cuanto a mostrar el identificador único (ID) al usuario, opino igual que Agustín, no le veo sentido alguno.

Si estas trabajando con una versión de Delphi que no soporta LiveBindings, el identificador único lo podes guardar en la propiedad Data de cada TListItem.

Un ejemplo básico de como podrías hacerlo:

// guardar valores
procedure TForm1.FormCreate(Sender: TObject);
var
it : TListItem;
begin
DataSet.Open;
while not DataSet.Eof do
begin
it := ListView1.Items.Add;
it.Caption := DataSet.FieldByName('NOMBRE').AsString;
it.Data := Pointer(DataSet.FieldByName('ID').AsInteger);
DataSet.Next;
end;
end;

// mostrar
procedure TForm1.Button1Click(Sender: TObject);
var
lv: TListView;
begin
lv := ListView1;
if lv.ItemIndex <> -1 then
ShowMessage(Format('Nombre: %s, ID: %d',
[lv.Items[lv.Selected.Index].Caption, // NOMBRE
Integer(lv.Items[lv.Selected.Index].Data)])); // ID
end;



Saludos :)

Ramsay
26-03-2016, 03:49:59
gracias por responder ecfisa , me has dejado con una duda , ¿ en los combobox tambien se puede almacenar el id como me mostraste en listview ? , te lo pregunto porque veo que se hace algo asi :


ComboBox.AddItem(TPerson(PersonList[i]).Name, PersonList[i]);


No me queda claro como se extraeria el id seleccionado en este caso.

ecfisa
26-03-2016, 06:15:14
Hola Ramsay.
gracias por responder ecfisa , me has dejado con una duda , ¿ en los combobox tambien se puede almacenar el id como me mostraste en listview ? , te lo pregunto porque veo que se hace algo asi :


ComboBox.AddItem(TPerson(PersonList[i]).Name, PersonList[i]);


No me queda claro como se extraeria el id seleccionado en este caso.
Ejemplo:

...
// guardar columnas NOMBRE e ID en el combo
procedure TForm.FormCreate(Sender: TObject);
begin
TuQuery.Close;
TuQuery.SQL.Text := 'SELECT ID, NOMBRE FROM TU_TABLA';
TuQuery.Open;
while not TuQuery.Eof do
begin
ComboBox1.AddItem( TuQuery.FieldByName('NOMBRE').AsString,
TObject(TuQuery.FieldByName('ID').AsInteger) );
TuQuery.Next;
end;
end;

// extraer los datos NOMBRE e ID del combo
procedure TForm.ComboBox1Change(Sender: TObject);
var
nombre: string;
id: Integer;
begin
if ComboBox1.ItemIndex <> -1 then
begin
nombre := ComboBox1.Items[ComboBox1.ItemIndex];
id := Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]);
ShowMessage(Format('%s %d',[nombre, id]));
end;
end;


Saludos :)

Ramsay
26-03-2016, 21:54:27
Listo , gracias por la ayuda a los dos.