Sie sind auf Seite 1von 6
GESTIÓN ALMACÉN – ADENDA 2 1 INTRODUCCIÓN Se me ha solicitado una variación en el
GESTIÓN ALMACÉN – ADENDA 2 1
INTRODUCCIÓN
Se me ha solicitado una variación en el ejemplo “Gestión
Almacén”, consistente en poder filtrar a través de fecha.
En esta adenda se va a explicar cómo podemos realizar ese
filtro.
Debemos tener presente que esta explicación presupone
que tenemos completamente desarrollado el ejemplo que se
muestra en “Gestión Almacén”, y que todo lo que se
indicará en este documento parte de esa base.
Así pues, si el “querido lector” aún no ha visto cómo se construye dicha aplicación no tendrá
más remedio que, antes, echar un vistazo a ese ejemplo (que puede consultar aquí). Si no con
dificultad entenderá lo que se explicará a continuación.
Dicho lo anterior
“¡Al ataque!”
MODIFICANDO NUESTRO FMENU
Situemos nuestro formulario FMenu en vista diseño. Vamos a añadir un cuadro de texto, al que
pondremos de nombre txtFecha. Seleccionamos dicho TextBox, sacamos sus propiedades y
– Pestaña Otras → Nombre, y escribimos txtFecha (esto para el que no se acuerde de
cómo “ponemos nombre” a los controles).
– Pestaña Formato → Formato, y seleccionamos “Fecha corta”
¿Por qué le aplicamos este formato? Porque aprovechamos las características de Access en
cuanto a validación; es decir, que si el valor que se introduce no es una fecha el propio Access
nos lanzará un mensaje de advertencia advirtiéndonos que el formato introducido no es
correcto. Eso nos ahorra código de verificación del valor.
La segunda ventaja es que Access, al detectar que es formato fecha, nos muestra
automáticamente el tip del calendario, para que podamos seleccionar una fecha mediante el
ratón (esta característica no está disponible en Access 2003  )
Si queremos “rizar el rizo” podemos irnos a la pestaña Datos → Máscara de entrada, y
escribirle la siguiente máscara:
##/##/##
Eso sí, debemos ser conscientes de que el tip del calendario se va a desactivar.
En la etiqueta de ese control podemos escribir algo así como “Filtrar por fecha:”. En definitiva,
debería quedarnos una cosa así:
1 La BD de ejemplo os la podéis bajar aquí.
1
Visítame en http://siliconproject.com.ar/neckkito/
MODIFICANDO NUESTRAS CONSULTAS Situamos nuestra consulta CEntradas en vista diseño y, al grid de la
MODIFICANDO NUESTRAS CONSULTAS
Situamos nuestra consulta CEntradas en vista diseño y, al
grid de la consulta, añadimos el campo [FechE].
Como filtro escribimos, en la línea correspondiente a
“Criterios:”, la siguiente expresión:
<=SiInm(EsNulo([Forms]![FMenu].[txtFecha].[value]);Ahora();[Forms]![FMenu].[txtFecha].[value])
¿Qué hace el anterior filtro? Pues lo que hace es evaluar el valor que tenemos en nuestro
txtFecha del formulario FMenu. Si no hay valor el filtro resultante es
<= (Fecha actual)
Y si hay valor el filtro resultante es
<= (Fecha del TextBox)
Guardamos la consulta y la cerramos.
Realizamos el mismo proceso en la consulta CSalidas. Añadimos el campo [FechS] y le aplicamos
Realizamos el mismo proceso en la consulta CSalidas. Añadimos el campo [FechS] y le
aplicamos el mismo filtro:
<=SiInm(EsNulo([Forms]![FMenu].[txtFecha].[value]);Ahora();[Forms]![FMenu].[txtFecha].[value])
Es decir:
2
Visítame en http://siliconproject.com.ar/neckkito/
Guardamos y cerramos la consulta. Situamos nuestra consulta CStock en vista diseño. Vamos a tener
Guardamos y cerramos la consulta.
Situamos nuestra consulta CStock en vista diseño. Vamos a
tener que manipular la combinación de la relación entre las
tres tablas que tenemos ahí.
Seleccionamos pues la relación (la línea que las une) entre
TProductos y CEntradas2 y click con el botón derecho del
ratón. Seleccionamos la opción “Propiedades de la
combinación”.
En la ventana que nos aparece seleccionamos la combinación tipo 2 (Incluir TODOS los registros
En la ventana que nos aparece seleccionamos la combinación tipo 2 (Incluir TODOS los
registros de TProductos
Realizamos la misma operación con la relación entre las tablas TProductos y CSalidas2.
Nos centramos ahora en el grid de la consulta. Tenemos un campo llamado [SumaDeEntrada].
Debemos cambiarlo por la siguiente expresión:
TotE: SiInm(EsNulo([SumaDeEntrada]);0;[SumaDeEntrada])
Ahora pasamos al campo [SumaDeSalida], y lo cambiamos por la siguiente expresión:
TotS: SiInm(EsNulo([SumaDeSalida]);0;[SumaDeSalida])
Finalmente, pasamos al campo [Stock] y lo cambiamos por la siguiente expresión:
Stock: [TotE]-[TotS]
Guardamos y cerramos nuestra consulta.
MANIPULANDO NUESTRO INFORME
Procedamos a situar nuestro informe RStock en vista diseño. Necesitamos “reasignar” los
campos que antes teníamos en la consulta CStock y que ahora acabamos de manipular.
Seleccionamos pues el campo [SumaDeEntrada] y directamente borramos ese valor y
escribimos TotE.
3
Visítame en http://siliconproject.com.ar/neckkito/
ANTES DESPUÉS (Como en los anuncios de “productos milagrosos”  ) Hacemos lo mismo con
ANTES DESPUÉS (Como en los anuncios de “productos milagrosos”  ) Hacemos lo mismo con
ANTES DESPUÉS (Como en los anuncios de “productos milagrosos”  ) Hacemos lo mismo con
ANTES DESPUÉS (Como en los anuncios de “productos milagrosos”  ) Hacemos lo mismo con
ANTES DESPUÉS (Como en los anuncios de “productos milagrosos”  ) Hacemos lo mismo con
ANTES
DESPUÉS
(Como en los anuncios de “productos milagrosos”  )
Hacemos lo mismo con el campo [SumaDeSalida],
cambiándolo por [TotS]
Vamos a manipular el encabezado del informe. Para ello, añadimos un cuadro de texto en el
mismo, a la derecha del título.
En la etiqueta de ese cuadro de texto podemos escribir algo parecido a: “Datos a fecha:”.
Es decir, en principio yo he creado una cosa así:
Dentro del TextBox escribimos nuestra maravillosa expresión:
Dentro del TextBox escribimos nuestra maravillosa expresión:
=SiInm(EsNulo([Forms]![FMenu].[txtFecha].[value]);Ahora();[Forms]![FMenu].[txtFecha].[value])
Sin el comparador matemático “menor que” (<), puesto que ahora no estamos aplicando un
filtro. Simplemente lo que hacemos es decirle que nos coja el valor que hay en txtFecha de
FMenu, y que si no hay valor nos escriba la fecha actual.
Para que la fecha se nos visualice correctamente sacamos las propiedades de ese cuadro de
texto y nos vamos a la Pestaña Formato → Formato, y seleccionamos la opción “Fecha corta”.
Y como estoy inspirado creamos un rectángulo
alrededor del cuadro de texto y su etiqueta (nos
tapará ambos, inicialmente). Hacemos click con
el botón derecho del ratón sobre ese rectángulo
y seleccionamos la opción “Ubicación” → Enviar al
fondo:
Y siguiendo con el rectángulo seleccionado sacamos sus propiedades y nos vamos a la pestaña
Y siguiendo con el rectángulo seleccionado sacamos sus propiedades y nos vamos a la pestaña
4
Visítame en http://siliconproject.com.ar/neckkito/
Formato → Efecto especial, y seleccionamos el efecto que más nos guste. Yo, por ejemplo,
Formato → Efecto especial, y seleccionamos el efecto que más nos guste. Yo, por ejemplo, he
seleccionado “Bajo relieve”.
Y si guardamos nuestro informe ya tenemos el ejemplo
desarrollado.
MODIFICANDO NUESTRO CÓDIGO PARA CHEQUEAR LAS
SALIDAS
Lo anterior nos crea un conflicto con el código que nos sirve para, en el formulario FSalidas,
chequear si podemos sacar la cantidad que queremos sacar. Vamos a arreglar eso.
Abrimos el formulario FSalidas en vista diseño, sacamos las propiedades del campo [CantS] y
editamos el código asociado al evento “Después de actualizar” (Pestaña Eventos). Vamos a
modificar el código de la siguiente manera:
Private Sub CantS_AfterUpdate()
'Declaramos las variables
Dim vProd As Long
Dim vCant As Integer, vCantStock As Integer
Dim miSql As String
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
'Guardamos el registro (necesario)
DoCmd.RunCommand acCmdSaveRecord
'Creamos la SQL para comprobar el stock
miSql = "SELECT C1.[TotE]-C2.[TotS] AS Stock FROM" _
& " (SELECT TEntradas.IdProd, Sum(TEntradas.CantE) As TotE FROM TEntradas" _
& " GROUP BY TEntradas.IdProd HAVING TEntradas.IdProd=" & vProd & ") AS C1," _
& " (SELECT TSalidas.IdProd, Sum(TSalidas.CantS) AS TotS FROM TSalidas" _
& " GROUP BY TSalidas.IdProd HAVING TSalidas.IdProd=" & vProd & ") AS C2"
'Creamos el recordset sobre la SQL
Set rst = CurrentDb.OpenRecordset(miSql)
With rst
'Cogemos el stock existente
vCantStock = Nz(.Fields("Stock").Value, 0)
'Le restamos la cantidad que estamos sacando
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 & _
5
Visítame en http://siliconproject.com.ar/neckkito/
" unidades", vbCritical, "SIN STOCK" 'Borramos la cantidad introducida Me.CantS.Value = Null
" 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
'Si queda stock, pero es inferior a 10
unidades, lanza un aviso
Case Is <= 10
MsgBox "¡Atención! El stock que quedará de este
producto es de " _
& vCantStock & " unidades", vbInformation,
"STOCK CRÍTICO"
End Select
End With
'Cerramos conexiones y liberamos memoria
rst.Close
Set rst = Nothing
End Sub
Como veis, hemos tenido que utilizar una SQL un poco “enrevesada”, que no explicaré aquí,
pero que os hace el trabajo de “sintetizar en una” varias consultas, a la vez que ya nos filtra
por el producto en cuestión que estamos sacando de nuestro almacén.
Y eso es todo. Espero que os sea de utilidad.
Un saludo, y
¡suerte!
6
Visítame en http://siliconproject.com.ar/neckkito/