Facturacion
Facturacion
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.
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.
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.
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:
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
Visítame en http://bit.ly/NckAccess
4.- Una tabla que me recoja los detalles de la venta en cada factura.
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:
2
Visítame en http://bit.ly/NckAccess
– 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])
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.
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:
3
Visítame en http://bit.ly/NckAccess
– Pestaña Otras → Nombre, y escribimos cmdAbreFras3
– Pestaña Eventos → Al hacer click, y generamos el siguiente código 4:
…
Private Sub cmdAbreFras_Click()
DoCmd.OpenForm "FAltaFra", , , , acFormAdd
End Sub
…
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.
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.
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://bit.ly/NckAccess
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
= [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.
= Suma([SubTot])
5
Visítame en http://bit.ly/NckAccess
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.
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.
…
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://bit.ly/NckAccess
'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:
Para ello:
1.- Creamos una consulta en vista diseño. La guardaremos con el nombre de CFacturas. La
7
Visítame en http://bit.ly/NckAccess
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í:
8
Visítame en http://bit.ly/NckAccess
– Definimos nuestra propia relación. Campo del informe: [NumFra]; campo del
subinforme: [IdFra]
– Guardamos ese subinforme con el nombre de subRptFrasDetall
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://bit.ly/NckAccess
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?
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.
Un saludo, y ¡suerte!
10
Visítame en http://bit.ly/NckAccess