Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   Leer datos mientras se ingresan en un dbgrid (https://www.clubdelphi.com/foros/showthread.php?t=89286)

aromigaret 28-10-2015 19:51:51

Leer datos mientras se ingresan en un dbgrid
 
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

1 Archivos Adjunto(s)
Casimiro, te adjunte un .pdf, para mostrarte la interfaz de usuario que utilizo.

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:
  1. Insertar un nuevo registro
  2. 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.
  3. El capturista selecciona un elemento del debgrid filtrado en cuanto localice el producto.
  4. Oprime OK y se cierra la ventana auxiliar capturando el ID del producto seleccionado.
  5. 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.
Cita:

Empezado por aromigaret (Mensaje 498818)
...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 :
Código Delphi [-]
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:


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.


La franja horaria es GMT +2. Ahora son las 06:21:40.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi