Sunteți pe pagina 1din 14

GESTIN ALMACN1

INTRODUCCIN
Como bien indica su nombre, vamos a crear una aplicacin
para gestionar los movimientos de un almacn. Sin
embargo, nuestra aplicacin no slo registrar entradas y
salidas, sino que, en el momento de sacar un producto, nos
dejar sacarlo siempre y cuando haya existencias del
mismo. Aprovechando la programacin tambin avisaremos
si el stock queda por debajo de una cantidad crtica. De la
misma manera, podremos calcular el stock existente en el
momento actual.
El funcionamiento ser muy sencillo (aunque la mecnica interna quiz no lo sea tanto).
Tendremos un formulario donde daremos recepcin a los materiales que entren en el almacn,
y otro formulario que nos permitir sacar los productos del almacn (no utilizaremos
subformularios para este ejemplo porque ello lo complicara demasiado, pero si sois capaces de
adaptar el ejemplo funciona igual de bien).
Yo voy a utilizar, para el ejemplo, unos campos que considero mnimos, pero ello no es
obstculo para que, lgicamente, en vuestra aplicacin aadis todos los campos que queris.
La finalidad es que os quedis con la idea de cmo puede ir Access controlando las salidas, y
de qu manera podemos conseguir un informe sobre el stock global o de un producto en
concreto.
Vmonos pues...

PLANIFICANDO NUESTRA APLICACIN


Qu vamos a necesitar? Los elementos mnimos de nuestra BD deberan ser los siguientes:

Una tabla donde tengamos los productos Con un formulario para darlos de alta

Una tabla donde tengamos las entradas de productos Con un formulario para dar de
alta dichas entradas.

Una tabla donde tengamos las salidas de productos Con un formulario para dar de
alta dichas salidas.

Un formulario que nos haga de men para movernos por la aplicacin.

Una serie de consultas (lo veremos ms adelante)

Un informe (ms los que queramos) para ver el stock existente.


En principio, si no me dejo nada, con esto nos bastara.
Vamos pues a ver cmo diseamos las tablas.
CREANDO LAS TABLAS
Vamos a empezar por la tabla que recoger la informacin de los productos. A esta tabla la
llamaremos TProductos. La creamos con la siguiente estructura:

La BD de ejemplo os la podis bajar aqu.

Vistame en http://siliconproject.com.ar/neckkito/

IMPORTANTE
a) Punto 1
Fijaos que he puesto un autonumrico como identificador del registro. Lo he puesto as porque
he dado por supuesto que el cdigo del producto ser un cdigo alfanumrico, y por ello he
tenido que crear el campo [CodProd], de tipo texto.
Poner un campo de tipo texto como clave principal no es recomendable, y slo lo debemos
utilizar siempre y cuando no tengamos otra opcin. Esto es simplemente un consejo.
Si nuestro cdigo de producto fuera de tipo numrico no importara incluir un autonumrico,
puesto que el propio cdigo de producto nos servira. En definitiva, que la estructura de la
tabla podra quedarnos as:

A medida que se vaya desarrollando el ejemplo, si utilizis este segundo sistema, ir


remarcando las diferencias entre un sistema u otro.
b) Punto 2
Fijaos tambin que escribo los nombres de los campos sin espacios. Si vamos a programar os
recomiendo que no utilicis espacios en los nombres. En el cdigo, si el nombre no tiene
espacios, lo podemos escribir directamente; si tiene espacios lo deberemos enmarcar entre
corchetes (por ejemplo, [Codigo Producto].
Tampoco, en elementos internos, os recomiendo que utilicis la acentuacin grfica, ni
caracteres extraos (como la letra ee, la abreviatura de n esa , etc.).
c) Punto 3
Quiz alguien pueda pensar, y dnde est la cantidad para tener el stock? Como este va a ser
un dato variable no necesitamos almacenarlo en una tabla: una consulta nos servir para crear
y obtener ese dato.
Sigamos con nuestras tablas: vamos a crear la tabla de las entradas de productos, que
llamaremos TEntradas. Tendr la siguiente estructura:

