PDA

Ver la Versión Completa : Concatenar 3 columnas con query de 2 tablas


GonzaloDias
22-04-2012, 17:18:30
Hola amigos del foro,
les comento que me surgio un problemita con una consulta que quiero mostrar en un dblookupcombobox


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.

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
Hola amigos del foro,
les comento que me surgio un problemita con una consulta que quiero mostrar en un dblookupcombobox


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:

...
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
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:

...
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
Bien asi me funciono es otra forma pero me quede con la duda de la anterior.

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?

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:


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
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 (http://www.clubdelphi.com/foros/showpost.php?p=431056&postcount=4) ¿ No preguntabas por un DBLookupComboBox ?

Saludos.