Ir al contenido


Foto

ABM dentro de un DBGrid


  • Por favor identifícate para responder
9 respuestas en este tema

#1 Fleon

Fleon

    Advanced Member

  • Miembros
  • PipPipPip
  • 172 mensajes
  • LocationRepública Dominicana

Escrito 26 julio 2011 - 12:04

Hola a todos, he estado buscando en la red y en varios foros y no encuentro información de cómo hacer un ABM dentro de un DBGrid, me explico, quiero hacer un formulario de facturación, con la primera columna del DBGrid ingresar un código de artículo y si es correcto llene la información de las demás columnas, así como al dar enter en la última columna se crea una nueva fila, etc, etc. Espero su ayuda.

Fleon XD

  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 26 julio 2011 - 12:53

A ver amigo, supongamos que tienes un dataset de nombre (Lineas_de_Factura) con las líneas de detalle de una factura con los campos  típicos, más o menos como en esta estructura:


- Codigo: Visible
- Cantidad: Visible
- Id_Articulo: Invisible pero necesario
- Precio_Unitario:  Visible, se obtendrá a partir de una consulta que llamaremos "Seleccion"
. Articulo: Visible, se obtendrá a partir de una consulta que llamaremos "Seleccion"
- Cantidad_Por_Precio_Unitario: Visible, campo calculado.


La idea es lanzar una consulta contra la tabla artículos pasándole como parámetro el código (según tu necesidad, yo personalmente no uso el código, excepto que éste sea ingresado desde un escaner de código de barras,  porque en una tabla con 5.000 artículos es muy improbable que un digitador se los sepa todos, en su defecto yo utilizo el propio nombre del artículo o partes de este) y que devuelva los campos del artículo que sean necesarios (para nuestro ejemplo deberá devolver el precio unitario y el nombre del artículo).


Con el resultado de la consulta "seleccion" simplemente le pasas los valores al dataset "Líneas_Factura":




delphi
  1. Lineas_De_Factura.Edit;
  2. Lineas_De_Factura.FieldByName('Articulo').value:= Seleccion.FieldByName('Articulo').value;
  3. Lineas_De_Factura.FieldByName('Precio_Unitario').value:= Seleccion.FieldByName('Precio_Unitario').value;




Espero te sirva de algo.


Saludos


  • 0

#3 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 26 julio 2011 - 01:26

Te termino de responder, el evento en que llamarías la consulta sería el OnColExit:




delphi
  1. procedure TForm1.DBGrid1ColExit(Sender: TObject);
  2. begin
  3.   if  DBGrid1.SelectedIndex = 0 then // Suponiendo que 0 es el índice  de la columna del código
  4.     begin
  5.       Consulta_Seleccion.Close;
  6.       Consulta_Seleccion.Params[0].value := Lineas_de_Factura.FieldByName('Codigo').value;
  7.       Consulta_Seleccion.Open;
  8.       if not Consulta_Seleccion.IsEmpty then //Suponiendo que el campo código es único
  9.         begin
  10.           Lineas_De_Factura.Edit;
  11.           Lineas_De_Factura.FieldByName('Articulo').value:= Seleccion.FieldByName('Articulo').value;
  12.           Lineas_De_Factura.FieldByName('Precio_Unitario').value:= Seleccion.FieldByName('Precio_Unitario').value;
  13.         end;
  14.     end;
  15. end;


  • 0

#4 Fleon

Fleon

    Advanced Member

  • Miembros
  • PipPipPip
  • 172 mensajes
  • LocationRepública Dominicana

Escrito 28 julio 2011 - 12:02

Muchas gracias Wilson, me funciona de maravillas, pero..¿Hay manera de hacerlo cuando le das enter y no al salir de la columna?.

Fleon XD
  • 0

#5 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 28 julio 2011 - 12:19

Pasa el mismo procedimiento al evento OnKeyPress del DBGrid, más o menos asi:




delphi
  1. procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
  2. begin
  3. if key = #13 then
  4.   if  DBGrid1.SelectedIndex = 0 then // Suponiendo que 0 es el índice  de la columna del código
  5.     begin
  6.       Consulta_Seleccion.Close;
  7.       Consulta_Seleccion.Params[0].value := Lineas_de_Factura.FieldByName('Codigo').value;
  8.       Consulta_Seleccion.Open;
  9.       if not Consulta_Seleccion.IsEmpty then //Suponiendo que el campo código es único
  10.         begin
  11.           Lineas_De_Factura.Edit;
  12.           Lineas_De_Factura.FieldByName('Articulo').value:= Seleccion.FieldByName('Articulo').value;
  13.           Lineas_De_Factura.FieldByName('Precio_Unitario').value:= Seleccion.FieldByName('Precio_Unitario').value;
  14.         end;
  15.     end;
  16. end;


  • 0

#6 Fleon

Fleon

    Advanced Member

  • Miembros
  • PipPipPip
  • 172 mensajes
  • LocationRepública Dominicana

Escrito 28 julio 2011 - 01:59

Excelente amigo Wilson!, voy a aprovechar este mismo hilo para expone mis dudas sobre el tema, ahora, ¿cómo haría el foco a una celda específica?.

Fleon XD
  • 0

#7 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 28 julio 2011 - 03:31

Excelente amigo Wilson!, voy a aprovechar este mismo hilo para expone mis dudas sobre el tema, ahora, ¿cómo haría el foco a una celda específica?.

Fleon XD



Explícate un poco más.
  • 0

#8 Fleon

Fleon

    Advanced Member

  • Miembros
  • PipPipPip
  • 172 mensajes
  • LocationRepública Dominicana

Escrito 28 julio 2011 - 05:07

Explícate un poco más.


Por ejemplo, si en la primera columna le doy ENTER normalmente el foco se queda en esa misma celda, pero quisiera que al dar ENTER el foco pase al celda de otra columna, por ejemplo, en la tercera columna, ¿me explico?.
  • 0

#9 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 28 julio 2011 - 05:30

Así:




delphi
  1. procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
  2. begin
  3.   if Key = #13 then
  4.     case DBGrid1.SelectedIndex of
  5.       0: // Enter en la columna de índice 0
  6.         begin
  7.           // Aquí puedes poner el procedimiento que quieras
  8.           DBGrid1.SelectedIndex := 5; // Aquí puedes poner el índice de la columna a la que quieras saltar
  9.         end;
  10.       1: // Enter en la columna de índice 1
  11.         begin
  12.           // Lo que quieras
  13.           DBGrid1.SelectedIndex := 6; // El índice de la columna que quieras
  14.         end;
  15.       2: // Enter en la columna de índice 2
  16.         begin
  17.           // Lo que quieras
  18.         end;
  19.     end;
  20. end;


  • 0

#10 Fleon

Fleon

    Advanced Member

  • Miembros
  • PipPipPip
  • 172 mensajes
  • LocationRepública Dominicana

Escrito 28 julio 2011 - 06:01

Vaya, eso sí que fue sencillo, no se me hubiese ocurrido, gracias amigo Wilson, ¡Me encanta DELPHIACCESS! (y)
  • 0




IP.Board spam blocked by CleanTalk.