Tutorial (Como hacer un programa de Facturacion)
#1
Escrito 03 enero 2009 - 01:50
Con este tutorial lo que se pretende es enseñar lo elementos básicos para hacer un programa de facturación sencillo.
Para este vamos a usar una base de datos ACCESS y componentes de sencillo uso de Delphi.
Empecemos con la base de datos:
Todo programa de facturación contiene elementos en común, como son:
Artículos, clientes, usuarios, facturas.
Asi empezaremos haciendo estas tablas directamente en access.
Articulos:
Clientes:
Usuarios:
Factura:
Una vez que terminemos con las tablas guardaremos nuestra base de datos en el directorio que deseemos, recordemos que lo necesitaremos para hacer la conexión con delphi.
Ya teniendo la tablas listas empezaremos con delphi, enlazando cada una y generando el código para que funcione nuestro programa.
En la segunda parte seguiremos con delphi.
Saludos
#2
Escrito 03 enero 2009 - 02:20
Seguimos con:
Conexión a la base de datos:
Para esto vamos a usar los componentes ADO, vamos a usar un datamodule y haremos un archivo INI que nos servirá para indicar donde esta nuestra base de datos.
Empecemos con delphi:
Generamos un nuevo proyecto, nos aparecerá un nuevo form (este sera el principal).
Vamos a File, New,data module y le damos click.
Esto nos generara un form DataModule para nuestro proyecto.
Vamos a la paleta ADO, seleccionamos un ADOConnection y lo colocamos en el datamodule, quedaria asi:
Le damos doble click a nuestro ADOConnection y nos saldrá esta pantalla:
Ahora presionamos el botón Build y nos saldra esta otra pantalla:
Una vez con esta pantalla seleccionamos la opción marcada Jet 4 y le damos next, nos saltara la otra pestaña:
Seleccionamos la primera opción y Presionamos el botón con tres puntos, con este buscaremos donde guardamos nuestra base de datos.
Una vez ubicada, la seccionamos y presionamos el boton Test connection, si es correcta nos saldra un mensaje indicandolo.
Con esto ya tenemos la primera parte lista, ya hicimos la conexion con nuestra base de datos.
Seguimos.....
saludos
PD: Acordaros de ir guardando el proyecto...
#3
Escrito 03 enero 2009 - 02:53
Seguimos con la conexión:
Como en este caso usaremos un archivo INI para la conexion necesitamos añadir al uses del datamodule el uses IniFiles.
para esto seleccionemos el unit del datamodule y le añadimos dicho uses, quedaria asi:
uses SysUtils, Classes, DB, IniFiles, ADODB, Forms, Dialogs;
Nos posicionamos en el datamodule en la parte blanca y le damos doble click, esto nos generara el evento DataModuleCreate.
Ahora pondremos este cogido que es el que nos servirá para que el archivo INI nos encuentre la base de datos:
procedure TDataModule1.DataModuleCreate(Sender: TObject); Var BaseDeDatos, ConStr : String; IniFile: TIniFile; begin // Obtiene la ruta y el nombre de la base de datos IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+'BDatos.ini'); BasedeDatos := IniFile.ReadString('BD','Path',''); If BasedeDatos = '' then ShowMessage('Error al cargar Base de Datos'); ConStr := 'Provider=Microsoft.Jet.OLEDB.4.0;'+ 'Data Source='+BaseDeDatos+';'+ 'Persist Security Info=False;'+ 'Jet OLEDB:Database Password=admin'; ADOConnection1.ConnectionString := ConStr; ADOConnection1.Open; end;
Como veis el evento buscara en el archivo INI que en este caso se llama BDatos.ini y enlazara la base de datos con la dirección de este archivo.
Para hacerlo un poco mas sencillo os dejo el archivo ini, solamente se tendria que cambiar la diereccion que se encuentra en PATH y listo.
Saludos
Archivos adjuntos
#4
Escrito 03 enero 2009 - 03:33
Ya tenemos nuestra base de datos enlazada al ADOConnection y cuando arranque este se conectara al archivo INI que buscara la dirección de la base de datos.
Bueno sigamos con el primer form que se creo al iniciar delphi (form1).
Aquí vamos a hacer una pantalla inicial, sencilla, que nos ligue con las demás opciones que tendrá nuestro programa.
Coloquemos le a este form un MainMenu, que esta el la primera paleta (standard).
Le damos doble click y nos saldra una pequeña pantalla.
Ahi es donde vamos a colocar el menu de nuestro programa en este caso seran estas:
Luego nos servirá para enlazar cada uno de los forms que vallamos creando.
Bien una vez que tenemos listo este primer form lo guardamos, es buena idea ponerle un nombre adecuado a cada form en este caso en la propiedad Name le pondremos: FClientes, puede ser cualquier otro, el que os guste.
Seguimos......
Saludos
#5
Escrito 03 enero 2009 - 04:22
Ya tenemos nuestro primer form, el principal, pronto regresaremos para hacer que sea este el que nos guié.
Vamos a hacer nuestro segundo form, seguimos el mismo procedimiento:
File, New, Form.
Esto nos creara nuestro segundo form.
Vamos a hacer nuestro primer enlace, este va a ser con la tabla Clientes.
Aqui podremos añadir, modificar, etc, cada cliente de nuestro programa.
Primero vamos a añadir a este nuevo form un ADOTable.
En su propiedad Connection le escribimos: DataModule1.ADOConnection1
Esto guiara al adotable hacia el datamodule y a su vez hacia el adoconnection.
Ahora en la propiedad TableName buscaremos la tabla Clientes.
Demosle doble click al adotable y nos mostrara una pequeña pantalla.
Con el raton derecho sobre esta pantallita, nos saldra la opcion ADD fields, le damos click y nos saldra una nueva pantalla que contendra todos los campos de la tabla Clientes, presionamos OK y quedaran grabados en esta pantallita.
Vamos a seleccionar uno a uno de estos campos y arrastrarlos al nuevo form.
Colocadlos de manera que quede presentable, que sirva para trabajar sobre ellos, conservando cierto orden.
Veréis que se ha colocado automáticamente un DataSource, este sera el enlace de cada uno de los campos.
Ahora necesitaremos un componente que nos sirva para poder enlazar y trabajar sobre la tabla clientes.
De la paleta dataControls seleccionamos un DBNavigator y lo arrastramos a nuestro form.
En la propiedad Datasource del dbnavigator buscaremos el datasource que se creo automáticamente, así de simple quedara enlazado.
Vamos a activar nuestra tabla con el programa.
Nos posicionamos en el form y le damos doble click, esto nos creara el evento FormCreate y colocamos esto:
ADOTable1.Active:= True;
Bueno, como en todo form, siempre tenemos que cerrerlo, asi que coloquemos un boton en el from, en su propiedad Caption ponemos Salir, le damos doble click y ponemos esto:
Close;
Ahora como siempre le pondremos un nombre que nos interese a este nuevo form, en su propiedad Name pondremos: FMantClientes y lo guardamos.
Si, ese es todo el codigo que necesitamos de momento, asi de facil, bueno, quedaria asi:
Ya tenemos nuestro segundo form, vamos bien.
Seguimos....
Saludos
#6
Escrito 03 enero 2009 - 04:29
Veo con mucho agrado que le estás dando mucho empuje a esta sección amigo. Te lo agradezco, ya que estaba dejándola un poco de lado porque estoy preparando nuevo material para la sección .
Saludos,
#7
Escrito 03 enero 2009 - 04:34
Como me va a molestar amigo, aquí todos somos uno u uno para todos.Espero que me disculpes por este comentario "off-topic".
Veo con mucho agrado que le estás dando mucho empuje a esta sección amigo. Te lo agradezco, ya que estaba dejándola un poco de lado porque estoy preparando nuevo material para la sección .
Saludos,
Saludos
#8
Escrito 03 enero 2009 - 04:48
Seguimos......
Vamos a hacer nuestro tercer form para el manejo de los Artículos.
Como siempre:
File, New, Form
Empecemos cambiándole el nombre, a este lo llamaremos: FArticulos, lo podemos guardar o esperar y luego guardarlo.
Igual que con el form anterior Clientes, le pondremos un AdoTable, un dbnavigator, un botón y seguimos los mismos pasos que en el form clientes.
Este quedaría así:
Seguimos.......
Saludos
#9
Escrito 04 enero 2009 - 12:22
Seguimos...
Vamos a hacer un nuevo Form, Facturación.
Como siempre:
File, New, Form.
Le vamos a cambiar el nombre por FFactura y lo guardamos.
A este nuevo from le vamos a colocar los siguientes componentes:
1-PageControl
En este vamos a hacer dos TabSheet.
Al primero lo llamaremos factura y al segundo Resumen de Factura
En El primero (factura) colocaremos estos componentes:
13- Edits.
1-Combobox.
1-DatetimePicker
4- botones
3-ADOQuery
2-Datasource
Quedaria asi:
En el segundo (resumen de Factura) colocaremos estos:
1-DBGrid
4-Edits
2-Botones
1.DBNavigator (a este le quitaremos todas las opciones excepto Delete.)
Quedaria asi:
[img width=640 height=440]http://img293.imageshack.us/img293/7803/ffactura1qp4.jpg[/img]
Seguiremos con el codigo de este form........
Saludos
#10
Escrito 04 enero 2009 - 12:35
Seguimos...
Primero vamos a conectar nuestros componentes ADO.
Vamos a ir a la propiedad Connection de cada uno de los ADOQuery y ponemos esto: DataModule1.ADOConnection1
Ahora conectamos el primer Datasource al Adoquery1 y el segundo al AdoQuery2.
Bien, vamos con código:
En el evento Oncreate del form ponemos esto:
procedure TFFactura.FormCreate(Sender: TObject); begin DateTimePicker1.Date:= Now; ADOQuery1.SQL.Text:='SELECT DISTINCTROW Max([Factura].[CodFactura])AS [CodFacturaa]FROM Factura'; ADOQuery1.Open; ECodFactura.Text:= IntToStr(ADOQuery1.Fields[0].AsInteger+1); end;
Vamos a poner el primer codigo del boton buscar (el que esta en la imagen a la par de clientes).
Este seria:
procedure TFFactura.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); FMantClientes.Free; end; end;
Ahora el segundo boton Buscar, esta vez Articulos:
procedure TFFactura.Button4Click(Sender: TObject); begin FArticulos:=TFArticulos.Create(self); try FArticulos.ShowModal; finally If FArticulos.Cod_Parte <> '' then ECodArticulo.Text := FArticulos.Cod_Parte; Label9.Caption:= QuotedStr(FArticulos.Descripcion); FArticulos.Free; end; end;
Vamos con el boton Guardar, ese es el que hará los cálculos y los guardara:
procedure TFFactura.Button1Click(Sender: TObject); Var a,b,c,d,e,f,g,h : real; begin a:= StrTofloat(ECantidad.Text); b:= StrTofloat(EMonto.Text); d:= StrTofloat(EDesc.Text); f:= StrTofloat(EImp.Text); c:= a * b; e:= c * d / 100; g:= (c - e) * f / 100; h:= c - e + g; ESTotal.Text:= floatToStr(c); EDescuento.Text:=floatToStr(e); EImpuesto.Text:=floatToStr(g); ETotal.Text:= floatToStr(Round(h)); AdoQuery1.SQL.Text := 'Insert into Factura Values ('+QuotedStr(ECodFactura.Text)+', :fecha, '+QuotedStr(ECodCliente.Text)+ ', '+QuotedStr(ECodArticulo.Text)+ ', '+Label9.Caption+ ', '+QuotedStr(ECantidad.Text)+ ', '+QuotedStr(ComboBox1.Text)+', '+QuotedStr(EOCompra.Text)+', '+ QuotedStr(EVendedor.Text)+', '+QuotedStr(EDesc.Text)+', '+QuotedStr(EImp.Text)+', '+QuotedStr(ESTotal.Text)+', '+QuotedStr(EDescuento.Text)+ ', '+QuotedStr(EImpuesto.Text)+ ', '+QuotedStr(ETotal.Text)+')'; AdoQuery1.Parameters.ParamByName('fecha').Value:= DateToStr(DateTimePicker1.Date); AdoQuery1.ExecSQL; end;
El boton Salir:
procedure TFFactura.Button2Click(Sender: TObject); begin Close; end;
En el segundo TabSheet tenemos el boton imprimir, este lo veremos posteriormente.
El DBNavigator (que solo muestra Delete) lo enlazaremos al datasource2
Ahora en el evento OnShow del segundo tabsheet pondremos este codigo:
procedure TFFactura.TabSheet2Show(Sender: TObject); begin ADOQuery2.SQL.Text:= 'Select * From Factura'; ADOQuery2.SQL.Add('WHERE CodFactura = '+ECodFactura.Text); ADOQuery2.Open; 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;
Y en el evento OnExit del mismo pondremos esto:
procedure TFFactura.TabSheet2Exit(Sender: TObject); begin ADOQuery2.Close; end;
Vamos a añadir los units que necesitaremos enlazar asi:
implementation uses UFMantClientes, UArticulos, UQRFactura;
Seguimos......
Saludos
#11
Escrito 04 enero 2009 - 04:26
Ahora vamos con el siguiente y ultimo form. Login.
Ya sabemos el proceso para crearlo, a este lo llamaremos: FLogin
A este nuevo form le pondremos los siguientes componentes:
1-ADOQuery
2-Label
2-Edit
2-Botones
Quedaria asi:
le vamos a poner codigo:
Primero crearemos unas variables:
var FLogin: TFLogin; Cuenta : integer; Usuario, Nombre : String; LoginOK : boolean;
En el evento OnCreate:
procedure TFLogin.FormCreate(Sender: TObject); begin Cuenta := 0; Usuario := ''; Nombre := ''; end;
En el boton OK:
procedure TFLogin.BtnOkClick(Sender: TObject); begin LoginOK := False; ADLogin.Parameters.ParamByName('nom').Value:= EUsuario.Text; ADLogin.Active:= True; EUsuario.Text:= ADLogin.Fields[1].AsString; If ADLogin.RecordCount < 1 then Begin Cuenta := Cuenta + 1; MessageDlg('Usuario no encontrado',mtError, [mbOK], 0); EUsuario.Text := ''; EClave.Text := ''; ADLogin.Active := False; If Cuenta = 3 then Close; end else If ADLoginClave.AsString = EClave.Text then Begin LoginOk := True; Nombre := ADLoginNombre.AsString; ADLogin.Active := False; FClientes:=TFClientes.Create(self); try FLogin.Visible:= False; FClientes.ShowModal; finally FClientes.Free; end; Close; end else Begin Cuenta := Cuenta + 1; MessageDlg('Clave Inválida',mtError, [mbOK], 0); EClave.Text := ''; ADLogin.Active := False; If Cuenta = 3 then Close; end; end;
Y en el boton cancelar:
procedure TFLogin.BtnCancelClick(Sender: TObject); begin LoginOK :=False; Close; end;
Ahora nos posicionamos en el adoquery y en su propiedad SQL String nos saldra una pantalla y ponemos esto:
SELECT CodUsuario, Nombre, Clave FROM Usuarios WHERE CodUsuario = nom
Bueno, con esto ya tenemos todos los forms y las conexiones listas, solo nos falta terminar algunos detalles.
Seguimos....
Saludos
#12
Escrito 04 enero 2009 - 05:16
Bueno, ya tenemos todo lo que necesitamos listo para trabajar, solo algunos ajuste y a andar.
Primero:
Os acordais del primer Form, el que serviría de principal y contiene un MainMenu.
Vamos a enlazarlo con los demos forms.
Demosle dobleclick al mainmenu.
Nos saldran las opciones que teniamos.
Vamos a darle dobleclick a la primera: Clientes y ponemos esto:
procedure TFClientes.AadirClientes1Click(Sender: TObject); begin FMantClientes:=TFMantClientes.Create(self); try FMantClientes.ShowModal; finally FMantClientes.Free; end; end;
A la segunda: Articulos
procedure TFClientes.AadirArticulos1Click(Sender: TObject); begin FArticulos:=TFArticulos.Create(self); try FArticulos.ShowModal; finally FArticulos.Free; end; end;
A la tercera: Facturacion
FFactura:=TFFactura.Create(self); try FFactura.ShowModal; finally FFactura.Free; end;
Y a Salir:
procedure TFClientes.Salir1Click(Sender: TObject); begin Close; end;
Ahora que tenemos enlazado todo nos falta que el programa arranque primero en el form Login.
Nos vamos al unit del proyecto y cambiamos el orden de acceso asi:
begin Application.Initialize; Application.CreateForm(TFLogin, FLogin); Application.CreateForm(TFClientes, FClientes); Application.CreateForm(TDataModule1, DataModule1); Application.Run; end.
Ya estamos listos para ejecutar y probar el programa.
Espero os sirva de ejemplo y os guste.
Como siempre el código fuente de este programa lo dejo por si tenéis alguna duda.
Saludos
AQUI ESTA LOS ARCHIVOS COMPLETOS EN LA ZONA DE DESCARGA
Listo el Tutorial de facturacion 2, espero os sirva y os guste.
Aqui os dejo el enlace.
Listo el Turorial de Facturacion 3, espero os guste.
Aquí os lo dejo.
#13
Escrito 06 marzo 2009 - 06:22
sale mi compa ahi tamos y aledante
#14
Escrito 15 mayo 2009 - 03:18
#15
Escrito 15 mayo 2009 - 03:40
Muchas gracias por vuestros comentarios.
Saludos
#16
Escrito 18 mayo 2009 - 08:50
Cod_Cliente, Cod_Parte... Gracias por Adelantado (QDT)
#17
Escrito 18 mayo 2009 - 12:19
Ya casi no me acuerdo de esto, en realidad no se por que use estos nombres de archivos, mas sabiendo que en la bd no estan.
Debe ser algun error que cometi, si tienes algun problema simplemente quitales la raya del medio ( _ ) , deja solo los nombres (CodCliente, CodParte).
Me comentas como te fue.
Saludos
#18
Escrito 18 mayo 2009 - 12:36
Casi juraría que tenía una copia del archivo zip. Intento descomprimir el zip y me indica que el archivo está dañado.
¿Por casualidad no tienes una copia?
En el código que expones aquí no se ve, o al menos yo no distingo, un Cod_Cliente, Cod_Parte... y me extraña lo que comenta ®k2.
Saludos,
#19
Escrito 18 mayo 2009 - 12:51
No me tenéis paciencia.
Ayer limpie el ordenador y reinstale casi todo pero me faltaron algunas cosas.
Ya me acorde de las variables.
Estas variables son las que se usan para traer los datos desde otros forms, son importantes, no se pueden cambiar.
Creo que este es el archivo original, si no es, me lo avisáis.
Saludos
PD: Cambie el otro por si estaba corrupto, ya esta bien.
Archivos adjuntos
#20
Escrito 18 mayo 2009 - 01:22
Ahora si descomprimió.
Si o sí, a lo largo de esta semana me voy a poner a hacer copias de seguridad de los hilos, y archivos que se vayan haciendo en el foro Manuales y Tutoriales. Mas vale prevenir...
No se que hice con los anteriores backups que tenía en mi disco... Tal vez borré la carpeta en el último mantenimiento. Ahora los haré en cds
Saludos,