You are on page 1of 9

GESTIN ALMACN ADENDA 31

INTRODUCCIN
Se me ha solicitado una variacin en el ejemplo Gestin
Almacn-Adenda2.
Dicha
modificacin
consiste
en
introducir un producto bajo el cual cuelgan una serie de
referencias. Es decir, que el producto es, genricamente
uno, pero en concreto son las referencias de este producto
las que entran en nuestro almacn.
Grficamente, el producto X sera, en realidad:
Producto X Referencia 1
Producto X Referencia 2
Producto X Referencia 3
Etc.
En este ejemplo intentaremos que sea posible dar entrada (y salida) tanto producto como
referencias de una manera gil.
Debemos tener presente que esta explicacin presupone que tenemos completamente
desarrollado el ejemplo que se muestra en Gestin Almacn-Adenda 2 (que a su vez depende
del ejemplo Gestin Almacn, y que todo lo que se indicar en este documento parte de la
estructura de Gestin Almacn-Adenda 2).
As pues, si el querido lector an no ha visto cmo se construye dicha aplicacin no tendr
ms remedio que, antes, echar un vistazo a ese ejemplo (Gestin Almacn-Adenda2, que
puede consultar aqu). Si no con dificultad entender lo que se explicar a continuacin.
Aqu debo hacer una advertencia: el sistema es un sistema simplificado. Con ello quiero decir
que establecer un control de salida de referencias que no han entrado, o que ya no hay en
stock, complicara muchsimo el ejemplo. Por ello debis ser conscientes de que transfiero
ese control a vuestra supervisin manual, puesto que slo os controlar las cantidades
globales de producto, no referencia por referencia.
Dicho lo anterior pongmonos manos a la obra.

CREANDO NUESTRAS TABLAS DE REFERENCIAS DE


PRODUCTO
Si recordamos la estructura de nuestra tabla productos veremos que tenamos un campo
llamado [Id], de tipo texto, que representaba nuestro identificador del producto. Este campo
va a ser muy importante, puesto que ser el que nos har de enlace entre el producto y las
referencias de producto.
Vamos a crearnos una nueva tabla, que guardaremos como TReferencias. Voy a utilizar slo
tres campos, que son los bsicos para que el ejemplo funcione, pero vosotros podrais aadir
todos los campos que necesitis. Esos tres campos sern:
Un identificador del registro
Un identificador auxiliar para poder trabajar con subformularios
Un identificador de producto, que ser el que nos referenciar al [Id] de producto que
comentbamos antes
1

La BD de ejemplo os la podis bajar aqu.

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

La referencia en s.

La estructura de la tabla podra ser la siguiente:

En principio ya tenemos nuestra tabla lista.

CREANDO EL FORMULARIO QUE NOS HAR DE


SUBFORMULARIO
Vamos a crearnos un formulario sobre TReferencias, que guardaremos como FReferencias. Este
formulario lo crearemos como Formularios continuos.
Nos debera haber quedado una cosa as:

Si os fijis he hecho pequeitos los campos [IdRef], [IdAux] e [IdProd] y los he situado en
un rincn del formulario. Vamos a seleccionar esos tres campos y vamos a sacar sus
propiedades. Nos vamos a Pestaa Formato Visible, y situamos esa propiedad en NO.

MODIFICANDO FENTRADAS
Situamos nuestro formulario FEntradas en vista diseo. A continuacin insertamos un
subformulario y cuando nos salga el asistente lo configuramos as:

Usar un formulario existente Seleccionamos FReferencias.


Definimos nuestra propia relacin:
Campo del formulario: [IdProd]
Campo del subformulario: [IdProd]
Definimos una segunda relacin:
Campo del formulario: [Id]
Campo del subformulario: [IdAux]
Como nombre podemos dejar el que sale por defecto

Seleccionamos nuestro campo [CantE], nos vamos a sus propiedades y en la pestaa Datos
situamos la propiedad [Bloqueado] en S.
A continuacin aadimos, en la seccin Detalle, un botn de comando, que guardaremos con el

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

