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 

problemas con el TQuery y bases de datos

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: problemas con el TQuery y bases de datos Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Te hubiera bastado poner la instrucción así:
Código:
TQuery *sql=new TQuery(this);

_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

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
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

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
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.