You are on page 1of 10

FACTURACIÓN

1
INTRODUCCIÓN
Vamos a ver, a través de este ejemplo, cómo podemos
crear una aplicación para facturar la venta de nuestros
productos.
Este ejemplo no pretende ser una BD de facturación “ultra-
depurada”. Pensad que simplemente os voy a explicar la
mecánica de cómo podría hacerse una BD de estas
características.
Lo interesante del ejemplo, desde mi punto de vista, es, precisamente, que cojáis la
sistemática de cómo relacionamos las tablas, cómo construimos los formularios, cómo
construimos las consultas y cómo estructuramos los informes.
Para el ejemplo se van a utilizar los campos mínimos (lo cual significa que vosotros podéis
añadir, en vuestras BD's, los campos que necesitéis). Tened en cuenta que toda la estructura
del ejemplo va a descansar sobre esos campos mínimos, por lo que si elimináis alguno no
puedo responder del correcto funcionamiento de la aplicación.
El ejemplo desarrolla una BD de facturación relativamente simple. No hay elementos de control
sobre fechas, por ejemplo, y al utilizar, como numerador de facturas, un autonumérico, si
borramos un registro o lo dejamos inacabado ese número va a “desaparecer” de la BD, o va a
aparecer, pero sin datos. Tened en cuenta que programar un programa más “depurado” excede
de las pretensiones de este ejemplo.
Vamos a utilizar, también, código VB. No os preocupéis, porque lo voy a escribir bien
comentado para que sepáis qué hace cada línea. Ahora bien, una vez explicado cómo asignar
un código al primer control los siguientes ya voy a abreviar (es decir, que no lo explicaré cada
vez). Por eso os recomiendo que prestéis atención especial a la primera vez que se indique
cómo crear un código, puesto que la mecánica es prácticamente igual para el resto de
supuestos.
Dicho lo anterior vamos a empezar con... una BD para facturación de ventas.
PLANEANDO LA ESTRUCTURA
Lo primero que debemos hacer antes de empezar con la BD en Access es planear la estructura.
Simplemente este planteamiento es sentarse a pensar sobre un par de cuestiones básicas:
– Qué elementos voy a necesitar
– Cómo voy a estructurar esos elementos
En nuestro caso vamos a ver cómo podría ser un planteamiento posible:
Elementos que voy a necesitar:
1.- Una tabla que me recoja los materiales que se van a vender.
2.- Una tabla que me recoja los clientes a quienes voy a vender esos materiales.
3.- Una tabla que me recoja las facturas que se van a emitir, con los datos generales de la
factura.
1 La BD de ejemplo os la podéis bajar aquí.
1
Visítame en http://siliconproject.com.ar/neckkito/
4.- Una tabla que me recoja los detalles de la venta en cada factura.
Más allá, voy a necesitar:
5.- Un formulario para crear la factura
2
6.- Un subformulario para crear los detalles de la factura.
7.- Un informe para imprimir la factura.
Tras lo anterior deberíamos plantearnos qué campos vamos
a necesitar en cada una de las tablas que hemos imaginado
en los puntos 1 a 4. No vamos a hacer eso aquí, porque el
ejemplo podría ser eterno. Lo iremos mostrando a medida
que desarrollemos el ejemplo.
CREANDO LA ESTRUCTURA DE LAS TABLAS
Vamos pues a crear las tablas que necesitamos (insisto en recordaros que yo utilizaré los
campos mínimos). Vamos a por ello.
1.- Creamos una tabla, a la que llamaremos TClientes. Su estructura sera la siguiente:
2.- Creamos otra tabla, a la que llamaremos TProductos. Su estructura será la siguiente:
3.- Creamos una tabla que se llamará TFacturas, con la siguiente estructura:
Una vez tengamos esta tabla creada vamos a crear una relación. Nos situamos sobre el campo
[IdCli] y, en tipo de datos, seleccionamos “Asistente para búsquedas”. Lógicamente se nos
abrirá el asistente. Lo configuramos de la siguiente manera:
– Deseamos que la consulta busque los valores en una tabla.
2 Me centraré, para este ejemplo, en este formulario. Evidentemente necesitaremos un formulario para dar de alta
los productos y otro para dar de alta los clientes, pero estos formularios son muy fáciles de hacer y no se
explicarán aquí.
2
Visítame en http://siliconproject.com.ar/neckkito/
– Seleccionamos la tabla TClientes.
– Añadimos los campos [DNI] y [ApellNom]
– Ordenamos. Por ejemplo, por [ApellNom] ascendente
– Ocultamos la columna clave y redimensionamos las
columnas “a ojo” para que se muestren bien los datos del
DNI y de los apellidos y nombre.
– Le dejamos el nombre que le habíamos puesto al
campo ([IdCli])
Guardamos la tabla para que se creen las relaciones.
Tened en cuenta que ahora el campo [IdCli], cuando seleccionemos un cliente, va a guardar el
valor del identificador del cliente (correspondiente a la clave principal de la tabla TClientes).
Pensad que una cosa es el valor que guarda el campo y otra es el valor que se muestra. Es
importante recordar esto a efectos de código y de creación de consultas.
4.- Creamos una última tabla, que llamaremos TFacturasDetall, que nos permitirá añadir los
detalles a la factura que creemos.
Se debe establecer una relación de tipo 1:N (uno a varios) entre TFacturas y TFacturasDetall,
porque UNA factura puede tener VARIAS líneas de detalle. No entraremos en la teoría de las
relaciones. En la web, en el apartado Objetos Tablas podréis encontrar una explicación sobre →
este punto.
La estructura de esta tabla debería quedarnos así:
Tal como hemos hecho en el punto 3, vamos a utilizar un asistente para búsquedas para
establecer una relación con la tabla TProductos. Así, nos situamos en el campo [IdProd] y,
como tipo de datos, seleccionamos el asistente. Lo configuramos de la siguiente manera:
– Buscar los datos en una tabla
– Seleccionamos la tabla TProductos
– Elegimos el campo [Descrip]
– Ordenamos, por ejemplo, el campo [Descrip] ascendente
– Ocultamos la columna clave y redimensionamos el campo [Descrip] a nuestro gusto
– Dejamos el nombre que habíamos puesto al campo ([IdProd])
Guardamos la tabla para que se creen las relaciones.
Y, en principio, ya tenemos nuestras tablas conforme a nuestra planificación.
CREANDO FORMULARIOS Y SUBFORMULARIOS
Vamos a crear un formulario de inicio, al que llamaremos FMenu. En este formulario vamos a
insertar un botón de comando. Una vez insertado sacamos sus propiedades y nos vamos a:
3
Visítame en http://siliconproject.com.ar/neckkito/
– Pestaña Otras Nombre, y escribimos cmdAbreFras →
3
– Pestaña Eventos Al hacer click, y generamos el siguiente código →
4
:
.
Private Sub cmdAbreFras_Click()
DoCmd.OpenForm "FAltaFra", , , , acFormAdd
End Sub
.
Este código nos permitirá abrir el formulario FAltaFra (que
crearemos a continuación) de manera que nos lleve ya a la
introducción de un nuevo registro.
Vamos a crear el formulario FAltaFra, que estará basado sobre la tabla TFacturas. Lo
organizamos un poco (a nuestro gusto). Por ejemplo, yo lo he organizado, inicialmente, así:
El campo [TotalFra] lo vamos a cambiar una vez insertado nuestro subformulario. Por ahora no
debemos preocuparnos de él.
Vamos, finalmente, a crear nuestro subformulario dentro de FAltaFra. Seleccionamos el control
“subformulario” y lo insertamos en el formulario. Nos saldrá el asistente. Lo configuramos de la
siguiente manera:
– Usar tablas y consultas existentes
– Seleccionamos la tabla TFacturasDetall y seleccionamos todos los campos menos [Id]
– Definimos nuestra propia relación: Campo del formulario: [NumFra]; campo del
subformulario: [IdFra]
– Le damos de nombre subFrmFrasDetall
Veremos que se nos ha creado el nuevo subformulario como objeto formulario en la BD.
Ya podemos cambiar el diseño de nuestro formulario, situando el campo [TotalFra] debajo del
subformulario.
Por ejemplo, yo lo he dejado así:
3 A partir de este momento, cuando haga referencia a algún control y os diga “Al control XXX le ponemos de nombre ZZZ” me estaré
refiriendo a esta propiedad (Pestaña Otras Nombre). →
4 Para generar código nos ponemos en la parte en blanco junto al evento que queramos, y veremos cómo nos aparece un pequeño
botón de puntos suspensivos. Si hacemos click sobre él nos aparecerá una ventana. Le decimos que queremos generar código.
Se nos abrirá el editor de VB, con dos líneas por defecto (Private Sub... y End Sub). Esas dos líneas no deben tocarse. El código lo
escribimos entre dichas líneas
4
Visítame en http://siliconproject.com.ar/neckkito/
MODIFICANDO FORMULARIOS Y SUBFORMULARIOS
Vamos a empezar a modificar el formulario principal (FAltaFra). Vamos a añadir dos campos
calculados para poder ver en pantalla el importe total de la venta, impuestos incluidos.
Así, insertamos un cuadro de texto debajo del campo [TotalFra], que será el que nos recogerá
el importe del impuesto. Supongamos que nuestro impuesto es del 18%. Dentro de ese cuadro
de texto escribiríamos:
= [TotalFra] * 0,18
Si ahora seleccionamos ese cuadro de texto, lo copiamos y lo pegamos (CTRL+C CTRL+V), →
veremos que se nos “duplica” abajo. Cambiamos la expresión que tiene por la siguiente:
= [TotalFra] * 1,18
Ahora seleccionamos estos dos cuadros de texto que hemos creado a la vez, sacamos sus
propiedades y nos vamos a la pestaña Formato Formato, y le indicamos que queremos →
formato Moneda.
Eso, a mí, me ha quedado así:
Cerramos el formulario guardando los cambios.
Abrimos el subformulario subFrmFrasDetall en vista
diseño. Vamos a realizar unos cambios.
Agrandamos el área correspondiente a la sección <Pie del formulario>. Ahí insertamos un
cuadro de texto, y dentro de él escribimos:
= Suma([SubTot])
Sacamos las propiedades de ese cuadro de texto y le ponemos de nombre txtSubTotal.
Y, en principio, no hacemos más cambios en cuestión de diseño en el subformulario.
5
Visítame en http://siliconproject.com.ar/neckkito/
PROGRAMANDO EL SUBFORMULARIO
Seguimos en subFrmFrasDetall en vista diseño.
Seleccionamos el campo [IdProd], sacamos sus propiedades
y nos vamos a Pestaña Eventos Después de actualizar, y →
le generamos el siguiente código:
.
Private Sub IdProd_AfterUpdate()
'Declaramos las variables
Dim vCant As Integer
Dim vProd As String
Dim vSub As Currency, vPrec As Currency
'Asignamos valor a las variables
vCant = Nz(Me.Cantidad.Value, 0)
vProd = Nz(Me.IdProd.Value, "")
'Código de control por si no se han especificado datos
If vCant = 0 Then
MsgBox "Debe especificar una cantidad de venta", vbExclamation, "SIN CANTIDAD"
Exit Sub
End If
If vProd = "" Then Exit Sub
'Buscamos el precio de ese producto en la tabla TProductos
vPrec = DLookup("[PVta]", "TProductos", "[CodProd]='" & vProd & "'")
'Calculamos el total de venta de esa línea
vSub = vPrec * vCant
'Escribimos el valor en el campo [SubTot]
Me.SubTot.Value = vSub
'Nos movemos a una línea siguiente
DoCmd.RunCommand acCmdRecordsGoToNew
End Sub
.
Con este código lo que conseguimos es que, al seleccionar un producto, se nos indique el
importe total de la venta de esa línea de detalle.
Guardamos y cerramos el subformulario.
PROGRAMANDO EL FORMULARIO
Vamos a situar nuestro FAltaFra en vista diseño. En la cabecera del formulario vamos a añadir
un botón de comando. Ese botón de comando nos servirá para “cerrar” la factura una vez
comprobemos que se ha finalizado la venta.
A ese botón de comando le ponemos de nombre cmdCierraFra, y le generamos el siguiente
código:
.
Private Sub cmdCierraFra_Click()
'Creamos puntos de control para comprobar que todo en la factura es correcto
'Existe cliente
If IsNull(Me.IdCli.Value) Then
MsgBox "No ha indicado el cliente", vbCritical, "SIN DATOS"
Exit Sub
End If
6
Visítame en http://siliconproject.com.ar/neckkito/
'Existe fecha
If IsNull(Me.Fecha.Value) Then
MsgBox "No ha indicado la fecha", vbCritical, "SIN DATOS"
Exit Sub
End If
'Declaramos las variables
Dim vSub As Currency
'Cogemos el valor del cuadro de texto que creamos en el pie
'del subformulario
Me.TotalFra.Value = vSub
'Guardamos el registro
DoCmd.RunCommand acCmdSaveRecord
End Sub
.
Ya tenemos nuestro formulario de facturación totalmente creado. Sin embargo, nos falta un
pequeño detalle: queremos imprimir esa factura que tenemos en pantalla.
Así pues, en FAltaFra en vista diseño, añadimos un nuevo botón de comando. Le pondremos de
nombre cmdImprimeFra, y al evento “Al hacer click” le generamos este código:
.
Private Sub cmdImprimeFra_Click()
'Controlamos que la factura está creada. Para ello miraremos si el campo
'[TotalFra] tiene valor.
If IsNull(Me.TotalFra.Value) Then
MsgBox "La factura no está cerrada. No se puede imprimir", vbCritical, "AVISO"
Exit Sub
End If
'Declaramos las variables
Dim vFra As Long
'Cogemos el número de factura creado
vFra = Me.NumFra.Value
'Abrimos el formulario filtrado por el número de factura
DoCmd.OpenReport "RFacturas", acViewPreview, , "[NumFra]=" & vFra
End Sub
.
Tened en cuenta que el código anterior lo que hace es abrir el formulario en vista preliminar. Si
lo que queremos es enviar el informe directamente a la impresora deberemos cambiar esta
línea:
DoCmd.OpenReport "RFacturas", acViewPreview, , "[NumFra]=" & vFra
Por esta otra:
DoCmd.OpenReport "RFacturas", , , "[NumFra]=" & vFra
CREANDO NUESTRO INFORME DE FACTURA
Ya sólo nos resta crear nuestro informe, al que llamaremos RFacturas.
Para ello:
1.- Creamos una consulta en vista diseño. La guardaremos con el nombre de CFacturas. La
7
Visítame en http://siliconproject.com.ar/neckkito/
confeccionamos de acuerdo a la siguiente estructura:
2.- Creamos otra consulta, a la que llamaremos CDetalles. Debería tener la siguiente
estructura.
3.- Sobre la consulta CFacturas creamos un informe, que llamaremos RFacturas. Deberemos
modificar su diseño para
conseguir un formato de
factura. La primera
modificación inicial podría
quedarnos, por ejemplo, así:
Fijaos bien en qué sección
del informe está cada
elemento.
4.- Ampliamos la sección
detalle y añadimos un
subinforme. Cuando nos
salga el asistente lo
configuramos de la siguiente
manera:
– Usar tablas y consultas ya existentes
– Seleccionamos la consulta CDetalles y agregamos todos los campos
8
Visítame en http://siliconproject.com.ar/neckkito/
– Definimos nuestra propia relación. Campo del informe: [NumFra]; campo del
subinforme: [IdFra]
– Guardamos ese subinforme con el nombre de subRptFrasDetall
Probablemente tengamos que realizar ajustes de diseño
sobre el subformulario por amplitud de campos (no se ve
toda la información en el informe). Para ello basta que
pongamos nuestro subinforme en vista diseño y vamos
ajustando los campos.
5.- Como necesitábamos el campo [IdFra] para establecer la
relación entre informe y subinforme, pero a la vista no aporta
nada, vamos a ocultarlo. Para ello situamos subRptFrasDetall en
vista diseño y seleccionamos el campo [IdFra]. Sacamos sus
propiedades y nos vamos a Pestaña Formato Visible, y le →
establecemos esa propiedad en NO.
Pensad que deberemos borrar su etiqueta (ojo, la etiqueta, no el campo).
Nos debería quedar una cosa así:
5.- Ya sólo nos queda un último detalle. Vamos a crear campos calculados en el informe por el
tema de los impuestos y el total de la factura. Para ello situamos nuestro informe RFacturas en
vista diseño y creamos los dos cuadros de texto (recordad que debemos establecer su formato
en “moneda”), con las siguientes expresiones:
FINALIZANDO EL EJEMPLO
Y con todo lo anterior ya tenemos nuestro programa de facturación acabado. Sólo me queda
haceros un comentario:
Probablemente, para probarlo, metáis algunos datos de prueba a ver si todo funciona como es
9
Visítame en http://siliconproject.com.ar/neckkito/
debido. ¿Qué pasa? Que nuestros campos autonuméricos van aumentando una unidad. Si, tras
las pruebas, decidimos ponerla en marcha “en la vida real”, ¿cómo arreglamos lo de los
autonuméricos?
Pues lo que debemos hacer es lo siguiente:
1.- Borramos los registros de TODAS las tablas, de manera
que las tablas nos queden con su estructura sin ningún
dato.
2.- Le damos al boton de Office (Archivo en Access 2010) →
Administrar Compactar base de datos. →
Con esta operación restablecemos todos los autonuméricos a cero. Eso sí, una vez puesta en
funcionamiento... lo que hay es lo que hay.
Bueno. Espero que este ejemplo os pueda ser de utilidad.
Un saludo, y ¡suerte!
10
Visítame en http://siliconproject.com.ar/neckkito/