Vistame en http://siliconproject.com.ar/neckkito/

Una vez la tengamos creada vamos a establecer una


relacin con TProductos. Para ello nos situamos sobre el
campo [IdProd] y, en tipo de datos, seleccionamos
Asistente para bsquedas. Cuando se inicie el asistente lo
configuramos de la siguiente manera:

Buscar los valores en una tabla

Seleccionamos la tabla TProductos

Seleccionamos todos los campos de la tabla

Ordenamos por el campo que ms til nos sea. Yo he ordenado ascendente por la
descripcin del producto.

Ocultamos la columna clave y redimensionamos a nuestro gusto. Si utilizamos el campo


[CodProd] como clave principal, y nos interesa ver tambin el cdigo del producto,
desmarcamos este check

Dejamos la etiqueta que le habamos puesto al campo

Guardamos la tabla para que se generen las relaciones.


Qu hemos conseguido con esto? Pues hemos relacionado ambas tablas y ahora el valor que
se nos va a guardar en la tabla va a ser el valor recogido en la clave principal de TProductos, a
pesar de que, cuando vayamos a rellenar este campo, lo que veremos ser los campos que
hemos dicho que se muestren en el asistente.
Cerramos la tabla.
Lo que vamos a hacer ahora, para ahorrarnos trabajo, es copiar la tabla TEntradas y guardarla
con el nombre de TSalidas. Una vez hecho esto la editamos y cambiamos su estructura as:

Guardamos la tabla.
Ahora, para ser puristas, deberamos identificar las relaciones entre las tres tablas. Para ello:

Sacamos la ventana Relaciones (doy por supuesto que sabis dnde est)

Mostramos tabla Mostramos la tabla TSalidas

De la tabla TProductos seleccionamos el campo [Id] y lo arrastramos sobre el campo


[IdProd] de TSalidas (si el campo clave utilizado es [CodProd] pues es este el que
arrastramos). En la ventana que nos sale aceptamos sin ms2.
2

No entraremos, en este ejemplo, a explicar como definir a fondo las relaciones. En la web, en el apartado Objetos Tablas, podis
encontrar una explicacin para este asunto.

Vistame en http://siliconproject.com.ar/neckkito/

Veremos que ambos campos se nos han unido por una lnea: ya tenemos establecida la
relacin.
Nos debera haber quedado una cosa as:

Y, en principio, nuestra estructura de tablas ya est creada.

CREANDO LOS FORMULARIOS DE TRABAJO


Basndonos en la tabla TProductos creamos un formulario para dar de alta los productos, que
llamaremos FProductos. En el encabezado del formulario vamos a insertar un botn de
comando. Le ponemos de nombre cmdCerrar3.
Vamos a programar ese botn. Sacamos sus propiedades y nos vamos a la pestaa Eventos
Al hacer click, y generamos el siguiente cdigo4:

Private Sub cmdCerrar_Click()


'Cerramos el formulario actual
DoCmd.Close acForm, Me.Name
'Abrimos FMenu
DoCmd.OpenForm "FMenu"
End Sub

Como vemos, el cdigo nos cierra el formulario en el que estamos en ese momento (que ser
FProductos) y nos abre el formulario FMenu, que an no hemos creado pero que crearemos en
breve.
Por ejemplo, a m me ha quedado una cosa as:

3
4

De ahora en adelante, si os indico le ponemos de nombre, me estar refiriendo al nombre del control, no a su ttulo. Y cmo
ponemos nombre a un control? Sacamos sus propiedades y nos vamos a la Pestaa Otras Nombre, y ah le escribimos el nombre.
Para generar cdigo nos ponemos en la parte en blanco junto al evento que queramos, y veremos cmo nos aparece un pequeo
botn de puntos suspensivos. Si hacemos click sobre l nos aparecer una ventana. Le decimos que queremos generar cdigo.
Se nos abrir el editor de VB, con dos lneas por defecto (Private Sub... y End Sub). Esas dos lneas no deben tocarse. El cdigo lo
escribimos entre dichas lneas

Vistame en http://siliconproject.com.ar/neckkito/

A continuacin vamos a crear nuestro formulario FEntradas.


Para ello, lo creamos lgicamente sobre la tabla TEntradas.
En la cabecera del formulario vamos a repetir lo que hemos
hecho con FProductos, que es aadir un botn para cerrar
el formulario. Aadimos pues ese botn, le ponemos de
nombre cmdCerrar y le generamos el siguiente cdigo en el
evento Al hacer click (ahora el cdigo ya sin comentarios):

Private Sub cmdCerrar_Click()


DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "FMenu"
End Sub

NOTA:

Con este formulario podremos dar entrada a los productos que ya estn dados de
alta, pero, as como lo tenemos, si el producto no est dado de alta... pues mal lo tenemos
(deberamos salir del formulario, darlo de alta y volver a registrar la entrada). La solucin a
este problema sera estudiar el ejemplo Alta en form desde form de la web y aplicar las
enseanzas de ese ejemplo a nuestra aplicacin.

NOTA: Si queremos ser muy puristas con el tema de diseo os recomiendo tener un simple

archivo txt (o algn sucedneo de bloc de notas) para ir anotando los elementos que queremos
tengan un aspecto homogneo en nuestra aplicacin. Por ejemplo, si sacamos las propiedades
del botn cerrar y nos vamos a la pestaa Formato veremos dos propiedades, Alto y Ancho,
con unos valores. Si tomamos nota de esos valores podemos aplicar los mismos valores a
todos los botones cerrar que creemos (lo que nos libra de dibujarlos con cuidado) en el
momento de crearlos: dibujamos el botn a lo rpido y le establecemos los valores que
tenemos apuntados; el botn se redimensionar segn esos valores. Lo mismo podramos
hacer, por ejemplo, con las dimensiones del campo para el cdigo de producto, el campo para
la fecha, etc.

A m me ha quedado una cosa as:

Vistame en http://siliconproject.com.ar/neckkito/

Realizamos el mismo proceso, pero con un formulario


basado en la tabla TSalidas, que llamaremos FSalidas. No
creo que haga falta repetir cmo hacerlo. Tambin le
incluimos un botn de comando para cerrar el formulario,
con el mismo nombre y cdigo que los anteriores.
Finalmente, vamos a crearnos nuestro formulario FMenu.
Para ello, creamos un formulario en blanco. Vamos a
realizar, en principio, las operaciones siguientes:
1.- Creamos un botn de comando, que llamaremos cmdAltaProductos. Le asignamos, en el
evento Al hacer click, el siguiente cdigo:

Private Sub cmdAltaProductos_Click()


DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "FProductos", , , , acFormAdd
End Sub

Si observis el cdigo veris que el argumento acFormAdd lo que nos permite es abrir el
formulario preparado para la introduccin de nuevos productos.
2.- Copiamos el botn que hemos creado y lo pegamos (CTRL+C / CTRL +V). Nos aparecer
abajo. A este nuevo botn le ponemos de nombre cmdAltaEntradas y le generamos el siguiente
cdigo:

Private Sub cmdAltaEntradas_Click()


DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "FEntradas", , , , acFormAdd
End Sub

3.- Copiamos este ltimo botn y lo volvemos a pegar, para que nos aparezca abajo. A este
nuevo botn le ponemos de nombre cmdAltaSalidas y generamos el cdigo:

Private Sub cmdAltaSalidas_Click()


DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "FSalidas", , , , acFormAdd
End Sub

NOTA:

Si quisiramos poder abrir el formulario, sin ms, y navegar por los registros y
poder aadir registros nuevos la lnea de cdigo que abre el formulario sera, simplemente,
DoCmd.OpenForm "NombreFormulario"
Si quisiramos abrir el formulario slo para editar los datos, pero no poder aadir registros
nuevos, las lneas deberan ser:
DoCmd.OpenForm "FSalidas", , , , acFormEdit
6

Vistame en http://siliconproject.com.ar/neckkito/

Forms!FSalidas.AllowAdditions = False
Y si quisiramos abrir el formulario slo para consultar los registros (pero no poder editarlos o
aadir nuevos)
la lnea sera
DoCmd.OpenForm "FSalidas", , , , acFormReadOnly
Lgicamente, podramos, en FMenu, crear tantos botones
como necesitramos.

4.- Aadimos finalmente un ltimo botn (por ahora) que nos


permitir cerrar la aplicacin. A ese botn lo llamaremos cmdQuit,
y su cdigo sera:

Private Sub cmdQuit_Click()


DoCmd.Quit
End Sub

CREANDO NUESTRAS CONSULTAS


Hasta aqu tenemos una aplicacin normal, en el sentido que ya es una aplicacin totalmente
operativa. Sin embargo, el compromiso era gestionar el stock de productos. As que para ello
vamos a auxiliarnos de unas consultas.
El meollo del asunto radica en que vamos a necesitar un conjunto entrelazado de consultas
para poder llegar a los resultados previstos. As pues...
1a.- Creamos una primera consulta, que llamaremos CEntradas, que nos va a dar la
informacin de todos los productos que han entrado. Es decir, creamos la consulta en vista
diseo y aadimos la tabla TProductos y la tabla TEntradas. Los campos [Id] e [IdProd]
deberan habernos salido unidos por una lnea.
1b.- Nos situamos, con precisin, sobre esa lnea de relacin y hacemos click con el botn de la
derecha. En el men emergente debera aparecernos una opcin llamada Propiedades de la
combinacin

Si hacemos click sobre esa opcin nos aparecer una ventana que nos pedir el tipo de
combinacin. Debemos marcar la tipo 2

Vistame en http://siliconproject.com.ar/neckkito/

Por qu hacemos esto? Para forzar a la consulta para que nos d la informacin de todos los
productos que haya en la BD, independientemente de si han tenido algn movimiento de
entrada o no.
1c.- Arrastramos al grid de la consulta el campo [CodProd]. En la segunda columna del grid
vamos a escribir, en la primera lnea (la correspondiente a Campo:), la siguiente expresin:
Entrada: SiInm(EsNulo([CantE]);0;[CantE])
En definitiva, esto:

Ya tenemos los datos como queramos: todos los detalles de los productos que han salido y, si
no han salido, indicados con valor cero, que es lo que devuelve la funcin SiInm()
Guardamos la consulta.
2a.- Creamos una nueva consulta en vista diseo, que guardaremos con el nombre de
CEntradas2. Aadimos la consulta que acabamos de crear.
2b.- Aadimos los dos campos de que consta la consulta, y la convertimos en una consulta de
totales. En el campo [Entrada] indicamos que queremos agrupar por suma.

Vistame en http://siliconproject.com.ar/neckkito/

Guardamos la consulta.
Ahora vamos a hacer lo mismo, pero con los datos de la tabla TSalidas.
3a.- Creamos en vista diseo una consulta que llamaremos CSalidas, basada en la tabla
TProductos y TSalidas. Su diseo sera el siguiente:

Tened en cuenta que, como se muestra en la lnea de relacin, el tipo de combinacin es la 2.


Por si no se ve claro, la expresin es:
Salida: SiInm(EsNulo([CantS]);0;[CantS])
3b.- Creamos una nueva consulta, basada en la consulta anterior, aadiendo los dos campos
que hay. Convertimos esa consulta en una consulta de totales y agrupamos el campo [Salida]
por suma.
9

Vistame en http://siliconproject.com.ar/neckkito/

4 a.- Creamos una ltima consulta, que estar basada sobre la tabla TProductos, CEntradas2 y
CSalidas2. Guardamos esa consulta con el nombre de CStock.
Hacemos click sobre el campo [CodProd] de <TProductos> y lo arrastramos sobre el mismo
campo en CEntradas2. Hacemos lo mismo con TProductos y CSalidas2. Se nos deberan crear
dos lneas de relacin entre las tres tablas.