nombre de cmdContarReferencias2. En su evento Al hacer click generamos este cdigo3:

Private Sub cmdContarReferencias_Click()


'Declaramos las variables
Dim nRef As Long
Dim rst As DAO.Recordset
'Clonamos el recordset del subformulario
Set rst = Me.FReferencias.Form.Recordset.Clone
'Contamos las referencias introducidas
nRef = rst.RecordCount
'Escribimos el valor en la cantidad de entrada
Me.CantE.Value = nRef
End Sub

Creo que no hace falta comentar mucho el cdigo... Slo hacer notar que hemos utilizado DAO,
lo que implica que debemos tener registrada la referencia Microsoft DAO 3.6 Object Library o
mdulo equivalente4.
El formulario lleva un botn, que es cmdCerrar, en su encabezado. Vamos a modificar
ligeramente su cdigo para que nos sirva de control para evitar patinazos.
El nuevo cdigo sera el siguiente:

Private Sub cmdCerrar_Click()


'Declaramos las variables
Dim resp As Integer
'Comprobamos que haya valor en la cantidad de entrada
If IsNull(Me.CantE.Value) Then 'No hay valor. Pedimos confirmacin de salida
resp = MsgBox("No hay valor en la cantidad de entrada. Es correcto?", _
vbQuestion + vbYesNo, "AVISO")
If resp = vbYes Then 'Si es correcto...
'Salimos del formulario y volvemos a men
DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "FMenu"
End If
Else
'Si hay valor cerramos normalmente
DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "FMenu"
End If
'En caso contrario nos quedamos en el formulario para corregir la incidencia
End Sub

CUL ES EL PROCESO DE ENTRADA DE DATOS?


A nivel de usuario el proceso, aunque creo que intuitivo, ser el siguiente:

2
3
4

Damos de alta los productos


Damos de alta los datos de la entrada
No podremos escribir la cantidad (porque hemos bloqueado el campo). Lo que tenemos
que hacer es simplemente ir dando de alta las referencias de ese producto en el
subformulario.

Para asignar un nombre a un control lo que debemos hacer es sacar las propiedades de ese control e irnos a la Pestaa Otras
Nombre. Ah escribimos el nombre que queramos.
Para generar cdigo debemos sacar las propiedades del control Pestaa Eventos, y nos situamos en la parte blanca a la derecha
del evento que queremos programar. Veremos un pequeo botn de puntos suspensivos. Si hacemos click sobre l nos aparecer
una ventana que nos pedir qu operacin deseamos realizar. Le indicamos que queremos generar cdigo.
Para registrar una referencia debemos irnos, en el editor de VB, a Men Herramientas Referencias... Se nos abrir una ventana
mostrndonos todas las referencias disponibles. Buscamos la que nos interese, marcamos su check y aceptamos.

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

Una vez finalizada la entrada de referencias hacemos click sobre el botn que nos
cuenta las referencias y, ahora s, el nmero de unidades de entrada se escribe en el
campo correspondiente.
Si nos olvidamos y le damos al botn para cerrar el
formulario la aplicacin nos avisa del fallo y nos permite
volver atrs para subsanarlo.
Este proceso ser idntico para lo que es la salida de
artculos, que veremos a continuacin.

MODIFICANDO FSALIDAS
El proceso a realizar en FSalidas es casi exactamente el mismo que hemos hecho para
FEntradas. Lo voy a repetir aqu en plan telegrfico para que tengis una gua de pasos. A
continuacin remarcar las cosas que deben modificarse sobre el formulario original.

Creamos un subformulario en FSalidas.


Cuando nos salga el asistente lo configuramos as:
Usar un formulario existente Seleccionamos FReferencias
Definir la ma propia
Creamos una primera relacin
Campo del formulario: [IdProd]
Campo del subformulario: [IdProd]
Creamos una segunda relacin
Campo del formulario: [Id]
Campo del subformulario: [IdAux]
Dejamos el nombre que nos sale por defecto. Finalizamos
Establecemos la propiedad Bloqueado del campo [CantS] en S (Pestaa Datos
Bloqueado)
Insertamos un botn de comando que llamaremos cmdContarReferencias

