Hola
Me he decidido a hacer esta segunda parte por algunas preguntas que he recibido, sobre todo en relación al componente DBgrid y como usarlo para hacer la factura directamente.
Os aconsejo que veáis la primera parte de este tutorial (si no lo habéis visto) para tener las cosas mas claras.
En este tutorial lo que pretendo es solamente hacer un nuevo form de factura para que podáis ver la diferencia, ademas de crear un form para la búsqueda de los artículos.
La BD y el código del primer tutorial es la base para este así que bajadlo si no lo habéis hecho.
Como siempre este es para novatos, así que no le tengáis miedo, es muy sencillo de entender.
Saludos
Seguimos con los detalles........
Tutorial (Como hacer un programa de Facturacion) 2
Comenzado por
Caral
, feb 16 2012 06:27
5 respuestas en este tema
#1
Escrito 16 febrero 2012 - 06:27
#2
Escrito 16 febrero 2012 - 06:53
Hola
Seguimos con el nuevo form de factura.
Primero cread un nuevo form y llamadlo FFacturaDBG (DBG es por Dbgrid..)
Abrid el form de factura anterior (FFactura) y copiad y pegad en el form nuevo los componentes que se ven en la foto.
En realidad son prácticamente los mismos e intuitivos.
Los arreglos con el componente panel son opcionales, yo los he hecho por gusto.
Ahora vamos con el código:
Dadle dobleclick al form (evento OnCreate) y poned este código:
Como veis aquí esta el primer cambio importante, hemos creado en el dbgrid un boton que nos servira para llamar al form de búsqueda de artículos que haremos después, ademas borrara el item que no se necesite (usando el mismo).
Por lo demás, si os dais cuenta es muy similar al antiguo form de factura (facil).
Para que empecéis a manejar el concepto de los procedimientos propios vamos a crear dos que nos servirán para no repetir código:
Procedimiento cargar factura:
Este lo que hace es mostrarnos los item de la factura segun su numero y llamarnos al segundo procedimiento que crearemos:
Procedimiento Suma:
Este procedimiento lo que hace es simplemente totalizar la factura.
También vamos a llamar a estos procedimientos desde el evento Onshow del nuevo form factura en el que estamos trabajando.
Seguimos........
Saludos
Seguimos con el nuevo form de factura.
Primero cread un nuevo form y llamadlo FFacturaDBG (DBG es por Dbgrid..)
Abrid el form de factura anterior (FFactura) y copiad y pegad en el form nuevo los componentes que se ven en la foto.
En realidad son prácticamente los mismos e intuitivos.
Los arreglos con el componente panel son opcionales, yo los he hecho por gusto.
Ahora vamos con el código:
Dadle dobleclick al form (evento OnCreate) y poned este código:
delphi
procedure TFFacturaDBG.FormCreate(Sender: TObject); begin DbGrid1.Columns[0].ButtonStyle:= cbsEllipsis; // creamos un botón en la primera columna DateTimePicker1.Date:= Now; ADOQuery2.SQL.Text:='SELECT DISTINCTROW Max([Factura].[CodFactura])AS [CodFacturaa]FROM Factura'; ADOQuery2.Open; ECodFactura.Text:= IntToStr(ADOQuery2.Fields[0].AsInteger+1); end;
Como veis aquí esta el primer cambio importante, hemos creado en el dbgrid un boton que nos servira para llamar al form de búsqueda de artículos que haremos después, ademas borrara el item que no se necesite (usando el mismo).
Por lo demás, si os dais cuenta es muy similar al antiguo form de factura (facil).
Para que empecéis a manejar el concepto de los procedimientos propios vamos a crear dos que nos servirán para no repetir código:
Procedimiento cargar factura:
Este lo que hace es mostrarnos los item de la factura segun su numero y llamarnos al segundo procedimiento que crearemos:
delphi
Procedure TFFacturaDBG.CargaFact; begin ADOQuery1.SQL.Text:= 'Select * From Factura'; ADOQuery1.SQL.Add('WHERE CodFactura = '+ECodFactura.Text); ADOQuery1.Open; ADOQuery1.Append; Suma; end;
Procedimiento Suma:
Este procedimiento lo que hace es simplemente totalizar la factura.
delphi
Procedure TFFacturaDBG.Suma; begin ADOQuery3.SQL.Text:= 'SELECT DISTINCTROW Sum([Factura].[MntSubTotal]) AS [SubTotal], Sum([Factura].[MntDescuento]) AS [Descuento],'+ ' Sum([Factura].[MntImpuesto]) AS [Impuesto], Sum([Factura].[MntTotal]) AS [Total]'+ ' FROM Factura '; ADOQuery3.SQL.Add('WHERE Factura.CodFactura = '+ECodFactura.Text); AdoQuery3.Open; ESSubTotal.Text := ADOQuery3.Fields[0].AsString; ESDescuento.Text := ADOQuery3.Fields[1].AsString; ESImpuesto.Text := ADOQuery3.Fields[2].AsString; ETotalFact.Text := ADOQuery3.Fields[3].AsString; end;
También vamos a llamar a estos procedimientos desde el evento Onshow del nuevo form factura en el que estamos trabajando.
delphi
procedure TFFacturaDBG.FormShow(Sender: TObject); begin CargaFact; Suma; end;
Seguimos........
Saludos
#3
Escrito 16 febrero 2012 - 07:07
Hola
Seguimos.....
Para que os quede claro, el botón Buscar (cliente) contiene el mismo código que el del form factura anterior, en esto solamente se me ocurrió añadirle el vendedor (cuestión de gustos)
Vamos con el Dbgrid:
Este componente tiene un evento que se llama DBGrid1EditButtonClick este es el que hace que funcione el boton que creamos en el evento oncreate.
Posicionaros en el dbgrid y buscad ese evento, dadle doble click y colocada este código:
Bien, como veis primero creamos una condición con IF. y de acuerdo al campo codarticulo del query1 (este es persistente).
Dependiendo de cumplirse o no se abrirá el form de búsqueda de artículos (que crearemos) o dará un click al dbnavigator, ademas llamara a los dos procedimientos que creamos.
Como os habréis imaginado el botón Imprimir llamara al qreport:
Otra cosa que he cambiado es la posibilidad de ver una factura existente, esto lo haremos en el edit ECodFactura en el evento onchange:
No os olvidéis de colocar el uses de las unidades que necesitaremos, en este caso esta UBuscaArticulo que no hemos hecho, todavía.
Esto demuestra que creando los procedimientos nos ahorramos código, espacio, trabajo, etc......
Sencillo..., Seguimos con el form búsqueda de artículos......
Saludos
Seguimos.....
Para que os quede claro, el botón Buscar (cliente) contiene el mismo código que el del form factura anterior, en esto solamente se me ocurrió añadirle el vendedor (cuestión de gustos)
delphi
procedure TFFacturaDBG.Button3Click(Sender: TObject); begin FMantClientes:=TFMantClientes.Create(self); try FMantClientes.ShowModal; finally If FMantClientes.Cod_Cliente <> '' then ECodCliente.Text := FMantClientes.Cod_Cliente; Label2.Caption:= QuotedStr(FMantClientes. NombreCliente); EVendedor.Text:= FMantClientes.Vendedor; FMantClientes.Free; end; end;
Vamos con el Dbgrid:
Este componente tiene un evento que se llama DBGrid1EditButtonClick este es el que hace que funcione el boton que creamos en el evento oncreate.
Posicionaros en el dbgrid y buscad ese evento, dadle doble click y colocada este código:
delphi
procedure TFFacturaDBG.DBGrid1EditButtonClick(Sender: TObject); begin If ADOQuery1CodArticulo.AsString = '' then Begin BuscaArticulo:=TBuscaArticulo.Create(self); try BuscaArticulo.ShowModal; finally CargaFact; ADOQuery1.Append; BuscaArticulo.Free; // hace la suma Suma; end; end else if MessageBox(Handle, PChar('Esta seguro que desea borrar este Itemn ?'), PChar('Borrar '), MB_OKCANCEL + MB_ICONQUESTION + MB_DEFBUTTON1 + MB_APPLMODAL) = IDOK then begin DBNavigator1.BtnClick(nbDelete); CargaFact; Suma; end; end;
Bien, como veis primero creamos una condición con IF. y de acuerdo al campo codarticulo del query1 (este es persistente).
Dependiendo de cumplirse o no se abrirá el form de búsqueda de artículos (que crearemos) o dará un click al dbnavigator, ademas llamara a los dos procedimientos que creamos.
Como os habréis imaginado el botón Imprimir llamara al qreport:
delphi
procedure TFFacturaDBG.Button1Click(Sender: TObject); begin try QRFactura:=TQRFactura.Create(self); QRFactura.ADOQuery1.SQL.Add(' WHERE Factura.CodFactura = '+ECodFactura.Text+''); QRFactura.ADOQuery1.Open; QRFactura.ADOQuery2.SQL.Add(' WHERE Clientes.CodCliente = '+ECodCliente.Text); QRFactura.ADOQuery2.Open; QRFactura.Preview; finally QRFactura.Free; end; end;
Otra cosa que he cambiado es la posibilidad de ver una factura existente, esto lo haremos en el edit ECodFactura en el evento onchange:
delphi
procedure TFFacturaDBG.ECodFacturaChange(Sender: TObject); begin CargaFact; end;
No os olvidéis de colocar el uses de las unidades que necesitaremos, en este caso esta UBuscaArticulo que no hemos hecho, todavía.
delphi
Uses UDataModule, UBuscaArticulo, UFMantClientes, UQRFactura;
Esto demuestra que creando los procedimientos nos ahorramos código, espacio, trabajo, etc......
Sencillo..., Seguimos con el form búsqueda de artículos......
Saludos
#4
Escrito 16 febrero 2012 - 07:44
Hola
Seguimos con el form búsqueda de artículos.....
Creemos un nuevo form y llamemoslo BuscaArticulo
Recordad ir guardando todo, con relación al nombre de las unidades normalmente me gusta anteponerle una U al nombre, así es mas sencillo acordarse.
Bien, como ya somos novatos +1 creo que la imagen es mas que suficiente para darse cuenta de que componentes hay que poner en este nuevo form (si no sabéis o tenéis alguna duda, preguntad).
Con relación al combobox que se ve, los item son:
Descripción y código
Esto por que haremos búsquedas de los artículos por medio de estos.
Otra cosa mas, para que no os perdáis, todos las casillas son Edit, NO DBEdit.
Seguimos con el código.......
Saludos
Seguimos con el form búsqueda de artículos.....
Creemos un nuevo form y llamemoslo BuscaArticulo
Recordad ir guardando todo, con relación al nombre de las unidades normalmente me gusta anteponerle una U al nombre, así es mas sencillo acordarse.
Bien, como ya somos novatos +1 creo que la imagen es mas que suficiente para darse cuenta de que componentes hay que poner en este nuevo form (si no sabéis o tenéis alguna duda, preguntad).
Con relación al combobox que se ve, los item son:
Descripción y código
Esto por que haremos búsquedas de los artículos por medio de estos.
Otra cosa mas, para que no os perdáis, todos las casillas son Edit, NO DBEdit.
Seguimos con el código.......
Saludos
#5
Escrito 16 febrero 2012 - 08:05
Hola
Seguimos.....
El evento oncreate:
Si, ya se, este es el nombre que le di a ADOTable que se ve en la foto.
Como veis, simplemente se abre desde el inicio del form.
Vamos arriba, al edit (buscar) Edit1:
En el evento OnChange:
El botón aceptar, el mas importante:
Este hace prácticamente lo mismo que el botón Guardar del antiguo form factura, solamente le hice algunos cambios para mejorar la practica, compararlos, siempre es bueno.
Ahora nos vamos al datasource que esta ligado al adotable, en este caso lo he llamado DSArticulos.
Vamos al evento OnDataChange, le damos doble click y ponemos esto:
Si, también lo se, donde están declaradas esas variables ?, bien, aquí, en el inicio del form:
Que hace esto ?'??:
Cada vez que se mueve entre los registros cambia el valor de las variables ademas de cambiar el valor del edit3 que contiene el precio del articulo.
Bien, como veis no ha sido nada dificil el cambio.
Por cierto, ha modificado el campo Exento y le he puesto PrecioVenta (para que lo tengáis presente.
Para llamar al nuevo form factura, que llamara a su vez al de búsqueda haced simplemente lo mismo que hicisteis con el anterior, solo que lógicamente usando el nuevo nombre .
Bueno, ya podeis correr el programa........
Espero os sirva de practica y ojala de algún conocimiento adicional, aunque sea básico.
Saludos
Os dejo el código completo con los cambios, como siempre.
Listo el Tutorial de Facturación 3, espero os sirva.
Aqui os dejo el enlace.
Seguimos.....
El evento oncreate:
delphi
procedure TBuscaArticulo.FormCreate(Sender: TObject); begin ATArticulos.Open; end;
Si, ya se, este es el nombre que le di a ADOTable que se ve en la foto.
Como veis, simplemente se abre desde el inicio del form.
Vamos arriba, al edit (buscar) Edit1:
En el evento OnChange:
delphi
procedure TBuscaArticulo.Edit1Change(Sender: TObject); Var Filtro: String; begin If (Edit1.Text <> '') then Begin ATArticulos.Filtered := False; If CBFiltro.Text = 'Código' then Filtro := 'CodProducto Like '''+Edit1.Text + '*''' else If CBFiltro.Text = 'Descripción' then Filtro := 'Descripcion Like '''+ Edit1.Text + '*'''; ATArticulos.Filter := Filtro; ATArticulos.Filtered := True end else ATArticulos.Filtered := False; end;
El botón aceptar, el mas importante:
delphi
procedure TBuscaArticulo.Button1Click(Sender: TObject); Var a,b,c,d,e,f,g : real; begin a:= StrTofloat(Edit2.Text); //cantidad b:= StrTofloat(Edit3.Text); //pVenta f:= StrTofloat(Edit4.Text); //Impuesto d:= StrTofloat(Edit5.Text); // Descuento c:= (a * b); // subtotal e:= c * f / 100; // impuesto g:= (c - d) + e; // Total // Inserta en la tabla factura AdoQuery1.SQL.Text := 'Insert into Factura Values ('+QuotedStr(FFacturaDBG.ECodFactura.Text)+', :fecha, '+QuotedStr(FFacturaDBG.ECodCliente.Text)+ ', '+QuotedStr(ATArticulosCodProducto.AsString)+ ', '+QuotedStr(ATArticulosDescripcion.AsString)+ ', '+QuotedStr(Edit2.Text)+ ', '+QuotedStr(FFacturaDBG.ComboBox1.Text)+', '+QuotedStr(FFacturaDBG.EOCompra.Text)+', '+ QuotedStr(FFacturaDBG.EVendedor.Text)+', '+QuotedStr(Edit3.Text)+', '+QuotedStr(Edit4.Text)+', '+FloatToStr(c)+', '+QuotedStr(Edit5.Text)+ ', '+FloatToStr(e)+ ', '+FloatToStr(g)+')'; AdoQuery1.Parameters.ParamByName('fecha').Value:= DateToStr(FFacturaDBG.DateTimePicker1.Date); AdoQuery1.ExecSQL; // actualiza el inventario AdoQuery2.SQL.Text:= 'Update Articulos set disponible = disponible - :a Where CodProducto = :b'; AdoQuery2.Parameters[0].Value:= FloatToStr(a); AdoQuery2.Parameters[1].Value:= Cod; AdoQuery2.ExecSQL; Close; end;
Este hace prácticamente lo mismo que el botón Guardar del antiguo form factura, solamente le hice algunos cambios para mejorar la practica, compararlos, siempre es bueno.
Ahora nos vamos al datasource que esta ligado al adotable, en este caso lo he llamado DSArticulos.
Vamos al evento OnDataChange, le damos doble click y ponemos esto:
delphi
procedure TBuscaArticulo.DSArticulosDataChange(Sender: TObject; Field: TField); begin Edit3.Text:= FloatToStr(ATArticulosPrecioVA.Value); Cod:= ATArticulosCodProducto.AsString; Des:= ATArticulosDescripcion.asString; end;
Si, también lo se, donde están declaradas esas variables ?, bien, aquí, en el inicio del form:
delphi
var BuscaArticulo: TBuscaArticulo; Cod, Des: String; // aquí mismo
Que hace esto ?'??:
Cada vez que se mueve entre los registros cambia el valor de las variables ademas de cambiar el valor del edit3 que contiene el precio del articulo.
Bien, como veis no ha sido nada dificil el cambio.
Por cierto, ha modificado el campo Exento y le he puesto PrecioVenta (para que lo tengáis presente.
Para llamar al nuevo form factura, que llamara a su vez al de búsqueda haced simplemente lo mismo que hicisteis con el anterior, solo que lógicamente usando el nuevo nombre .
Bueno, ya podeis correr el programa........
Espero os sirva de practica y ojala de algún conocimiento adicional, aunque sea básico.
Saludos
Os dejo el código completo con los cambios, como siempre.
Listo el Tutorial de Facturación 3, espero os sirva.
Aqui os dejo el enlace.
Archivos adjuntos
#6
Escrito 26 septiembre 2013 - 02:30
Lo primero felicidades por el tutorial, llego tarde por las fechas en las que estoy viendo que se realizó jeje.
Me gustaría ver la primera imagen donde muestra el form inicial del tutorial 2 que se ve que con el tiempo el link ha expirado y no comprendo varias cosas si no veo la imagen ya que estoy aprendiendo y necesito guiarme un poco.
Muchisimas gracias por el tutorial y por todo.
Me gustaría ver la primera imagen donde muestra el form inicial del tutorial 2 que se ve que con el tiempo el link ha expirado y no comprendo varias cosas si no veo la imagen ya que estoy aprendiendo y necesito guiarme un poco.
Muchisimas gracias por el tutorial y por todo.