ABM dentro de un DBGrid
Comenzado por
Fleon
, jul 26 2011 12:04
9 respuestas en este tema
#1
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
Fleon XD
#2
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":
Espero te sirva de algo.
Saludos
- 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
Lineas_De_Factura.Edit; Lineas_De_Factura.FieldByName('Articulo').value:= Seleccion.FieldByName('Articulo').value; Lineas_De_Factura.FieldByName('Precio_Unitario').value:= Seleccion.FieldByName('Precio_Unitario').value;
Espero te sirva de algo.
Saludos
#3
Escrito 26 julio 2011 - 01:26
Te termino de responder, el evento en que llamarías la consulta sería el OnColExit:
delphi
procedure TForm1.DBGrid1ColExit(Sender: TObject); begin if DBGrid1.SelectedIndex = 0 then // Suponiendo que 0 es el índice de la columna del código begin Consulta_Seleccion.Close; Consulta_Seleccion.Params[0].value := Lineas_de_Factura.FieldByName('Codigo').value; Consulta_Seleccion.Open; if not Consulta_Seleccion.IsEmpty then //Suponiendo que el campo código es único begin Lineas_De_Factura.Edit; Lineas_De_Factura.FieldByName('Articulo').value:= Seleccion.FieldByName('Articulo').value; Lineas_De_Factura.FieldByName('Precio_Unitario').value:= Seleccion.FieldByName('Precio_Unitario').value; end; end; end;
#4
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
Fleon XD
#5
Escrito 28 julio 2011 - 12:19
Pasa el mismo procedimiento al evento OnKeyPress del DBGrid, más o menos asi:
delphi
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char); begin if key = #13 then if DBGrid1.SelectedIndex = 0 then // Suponiendo que 0 es el índice de la columna del código begin Consulta_Seleccion.Close; Consulta_Seleccion.Params[0].value := Lineas_de_Factura.FieldByName('Codigo').value; Consulta_Seleccion.Open; if not Consulta_Seleccion.IsEmpty then //Suponiendo que el campo código es único begin Lineas_De_Factura.Edit; Lineas_De_Factura.FieldByName('Articulo').value:= Seleccion.FieldByName('Articulo').value; Lineas_De_Factura.FieldByName('Precio_Unitario').value:= Seleccion.FieldByName('Precio_Unitario').value; end; end; end;
#6
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
Fleon XD
#7
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.
#8
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?.
#9
Escrito 28 julio 2011 - 05:30
Así:
delphi
procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then case DBGrid1.SelectedIndex of 0: // Enter en la columna de índice 0 begin // Aquí puedes poner el procedimiento que quieras DBGrid1.SelectedIndex := 5; // Aquí puedes poner el índice de la columna a la que quieras saltar end; 1: // Enter en la columna de índice 1 begin // Lo que quieras DBGrid1.SelectedIndex := 6; // El índice de la columna que quieras end; 2: // Enter en la columna de índice 2 begin // Lo que quieras end; end; end;
#10
Escrito 28 julio 2011 - 06:01
Vaya, eso sí que fue sencillo, no se me hubiese ocurrido, gracias amigo Wilson, ¡Me encanta DELPHIACCESS!