Ir al contenido



Foto

Tutorial (Como hacer un programa de Facturacion) 3


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

#1 Caral

Caral

    Advanced Member

  • Administrador
  • 4.218 mensajes
  • LocationCosta Rica

Escrito 23 febrero 2012 - 01:22

Hola
Esta vez vengo con otro cambio que me parece interesante que aprendáis. (y)
En el tutorial 2 aprendimos a hacer una factura directa con el Dbgrid, esta vez vengo con su competencia, el StringGrid.
Este componente trabaja muy diferente que el dbgrid que solo se conecta al dataset y listo, al StringGrid hay que indicarle donde poner cada dato, eso lo hace mas especifico y aunque es mas código es mas manejable, para mi.
En este vamos a aprender (como hicimos con el dbgrid) a crear botones dentro del componente para poder usarlos posteriormente.
Ademas veremos como añadir registros de una tabla y también eliminarlos basándonos en las lineas, celdas o Rows.
Ademas crearemos otro StringGrid para que nos de los totales de la factura en vez de los edits que usamos con anterioridad.
Sigo también con la creación de procedimientos aparte para no repetir código.
Como siempre os sugiero que empecéis con el primer tutorial para que tengáis mas bases.  (y)

Espero os sea de utilidad y aprendáis algo mas de este Novato. (y)

Seguimos........
Saludos

PD: Como siempre pondré el código completo al final de la explicacion.
Si tenéis dudas, publicarlas, os trataremos de ayudar. (y)
  • 0

#2 Caral

Caral

    Advanced Member

  • Administrador
  • 4.218 mensajes
  • LocationCosta Rica

Escrito 23 febrero 2012 - 01:40

Hola
Seguimos con el nuevo form de factura para el StringGrid.
Primero cread un nuevo form y llamadlo FFacturaSTG (STG es por StringGrid..)
Abrid el form de factura anterior (FFacturaDBG) y copiad y pegad en el form nuevo los componentes que se ven en la foto.
Luego quitadle el DBgrid, cambiadlo por un StringGrid y también quitad los edits que generaban los totales y cambiadlo por otro StringGrid.
Al StringGrid que contendrá los Items de la factura ponedle el nombre de SGFact y al que mostrara los totales ponedle SGTotal.
Hacedlo como se ve en la foto:

Imagen Enviada

Como veis en la foto se aprecian los dos botones que crearemos (por código) para agregar y eliminar items de la factura.

Para que los espacios se mantengan, como la foto, en el StrinGrid (SGFact) poned en la propiedad ColCout = 7 ,en FixedCols = 0 y en FixedRows = 1 (acomodad las celdas con el mouse según la foto)
En el StringGrid (SGTotal) poned en ColCout = 2 ,en FixedCols = 1 y en FixedRows = 0.

En la siguiente parte vamos con código.

Seguimos.......
Saludos
  • 0

#3 Caral

Caral

    Advanced Member

  • Administrador
  • 4.218 mensajes
  • LocationCosta Rica

Escrito 23 febrero 2012 - 01:54

Hola
Seguimos.....
Para que os quede claro, el botón Buscar (cliente) contiene el mismo código que el del form factura anterior, solo copiadlo y Pegadlo en el evento del botón Buscar.

Coloquemos unas variables que nos servirán para almacenar algunos datos:
Como siempre aquí:


delphi
  1. var
  2.   FFacturaSTG: TFFacturaSTG;
  3.   Cuenta : Integer;
  4.   Boton, Boton2: TButton;
  5.  
  6. implementation



Ahora crearemos un Procedimiento (Etiquetas) que sera el que contendrá los nombres de las celdas de nuestros StringGrid:


