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 

Busqueda en datos de Interbase

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Busqueda en datos de Interbase Responder citando

hola, ahora me toca preguntar, jeje

bueno, estoy realizando un formulario de busquedas para interbase, la cuestion es no usar la sentencia LOCATE del dataset,

esto lleva a que interbase/firebird, manejan, paginas de datos y el realizar una busqueda, usando locate, es usar una busqued secuencial, dentro de ello, el FindFirst y FindNext, no vienen implementados en los componentens IBX,

la idea es la siguiente, de un conjunto de datos. (n) datos sobrepasemos los 100 mil registros, encontrar un registro que se encuentre a la mitad o 50 registros antes de llegar al final, es como poner el cable de la red al rojo vivo, usando la sentencia LOCATE,
en si viene a lo siguiente,
si tengo un select de la siguiente maner
Código:
SELECT * FROM productos

donde me regresa todo el contenido de la tabla (digamos 100 mil registros), y al generar un formulario de busqueda, para traer a un solo registro, puedo usar la sentencia LIKE, dentro del select, y asi reduzco considerablemente, los datos que quiero presentar, ahora bien, cuando el dato ya esta localizado, quiere decir que de los 100 mil registros, realice otro select de la siguiente manera

Código:
SELECT  * FROM productos WHERE nombre_prod LIKE :filtro

donde filtro es un parametro, que pude tomar cualquier valor que tenga algun nombre de producto
ejemplo producto 'cl'
regresa
clavos
claveles
clipper
etc todos los que empiecen con 'cl', bien, esto esta dentro del formulario de busqueda, ahora ya que encontre el producto, reduciendo la busqueda, no quiero usar locate, para que cuando al cerrar el formulario de busqueda y regresar al formulario donde se encuentran los datos (100 mil), tenga que usar locate, para encontrar el registro, pero si posicionarme en el registro que se selecciona en el formulario de busqueda

alguien, ha tenido alguna idea de como regresar los regisros,

para entenderlo mejor

formulario de productos, navegacion etc,
IBDataSet1 <- SELECT * FROM productos

presionar el boton buscar y abrir el otro formulario con otro IBDataSet
IBDataSet2 <- SELECT * FROM productos WHERE nombre_prod LIKE :filtro

El registro lo encuentro en el IBDataset2, como indicarle que registro irme en el IBDataset1.

gracias ahora si, sugerencias son bien venidas..
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola César, yo lo uso de la siguiente manera:

1. si las tablas son chicas, uso locate.

2. si la tabla es grande uso filtros como vos decis, pero nunca un
SELECT * FROM productos

En tu caso vos ya tenes una consulta de este ultimo tipo en tu formulario principal e independiente de la forma en que busques en el otro formulario una vez que tengas el registro (o el indice) que te interese para localizarlo en el formulario principal vas a tener que pedir al servidor TODOS los datos que esten localizados desde tu posición actual hasta ese.

IMAGINATE SI ÉL QUE BUSCAS ESTA AL FINAL !!!!.

Yo creo que independiente del metodo de busqueda la solución esta en no mostrar todos los registros de tablas grandes casi NUNCA.

Salvo que el caño te sobre.

Acabos de hacer una prueba (FB 1.5) y me trajo unos 60.000 registros en unos 5 segundos a una velocidad de 4.2 mbps (promedio) para darte una idea.

Esto lo podes hacer en una red de 100 mps, pero igualmente no es tan aconsejable.

Igualmente una vez cargada la tabla completa cualquier movimiento sobre ella es muy rápido, porque ya tenes una copia local Very Happy

Luego hacer locate o cualquier otra cosa sobre esta tabla es muy rápido y no necesitas de ningun filtro ni nada especial.

Son datos para que vos analices y pienses tu mejor solución dado tu problema.

Si los datos NO van a seguir creciendo mucho, y tu red es rápida, es una buena forma de volcar todo el trabajo sucio sobre la máquina cliente, usas el FETCH ALL.

Espero que te sirva.

Suerte
_________________
Crandel

"hay 10 tipos de personas, las que ven en binario y las que no"

