 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
rivo Lt JG

Registrado: 13 Mar 2004Mensajes: 72Ubicación: Asturias (España)
|
Publicado: Lun 26 Mar, 2007 4:00 pm Asunto: problemas con el TQuery y bases de datos |
|
|
hola!, me gustaria poder hacer una consulta desde una funcion que tengo en archivo, intento crear un objeto TQuery, pero al intentar crarlo poniendo:
| Código: |
TQuery *sql=new TQuery();
|
me da un error ya que dice que al constructor hay que pasarle un Tcomponent, ¿alguien me podria echar una mano u orientar mas o menos como podria hacerlo?, es que tengo que hacer un programa por capas y en la capa de base de datos tengo que hacer la cosulta a la base de datos y me gustaria retornar un TQuery con la soluccion de la consulta, para luego sacar los resultados en un DBGrid que tengo en otra capa diferente.
un saludo!! |
|
| Volver arriba |
|
 |
dobermannmx Master


Registrado: 30 Ago 2006Mensajes: 191Ubicación: Zapopan, Jal. - México
|
Publicado: Lun 26 Mar, 2007 4:44 pm Asunto: |
|
|
Rivo, la mayoría de los componentes de la VCL, su constructor te piden como parámetro el COMPONENTE que es propietario del nuevo componente que deseas crear, lo que requieres simplemente o es pasarle un THIS (que es el apuntador por defecto del componente sobre el que creas otros nuevos) o pasarle el apuntador del componente que lo está creando.
Espero esta info te saque de la duda
Salu2 _________________ ISC
Dobermannmx |
|
| Volver arriba |
|
 |
rivo Lt JG

Registrado: 13 Mar 2004Mensajes: 72Ubicación: Asturias (España)
|
Publicado: Lun 26 Mar, 2007 6:32 pm Asunto: |
|
|
Gracias dobermannmx por resoverme la duda que tenia, al final se me a ocurrido de otra manera para hacerlo, he creado un data_module y en él he metido la conexion a la base de datosy el query para realizar las cosultas sobre el y luego yo recogerlo donde lo necesite. Aun no lo pude probar pero por lo que he visto asi por encima deberia funcionar.
un saludo!! |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
rivo Lt JG

Registrado: 13 Mar 2004Mensajes: 72Ubicación: Asturias (España)
|
Publicado: Mar 27 Mar, 2007 3:36 pm Asunto: |
|
|
hola angel, es que no estaba en ningun form, solo tenia un archivo funciones.h y funciones.cpp vacios entonces lo que yo queria era crear un funcion que retornara un TQuery pero al declararla de esta manera me daba error
| Código: |
*TQuery buscar(string);
|
con esto lo que queria conseguir es por ejemplo, si realizo una busqueda en el programa llamar a esta funcion y que me devolviera en un objeto de tipo TQuery el resultado de la consulta a la base de datos, lo que pasa que al declarar esa funcion me da error, me dice declaration sintasys error, probe a meterle librerias, pero siempre me da el error, luego tambien intente que la funcion fuera void para probar a crear el objeto en ella de la manera que puse en el primer mensaje, pero que me pedia un TComponent, pero this no vale y no sabia lo que poner, asi que al final cree un data module, aunque si alguien me da la soluccion de como hacerlo de la primera forma que habia pensado estaria encantado :p.
las librerias que le añadi para ver si funcionaba eran estas, pero seguia dando error :
| Código: |
#include <vcl>
#include <Classes>
#include <Db>
#include <DBTables> |
un saludo!! |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mar 27 Mar, 2007 11:06 pm Asunto: |
|
|
Vamos con una breve explicacion, de lo mucho que se encuentra en el foro, estas haciendo un Form de Busqueda y quieres retornar el registro en un TQuery para poder ser utilizado, me temo que eso no es posible, ya que como bien sabes SQL, no guarda la información como lo hace DBase o Fox o llamese Clipper y claro ni mucho menos paradox. puedes usar los datos y establecerles una consulta es correcto, pero no puede retornar un registro y posteriormente cerrar el DataSet y luego regresar a donde estas como un clasico GoRecno(int)
afortunadamente, este tema se ha tratado mucho dentro del foro, eso significa que la información se encuentra si no fácil, pero si encontrable
supongamos lo siguiente, tienes 10 millones te parecen suficentes de registros en un tabla?
y realizamos la consulta
1.- Abres el dataset
2.- generas la consulta "select * from registros etc etc etc etc"
3.- aplicas la consulta y en este momento estas posicionado en el registro
que te interesa
para que quieres cerrar "este" dataset y volver abrirlo para irte a este registro?
ya que la operacion continua entonces haces lo siguiente
4.- regresas el registro o la posicion?
5.- habres nuevamente tu dataset, y tratas de buscar el registro que estas devolviendo?
si desde el paso 3 estas posicionado en el para que te sirven los pasos 4 y 5?
Anteriormente dije son malas costumbres traidas desde Fox,Clipper Access y todos los gestores que no usan SQL como lenguaje, la filosofia ha cambiado y por lo mismo los diseños de Software son diferentes.
Con ello quiero decir, que no es malo hacer un formulario de busqueda, solo que las cosas han cambiado y la manera de usarlos es diferente
Asi, que lo mejor es verificar realmente que es lo que quieres realizar con el TQuery de busqueda.
usa la opcion buscar del foro y ahi vas a encontrar varios trozos de codigo, que pueden ayudarte a entender mejor el conecpto de busquedas dentro de las consultas (SQL) una consulta NO es un filtro, una consulta es una "seleccion de datos que cumplen condiciones espesíficas" para devolver un conjunto FINITO de registros.
un filtro es eliminar los registros que no cumplen condiciones, pero no devuelven conjutos de datos, devuelven registros condicionados.
Saludos y espero nos des mas detalles de el concepto. _________________
 |