delphi
  1. Procedure TFFacturaSTG.Etiquetas;
  2. begin
  3.   SGFact.Cells[0,0] := ' + ';
  4.   SGFact.Cells[1,0] := 'Codigo';
  5.   SGFact.Cells[2,0] := 'Descripción';
  6.   SGFact.Cells[3,0] := 'Cantidad';
  7.   SGFact.Cells[4,0] := 'Precio';
  8.   SGFact.Cells[5,0] := 'STotal';
  9.   SGFact.Cells[6,0] := ' - ';
  10.   SGTotal.Cells[0,0] := 'Sub Total';
  11.   SGTotal.Cells[0,1] := 'Descuento';
  12.   SGTotal.Cells[0,2] := 'Impuesto';
  13.   SGTotal.Cells[0,3] := 'Total';
  14.   SGTotal.Cells[1,0] := '0.00';
  15.   SGTotal.Cells[1,1] := '0.00';
  16.   SGTotal.Cells[1,2] := '0.00';
  17.   SGTotal.Cells[1,3] := '0.00';
  18. end;



Vamos con el evento OnCreate del nuevo Form FFacturaSTG.


delphi
  1.   procedure TFFacturaSTG.FormCreate(Sender: TObject);
  2. begin
  3.   Etiquetas; // llama al procedimiento Etiquetas
  4.   DateTimePicker1.Date:= Now; // dia actual
  5.   // Busca el ultimo numero de factura y le aumenta uno.
  6.   ADOQuery2.SQL.Text:='SELECT DISTINCTROW Max([Factura].[CodFactura])AS [CodFacturaa]FROM Factura';
  7.   ADOQuery2.Open;
  8.   ECodFactura.Text:= IntToStr(ADOQuery2.Fields[0].AsInteger+1);
  9.   Cuenta := 1; // le da valor a la variable Cuenta.
  10.  
  11. end;


 
Creamos un Procedimiento que a su vez nos creara los Botones de Agregar y Eliminar Items.


delphi
  1. procedure TFFacturaSTG.CrearBoton(ACol: Integer);
  2. var
  3.   i: Integer;
  4. begin
  5.   for i := SGFact.FixedRows to SGFact.RowCount -1 do
  6.   begin
  7.     // boton añadir
  8.     Boton          := TButton.Create(nil);
  9.     Boton.Caption  := 'Agregar';
  10.     Boton.BoundsRect:= SGFact.CellRect(0, i);
  11.     Boton.ControlStyle := [csClickEvents];
  12.     Boton.OnClick  := BotonClick;
  13.     Boton.Parent    := SGFact;
  14.     SGFact.Objects[0,i] := Boton;
  15.     // boton eliminar
  16.     Boton2          := TButton.Create(nil);
  17.     Boton2.Caption  := 'Eliminar';
  18.     Boton2.BoundsRect:= SGFact.CellRect(6, i);
  19.     Boton2.ControlStyle := [csClickEvents];
  20.     Boton2.OnClick  := Boton2Click;
  21.     Boton2.Parent    := SGFact;
  22.     SGFact.Objects[6,i] := Boton2;
  23.   end;
  24. end;



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

#4 Caral

Caral

    Advanced Member

  • Administrador
  • 4.218 mensajes
  • LocationCosta Rica

Escrito 23 febrero 2012 - 02:10

Hola
Seguimos.
Vamos a crear los procedimientos que son llamados cuando se presionan los botones:
El Boton 1 (agregar):
Este botón llama al Form Busqueda de Articulos, es el mismo, la diferencia solo se dará en algunos nombres que cambiaran ya que esta vez sera llamado desde el form que acabamos de crear (FFacturaSTG), ya lo veremos adelante.