Angel Zeitoune - Artículo: Generación de eventos en C++Builder
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

bueno, se me ocurre que el cliente no se de cuenta cuando cambias de "formulario", es decir en lugar de situar la busqueda en otro formulario , situala en el mismo en otro dbgrid con propiedad visible a false, cuando hagas la busqeuda sopreponlo al dbgrid donde estan TODOS, cuando quiera "quitar el filtro" (que sabemos que no es un filtro pero lo trataremos como tal..te acueda de SET FILTER?) apreta un boton y visualiza todos los registos



a ver si me explico.

qry1 = Select * from x (no e soptimo pero bueno, a,lo mejor asi lo necesitas)

qry2 = estes es que vas a estar modificando para busquedas

apuntando respectivamete a dbgrid1 y dbgrid2, haciendo visibles e invisibles segun sea el caso.

Espero habe sido claro

El problema al que te enfrentas es que si modificas algun registro en qry2 tendras qeu refrescar qry1..y 100,000 registros con un monton..

asi qeu tal vez el enfoque es incorrecto, tal vez no es necesario visualizar los 100,000 si no los que el usuario pida o necesite

Saludos
_________________
Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc

http://www.touchsoftwares.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

Bien, gracias a todos por sus respuestas.. espero encontrar mas proximamente

el objetivo es, cuando el usuario esta creando una nota de venta, y decide consultar, el nombre de un producto, para checar la existencia, si lo encuentra, jalar los datos, y grabarlos dentro de otra tabla, hasta ahi el problema no es grave, ya que solo se extraen los datos, que el usuario necesita

ejemplo:
Descripcion:
pant <= usuario tecleando despues del enter, abrir form de busqueda

dentro de este form, buscar el que necesita, copia los datos, y listo es decir no hay nada de problema,

el problema lo tengo cuando se esta realiando una actualizacion de inventario y se han cargado los datos de la tabla productos es decir jalar toda la base de datos. y buscar un registro espesifico, para editarlo.


ja ja, escribiendo estoy me doy cuenta, que es lo mismo.., al final el usuario, solo va a ver el registro que esta editando y con LIKE regreso el que necesito, en la consulta y ya no cargo los 100 mil. lo unico que me desconcierta es cuando quiera volver al primer registro pero de todos? o moverse ha otro que no cumpla los requisitos..

al parecer en primera instancia, jalamos todos, cuando edita, realizo el filtro (dataset2 Form de consulta) y ese mismo filtro me sirve para borrar los que no me sirven el DataSet1, (form de edicion de productos),

bueno, espero tener un form de consulta bien depurado y ponerlo aqui,

alguna otra sugerencia.?
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Cesar, creo que te esta pasando lo mismo que me paso a a mi al principio , ya que quieres programar cliente-servidor como si fuera monolitico orientado a registros.

olvida los TTables y sus anexos (usalos solo como temporales para cargar tus notas de venta, remisiones etc etc y luego modificar las tablas maestras o usala para la edicion de tus ABC de catalogos del sistema, clientes,proveedores, articulos etc tec)

Actualiza con puros qry de actualizacion secuencias sql UPDATE, INSERT

Mira , aunque algunos libros te recomiendan usar los controles enlazados,por experiencia y gusto personal, solo uso los enlazados en tablas de catalogos (clientes,proveedores, ingredientes) y todo lo demas manejo controles normales (no enlazados a un DataControl) y actualizo directo con UPDATE o INSERT

te evitas 1000 problemas

Suerte
_________________
Ing. Gabriel Góngora Navarrete
TouchSoftwares Inc

http://www.touchsoftwares.com
Volver arriba
Ver perfil de usuario Enviar mensaje privado Visitar sitio web del autor MSN Messenger
Mensaje    Asunto: Responder citando

no uso TTables ni TQuery, Uso el IBDataSet, que es mas potente, de la paleta de Interbase

saludos.
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Hola Cesar, Por fin vuelvo a tener acceso a internet por unos dias al menos.