En el grid de la consulta vamos a aadir:

El campo [Id] de TProductos. Si hemos utilizado [CodProd] como clave principal


lgicamente este campo no podramos aadirlo.

El campo [CodProd] de TProductos.

El campo [DescProd] de TProductos

El campo [SumaDeEntrada] de CEntradas2

El campo [SumaDeSalida] de CSalidas2.


En la siguiente columna en blanco, en el grid, vamos a crear el campo calculado. Para ello, en
la lnea superior (la correspondiente a Campo:) escribimos:
Stock: [SumaDeEntrada] [SumaDeSalida]

10

Vistame en http://siliconproject.com.ar/neckkito/

CREANDO NUESTROS INFORMES


Vamos a crear un informe basado en CStock. Lo creamos a nuestro
gusto. Guardaremos ese informe como RStock.
Una vez tengamos ese informe creado lo situamos en vista
diseo. Vamos a eliminar (que no lo eliminaremos el
campo [Id], porque es un campo de referencia interna y no
nos aporta ningn valor a nivel visual. Lo que haremos
ser:

Borrar su etiqueta

Seleccionamos el campo [Id] y sacamos sus propiedades. Nos vamos a Pestaa


Formato Visible, y ah situamos la propiedad en NO. Una vez hecho esto podemos situar el
campo en algn rincn donde no moleste. Si no hemos utilizado este campo lgicamente no
har falta realizar estas operaciones.
Arreglamos los detalles de diseo que queramos en ese informe. Por ejemplo, mi diseo final
ha quedado as:

Fijaos que no podis ver mi campo [Id]. Ello es as porque est escondido detrs del campo
[CodProd] (si os fijis bien se le ven cuatro pelillos... je, je...).
Cuando quede a nuestro gusto cerramos y guardamos el informe.

PROGRAMACIN DE FMENU
Vamos a situar nuestro formulario FMenu en vista diseo. Vamos a aadir un cuadro
combinado y un botn para poder abrir nuestro informe con toda la informacin o filtrado.
As pues:
1.- Aadimos un cuadro combinado. Cuando se nos inicie el asistente lo configuramos de la
siguiente manera:

Deseo buscar los valores en una tabla


Seleccionamos la tabla TProductos
11

Vistame en http://siliconproject.com.ar/neckkito/

Aadimos los tres campos que hay en esa tabla. Dos campos si no hemos utilizado [Id]

Ordenamos por el campo que ms nos interese (o


bien por [CodProd] o bien por [DescProd]), ascendente.

Si hemos utilizado [Id] ocultamos la clave principal.


Si no hemos utilizado [Id] y no queremos ver el cdigo de
producto (porque [CodProd] es nuestra clave principal),
pues ocultamos; si queremos ver el campo deberemos
desmarcar ese check. Redimensionamos a nuestro gusto.

Como etiqueta podemos escribir algo como:


Seleccione producto

2.- Sacamos las propiedades del cuadro combinado y nos vamos a Pestaa Otras Nombre, y
ah escribimos cboProd
3.- Insertamos un botn de comando. Le ponemos de nombre cmdAbreRStock.
Por ejemplo, el diseo de estos dos controles yo lo he ideado as:

4.- En el evento Al hacer click de cmdAbreRStock generamos el siguiente cdigo:

Private Sub cmdAbreRStock_Click()


'Declaramos las variables
Dim vProd As Long
'Cogemos el valor del combo
vProd = Nz(Me.cboProd.Value, 0)
'Si no hay valor devuelve el valor cero. En ese caso abrimos
'el informe sin ms
If vProd = 0 Then
DoCmd.OpenReport "RStock", acViewPreview
Else
'Si hay valor abrimos el informe filtrndolo
DoCmd.OpenReport "RStock", acViewPreview, , "[Id]=" & vProd
End If
End Sub

Un par de comentarios:

Si hemos utilizado [CodProd] como clave principal nuestra lnea de cdigo

DoCmd.OpenReport "RStock", acViewPreview, , "[Id]=" & vProd


debera ser
DoCmd.OpenReport "RStock", acViewPreview, , "[CodProd]=" & vProd

El informe, con este cdigo, se abre en vista preliminar. Si lo que queremos es enviarlo
directamente a la impresora debemos cambiar el argumento:
12

Vistame en http://siliconproject.com.ar/neckkito/

acViewPreview
por
acViewNormal
Y con esto nuestro formulario FMenu ya est listo para salir
del horno.

PROGRAMANDO FSALIDAS
Vamos a establecer un control en FSalidas, para evitar que podamos dar salida a un producto
que del cual no hay stock. Aprovecharemos para lanzar un mensaje de advertencia si quedan,
por ejemplo, 10 o menos unidades de ese producto.
1.- Situamos FSalidas en vista diseo. Seleccionamos el campo [CantS] y sacamos sus
propiedades. Nos vamos a Pestaa Eventos Despus de actualizar, y generamos el siguiente
cdigo5:

Private Sub CantS_AfterUpdate()


'Declaramos las variables
Dim vProd As Long
Dim vCant As Integer, vCantStock As Integer
Dim rst As DAO.Recordset
'Cogemos el identificador del producto
vProd = Nz(Me.IdProd.Value, 0)
'Cogemos la cantidad introducida
vCant = Nz(Me.CantS.Value, 0)
'Si no hubiera cantidad introducida salimos del proceso
If vCant = 0 Then Exit Sub
'Creamos el recordset
Set rst = CurrentDb.OpenRecordset("CStock", dbOpenSnapshot)
With rst
'Nos situamos en el primer registro
.MoveFirst
'Iniciamos el recorrido de registros hasta encontrar la referencia
'con la que estamos trabajando en el formulario
Do Until .EOF
'Cuando lo encontramos...
If .Fields("Id").Value = vProd Then
'Cogemos el stock existente
vCantStock = .Fields("Stock").Value
'Le restamos la cantidad que estamos sacando
vCantStock = vCantStock - vCant
Select Case vCantStock
'Si el resultado es negativo no permitimos sacar esa cantidad
Case Is < 0
MsgBox "No hay stock suficiente de este producto" & vbCrLf & vbCrLf _
& "El stock actual del producto es " & vCantStock + vCant & _
" unidades", vbCritical, "SIN STOCK"
'Borramos la cantidad introducida
Me.CantS.Value = Null
'Es necesario hacer un rebote de foco para volver a situar
'el enfoque en CantS
Me.IdProd.SetFocus
Me.CantS.SetFocus
Exit Do
'Si queda stock, pero es inferior a 10 unidades, lanza un aviso
Case Is <= 10
5

El cdigo utiliza DAO, por lo que debemos asegurarnos de que tenemos la referencia registrada. Para ello, en el editor de VB, nos
vamos a Men Herramientas Referencias, y debemos tener marcado el check de la librera Microsoft DAO 3.6 Object Library. Si
no la tuviramos debemos buscarla, marcar su check y aceptar.

13

Vistame en http://siliconproject.com.ar/neckkito/

MsgBox "Atencin! El stock que quedar de este producto es de " _


& vCantStock & " unidades", vbInformation, "STOCK CRTICO"
Exit Do
End Select
End If
.MoveNext
Loop
End With
'Cerramos conexiones y liberamos memoria
rst.Close
Set rst = Nothing
End Sub

Como veis el cdigo est comentado y he intentado ir explicando lo que hace cada lnea de
cdigo.
Y ya tenemos, con esto nuestro FSalidas preparado para supervisar nuestras salidas y darnos
un tirn de orejas si intentamos sacar material que no existe.
Pues eso... Nuestra aplicacin de gestin de inventario ya est totalmente operativa. Espero
que os sea de utilidad y que podis adaptar algunas cosillas de las aqu explicadas a vuestras
aplicaciones.
Un saludo, y...
suerte!

14

Vistame en http://siliconproject.com.ar/neckkito/

S-ar putea să vă placă și