![]() |
busqueda de registros en un dbgrid con mysql
hola a todos soy nuevo por aqui y me gustaria que me ayudaran con mi problema ya que he buscado por mucho y no encuentro solucion. utilizo delphi 7 y mysql4 como base de datos, quiero hacer dos tipos de busquedas el cual la primera ya lo tengo que es una busqueda mediante un campo llave y este me lleve a dinde se encuentra dicho campo en el dbgrid, los elementos que utilizo son un edit, un button , y el dbgrid los campos que tengo el la tabla son;
codigo(campo llave) productos cantidad etc... la otra busqueda que quiero hacer mediante el campo de productos es decir que al escribir en el edit el producto y le click en buscar este me señale en el mismo dbgrid el producto que busco pero no se como hacerlo ya que pienso utilizar ese mismo dbgrid que ya tiene datos cargados para las dos busquedas este es un ejemplo del buscador por cierto he visto que muchos utilizan query para esto y veo que es facil pero no lo hago por que las dos busquedas las quiero hacer en el mismo dbgrid espero me entiendan ------------------------------ ------buscar------------------------------- checkbox--->[]por codigo [___________] | checkbox--->[]por producto [buscar] | ------------------------------------------- el codigo de busqueda que hice para el primero que es por codigo es: if radiobutton1.Checked =true then begin datamodule1.productos.SetKey; datamodule1.productos.FieldValues['codigo']:=edit1.Text; if not datamodule1.productos.GotoKey then begin messagedlg('NO EXISTE ESE CODIGO',mtinformation,[mbok],0); end; |
Los componentes db-aware (como el dbgrid) son componentes de visualización y sólo se usan -o se deberían usar- para mostrar datos, el trabajo de localización y actualización de datos lo debes realizar con los datasets, mientras menos uses los componentes visuales para manipular datos, menos problemas tendrás, luego de muchos golpes en la cabeza entendí eso.
Una método que te permite hacer una búsqueda por más de un campo es Locate, trata de hacer lo siguiente: Código:
datamodule1.productos.locate('codigo;nombre', [edit1.text, edit2.text], [loCaseInsensitive] ); |
Una recomendación, ese efecto de "speed search" o búsqueda rápida es vistoso pero inútil al final porque el locate solo busca lo que empiece con lo que escribas en el TEdit. Si tu tabla solo tiene unas cuantas filas, al final si puede ser útil, pero si es una tabla con miles de registros no veo el caso e usar un grid para mostrarlas todas si al final el usuario no quiere verlas todas sino una o dos. Cuesta trabajo conceptualizar un diseño en donde los grids se usen únicamente para mostrar resultados de búsquedas y no como la fuente donde el usuario va a buscar. Te pongo un ejemplo, es como si le das al usuario la guía telefónica y le pides que ahi el busque el nombre que desea, cuando esa búsqueda la puede hacer el sistema.
Lo que yo recomiendo casi siempre es usar uno o varios TEdits para pedir al usuario que escriba los criterios de búsqueda. Tratándose de nombres o campos que contienen solo texto le pido que ponga solo la parte que más lo identifique, no necesariamente las letras con las que comience. Por ejemplo si busca "MARTILLO DE UÑA", bastaría conque pusiera "UÑA" o "MARTILL". Lo que hago en el query es hacer un LIKE para que me devuelva todos los registros que contengan esa subcadena. El resultado lo muestro en un grid y de ahi ya puede el usuario seleccionar el que desee ver o editar. Además tenemos la ventaja de que en el grid mostramos únicamente las columnas relevantes no necesariamente todos los campos, pues por ejemplo un registro podría tener que será, unos 40 campos distintos y mostrarlos todos no tendría caso. De esta forma optimizas la velocidad de tu aplicación, el uso de memoría y las querys son mucho más rápidas, más a aún si es un sistema que funciona en línea. Mi regla de oro para este tipo de casos es traer del servidor la menor cantidad de datos posibles. |
muchas gracias me ayudo mucho lo que me dijeron ya lo pude solucionar
|
marcoi sería bueno que compartieras tu solución así ayudas a quien tenga el mismo problema que tú.
|
mi solucion
mi solucion fue la siguiente programandola en un boton
procedure TForm1.Button6Click(Sender: TObject); begin if radiobutton1.Checked =true then begin datamodule1.productos.SetKey; datamodule1.productos.FieldValues['codigo']:=edit1.Text; if not datamodule1.productos.GotoKey then begin messagedlg('NO EXISTE ESTE CODIGO',mtinformation,[mbok],0); end; end; if radiobutton2.Checked= true then begin datamodule1.productos.Locate('producto', edit1.Text,[loPartialKey,loCaseInsensitive]); end; end; |
Excelente solución, solo hay que anotar que para usar GotoKey es necesario que la tabla en cuestión tenga el índice correspondiente sobre el campo de búsqueda, que en tu caso era 'codigo'. Tomando en cuenta este detalle tu solución es la adecuada.
|
La franja horaria es GMT +2. Ahora son las 10:03:24. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi