PDA

Ver la Versión Completa : Leer datos mientras se ingresan en un dbgrid


aromigaret
28-10-2015, 19:51:51
Hola, estoy desarrollando un sistema en el cual, en la celda de un dbgrid, se ingresa una palabra, que a medida que se va escribiendo, en un segundo dbgrid se va filtrando los registros de una tabla ado que inicien con la palabra que se esta ingresando. Lo he hecho con onkeydown sobre el primer dbgrid, capturo cada tecla presionada y voy formando una cadena que la uso para filtrar en la tabla ado. Pero quería saber si hay una forma mas sencilla o alguna función que capture lo que se ingresa en un dbgrid. Desde ya muchas gracias al que me pueda aportar algún dato.

roman
28-10-2015, 20:31:22
Quizá valdría la pena que explicaras un poco más la situación: por tu descripción, el filtro no parece ser una tarea adecuada para un dbgrid. Más bien poner un TEdit normal y filtrar con base a su contenido.

// Saludos

aromigaret
02-11-2015, 20:04:54
Perdón Roman, estuve sin internet hasta hoy. Voy a tratar de ser mas claro. En un campo del primer dbgrid, el usuario escribe las primeras palabras de una descripción de mercadería, a medida que esta escribiendo, en el segundo dbgrid, aparecen los artículos de tabla 'artículos' que inician con las letras que esta ingresando. Ejemplo, en el primero escribe 'PAL' y en el segundo solo aparecen los artículos que inicien con 'PAL'. La idea es que no presione la tecla Enter para que filtre, sino, a medida que va escribiendo letra por letra, lo haga. Pero al NO presionar Enter, el valor que se ingresa,no esta actualizado en la tabla donde apunta el primer Dbgrid. Por eso leo letra por letra usando el OnkeyDown, voy pegando las letras y con ellas filtro en la segunda tabla. Espero haber sido claro.

Casimiro Notevi
02-11-2015, 20:07:50
¿Por qué usas un dbgrid para que teclee el usuario el artículo que busca?

aromigaret
03-11-2015, 18:53:57
Casimiro, te adjunte un .pdf, para mostrarte la interfaz de usuario que utilizo.
http://s2.subirimagenes.com/otros/9487453pal.jpg

AgustinOrtu
03-11-2015, 19:29:26
Sigo pensando que ingresando el texto en un edit es mejor que dos grid

aromigaret
03-11-2015, 21:51:33
Agustinortu, estéticamente no me gusta que se ingrese la carga de una factura atraves de un edit. No pongo en discucion cual es la ideal, simplemente me parece mas amigable el poder navegar por cualquier fila y columna y modificar a "piacere", sin tener que ir a un edit para modificar algo. Pero solo es mi modesto punto de vista. Pero mas alla de cual es la mejor opcion, mi pregunta es si alguien puede aportarme información de como leer los datos de un dbgrid a medida que se ingresan sin tener que presionar "enter".

roman
03-11-2015, 22:43:06
Por favor acláreme esto:

El usuario escribe en el primer dbgrid las primeras letras del nombre de un producto. Con ello se filtra el listado del segundo dbgrid. Ok. ¿Y luego? ¿Qué se hace con ese filtrado? ¿Se selecciona un elemento del segundo dbgrid y se implanta en el primero? Pero entonces ¿ese primer dbgrid es, a la vez, fuente de datos y receptor de datos? O bien, ¿el filtrado es sólo para que el capturista sepa que escribir? Pero la factura debería tener el ID del producto y no todo el nombre.

Es por ello que te te pedimos que aclares y las sugerencias van más allá de una simple estética en la presentación de los datos.

Desde mi perspectiva, para dar de alta un elemento de una factura, lo más práctico para el capturista sería:


Insertar un nuevo registro
Para capturar el producto se abre una nueva ventana con dos elementos: un edit y un dbgrid. En el primero se escriben las primeras letras del producto y el segundo filtra según lo escrito.
El capturista selecciona un elemento del debgrid filtrado en cuanto localice el producto.
Oprime OK y se cierra la ventana auxiliar capturando el ID del producto seleccionado.
El ID de producto se graba en el registro actual de la factura.


// Saludos

aromigaret
03-11-2015, 23:22:05
Roman, el funcionamiento del primer dbgrid es así :
primer columna se ingresa cantidad a facturar al presionar "Enter" se pasa a la segunda columna donde se escriben las primeras letras de la descripción a buscar, al mismo instante en el segundo dbgrid, aparecen los artículos que inician con las letras introducidas. Luego hay varias opciones para el operador:
1- si el artículo es el primero de la lista, estando en el 1er dbgrid, presiona enter y se carga dicho artículo con su marca, precio y realiza el subtotal.
2 -si el articulo esta en otra posición, con el mouse o presionando la tecla "down", pasa al segundo dbgrid y escoge el o los artículos a cargar (ya que está habilitada la opción multiselect) y al presionar "enter" el o los artículos seleccionados se cargan en el primer dbgrid, haciendo más rápida la carga ya que solo resta poner cantidades. Hoy funciona bien capturando con el evento onkeydown, las teclas presionadas , pero en mi afán de perfeccionar el código quisiera saber si hay algún buffer o función que examinar en el dbrid para tomar lo que se carga y no una letra por letra
.

ecfisa
04-11-2015, 01:10:24
Hola aromigaret.

...quisiera saber si hay algún buffer o función que examinar en el dbrid para tomar lo que se carga y no una letra por letra
No voy a omitir opinión sobre el modo de ingreso y tampoco sé si esta opción es mejor que lo que has implementado. Pero respondiendo a tu consulta, creo que podrías usar el objeto TInplaceEdit de modo similar a este ejemplo :

procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
var
s : string;
begin
if DBGrid1.EditorMode and (DBGrid1.SelectedField.FieldName = 'ARTICULO') then
begin
s := TInPlaceEdit(DBGrid1.Controls[0]).Text;
if Key in ['A'..'Z','Á','É','Í','Ú','Ñ'] then // (y demás caracteres que desees )
s := s + Key
else if Key = #8 then
Delete(s, Length(s), 1);

tuQuery.Close;
tuQuery.SQL.Clear;
tuQuery.SQL.Add('SELECT ARTICULO, STOCK, PRECIO, IVA FROM PRODUCTO');
tuQuery.SQL.Add('WHERE ARTICULO LIKE :DET ORDER BY ARTICULO');
tuQuery.ParamByName('DET').AsString := s + '%';
tuQuery.Open;
end;
end;

Salida:
http://s4.postimg.org/xl6q8f53x/incremental.gif

De todos modos, recuerda que si estas trabajando en red, las búsquedas incrementales pueden tornar todo lento ya que aumentan el tráfico desde y hacia el servidor.

Saludos :)

aromigaret
04-11-2015, 16:33:23
Muchas gracias ecfisa, eso me servirá.
Gracias por el comentario del trafico en red, pero este sistema lo hice para que mis clientes me envíen sus pedidos atraves del mismo, sin la necesidad de recordar los códigos de la mercadería.