Cita:
Empezado por lmpadron
Ecfisa ... un gusto verte !!! Saludos
|
Hola Impadron, también me alegra mucho verte por aca
Hola Yugo, si no entendí todo mal, del modo que te pongo en este ejemplo hace lo que solicitas en el primer mensaje. Para probarlo agrega 3 Querys, 3 DataSources y 3 DBGrids
Código:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
// NOMBRE, RE1, ID1
QueryTabla1->Close();
QueryTabla1->SQL->Text = "SELECT * FROM TABLA1";
QueryTabla1->Open();
DataSource1->DataSet = QueryTabla1;
// ID - RE1, ID1, RE2, ID2, RE3, ID3, ...
QueryTabla2->Close();
QueryTabla2->SQL->Text = "SELECT * FROM TABLA2";
QueryTabla2->Open();
DataSource2->DataSet = QueryTabla2;
// Ocurrencia de nombres
DataSource3->DataSet = QueryNames;
}
void __fastcall TForm1::DataSource2DataChange(TObject *Sender,TField *Field)
{
QueryNames->Close();
QueryNames->SQL->Clear();
QueryNames->SQL->Add("SELECT T1.NOMBRE");
QueryNames->SQL->Add("FROM TABLA1 T1 JOIN TABLA2 T2 ON T2.ID = :PID AND");
QueryNames->SQL->Add("( (T1.ID1 = T2.ID1 AND T1.RE1 = T2.RE1) OR");
QueryNames->SQL->Add("(T1.ID1 = T2.ID2 AND T1.RE1 = T2.RE2) OR");
QueryNames->SQL->Add("(T1.ID1 = T2.ID3 AND T1.RE1 = T2.RE3) OR");
QueryNames->SQL->Add("(T1.ID1 = T2.ID4 AND T1.RE1 = T2.RE4) OR");
//
// Aquí irían las comprobaciones faltantes...
//
QueryNames->SQL->Add("(T1.ID1 = T2.ID26 AND T1.RE1 = T2.RE26) )");
QueryNames->ParamByName("PID")->AsInteger = QueryTabla2->FieldByName("ID")->AsInteger;
QueryNames->Open();
}
Pero si te fijas, en la Tabla2 agregué un campo ID (T2.ID) de tipo integer que no se repite (UNIQUE).
Esto es necesario para poder distinguir unívocamente en que registro estamos parados, ya que los nombres a mostrar, corresponden a las comparaciones entre los pares de columnas (REx / IDx) de Tabla1 y las columnas (RE1/ID1 - RE26/ID26) de ese registro de Tabla2 y no otro.
Probé la Tabla2 con un ID y cuatro pares de valores (8 columnas) y funciona correcto, se me hacía pesado escribir las 22 comprobaciones restantes...
Saludos