Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Manejo de datos (tablas, dbgrids, querys) con ADO

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Manejo de datos (tablas, dbgrids, querys) con ADO Responder citando

Estimados,
Quisiera llenar un TreeView con el resultado de una consulta SQL que me devuelve un query de ADO. El tema es que no emboco como manipular la informacion que tengo en esa consulta para luego agregarla en el TreeView. Luego vendrá el problema de llanarlo como quisiera, pero aun no llegué a eso.
Cualquier consejo o ejemplo sera bienvenido.

saludos
diego


Ultima edición por el diego el Mar 10 Sep, 2002 3:49 pm, editado 6 veces
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

while (halla registros){
treeview->Items->Add(NULL,valor de tu columna);
pasar al siguiente registro();
}
Volver arriba
Mensaje    Asunto: Responder citando

Gracias, pero seguro me exprese mal. Estoy trabado en el paso anterior. Tengo los resultados de la consulta SQL en un query de ADO y no encuentro la manera de utilizar esos datos. Tengo que recorrer esa informacion dentro de un bucle para cargarla en el TreeView (u otro componente) y no sé cómo.
Si alguien me puede dar un mando se los agradeceré

saludos
diego
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¡Hola!

Creo que te refieres a esto:

...
TADOQuery *qryAux = new TADOQuery(this);

... //realizar la consulta

qryAux->First(); //situarnos en el primer registro
while(!qryAux->Eof){ //mientras haya datos
qryAux->Fields->FieldByName("Nombre_Campo")->AsInteger; //así se accede a los datos del registro actual
qryAux->Next(); //avanzar al siguiente registro
}

Tambien tienes otra forma en vez de "FieldByName", que es "FieldByNumber". Para recuperar el dato lo puedes hacer con "AsInteger", "AsString", "AsDateTime", "AsDouble" y alguno mas (según te interese).

Espero haberte ayudado. Salu2. Wink
Volver arriba
Mensaje    Asunto: Responder citando

Tecno, efectivamente me refería a eso. Mil gracias por la ayuda, de apoco me voy desasnando con esto. El viernes pasado habia estado practicamente todo el dia tratando de hacer eso. Estaba utilizando un ADOTable pero no me parecia arpiado.

saludos y hasta la próxima
diego
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Ahora me surgió otra traba.
Quisiera hacer varias modificaciones sobre un conjunto de datos (tengo que hacer una correccion masiva, por unica vez). Es decir, dada una condicion, modifico el valor de un campo de cada registro.
Ejemplo:
Código:
ADOTable1->MasterSource = DataSource1;
ADOTable1->RecordCount;
ADOTable1->First();

while (! ADOTable1->Eof)
   {
   ADOTable1->FieldByName("IDAutor")->AsString = ADOTable1->FieldByName("ID")->AsString ;
   ADOTable1->Next();
   }

Donde DataSource1 es en realidad el resultado de una consulta que trae datos de dos tablas de ms access.
al hacer esto me dice que no se puede porque son un conjunto de datos cerrados. Este erros lo hace al llegar al ADOTable1->RecordCount.
Probé de hacerlo directamente sobre el TADOQuery pero pasa lo mismo.

No se como continuar....
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¡Hola!

Para hacer lo que quieres tienes dos formas de hacerlo:
1.- Si quieres actuar sobre el conjunto de datos que tienes en ADOTable1, has de usar los métodos EDIT, POST, ... para modificar los datos. Yo no uso esta forma, por lo que no soy el más indicado para explicarte como funcionan, pero la ayuda de Builder vale.
2.- Hacer los cambios directamente en la base de datos mediante una sentencia SQL (UPDATE tabla SET campo = valor, campo = valor, ... WHERE condición). Yo prefiero esta forma, ya que los datos van a quedar modificados de fijo (de la otra forma, si se va la luz antes de reflejar los cambios en la tabla, pierdes todos los cambios).

Salu2 Wink
Volver arriba
Mensaje    Asunto: Responder citando

Hola Tecno,
No meanda. Creo que el problema es otro. Me dice algo asi como, traduccion mediante, no se puede efectuar esa operacion en un conjuntos de datos cerrados.
Me parece que el problema es que intento unsar ADOTable para trabajar con una consulta de SQL que trae datos de dos tablas. No estoy seguro pero sospecho que el ADOTable es solo para tratar una tabla de base de datos. Probe de ver si eso es asi asignando una tabla en TableName pero me devuelve el mismo mensaje de error. Sad
Ahora, que otra cosa podria usar para recorrer esa "tabla virtual" (en VB lo llamaba recordset)? Se puede hacer desde el Query o desde un DBGrid?
Yo quiero recorrer los datos que me trae la consulta para analizarlos y modificarlos.