A partir de aqu va a haber unas ligeras modificaciones. Empecemos por el cdigo de


cmdContarReferencias. En su evento Al hacer click generamos el cdigo siguiente:

Private Sub cmdContarReferencias_Click()


'Declaramos las variables
Dim nRef As Long
Dim rst As DAO.Recordset
'Clonamos el recordset del subformulario
Set rst = Me.FReferencias.Form.Recordset.Clone
'Contamos las referencias introducidas
nRef = rst.RecordCount
'Escribimos el valor en la cantidad de entrada
Me.CantS.Value = nRef
'Llamamos al procedimiento del evento "Despus de actualizar" de [CantS]
Call CantS_AfterUpdate
End Sub

Os he marcado en negrita los cambios respecto del botn de FEntradas.


Cogemos el cdigo del botn cmdCerrar del formulario y le cambiamos el cdigo del evento Al
hacer click por este otro:

Private Sub cmdCerrar_Click()


'Declaramos las variables

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

Dim resp As Integer


'Comprobamos que haya valor en la cantidad de salida
If IsNull(Me.CantS.Value) Then 'No hay valor. Pedimos confirmacin de
salida
resp = MsgBox("No hay valor en la cantidad de salida. Es correcto?",
_
vbQuestion + vbYesNo, "AVISO")
If resp = vbYes Then 'Si es correcto...
'Salimos del formulario y volvemos a men
DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "FMenu"
End If
Else
'Si hay valor cerramos normalmente
DoCmd.Close acForm, Me.Name
DoCmd.OpenForm "FMenu"
End If
'En caso contrario nos quedamos en el formulario para corregir la incidencia
End Sub

De nuevo os marco en negrita las diferencias con el cdigo del mismo botn de FEntradas.

CREANDO LAS CONSULTAS PARA VER REFERENCIAS


EXISTENTES
Vamos a crearnos un sistema de consultas que nos permitir sacar un listado de referencias
existentes.
Empezaremos por la consulta CRefEntradas, que tendr la siguiente estructura:

A continuacin nos creamos la consulta CRefSalidas, con una estructura idntica pero sobre la
tabla TSalidas. As:

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

Finalmente ya podemos crearnos la consulta definitiva, que estar basada en las dos consultas
anteriores. A esta consulta definitiva la llamaremos CRefExistentes, y ser as:

Fijaos en un par de detalles:

La relacin entre CRefEntradas y CRefSalidas es una combinacin de tipo 2. Eso


significa que se muestran todos los registros de CRefEntradas y slo los coincidentes de
CRefSalidas.
Una vez que tenemos la relacin con una combinacin de tipo 2 tenemos que filtrar
aquellos registros en los que el valor de [Referencia] de CRefSalidas sea nulo. Por qu?
Porque si es nulo quiere decir que an no ha salido de nuestro almacn. De ah que
podis ver en la ilustracin ese filtro sobre el campo [Referencia] de CRefSalidas.
Incluimos el campo [IdProd] en la consulta porque nos va a servir posteriormente para
darnos ms informacin en el informe que recoger el stock de referencias.

REALIZANDO LOS INFORMES


Vamos a confeccionarnos tres informes: uno para ver slo las entradas de referencias, otro
para las salidas y otro para ver las referencias en stock.
La construccin de los informes va a ser muy similar en los tres casos. As pues, vamos a por
el primero.
Nos creamos un informe, que llamaremos RRefEntradas, que basaremos sobre la consulta
CRefEntradas. Vamos a crearlo utilizando el asistente para informes. Cuando iniciemos el
asistente lo configuraremos as (asistente de Access 2007. Si utilizamos otra versin puede
haber pequeas diferencias en el proceso, pero con la informacin de pantalla no tendremos
problemas para seleccionar la opcin correcta):

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

