Ir al contenido



Foto

Tutorial (Como hacer un programa de Facturacion) 2


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

#1 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

Escrito 16 febrero 2012 - 06:27

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. (y)
Como siempre este es para novatos, así que no le tengáis miedo, es muy sencillo de entender.
Saludos

Seguimos con los detalles........

  • 0

#2 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

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. (y)
Imagen Enviada

Ahora vamos con el código:
Dadle dobleclick al form (evento OnCreate) y poned este código:



delphi
  1. procedure TFFacturaDBG.FormCreate(Sender: TObject);
  2. begin
  3.   DbGrid1.Columns[0].ButtonStyle:= cbsEllipsis; // creamos un botón en la primera columna
  4.   DateTimePicker1.Date:= Now;
  5.   ADOQuery2.SQL.Text:='SELECT DISTINCTROW Max([Factura].[CodFactura])AS [CodFacturaa]FROM Factura';
  6.   ADOQuery2.Open;
  7.   ECodFactura.Text:= IntToStr(ADOQuery2.Fields[0].AsInteger+1);
  8. 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). (y)

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
  1. Procedure TFFacturaDBG.CargaFact;
  2. begin
  3.   ADOQuery1.SQL.Text:= 'Select * From Factura';
  4.   ADOQuery1.SQL.Add('WHERE CodFactura = '+ECodFactura.Text);
  5.   ADOQuery1.Open;
  6.   ADOQuery1.Append;
  7.   Suma;
  8. end;



Procedimiento Suma:
Este procedimiento lo que hace es simplemente totalizar la factura.



delphi
  1. Procedure TFFacturaDBG.Suma;
  2. begin
  3.   ADOQuery3.SQL.Text:= 'SELECT DISTINCTROW Sum([Factura].[MntSubTotal]) AS [SubTotal], Sum([Factura].[MntDescuento]) AS [Descuento],'+
  4.                         ' Sum([Factura].[MntImpuesto]) AS [Impuesto], Sum([Factura].[MntTotal]) AS [Total]'+
  5.                         ' FROM Factura ';
  6.   ADOQuery3.SQL.Add('WHERE Factura.CodFactura = '+ECodFactura.Text);
  7.   AdoQuery3.Open;
  8.   ESSubTotal.Text := ADOQuery3.Fields[0].AsString;
  9.   ESDescuento.Text := ADOQuery3.Fields[1].AsString;
  10.   ESImpuesto.Text := ADOQuery3.Fields[2].AsString;
  11.   ETotalFact.Text := ADOQuery3.Fields[3].AsString;
  12. end;



También vamos a llamar a estos procedimientos desde el evento Onshow del nuevo form factura en el que estamos trabajando.



delphi
  1. procedure TFFacturaDBG.FormShow(Sender: TObject);
  2. begin
  3.   CargaFact;
  4.   Suma;
  5. end;



Seguimos........
Saludos
  • 0

#3 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

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) :)



delphi
  1. procedure TFFacturaDBG.Button3Click(Sender: TObject);
  2. begin
  3.     FMantClientes:=TFMantClientes.Create(self);
  4.   try
  5.     FMantClientes.ShowModal;
  6.   finally
  7.   If FMantClientes.Cod_Cliente <> '' then
  8.   ECodCliente.Text := FMantClientes.Cod_Cliente;
  9.   Label2.Caption:= QuotedStr(FMantClientes. NombreCliente);
  10.   EVendedor.Text:= FMantClientes.Vendedor;
  11.   FMantClientes.Free;
  12.   end;
  13.  
  14. 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
  1. procedure TFFacturaDBG.DBGrid1EditButtonClick(Sender: TObject);
  2. begin
  3.   If ADOQuery1CodArticulo.AsString = '' then
  4.   Begin
  5.     BuscaArticulo:=TBuscaArticulo.Create(self);
  6.   try
  7.       BuscaArticulo.ShowModal;
  8.   finally
  9.   CargaFact;
  10.   ADOQuery1.Append;
  11.   BuscaArticulo.Free;
  12.   // hace la suma
  13.   Suma;
  14.   end;
  15.   end
  16.   else
  17.   if MessageBox(Handle,
  18.                 PChar('Esta seguro que desea borrar este Itemn ?'),
  19.                 PChar('Borrar '),
  20.                 MB_OKCANCEL + MB_ICONQUESTION + MB_DEFBUTTON1 + MB_APPLMODAL) = IDOK then
  21.   begin
  22.   DBNavigator1.BtnClick(nbDelete);
  23.   CargaFact;
  24.   Suma;
  25.   end;
  26.  
  27. 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
  1. procedure TFFacturaDBG.Button1Click(Sender: TObject);
  2. begin
  3.   try
  4.   QRFactura:=TQRFactura.Create(self);
  5.   QRFactura.ADOQuery1.SQL.Add(' WHERE Factura.CodFactura = '+ECodFactura.Text+'');
  6.   QRFactura.ADOQuery1.Open;
  7.  
  8.   QRFactura.ADOQuery2.SQL.Add(' WHERE Clientes.CodCliente = '+ECodCliente.Text);
  9.   QRFactura.ADOQuery2.Open;
  10.   QRFactura.Preview;
  11.   finally
  12.   QRFactura.Free;
  13.   end;
  14. 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
  1. procedure TFFacturaDBG.ECodFacturaChange(Sender: TObject);
  2. begin
  3.   CargaFact;
  4. 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
  1. 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
  • 0

#4 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

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).
Imagen Enviada
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
  • 0

#5 Caral

Caral

    Advanced Member

  • Administrador
  • 4.241 mensajes
  • LocationCosta Rica

Escrito 16 febrero 2012 - 08:05

Hola
Seguimos.....
El evento oncreate:



delphi
  1. procedure TBuscaArticulo.FormCreate(Sender: TObject);
  2. begin
  3.   ATArticulos.Open;
  4. 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
  1. procedure TBuscaArticulo.Edit1Change(Sender: TObject);
  2. Var Filtro: String;
  3. begin
  4.   If (Edit1.Text <> '') then
  5.       Begin
  6.       ATArticulos.Filtered := False;
  7.       If CBFiltro.Text = 'Código' then Filtro := 'CodProducto Like '''+Edit1.Text + '*'''
  8.       else If CBFiltro.Text = 'Descripción' then Filtro := 'Descripcion Like '''+ Edit1.Text + '*''';
  9.       ATArticulos.Filter := Filtro;
  10.       ATArticulos.Filtered := True
  11.       end
  12.       else ATArticulos.Filtered := False;
  13. end;



El botón aceptar, el mas importante:



delphi
  1. procedure TBuscaArticulo.Button1Click(Sender: TObject);
  2. Var
  3.   a,b,c,d,e,f,g : real;
  4. begin
  5. a:= StrTofloat(Edit2.Text); //cantidad
  6. b:= StrTofloat(Edit3.Text); //pVenta
  7. f:= StrTofloat(Edit4.Text); //Impuesto
  8. d:= StrTofloat(Edit5.Text); // Descuento
  9. c:= (a * b); // subtotal
  10. e:= c * f / 100;  // impuesto
  11. g:= (c - d) + e;  // Total
  12. // Inserta en la tabla factura
  13. 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)+', '+
  14.                         QuotedStr(FFacturaDBG.EVendedor.Text)+', '+QuotedStr(Edit3.Text)+', '+QuotedStr(Edit4.Text)+', '+FloatToStr(c)+', '+QuotedStr(Edit5.Text)+ ', '+FloatToStr(e)+ ', '+FloatToStr(g)+')';
  15. AdoQuery1.Parameters.ParamByName('fecha').Value:= DateToStr(FFacturaDBG.DateTimePicker1.Date);
  16. AdoQuery1.ExecSQL;
  17. // actualiza el inventario
  18. AdoQuery2.SQL.Text:= 'Update Articulos set disponible = disponible - :a Where CodProducto = :b';
  19. AdoQuery2.Parameters[0].Value:= FloatToStr(a);
  20. AdoQuery2.Parameters[1].Value:= Cod;
  21. AdoQuery2.ExecSQL;
  22. Close;
  23. 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
  1. procedure TBuscaArticulo.DSArticulosDataChange(Sender: TObject;
  2.   Field: TField);
  3. begin
  4.   Edit3.Text:= FloatToStr(ATArticulosPrecioVA.Value);
  5.   Cod:= ATArticulosCodProducto.AsString;
  6.   Des:= ATArticulosDescripcion.asString;
  7. end;



Si, también lo se, donde están declaradas esas variables ?, bien, aquí, en el inicio del form:



delphi
  1. var
  2.   BuscaArticulo: TBuscaArticulo;
  3.   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. (y)

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 . (y)

Bueno, ya podeis correr el programa........
Espero os sirva de practica y ojala de algún conocimiento adicional, aunque sea básico. (b)

Saludos

Os dejo el código completo con los cambios, como siempre.

Listo el Tutorial de Facturación 3, espero os sirva. (y)
Aqui os dejo el enlace.

Archivos adjuntos


  • 0

#6 decodito

decodito

    Newbie

  • Miembros
  • Pip
  • 1 mensajes

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.
  • 0