A ver si te sirve, Aprovecho la propiedad SelectSQL para limitar los datos que se 'jalan' del servidor, por ej.
Código:
IBDataSet1->SelectSQL->Text="Select * from facturas where Fecha='"+strHOY+"'";

Cambio la sentencia para filtrar los datos por cliente, vendedor etc.
Para obtener informacion contenida en otra tabla y volcarla en el formulario actual, por ej. escribir parte del nombre del cliente en el DBEdit correspondiente y obtener su numero fiscal telf y direccion uso lo siguente:
Un Form con una rejilla un data source y una ibquery enlazados debidamente, una variable publica bool AceptarRejilla, e intercepto los siguentes eventos:
Código:
void __fastcall TForm1:: FormShow(TObject *Sender)
{
AceptarRejilla=false;
}
//--------------------------------------
void __fastcall TForm1::DBGrid1DblClick(TObject *Sender)
{
AceptarRejilla=true;

}
//-------------
void __fastcall TForm1::DBGrid1KeyPress(TObject *Sender, char &Key)
{
if(Key==13)//Return
 AceptarRejilla=True;
}
//---------------
Este Form lo utilizo junto a cualquier formulario y en distintos programas, ahora en el formulario de facturas tengo lo siguente:
Código:
void __fastcall TfFacturas::CompletarCliente(TObject *Sender, char &Key)
{
bool PasarDatos;
TDBEdit *Edit=(TDBEdit *)Sender;
if(Key==13&&(Sumario->State==dsInsert||Sumario->State==dsEdit))
{
 DataModule1->Query->SQL->Clear();
 DataModule1->Query->SQL->Add("Select Codigo,Nombre,Rif,Nit,\
  Direccion_Fiscal,Direccion_Entrega, Condiciones_Pago,Telefono from Clientes where Upper("+
  Edit->DataField+") Like '%"+UpperCase(Edit->Text)+"%'");
 DataModule1->Query->Open();
 DataModule1->Query->Last(); //obligo a traer todos los registros del resultado
 if(DataModule1->Query->RecordCount==1)
  PasarDatos=true;
 if(DataModule1->Query->RecordCount==0)
  ShowMessage("No se localizo ningun Registro Con '"+Edit->Text);
 if(DataModule1->Query->RecordCount>1)
  fRejilla->ShowModal();
 if(AceptarRejilla)
  PasarDatos=true;

 if(PasarDatos)
 {
  Sumario->FieldByName("Nombre")->AsString=
                      DataModule1->Query->FieldByName("Nombre")->AsString;
  Sumario->FieldByName("Codigo")->AsString=
                      DataModule1->Query->FieldByName("Codigo")->AsString;
  Sumario->FieldByName("Rif")->AsString=
                      DataModule1->Query->FieldByName("Rif")->AsString;
  Sumario->FieldByName("Nit")->AsString=
                      DataModule1->Query->FieldByName("Nit")->AsString;
  Sumario->FieldByName("Direccion_Fiscal")->AsString=
                      DataModule1->Query->FieldByName("Direccion_Fiscal")->AsString;
  Sumario->FieldByName("Direccion_Entrega")->AsString=
                      DataModule1->Query->FieldByName("Direccion_Entrega")->AsString;
  Sumario->FieldByName("Condiciones_Pago")->AsString=
                      DataModule1->Query->FieldByName("Condiciones_Pago")->AsString;
  Sumario->FieldByName("Telefono")->AsString=
                      DataModule1->Query->FieldByName("Telefono")->AsString;
  DBEdit10->SetFocus();//salto al siguente edit vacio
 }
}
}
//----------------------------------
Como se puede ver este es un evento OnKeyPress y este lo asigno a los DBEdits del Codigo, Nombre,Telefonos, Rif, Nit y hasta Direccion lo cual permite posicionarse
en cualquiera de estas casillas y obtener la informacion de una forma rapida y simple. En ningun momento se requiere traer todos los registros con esta tecnica al menos en las aplicaciones de Creacion y Mantenimiento de datos, otra cosa seria en aplicaciones de consulta y analisis y aun asi se puede limitar el trafico de red optimizando las clausulas where.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
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.