Seleccionamos la consulta CRefEntradas y aadimos los campos de esa consulta.


Agregamos un nivel de agrupamiento, seleccionando el campo [IdProd]
Podemos ordenar por referencia, si queremos. Yo he ordenado ascendente.
Seleccionamos la distribucin que ms nos guste para el
informe. Yo he elegido En pasos.
Seleccionamos el estilo de nuestro gusto
Como ttulo escribimos RRefEntradas
Situamos nuestro informe en vista diseo y realizamos los
cambios de diseo que consideremos oportunos.
Vamos a aadir un cuadro de texto en la seccin <Encabezado de
IdProd>, y vamos a eliminar la etiqueta. En el interior de ese
textbox escribiremos la siguiente expresin:

=DBsq("[CodProd]";"TProductos";"[Id]=" & [IdProd])


Con ese DBsq lo que logramos es que al lado del identificador del producto nos salga el
cdigo de producto. Si queremos la descripcin deberamos haber escrito:
=DBsq("[DescProd]";"TProductos";"[Id]=" & [IdProd])
En definitiva, el informe a m me ha salido as:

A continuacin, tras cerrar este informe, vamos a copiarlo y pegarlo con el nombre de
RRefSalidas.
Situamos RRefSalidas en vista diseo y sacamos sus propiedades. Nos vamos a la pestaa
Datos Origen del registro, y seleccionamos del desplegable la consulta CRefSalidas.
Realizamos los cambios de diseo oportunos.
Finalmente vamos a crearnos el informe para ver las referencias existentes en el almacn. Para
ello creamos un nuevo informe a travs del asistente para informes y lo configuramos as:

Seleccionamos
la
consulta
CRefExistentes
[CrefEntradas.Referencia]
Aadimos un nivel de agrupamiento por [IdProd]
Aadimos una ordenacin si nos interesa
Elegimos la distribucin
Elegimos el estilo
Como ttulo indicamos RRefExistentes
7

los

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

campos

[IdProd]

De nuevo insertamos un cuadro de texto junto a [IdProd] y copiamos-pegamos la expresin


anterior de DBsq
Y ya tenemos nuestros informes.

PROGRAMANDO FMENU
Slo nos queda programar los botones en FMenu para poder
abrir esos informes.
As pues, aadimos tres botones de comando, que llamaremos, respectivamente:

cmdAbreRRefEntradas
cmdAbreRRefSalidas
cmdAbreRRefExistentes

Y los cdigos que vamos a asignarles sern:


A cmdAbreRRefEntradas:

Private Sub cmdAbreRRefEntradas_Click()


DoCmd.OpenReport "RRefEntradas", acViewPreview
End Sub

A cmdAbreRRefSalidas:

Private Sub cmdAbreRRefSalidas_Click()


DoCmd.OpenReport "RRefSalidas", acViewPreview
End Sub

El tercer botn va a depender del valor seleccionado en el cuadro combinado que ya tenemos
en FMenu. Si seleccionamos un productos el informe nos saldr filtrado por ese producto. Si
dejamos el valor del combo en blanco nos saldr el informe completo.
Su cdigo sera el siguiente:

Private Sub cmdAbreRRefExistentes_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 "RRefExistentes", acViewPreview
Else
'Si hay valor abrimos el informe filtrndolo
DoCmd.OpenReport "RRefExistentes", acViewPreview, , "[IdProd]=" & vProd
End If
End Sub

Desgraciadamente filtrar por fechas requerira complicar el ejemplo en demasa, por lo que no
8

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

realizaremos ese tipo de filtro.

PARA FINALIZAR EL EJEMPLO


Bueno... Gracias a vuestras peticiones la cosa se va
complicando... je, je...
Espero que el ejemplo os sea til o que os proporcione las
bases para poder ir desarrollando vuestra propia aplicacin.
Un saludo, y...
suerte!

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

You might also like