delphi
  1. procedure TFFacturaSTG.BotonClick(Sender: TObject);
  2. var
  3.   i : integer;
  4.   cat, pre, stot: Real;
  5. begin
  6.     i:=2;
  7.   BuscaArticulo:=TBuscaArticulo.Create(self);
  8.   try
  9.   BuscaArticulo.ShowModal;
  10.   cat := StrToFloat(BuscaArticulo.Edit2.Text);
  11.   pre := StrToFloat(BuscaArticulo.Edit3.Text);
  12.   stot := cat * pre;
  13.   i:=i+1;
  14.   SGFact.Cells[1,cuenta] := BuscaArticulo.ATArticulosCodProducto.asstring;
  15.   SGFact.Cells[2,cuenta] := BuscaArticulo.ATArticulosDescripcion.asstring;
  16.   SGFact.Cells[3,cuenta] := FloatToStr(cat);
  17.   SGFact.Cells[4,cuenta] := FloatToStr(pre);
  18.   SGFact.Cells[5,cuenta] := FloatToStr(stot);
  19.   Cuenta := Cuenta +1;
  20.   Suma;
  21.   SGFact.RowCount:= SGFact.RowCount + 1;
  22.   finally
  23.   BuscaArticulo.Free;
  24. end;
  25. end;


Como veis, busca el articulo y coloca los datos en el StringGrid (SGFact), ademas aumenta en uno la variable cuenta lo mismo que las filas del StringGrid, también llama al procedimiento Suma.

El Boton 2 (Eliminar):
Este procedimiento es algo mas complejo asi que para no complicarnos la vida lo hice a lo novato, eso si, funciona perfectamente.


delphi
  1. procedure TFFacturaSTG.Boton2Click(Sender: TObject);
  2. var i: integer;
  3. begin
  4. QTemp.SQL.Text:= ' Delete * From Factura '+
  5.                   ' WHERE Factura.CodFactura = :Fact '+
  6.                   ' And Factura.CodCliente = :Cli '+
  7.                   ' And Factura.CodArticulo = :Art '+
  8.                   ' And Factura.Descripcion = :Des '+
  9.                   ' And Factura.Cantidad = :Cant ';
  10.   QTemp.Parameters[0].Value:= ECodFactura.Text;
  11.   QTemp.Parameters[1].Value:= ECodCliente.Text;
  12.   QTemp.Parameters[2].Value:= SGFact.Cells[1,SGFact.Row];
  13.   QTemp.Parameters[3].Value:= SGFact.Cells[2,SGFact.Row];
  14.   QTemp.Parameters[4].Value:= SGFact.Cells[3,SGFact.Row];
  15.   QTemp.ExecSQL;
  16.   // limpiar stringrid
  17.   for i := 1 to SGFact.RowCount - 1 do
  18.   SGFact.Rows[i].Clear;
  19.   SGFact.RowCount:= SGFact.RowCount - SGFact.Rows[i].Count;
  20.   Boton.Free;
  21.   Boton2.Free;
  22.   Cuenta := 0;
  23.   CargarDatos;
  24.  
  25. end;


Aqui lo que hace es borrar el contenido de la tabla basándose en el numero de factura, el cliente, la descripción etc.
Posteriormente limpia todo el Stringgrid, los botones y llama al procedimiento (CargarDatos) que volverá a cargar los datos ya actualizados.
QTemp es el nombre del Adoquery, podéis ponerle el que os guste. (y)

Seguimos.....
Saludos
  • 0

#5 Caral

Caral

    Advanced Member

  • Administrador
  • 4.218 mensajes
  • LocationCosta Rica

Escrito 23 febrero 2012 - 02:23

Hola
Seguimos con dos procedimientos mas: Suma y CargarDatos:
El procedimiento Suma, esencialmente es igual que el del form facturaDBG, la diferencia esta en que envia los datos al StringGrid (SGTotal).


delphi
  1. procedure TFFacturaSTG.Suma;
  2. var i:integer;
  3. begin
  4.   ADOQuery3.SQL.Text:= 'SELECT DISTINCTROW Sum([Factura].[MntSubTotal]) AS [SubTotal], Sum([Factura].[MntDescuento]) AS [Descuento],'+
  5.                         ' Sum([Factura].[MntImpuesto]) AS [Impuesto], Sum([Factura].[MntTotal]) AS [Total]'+
  6.                         ' FROM Factura ';
  7.   ADOQuery3.SQL.Add('WHERE Factura.CodFactura = '+ECodFactura.Text);
  8.   AdoQuery3.Open;
  9.   // escribe los valores en las celdas
  10.   SGTotal.Cells[1,1] := Format('%8.2n',[ADOQuery3.Fields[1].asfloat]);
  11.   SGTotal.Cells[1,2] := Format('%8.2n',[ADOQuery3.Fields[2].asfloat]);
  12.   SGTotal.Cells[1,0] := Format('%8.2n',[ADOQuery3.Fields[0].asfloat]);
  13.   SGTotal.Cells[1,3] := Format('%8.2n',[ADOQuery3.Fields[3].asfloat]);
  14. end;


Como veis, no hay mayor diferencia ni problema.

En el siguiente procedimiento se cargan los datos una vez que se eliminan, trabaja muy de la mano con el botón 2.


delphi
  1. procedure TFFacturaSTG.CargarDatos;
  2. Begin
  3.   Etiquetas;
  4.   SGFact.RowCount:= 2;
  5.   SGFact.FixedRows:= 1;
  6.   Cuenta := Cuenta +1;
  7.   ADOQuery3.SQL.Text:= 'SELECT * From Factura ';
  8.   ADOQuery3.SQL.Add('WHERE Factura.CodFactura = '+ECodFactura.Text);
  9.   AdoQuery3.Open;
  10.   While not AdoQuery3.Eof do
  11.   begin
  12.   SGFact.Cells[1,cuenta] := AdoQuery3.Fields[3].Text;
  13.   SGFact.Cells[2,cuenta] := AdoQuery3.Fields[4].Text;
  14.   SGFact.Cells[3,cuenta] := AdoQuery3.Fields[5].Text;
  15.   SGFact.Cells[4,cuenta] := AdoQuery3.Fields[9].Text;
  16.   SGFact.Cells[5,cuenta] := AdoQuery3.Fields[11].Text;
  17.   SGFact.RowCount:= SGFact.RowCount + 1;
  18.   Cuenta := Cuenta +1;
  19.   CrearBoton(SGFact.RowCount-1);
  20.   AdoQuery3.Next;
  21.   end;
  22.   AdoQuery3.Active := False;
  23.   Suma;
  24.  
  25. end;


Como veis, ya que se limpio el StringGrid había que recuperar los datos y ordenarlos, para eso se hace un recorrido de la tabla según la factura.
Se repintan las etiquetas y se ordenan las celdas, ademas había que volver a actualizar los totales de la factura llamando al procedimiento Suma, crear Los botones y actualizar la variable Cuenta.

Seguimos.....
Saludos


  • 0

#6 Caral

Caral

    Advanced Member

  • Administrador
  • 4.218 mensajes
  • LocationCosta Rica

Escrito 23 febrero 2012 - 02:32

Hola
Seguimos.
Esta vez vamos a irnos al StringGrid (SGFact), vamos a buscar en sus eventos el evento OnSelectCell y le damos doble click.
Ahí vamos a poner este código:


delphi
  1. procedure TFFacturaSTG.SGFactSelectCell(Sender: TObject; ACol,
  2.   ARow: Integer; var CanSelect: Boolean);
  3. begin
  4.   CrearBoton(SGFact.RowCount-1);
  5. end;


Como veis es sencillo, creamos los botones para seguir añadiendo items.

Bien, como os habréis imaginado el botón imprimir contiene el mismo código que el anterior.

Cambios en el Botón aceptar del form búsqueda  (BuscaArticulo) :
Lo único que se tiene que cambiar es la sentencia sql que guarda los cambios, lógicamente esta tiene que apuntar al nuevo form de factura (FFacturaSTG) que acabamos de crear, así:


delphi
  1. // Inserta en la tabla factura
  2. AdoQuery1.SQL.Text := 'Insert into Factura Values ('+QuotedStr(FFacturaSTG.ECodFactura.Text)+', :fecha, '+QuotedStr(FFacturaSTG.ECodCliente.Text)+ ', '+QuotedStr(ATArticulosCodProducto.AsString)+ ', '+QuotedStr(ATArticulosDescripcion.AsString)+ ', '+QuotedStr(Edit2.Text)+ ', '+QuotedStr(FFacturaSTG.ComboBox1.Text)+', '+QuotedStr(FFacturaSTG.EOCompra.Text)+', '+
  3.                         QuotedStr(FFacturaSTG.EVendedor.Text)+', '+QuotedStr(Edit3.Text)+', '+QuotedStr(Edit4.Text)+', '+FloatToStr(c)+', '+QuotedStr(Edit5.Text)+ ', '+FloatToStr(e)+ ', '+FloatToStr(g)+')';
  4. AdoQuery1.Parameters.ParamByName('fecha').Value:= DateToStr(FFacturaSTG.DateTimePicker1.Date);
  5. AdoQuery1.ExecSQL;


Como veis es simplemente cambiar los nombres, fijaros en la diferencia, es muy sencillo pero importante.

Listo, Colocad otro item en el menu principal para llamar al nuevo form y a probarlo.
Para que se creen los botones (cuando inicia el form) hay que darle click a la celda del StringGrid (FFacturaSTG).

Ojala Os sirva de ejemplo y ayuda. (y)

Saludos
Os dejo el código.

Archivos adjuntos


  • 0

#7 cesar_cz

cesar_cz

    Advanced Member

  • Moderadores
  • PipPipPip
  • 919 mensajes
  • LocationChile

Escrito 15 mayo 2012 - 01:16

Excelente Caral gran aporte.....

A ver si te animas con un par de videos sobre el tema, si quieres yo te enseño a grabarlos, es re sencillo, te puedo pasar el camtasia studio tambien....

un saludo desde chago city :)
  • 0

#8 solian

solian

    Newbie

  • Miembros
  • Pip
  • 1 mensajes

Escrito 28 mayo 2012 - 08:51

Hola Caral, estupendo programa de facturación y además sencillo para los novatos como  yo en delphi,
quería proponer una variante del programa y vuestra ayuda para conseguirlo.

1. Dgrid , las celdas como "descripción" utilizarlo como celda Memo , ya que quiero trabajarlo como editar texto en tiempo de ejecución y,
en sub total darle el valor del servicio ( facturación de servicios de obras y rehabilitación).

2. validar con un botón el contenido de los valores de lineas en el Grid.

3. realizar un apartado de presupuestos y validar en este apartado con un botón (por ejemplo) el presupuesto guardado en facturación.

espero no exigir demasiado y poder entre todos , poder realizarlo..

  • 0

#9 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 28 mayo 2012 - 08:56

Qué tal amigo solian !

Bienvenido a DelphiAccess y ojalá te estemos viendo continuamente por aquí...

Qué te parece si abres un hilo con los apartados que comentas (para la mejora del sistema de Caral) y poco a poco vamos planteando las aportaciones que pudieramos darte entre todos y los avances que tu también puedas ir consiguiendo, de tal manera que podamos dejar éste sistema tal y como está y las adaptaciones que propones en otro hilo (y)

Saludox ! :)
  • 0

#10 danygonza

danygonza

    Newbie

  • Miembros
  • Pip
  • 8 mensajes
  • LocationConcepcion - Paraguay

Escrito 20 noviembre 2012 - 02:31

Gracias por el tutorial... estaré pasando a Lazarus 1.0.2 vs PostGreSQL...

  • 0

#11 maria_caruzo639

maria_caruzo639

    Newbie

  • Miembros
  • Pip
  • 1 mensajes

Escrito 13 agosto 2013 - 01:12

