![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
|
|
#1
|
||||
|
||||
|
Saludos Yugo y bienvenido al ClubDelphi
Cita:
En esencia tienes una Tabla1 y una tabla2. Necesitas recorrer los campos de la tabla2 y mientras se hace (usando el DBNavigator) ir comprobando ese valor de la tabla2 con todos los de la Tabla1 buscando posibles coincidencias en los campos ID y FREC. Bueno vamos a ver si podemos ser de ayuda, BCB usa en el BDE como SG el SQL lo que facilita bastante la vida, en caso de que estés usando el BDE para conectarte a la tabla, si estas usando ADO pues también tienes SQL. Por lo tanto lo que debes hacer es obtener el momento en que se ejecuta la acción, eso bien lo podrías hacer programando directo en el DBNavigator, detectando el botón que se presiona Código:
AnsiString BtnName;
switch (Button)
{
case nbFirst:
{
//aki va tu código
break;
}
case nbPrior:
{
//aki va tu código
break;
}
case nbNext:
{
//aki va tu código
break;
}
case nbLast:
{
//aki va tu código
break;
}
}
Una ves detectada la acción solo nos queda programar la comparación que puede ser un sencillo SELECT de SQL (aquí te dejo la lógica de como debería ser)
Una ves hecho esto solo debes mostrar el resultado de la comparación en un componente de tu elección para que tu usuario pueda determinar que hacer Espero que esto te sea de ayuda, si quieres mas detalles entonces debes dar mas detalles tu también, hay uno de los miembros de la comunidad que tiene en su pie de firma una frase estupenda (a mi en lo personal me encanta) que dice "La calidad de la respuesta es directamente proporcional a la calidad de la pregunta". Saludos
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código. Cuando miras fijamente al abismo, este te devuelve la mirada oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_ oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_ oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_ oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_ oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_ ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_ ________________________________________________________________________________ Última edición por lmpadron fecha: 31-07-2014 a las 18:21:43. |
|
#2
|
|||
|
|||
|
Hola lmpadron, quería agradecerte tu interés en responder a mi duda y por supuesto que trataré de seguir el consejo acerca de la claridad en la explicación de las dudas.
Básicamente has entendido bastante bien la cuestión, pero para que quede aún más claro voy a tratar de explicarlo de otra manera sólo para un registro de la tabla2, por ejemplo: 1.- Uso estos componentes: TTable1, TTable2, TDataSource1, TDBNavigator1, 13 TLabels, 26 TDBEdits (uno por cada campo de la tabla2 para ver los datos del registro actual) y un TQuery1 para realizar la consulta. 2.- Uso BDE para trabajar con bases de datos locales. 3.- En la tabla2, recorrer todos los campos del registro actual y tomando cada par de Frec2.x---Id2.x para comparar sus datos con el par Frec1---Id1 de todos los registros de la tabla1. Por lo tanto, tendría que usar un bucle for, tal que así: Código:
for(x=1;x<=13;x++)
{
Query1->Close();
Query1->SQL->Clear();
String sConsulta = " SELECT * FROM tabla1 WHERE tabla1.Frec1 = tabla2.Frec2.x AND tabla1.Id1 = tabla2.Id2.x ORDER BY Nombre1";
Query1->SQL->Add(sConsulta);
Query1->Open();
//Si la consulta devuelve alguna coincidencia
if(!Query1->IsEmpty())
{
//Hacer que la etiqueta contenga el nombre (ordenado alfabeticamente)
Labelx->Caption = Query1->FieldByName("Nombre1")->AsString;
}
//Si la consulta no devuelve ninguna coincidencia
else
{
Labelx->Caption = "Ninguna coincidencia encontrada.";
}
}
5.- Por otro lado, si al abrir la aplicación también se debe realizar esta operación con el primer registro de la tabla2, que sería el registro actual, ¿qué debería hacer para ello? Un saludo compañero!! Última edición por ecfisa fecha: 07-08-2014 a las 07:38:14. Razón: Agregar etiquetas [code] |
|
#3
|
||||
|
||||
|
Hola Yugo, bienvenido a ClubDelphi
![]() Por favor, cuando pongas código C++ usa las etiquetas code, su uso es: [code] ... aqui tu código ... [/code] (ya las agregué a tu mensaje anterior) Al ejecutar la sentencia: Los datos que se encuentren disponibles en Query1 ya han cumplido la condición que deseas, por lo que sólo tendrías que recorrerlo. No es necesario hacer nada en su evento AfterScroll. Saludos ![]()
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
|
#4
|
||||
|
||||
|
Saludos Yugo ... Ecfisa
también puedes usar WHILE Código:
while (TuQuery->Eof)
{
//todo tu codigo
TuQuery->Next();
}
Cita:
Código:
Query1->SQL->Clear();
Query1->SQL->Add("SELECT * FROM tabla1 WHERE tabla1.Frec1 = tabla2.Frec2.x AND tabla1.Id1 = tabla2.Id2.x ORDER BY Nombre1");
Cita:
Cita:
Espero haber sido de ayuda Ecfisa ... un gusto verte !!! Saludos
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código. Cuando miras fijamente al abismo, este te devuelve la mirada oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_ oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_ oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_ oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_ oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_ ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_ ________________________________________________________________________________ Última edición por lmpadron fecha: 07-08-2014 a las 20:59:53. |
|
#5
|
|||
|
|||
|
Hola, si me lo permitís voy a responderos a ambos en este mismo mensaje para no sobrecargarlo.
ecfisa, muchas gracias por la bienvenida y la información que me aportas. Procuraré usar las etiquetas que mencionas para escribir código en futuras ocasiones. También decirte que entiendo que al usar la instrucción: Cita:
lmpadron, debo decirte que como estoy experimentando con esto, estoy usando un TDBGrid3 para visualizar los resultados de la consulta SQL (para comprobar visualmente si los resultados de la consulta se adecúan a lo que busco). Pero la idea de usar tantos TLabels es porque, al mismo tiempo que visualizo los registros originales de la tabla2 en otro TDBGrid2, también necesito hacer visible que las cosultas se realizan correctamente, puramente informal. La cuestion es que escribo el siguiente código en un botón (a modo de prueba para comprobar si funciona o no) sólo para comprobar posibles coincidencias únicamente en el primer par de campos de la tabla2 (Frec2.1---BSIC): Código:
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("SELECT * ");
Query1->SQL->Add("FROM tabla1 ");
Query1->SQL->Add("WHERE tabla1.BSIC = tabla2.BSIC ");
//He renombrado el campo Id1 de la tabla1 a BSIC y el campo Id2.1 de la tabla2 tambien a BSIC por simple comodidad.
//Los campos BSIC de ambas tablas son del mismo tipo (A) y mismo tamaño (6).
Query1->SQL->Add("AND tabla1.Frec1 = tabla2.Frec2.1 ");
Query1->SQL->Add("ORDER BY Nombre1");
Query1->Open();
Cita:
Muchas gracias. Un saludo!! |
|
#6
|
||||
|
||||
|
El error debe estar en el SQL, ahora mismo, te digo !!!
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código. Cuando miras fijamente al abismo, este te devuelve la mirada oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_ oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_ oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_ oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_ oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_ ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_ ________________________________________________________________________________ Última edición por lmpadron fecha: 14-08-2014 a las 22:45:38. Razón: lo envié mal por error y no puedo eliminarlo ... si alguin moderador ve este post POR FAVOR ELIMINELO. Graciasl |
|
#7
|
||||
|
||||
|
Hola Yugo ... por lo que veo, me imagino el error este en que no haces referencia a la tabla2 para abrirla, por lo que al llamarla en el WHERE te dice q el campo BSIC no existe.
Prueba lo siguiente
Tambien puedes probar con un JOIN
... Claro esto también podrías hacerlo así
... o
... o incluso una mejor
... o
un poco mas limpio verdad !!! ![]()
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código. Cuando miras fijamente al abismo, este te devuelve la mirada oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_ oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_ oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_ oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_ oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_ ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_ ________________________________________________________________________________ Última edición por lmpadron fecha: 14-08-2014 a las 22:49:09. |
|
#8
|
|||
|
|||
|
Qué tal lmpadron!! justo acabo de probar todos los posibles códigos que me aportas y es fantástico comprobar que para ninguno de ellos salta la excepción, sin embargo, las consultas no devuelven nigún resultado visible en el DBGrid. Incluso probando con:
Código:
ShowMessage(Query1->FieldByName("Nombre1")->AsString);
También he probado a realizar una consulta únicamente sobre la tabla1 con datos numéricos directamente tal que así: Código:
Query1->Close();
Query1->SQL->Clear();
Query1->SQL->Add("SELECT * FROM tabla1 WHERE BSIC = '47' and BCCH = '751' ORDER BY Nombre1");
Query1->Open();
Estoy usando Database desktop 7.0, y no sé si será por esto por lo que no logro conseguir lo que busco. |
|
#9
|
||||
|
||||
|
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();
}
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 ![]()
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
|
#10
|
|||
|
|||
|
Qué tal ecfisa!! El código que me aportas funciona a la perfección si lo que buscamos es listar todos los nombres de la TABLA1 que cumplen la condición de que su par ID1/RE1 coincide con alguno de los pares ID1/RE1---ID26/RE26 de la TABLA2 del registro actual.
Sin embargo, la cuestion era otra. Disculpa si no me expliqué bien anteriormente. 1.- Supongamos que en el DBGrid estamos visualizando el registro nº1 de la TABLA2 (registro actual). 2.- Tomamos los dos datos del par ID1/RE1 (TABLA2). 3.- Comparar dicho par de datos ID1/RE1 (TABLA2) con el par de datos ID1/RE1 (TABLA1) de cada uno de los registros que tiene la TABLA1. 4.- Si la consulta devuelve algún resultado coincidente, visualizar en un TLabel el Nombre del primer resultado ordenado alfabéticamente que se obtiene. Y si no obtenemos ningún resultado pues, el TLabel contendrá un texto: "No coincidente", por ejemplo. #NOTA: En la TABLA1 puede haber dos ó más registros con los mismos datos ID1/RE1 pero con Nombre diferentes. (De ahí el hecho de ordenar el resultado de la consulta por Nombre, puesto que sólo interesa el primero de ellos en caso de mútliples coincidencias). 5.- Tomar los siguientes dos datos del registro nº1 de la TABLA2, es decir, el par ID2/RE2 (TABLA2). 6.- Repetir los pasos 3 y 4 para el par ID2/RE2 (TABLA2). ... Y así sucesivamente hasta el último par ID13/RE13 (TABLA2). Como puedes ver ecfisa la tarea es diferente. De todas formas, tu mensaje anterior no sólo me aclara bastante las ideas, sino que me soluciona la duda de cómo hacer cuando se cambia de un registro de la TABLA2 a otro. PD1: Como recordatorio, los campos de ambas tablas son... TABLA1 Nombre......ID1......RE1 TABLA2 ID ...... ID1......RE1 ...... ID2......RE2 ...... ID3......RE3 ··· ID13......RE13 PD2: No os podeis imaginar lo agradecido que se siente uno cuando hay personas como vosotros que se toman la molestia y gastan su tiempo en ayudar a los que lo necesitamos, muchas gracias. |
|
#11
|
||||
|
||||
|
Cita:
... al menos eso es lo que hago yo hehehe ... incluyendo todo el que se gasto ecfisa conmigo hehehehhee !!!A ver si esto te sirve .. pon un DBGRID con su DataSource y apuntalo a un Query (Query1) con este SQL
Una ves hecho esto en el DBGrid1 debes ver todos los valores de la "tabla 2", ahora si entiendo bien quieres comprobar los valores que están en los campos desde el ID1 RE1 hasta el ID13 RE13 con los contenidos en la "tabla 1" en los campos ID1 RE1. Para esto pon otro DBGrid con su DataSource apuntando a un segundo Query (Query2). En el DataSource1 en su evento DataChange pones lo siguiente Código:
void __fastcall TForm1::DataSource1DataChange(TObject *Sender,TField *Field)
{
Query2->Close();
Query2->SQL->Clear();
Query2->SQL->Add("SELECT "
"(SELECT nombre FROM tabla1 WHERE ID1 IN (SELECT ID1 FROM table2 WHERE ID = '"Query1->FieldByName("id")->Text"') AND RE1 IN (SELECT RE1 FROM table2 WHERE ID = '"Query1->FieldByName("id")->Text"') ORDER BY nombre ASC) AS PAR_ID1RE1, "
"(SELECT nombre FROM tabla1 WHERE ID1 IN (SELECT ID2 FROM table2 WHERE ID = '"Query1->FieldByName("id")->Text"') AND RE1 IN (SELECT RE2 FROM table2 WHERE ID = '"Query1->FieldByName("id")->Text"') ORDER BY nombre ASC) AS PAR_ID2RE2, "
"(SELECT nombre FROM tabla1 WHERE ID1 IN (SELECT ID3 FROM table2 WHERE ID = '"Query1->FieldByName("id")->Text"') AND RE1 IN (SELECT RE3 FROM table2 WHERE ID = '"Query1->FieldByName("id")->Text"') ORDER BY nombre ASC) AS PAR_ID3RE3, "
"(SELECT nombre FROM tabla1 WHERE ID1 IN (SELECT ID4 FROM table2 WHERE ID = '"Query1->FieldByName("id")->Text"') AND RE1 IN (SELECT RE4 FROM table2 WHERE ID = '"Query1->FieldByName("id")->Text"') ORDER BY nombre ASC) AS PAR_ID4RE4, "
"(SELECT nombre FROM tabla1 WHERE ID1 IN (SELECT ID5 FROM table2 WHERE ID = '"Query1->FieldByName("id")->Text"') AND RE1 IN (SELECT RE5 FROM table2 WHERE ID = '"Query1->FieldByName("id")->Text"') ORDER BY nombre ASC) AS PAR_ID5RE5, "
"(SELECT nombre FROM tabla1 WHERE ID1 IN (SELECT ID6 FROM table2 WHERE ID = '"Query1->FieldByName("id")->Text"') AND RE1 IN (SELECT RE6 FROM table2 WHERE ID = '"Query1->FieldByName("id")->Text"') ORDER BY nombre ASC) AS PAR_ID6RE6; "
);
Query2->Open();
}
Cada columna lleva como nombre el numero del par que analiza y en caso de encontrar resultados solo te mostrara el campo nombre.Saludos
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código. Cuando miras fijamente al abismo, este te devuelve la mirada oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_ oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_ oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_ oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_ oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_ ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_ ________________________________________________________________________________ |
|
#12
|
||||
|
||||
|
Si no te es molestia ponme el SQL para crear las tablas tuyas y algunos juegos de datos con los que verificar ... no es que no lo pueda hacer yo mismo... es q soy muy vago !!!
![]()
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código. Cuando miras fijamente al abismo, este te devuelve la mirada oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_ oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_ oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_ oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_ oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_ ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_ ________________________________________________________________________________ |
![]() |
| Herramientas | Buscar en Tema |
| Desplegado | |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Migrar version BCB6 | Toni | C++ Builder | 6 | 20-10-2014 14:44:32 |
| TurboPower Systool bcb6 | eldonfsr | C++ Builder | 0 | 15-01-2008 04:11:35 |
| Coincidencia?? | vtdeleon | Debates | 2 | 28-04-2006 13:43:17 |
| Exportación de datos de Excel a Tablas Paradox | Mone | Conexión con bases de datos | 1 | 31-10-2005 21:15:40 |
| Como buscar en una tabla Paradox ? | gregorio | Tablas planas | 2 | 25-04-2005 18:54:29 |
|