Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ID como primera columna en tabla (https://www.clubdelphi.com/foros/showthread.php?t=90020)

Ramsay 20-03-2016 19:52:11

ID como primera columna en tabla
 
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:
Código Delphi [-]
// 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 :

Código Delphi [-]
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.
Cita:

Empezado por Ramsay (Mensaje 503734)
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 :

Código Delphi [-]
ComboBox.AddItem(TPerson(PersonList[i]).Name, PersonList[i]);

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

Ejemplo:
Código Delphi [-]
...
// 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.


La franja horaria es GMT +2. Ahora son las 05:36:14.

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