saludos y gracias
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¡Hola!

Yo no uso TADOTable, sino TADOQuery, pero supongo que será igual. TADOQuery tiene RecordSet, pero no es necesario utilizarlo. Directamente uso los métodos qryAux->First(), qryAux->Next(), ..., en vez de qryAux->RecordSet->MoveFirst(), qryAux->RecordSet->MoveNext(), etc. Con estos métodos te mueves por el conjunto de datos.
Pero nunca he probado con 2 tablas a la vez. ¿No puedes hacerlo directamente sobre la base de datos?

Salu2 Wink
Volver arriba
Mensaje    Asunto: Responder citando

Si supiera cómo hacerlo lo haría. Como habras notado estoy dando mis primeros pasos en C++. Vengo de programar en VB y estoy tratando de adaptarme cuanto antes.
Cuando decís de tarbajar sobre la base, te referís a hacer una consulta de SQL que haga esos ajustes? Lamentablemente mis acotados conocimientos de SQL no me permiten ver la manera de hacerlo, así que nuevamente estoy donde comencé Smile.

Hice lo siguiente:
Código:
ADOQuery1->First();
while (! ADOQuery1->Eof)
   {
   ADOQuery1->Edit();
   ADOQuery1->FieldByName("IDAutor")->AsInteger = ADOQuery1->FieldByName("ID")->AsInteger ;
   ADOQuery1->UpdateRecord();
   ADOQuery1->Next();
   }
ADOQuery1->Requery();
DataSource1->DataSet = ADOQuery1;
DBGrid1->DataSource = DataSource1;

pero cuando llega a ADOQuery1->Next() me dice que la Información de columna clave insuficiente para realizar la operacion de update o refresh.

Vamos Tecno que ya casi lo tenemos, te escucho!

saludos
diego
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

¡Hola!

Me he hecho un ejemplo copiando tu código y funciona a las mil maravillas. Tanto con UpdateRecord() como con Post().

Si puedes colgar el código donde realizas la consulta (con todos los parámetros que pongas) a lo mejor te puedo ayudar mas. Puede que la consulta la hagas con algún parámetro que condicione o impida la modificación de los datos.

De momento no se me ocurre nada mas.
Wink
Volver arriba
Mensaje    Asunto: Responder citando

Aqui va la parte de la consulta:
Código:
ADOQuery1->Connection = frmMain->cnnConexion;
ADOQuery1->LockType = ltOptimistic;
ADOQuery1->Close();
ADOQuery1->SQL->Clear();
ADOQuery1->SQL->Add("SELECT tblAutor.ID, IDAutor, tblLibroAutor.IDAutorOld, NombreCompleto, IDLibro, IDOld");
ADOQuery1->SQL->Add("FROM tblAutor") ;
ADOQuery1->SQL->Add("INNER JOIN tblLibroAutor ON tblAutor.IDOld =tblLibroAutor.IDAutorOld");
ADOQuery1->SQL->Add("Where  tblAutor.ID <> tblLibroAutor.IDAutor");
ADOQuery1->SQL->Add("ORDER BY NombreCompleto, IDLibro");

ADOQuery1->Open();

DataSource1->DataSet = ADOQuery1;
DBGrid1->DataSource = DataSource1;


Y esta es la de la conexion que hago en en el formularioprincial. Para cada query utilizo la misma conexion:
Código:
CadenaConexion = "Persist Security Info=False;Extended Properties=\"DBQ=" ;
CadenaConexion +=  NomPathBase;
CadenaConexion +=  ";DRIVER=Microsoft Access Driver (*.mdb)\"";
cnnConexion->ConnectionString = CadenaConexion;
cnnConexion->LoginPrompt = false;
cnnConexion->ConnectionTimeout =15;
cnnConexion->KeepConnection = true;
cnnConexion->Open();


gracis de nuevo
diego
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

bueno, aleluya, encontre el problema. Cambie ADOQuery1->LockType = ltOptimistic a
ADOQuery1->LockType = ltBatchOptimistic y listo el pollo.
Pero (siempre tengo un pero) los datos no son actualizados en la base de datos. Si en el Query y en el DBGrid, pero al volver a cargar el programa o al verificar mediante Access los datos siguen como al comienzo. Evidente mente el ADOQuery1->UpdateRecord() no es suficiente o falta algo.

un abrazo
diego
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.