Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Concatenar 3 columnas con query de 2 tablas (https://www.clubdelphi.com/foros/showthread.php?t=78468)

GonzaloDias 22-04-2012 17:18:30

Concatenar 3 columnas con query de 2 tablas
 
Hola amigos del foro,
les comento que me surgio un problemita con una consulta que quiero mostrar en un dblookupcombobox

Código Delphi [-]
form2.Query7.Close;
form2.Query7.SQL.Clear;
form2.Query7.SQL.add('select c.Curso_ID as ID, r.Nombre||'' ''||r.Referencia||'' ''||c.Costo as Nombre');
form2.Query7.SQL.add('from Cursos c, Referencias r');
form2.Query7.SQL.add('where c.Nombre = r.Referencia_ID');
form2.Query7.SQL.add('Order by r.Nombre');
form2.Query7.Open;

Luego el campo Nombre del query lo asigno al listfield del db lookupcombbx y me dice Type mismatch in expression. La verdad que con 2 campos de la tabla Referencias si funciona y lo muestra bien pero al agregar c.Costo o algun otro campo de Referencias en la 3er concatenacion me tira ese error. Sabrian porque este error ? sera algo de la concatenacion que me falta ? gracias de antemano

GonzaloDias 22-04-2012 17:51:03

Bien asi me funciono es otra forma pero me quede con la duda de la anterior.
Código Delphi [-]
form2.Query7.Close;
form2.Query7.SQL.Clear;
form2.Query7.SQL.add('select c.Curso_ID as ID, r.Nombre as Nom,r.Referencia as Ref, c.Costo as Cos');
form2.Query7.SQL.add('from Cursos c, Referencias r');
form2.Query7.SQL.add('where c.Nombre=r.Referencia_ID');
form2.Query7.Open;

ComboBox1.Items.Clear;
form2.Query7.First; //Esto podria ser innecesario pero lo coloco por maña
While not form2.Query7.eof do
begin
   nombre := form2.Query7.FieldByName('Nom').AsString + ' ' + form2.Query7.FieldByName('Ref').AsString+ '   Costo $' + form2.Query7.FieldByName('Cos').AsString;
   //comboBox1.Items.Add(Query.FieldByName('nombre').AsString);
   combobox1.Items.Add(nombre);
   form2.Query7.Next;
end;
Gracias.

ecfisa 23-04-2012 03:13:19

Cita:

Empezado por GonzaloDias (Mensaje 430643)
Hola amigos del foro,
les comento que me surgio un problemita con una consulta que quiero mostrar en un dblookupcombobox

Código Delphi [-]
form2.Query7.Close;
form2.Query7.SQL.Clear;
form2.Query7.SQL.add('select c.Curso_ID as ID, r.Nombre||'' ''||r.Referencia||'' ''||c.Costo as Nombre');
form2.Query7.SQL.add('from Cursos c, Referencias r');
form2.Query7.SQL.add('where c.Nombre = r.Referencia_ID');
form2.Query7.SQL.add('Order by r.Nombre');
form2.Query7.Open;

Luego el campo Nombre del query lo asigno al listfield del db lookupcombbx y me dice Type mismatch in expression. La verdad que con 2 campos de la tabla Referencias si funciona y lo muestra bien pero al agregar c.Costo o algun otro campo de Referencias en la 3er concatenacion me tira ese error. Sabrian porque este error ? sera algo de la concatenacion que me falta ? gracias de antemano

Hola Gonzalo.

Es extraño, el problema estará en la forma que haces las asignaciones al TDBLookupComboBox...
De este modo me funciona correctamente:
Código Delphi [-]
...
  with IBQuery1 do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT C.CURSO_ID AS ID, R.NOMBRE ||'' ''||R.REFERENCIA||'' ''||C.COSTO AS NOMBRE '); 
    SQL.Add('FROM CURSOS C, REFERENCIAS R '); 
    SQL.Add('WHERE C.NOMBRE = R.REFERENCIA_ID '); 
    SQL.Add('ORDER BY R.NOMBRE');
    Open;
  end;
  DataSource1.DataSet:= IBQuery1;
  DBLookupComboBox1.ListSource:= DataSource1;
  DBLookupComboBox1.KeyField:= 'ID';
  DBLookupComboBox1.ListField:= 'NOMBRE';
...
También revisá que haya un espacio al finalizar cada línea que agregues con el método, Add (o al iniciar una nueva)

Saludos.

GonzaloDias 26-04-2012 13:30:49

Una consulta, asntes de agregar al Listfield del dblookupcombobox el campo NOMBRE se podria colocar antes: Nombre:'NOMBRE'? gracias

ecfisa 26-04-2012 14:05:57

Cita:

Empezado por GonzaloDias (Mensaje 431056)
Una consulta, asntes de agregar al Listfield del dblookupcombobox el campo NOMBRE se podria colocar antes: Nombre:'NOMBRE'? gracias

No.

Pero lo que sí podés hacer es usar el evento OnGetText del campo NOMBRE para lograr lo que deseas:
Código Delphi [-]
...
  private
     procedure DataSetNOMBREGetText(Sender: TField; var Text: String; DisplayText: Boolean);
  end;
...
implementation

procedure TForm1.DataSetNOMBREGetText(Sender: TField; var Text: String; DisplayText: Boolean);
begin
  Text:= 'NOMBRE: '+ TField(Sender).AsString;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  DataSet.FieldByName('NOMBRE').OnGetText:= DataSetNOMBREGetText;
end;

...

procedure TForm1.FormDestroy(Sender: TObject);
begin
   DataSet.FieldByName('NOMBRE').OnGetText:= nil;
end;

Saludos.

gatosoft 26-04-2012 14:17:51

Cita:

Empezado por GonzaloDias (Mensaje 430644)
Bien asi me funciono es otra forma pero me quede con la duda de la anterior.
Código Delphi [-]
form2.Query7.Close;
form2.Query7.SQL.Clear;
form2.Query7.SQL.add('select c.Curso_ID as ID, r.Nombre as Nom,r.Referencia as Ref, c.Costo as Cos');
form2.Query7.SQL.add('from Cursos c, Referencias r');
form2.Query7.SQL.add('where c.Nombre=r.Referencia_ID');
form2.Query7.Open;

ComboBox1.Items.Clear;
form2.Query7.First; //Esto podria ser innecesario pero lo coloco por maña
While not form2.Query7.eof do
begin
   nombre := form2.Query7.FieldByName('Nom').AsString + ' ' + form2.Query7.FieldByName('Ref').AsString+ '   Costo $' + form2.Query7.FieldByName('Cos').AsString;
   //comboBox1.Items.Add(Query.FieldByName('nombre').AsString);
   combobox1.Items.Add(nombre);
   form2.Query7.Next;
end;
Gracias.

Hola gonzalo, estoy de acuerdo contigo, la solución alterna funciona, pero no me parece la mejor.... además no es bueno quedarse con las dudas....

En que base estas trabajando? es PostgreSQL??

Por que no intentas un TypeCast?

Código Delphi [-]
form2.Query7.SQL.add('select Cast(c.Curso_ID as ID, r.Nombre||'' ''||r.Referencia||'' ''||c.Costo as Varchar) as Nombre');

GonzaloDias 26-04-2012 14:32:11

Ok, Gracias por la ayuda, me funciono bin de esa manera, pero el problema era que al llenar el combobox.items luego de realizar la consulta, al querer seleccionar desde el cmbbx :
edit1.text:=combobox.text,

no me traia nada, lo que supuse q no se cargaba fisicamente en la propiedad Items como se muestra sig:

Código Delphi [-]
form2.Query9.Close;
form2.Query9.SQL.Clear;
form2.Query9.SQL.Text:='select p.Plan_ID as pPID, p.ImporteMatricula as mat, p.CuotasCantidad as cuo, p.ImporteCuota as imp  from CursoPlan cp, Planes p  where cp.Curso ='+inttostr(Codigo)+'  and cp.PlanCod = p.Plan_ID';
form2.Query9.Open;

nombre1 := form2.Query9.FieldByName('pPID').AsString + '  Matricula: '+form2.Query9.FieldByName('mat').AsString + '  Cuotas: ' + form2.Query9.FieldByName('cuo').AsString+ '  Importe x Cuota: $' + form2.Query9.FieldByName('imp').AsString;

nombre1 := '';
While not form2.Query9.eof do
begin
   nombre1 := form2.Query9.FieldByName('pPID').AsString + '  Matricula: '+form2.Query9.FieldByName('mat').AsString + '  Cuotas: ' + form2.Query9.FieldByName('cuo').AsString+ '  Importe x Cuota: $' + form2.Query9.FieldByName('imp').AsString;
   combobox3.Items.Add(nombre1);
   form2.Query9.Next;
end;

POr lo cual necesitaba el campo pPID para luego guardarlo en otra tabla, con un DBlookupcombobox en la propiedad listfield viendo de utilizar GetText del campo que muestro. Gracias

GonzaloDias 26-04-2012 16:42:54

Bien se me ocurrio de otra manera para no tener que realizar substring para sacar los valores numerico, pense en utilizar los itemindex del combobox y a la vez que se va cargando en combobox guardo en un vector el ID de la consulta , es decir la cantidad de items en cmbbx es igual a la de registros en el vector.
Gracias igualmente.

ecfisa 26-04-2012 17:03:16

Cita:

Empezado por GonzaloDias (Mensaje 431092)
Bien se me ocurrio de otra manera para no tener que realizar substring para sacar los valores numerico, pense en utilizar los itemindex del combobox y a la vez que se va cargando en combobox guardo en un vector el ID de la consulta , es decir la cantidad de items en cmbbx es igual a la de registros en el vector.
Gracias igualmente.

Hola Gonzalo.

No entiendo, en el mensaje #4 ¿ No preguntabas por un DBLookupComboBox ?

Saludos.


La franja horaria es GMT +2. Ahora son las 07:48:27.

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