| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
el diego Master


Registrado: 23 Ago 2002Mensajes: 232Ubicación: Paris
|
Publicado: Vie 06 Sep, 2002 2:31 pm Asunto: Manejo de datos (tablas, dbgrids, querys) con ADO |
|
|
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 |
|
 |
tonynet Invitado
|
Publicado: Vie 06 Sep, 2002 2:39 pm Asunto: |
|
|
while (halla registros){
treeview->Items->Add(NULL,valor de tu columna);
pasar al siguiente registro();
} |
|
| Volver arriba |
|
 |
el diego Master


Registrado: 23 Ago 2002Mensajes: 232Ubicación: Paris
|
Publicado: Lun 09 Sep, 2002 9:06 am Asunto: |
|
|
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 |
|
 |
tecno Invitado
|
Publicado: Lun 09 Sep, 2002 9:45 am Asunto: |
|
|
¡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.  |
|
| Volver arriba |
|
 |
el diego Master


Registrado: 23 Ago 2002Mensajes: 232Ubicación: Paris
|
Publicado: Lun 09 Sep, 2002 10:18 am Asunto: |
|
|
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 |
|
 |
el diego Master


Registrado: 23 Ago 2002Mensajes: 232Ubicación: Paris
|
Publicado: Mar 10 Sep, 2002 1:35 pm Asunto: |
|
|
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 |
|
 |
tecno Invitado
|
Publicado: Mie 11 Sep, 2002 9:48 am Asunto: |
|
|
¡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  |
|
| Volver arriba |
|
 |
el diego Master


Registrado: 23 Ago 2002Mensajes: 232Ubicación: Paris
|
Publicado: Mie 11 Sep, 2002 10:38 am Asunto: |
|
|
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.
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 |
|
 |
tecno Invitado
|
Publicado: Mie 11 Sep, 2002 12:48 pm Asunto: |
|
|
¡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  |
|
| Volver arriba |
|
 |
el diego Master


Registrado: 23 Ago 2002Mensajes: 232Ubicación: Paris
|
Publicado: Mie 11 Sep, 2002 2:01 pm Asunto: |
|
|
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é .
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 |
|
 |
tecno Invitado
|
Publicado: Mie 11 Sep, 2002 4:41 pm Asunto: |
|
|
¡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.
 |
|
| Volver arriba |
|
 |
el diego Master


Registrado: 23 Ago 2002Mensajes: 232Ubicación: Paris
|
Publicado: Mie 11 Sep, 2002 4:49 pm Asunto: |
|
|
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 |
|
 |
el diego Master


Registrado: 23 Ago 2002Mensajes: 232Ubicación: Paris
|
Publicado: Mie 11 Sep, 2002 5:52 pm Asunto: |
|
|
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 |
|
 |
|