Vaya Caral, que gran aporte, muchas gracias.
A mi, mi hermano me dijo que me iba a enseñar, pero sabes como son los hombres... Pzz y ahora se un poquito mas :D Muchas gracias, ando trabajando en eso aunque soy aprendiz nomas.
  • 0

#12 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.744 mensajes
  • LocationMéxico

Escrito 13 agosto 2013 - 08:29

Vaya Caral, que gran aporte, muchas gracias.
A mi, mi hermano me dijo que me iba a enseñar, pero sabes como son los hombres... Pzz y ahora se un poquito mas :D Muchas gracias, ando trabajando en eso aunque soy aprendiz nomas.


Hola maria_caruzo639, bienvenida a DelphiAccess

¿ Cómo somos los hombres ?

Saludos

PD, Cómo estás Caral preciosa  :D :D :D
  • 0

#13 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 13 agosto 2013 - 08:37


Vaya Caral, que gran aporte, muchas gracias.
A mi, mi hermano me dijo que me iba a enseñar, pero sabes como son los hombres... Pzz y ahora se un poquito mas :D Muchas gracias, ando trabajando en eso aunque soy aprendiz nomas.


Hola maria_caruzo639, bienvenida a DelphiAccess

¿ Cómo somos los hombres ?

Saludos

PD, Cómo estás Caral preciosa  :D :D :D


Jajajajaja puras promesas con los hombres amiga ???... Yo si te comprendo, dudo que Caral lo comprenda, es uno más del enemigo

:undecided: :angel:

Saludox ! :)
  • 0

#14 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 mensajes
  • LocationMéxico D.F.

Escrito 13 agosto 2013 - 09:52



Vaya Caral, que gran aporte, muchas gracias.
A mi, mi hermano me dijo que me iba a enseñar, pero sabes como son los hombres... Pzz y ahora se un poquito mas :D Muchas gracias, ando trabajando en eso aunque soy aprendiz nomas.


Hola maria_caruzo639, bienvenida a DelphiAccess

¿ Cómo somos los hombres ?

Saludos

PD, Cómo estás Caral preciosa  :D :D :D


Jajajajaja puras promesas con los hombres amiga ???... Yo si te comprendo, dudo que Caral lo comprenda, es uno más del enemigo

:undecided: :angel:

Saludox ! :)



No todos son así amiga!
*-) *-) *-)


  • 0

#15 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 13 agosto 2013 - 09:56



Jajajajaja puras promesas con los hombres amiga ???... Yo si te comprendo, dudo que Caral lo comprenda, es uno más del enemigo

:undecided: :angel:

Saludox ! :)



No todos son así amiga!
*-) *-) *-)



No ! Otros son peores  :p :p :p :D :D :D

Saludox ! :)
  • 0

#16 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 mensajes
  • LocationMéxico D.F.

Escrito 13 agosto 2013 - 10:00




Jajajajaja puras promesas con los hombres amiga ???... Yo si te comprendo, dudo que Caral lo comprenda, es uno más del enemigo

:undecided: :angel:

Saludox ! :)



No todos son así amiga!
*-) *-) *-)



No ! Otros son peores  :p :p :p :D :D :D

Saludox ! :)



A bueno eso si! que cosas no? jejeje saludos  (y) (y) (y) (y)

y que onda con esas "gorditas", ya ves como NO solamente los hombres...  :D

-fíjate que encontré otras donde hasta le ponen carnitas arriba a las gorditas, y mmmm ricas... (y)

  • 0

#17 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 13.744 mensajes
  • LocationMéxico

Escrito 13 agosto 2013 - 10:00




Jajajajaja puras promesas con los hombres amiga ???... Yo si te comprendo, dudo que Caral lo comprenda, es uno más del enemigo

:undecided: :angel:

Saludox ! :)



No todos son así amiga!
*-) *-) *-)



No ! Otros son peores  :p :p :p :D :D :D

Saludox ! :)


:p :p :p  *-) *-) *-)

Saludos
  • 0