|
| Volver arriba |
|
 |
rivo Lt JG

Registrado: 13 Mar 2004Mensajes: 72Ubicación: Asturias (España)
|
Publicado: Mie 28 Mar, 2007 6:40 am Asunto: |
|
|
Hola cesar te he entendido perfectamente, entonces formulare la pregunta de manera diferente :p.
Si yo tengo dos ficheros unos clentes.h y otros consultas_sql.h, si en un momento dado yo estoy trabajando en clientes y necesito realizar una cosulta en la base de datos, llamo a una funcion que esta en consultas_sql.h, por ejemplo todos_los_clientes(), ahora mi pregunta es, ¿existe algun objeto (que exista ya en builder) que me pueda retornar esa funcion con los datos de la consulta a la funcion que la invoco en clientes.h y luego pueda asociar este objeto a un DBGrid?
Es que yo habia pensado tambien en retornar una estructura creada por mi y luego rellenar yo un stringGrid mediante un bucle, pero antes preferi consultar a ver si existe ya alguna manera de ahorrarme ese trabajo.
un saludo y gracias de antemano(espero haberme explicado correctamente) |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Mie 28 Mar, 2007 12:15 pm Asunto: |
|
|
bien ahora lo explicamos de la siguiente manera
tienes habierto el Dataset de clientes con un TQuery (aun no conozco el Controlador de base de datos que usas, firebird, interbase, etc etc)
lo mas recomendable es que pases este data set como parametro de una funcion de busqueda, ejemplo
| Código: | TQuery * __fastcall Todos_los_Clientes(TQuery tabla) |
aqui existen 2 cosas,
a) si la consulta es solo de busqueda
b) solo de busqueda-modificacion.
a) es una simple consulta que solo nos interesa que regrese 2 valores
1 - el registro existe
0 - el registro NO existe
En este tipo de consultas solo nos interesa saber si existe o no.
algo asi como para buscar un cliente y saber si existe.
b) esta consulta es igual a la anterior, pero con la finalidad que al movernos en el DataSet para buscar el registro, este debe posicionarse en él y mostrar esos datos en pantalla para poder ser modificados; en esta consulta es necesario que el parametro que esta pasandose a la funcion permita crear un "nuevo" DataSet, que es una copia del original, esto hace que al crear un DataSet usando el constructor copia, todo lo que se haga dentro del DataSet de Busqueda se refleja en el DataSet que ha sido pasado a la funcion.
Saludos espero ahora si que tengas una idea mas clara
si me muevo en los registros del constructor copia, tambien se hace dentro de los registros del constructor que se ha pasado como paramentro. _________________
 |
|
| Volver arriba |
|
 |
rivo Lt JG

Registrado: 13 Mar 2004Mensajes: 72Ubicación: Asturias (España)
|
Publicado: Mie 28 Mar, 2007 5:04 pm Asunto: |
|
|
hola!!, ya consegui que me funcionara, hice un ejemplillo pequeño para probar y lo hacia todo correctamente, tuve que añadir algunos includes, pero lo que es el codigo puse el que me dijoste cesar y funciona.
ahora no puedo pero por la noche o ya mañana pongo el codigo por si a alguien le puede ser util.
un saludo y gracias |
|
| Volver arriba |
|
 |
rivo Lt JG

Registrado: 13 Mar 2004Mensajes: 72Ubicación: Asturias (España)
|
Publicado: Sab 31 Mar, 2007 12:50 pm Asunto: |
|
|
hola!, pues aqui esta el codigo :
clientes.cpp
| Código: |
#include <vcl>
#pragma hdrstop
#include "clientes.h"
TIBQuery * __fastcall Ver_Todos(TIBQuery *tabla)
{
tabla->Close();
tabla->UnPrepare();
tabla->SQL->Clear();
tabla->SQL->Add("SELECT * FROM CLI");
tabla->Prepare();
tabla->Open();
return tabla;
}
|
clientes.h
| Código: |
#include <vcl>
#include <utilcls>
#include <IBDatabase>
#include <IBCustomDataSet>
#include <IBQuery>
TIBQuery * __fastcall Ver_Todos(TIBQuery *tabla);
|
bueno quizas me sobren includes, pero mas vale que sobren que no que falten, jajaja.
un saludo y gracias!! |
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|