Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   C++ Builder (https://www.clubdelphi.com/foros/forumdisplay.php?f=13)
-   -   Funcion? (https://www.clubdelphi.com/foros/showthread.php?t=81151)

borlandpablo 16-10-2012 11:04:34

Funcion?
 
Buenas a todos, soy nuevo en este foro. Alguien sabe como es la funcion que te dice el ID o el codigo de una fila registrada en una base de datos? Me explico, en un ComboBox tengo una lista de los nombres de distribuidores, y cuando lo seleccione quiero saber el ID o codigo de ese distribuidor.

Un saludo.

Casimiro Notevi 16-10-2012 11:17:36

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)

Por favor, recuerda poner títulos descriptivos a tus preguntas, gracias.

Neftali [Germán.Estévez] 16-10-2012 12:22:18

¿Exactamente qué componente estás utilizando? ¿TComboBox, TDBComboBox,..?
Aunque son parecidos no son iguales.

Si es un TComboBox, como comentas ¿cómo has rellenado los valores? Si has rellenado los valores con una SQL, tendrás que recuperar el valor del ID con una SQL.

Das poca información para saber cómo estás haciendo las cosas...

borlandpablo 16-10-2012 12:22:43

Si, ya lo leí hace tiempo, porque me metía de vez en cuando para consultar en vuestro foro:p

No sabía qué poner en el título...

Un saludo.

borlandpablo 16-10-2012 12:28:08

Cita:

Empezado por Neftali (Mensaje 447222)
¿Exactamente qué componente estás utilizando? ¿TComboBox, TDBComboBox,..?
Aunque son parecidos no son iguales.

Si es un TComboBox, como comentas ¿cómo has rellenado los valores? Si has rellenado los valores con una SQL, tendrás que recuperar el valor del ID con una SQL.

Das poca información para saber cómo estás haciendo las cosas...

Es un TComboBox, lo rhice con un Query, y en el evento OnShow del formulario hice un while. Mi intención era recuperar el ID con una sentencia SQL, pero no sé como meterlo en una variable entera. Creo recordar, que también se podía averiguar con una función, no sé si con un TComboBox o un DBComboBox. Gracias por la respuesta.

Un saludo.

Neftali [Germán.Estévez] 16-10-2012 13:14:17

Cita:

Empezado por borlandpablo (Mensaje 447224)
Es un TComboBox, lo rhice con un Query, y en el evento OnShow del formulario hice un while. Mi intención era recuperar el ID con una sentencia SQL, pero no sé como meterlo en una variable entera. Creo recordar, que también se podía averiguar con una función, no sé si con un TComboBox o un DBComboBox. Gracias por la respuesta.

Pues entonces ya has hecho lo más complejo.
Si ya has hecho una sentencia SQL para recuperar todos los nombres, debes hacer una similar para recuperar el ID o el código.

Habrás hecho algo similar a esto:

Código SQL [-]
  Select * from Tabla

o
Código SQL [-]
Select NOMBRE FROM TABLA

Una vez que seleccionen un nombre en el ComboBox, para obtener el ID o el Código deberás hacer una similar a esta:

Código SQL [-]
SELECT CODIGO,ID >from TABLA where Nombre = [Nombre]

Eso en Delphi será algo así:

Código Delphi [-]
var
  StrSQL, Str:String;
begin

  ...
  Str := ComboxBox.Text;
  // o Este
  Str := ComboBox.Items[ComboBox.ItemIndex];
  // en Str está el nombre
  StrSQl := 'SELECT CODIGO,ID FROM TABLA WHERE NOMBRE =' + QuotedStr(Str);
  // el valor nombre debe ir entre comillas, por eso usamos QuotedStr
  ...

  // Si lanzas la consulta con el componente query1, para recuperar los valores sería...
  cod := query1.FieldByName('Codigo').AsInteger;
  ID := query1.FieldByName('Codigo').AsString;

  ...

ecfisa 17-10-2012 14:22:19

Hola.

Un DBLookupComboBox tampoco sería mala elección. Pero, si como mencionas en el mensaje #5, ya recorres la consulta para almacenar los datos obtenidos en el ComboBox, otra alternativa podría ser:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
begin
  tuQuery.Close;
  tuQuery.SQL.Text:= 'SELECT CAMPO_A_MOSTRAR, ID FROM TU_TABLA';
  tuQuery.Open;
  while not tuQuery.Eof do
  begin
    ComboBox1.Items.AddObject(tuQuery.FieldByName('CAMPO_A_MOSTRAR').AsString,
      TObject(tuQuery.FieldByName('ID').AsInteger));
    tuQuery.Next;
  end;
  tuQuery.First;
end;

Obtener el ID, ejemplo:
Código Delphi [-]
procedure TForm1.ComboBox1Change(Sender: TObject);
var
  Id: Integer;
begin
  Id := Integer(ComboBox1.Items.Objects[ComboBox1.ItemIndex]); // valor del campo ID correspondiente a la selección
  Caption := IntToStr(Id); // hacer algo con Id...
  ...
end;

Saludos.

ecfisa 17-10-2012 20:51:50

Hola de nuevo.

Recién me percato de que estamos en el foro C++ Builder... :o

Entonces sería:
Código:

void __fastcall TForm1::FormCreate(TObject *Sender) {
  tuQuery->Close();
  tuQuery->SQL->Text = "SELECT CAMPO_A_MOSTRAR, ID FROM TU_TABLA";
  tuQuery->Open();
  while (!tuQuery->Eof){
    ComboBox1->Items->AddObject(tuQuery->FieldByName("CAMPO_A_MOSTRAR")->AsString,
      (TObject*)tuQuery->FieldByName("ID")->AsInteger);
    tuQuery->Next();
  }
  tuQuery->First();
}

Obtener el ID:
Código:

void __fastcall TForm1::ComboBox1Change(TObject *Sender) {
  int Id = Integer(ComboBox1->Items->Objects[ComboBox1->ItemIndex]);
  Caption = IntToStr(Id);
}

Saludos.

borlandpablo 18-10-2012 12:27:14

Muchísimas gracias, ya sé como funciona. El problema que tengo ahora es que cuando obtengo el ID de la tabla principal, no me dejarlo insertarlo en otra tabla con la clave ajena. Lo detallo mejor:

Código:

DISTRIBUIDOR                        CATALOGOS                                    TIENDAS
distribuidor_id (autonumérico)  catalogo_id(autonumérico)                  tienda_id           
Nombre                          Titulo                                    Nombre
Telefono                        Foto                                      Logo
Logo                            fecha_inicial                              distribuidor_id
                                fecha_fin
                                distribuidor_id(numero)
                                tienda_id(numero)

Esa es la base de datos. Me he creado una variable global de tiempo String (porque me daba fallo con el entero), la consulta que hice para obetener el ID del distribuidor es:

Código:

void __fastcall TXGestionTienda::ComboBox1Change(TObject *Sender)
{
  XDatos->QDistribuidor->Close();
  XDatos->QDistribuidor->SQL->Text = "select * from distribuidor where nombre = '"+ComboBox1->Text+"'";
  XDatos->QDistribuidor->Open();
  codigoD = XDatos->QDistribuidorDistribuidor_id->Value;
  //ShowMessage(codigoD);
}

Ya obtenido el ID, lo quiero asignar a la tabla TIENDAS para insertar una nueva tienda asignandole el distribuidor, lo que he hecho es:

Código:

void __fastcall TXGestionTienda::BitBtn1Click(TObject *Sender)
{
  XDatos->QTienda->Append();
  XDatos->QTienda->SQL->Text = "insert into tiendas(distribuidor_id) values ("+codigoD+")";
  XDatos->QTienda->Post();
}

Y el error que me salta es: " No se puede agregar o cambiar el registro porque se necesita un registro relacionado en la tabla 'DISTRIBUIDOR' ". Eso es lo que ya no sé hacer.

Un saludo.


La franja horaria es GMT +2. Ahora son las 14:15:34.

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