GestionAlmacen-Adenda3

9
GESTIÓN ALMACÉN – ADENDA 3 1 INTRODUCCIÓN Se me ha solicitado una variación en el ejemplo “Gestión Almacén-Adenda2”. Dicha modificación consiste en introducir un producto bajo el cual “cuelgan” una serie de referencias. Es decir, que el producto es, genéricamente uno, pero en concreto son las referencias de este producto las que entran en nuestro almacén. Gráficamente, el producto X sería, 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 explicación presupone que tenemos completamente desarrollado el ejemplo que se muestra en “Gestión Almacén-Adenda 2” (que a su vez depende del ejemplo “Gestión Almacén”, y que todo lo que se indicará en este documento parte de la estructura de “Gestión Almacén-Adenda 2”). 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 (“Gestión Almacén-Adenda2”, que puede consultar aquí ). Si no con dificultad entenderá lo que se explicará a continuación. 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, complicaría muchísimo el ejemplo. Por ello debéis ser conscientes de que “transfiero” ese control a vuestra supervisión manual, puesto que sólo os controlará las cantidades globales de producto, no referencia por referencia. Dicho lo anterior pongámonos manos a la obra. CREANDO NUESTRAS TABLAS DE REFERENCIAS DE PRODUCTO Si recordamos la estructura de nuestra tabla productos veremos que teníamos 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 sólo tres campos, que son los básicos para que el ejemplo funcione, pero vosotros podríais añadir todos los campos que necesitéis. Esos tres campos serán: 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 comentábamos antes 1 La BD de ejemplo os la podéis bajar aquí . 1 Visítame en http://neckkito.siliconproject.com.ar

description

Almacen en Access

Transcript of GestionAlmacen-Adenda3

Page 1: GestionAlmacen-Adenda3

GESTIÓN ALMACÉN – ADENDA 31

INTRODUCCIÓNSe me ha solicitado una variación en el ejemplo “GestiónAlmacén-Adenda2”. Dicha modificación consiste enintroducir un producto bajo el cual “cuelgan” una serie dereferencias. Es decir, que el producto es, genéricamenteuno, pero en concreto son las referencias de este productolas que entran en nuestro almacén.

Gráficamente, el producto X sería, en realidad:

Producto X – Referencia 1Producto X – Referencia 2Producto X – Referencia 3Etc.

En este ejemplo intentaremos que sea posible dar entrada (y salida) tanto producto comoreferencias de una manera ágil.

Debemos tener presente que esta explicación presupone que tenemos completamentedesarrollado el ejemplo que se muestra en “Gestión Almacén-Adenda 2” (que a su vez dependedel ejemplo “Gestión Almacén”, y que todo lo que se indicará en este documento parte de laestructura de “Gestión Almacén-Adenda 2”).

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 (“Gestión Almacén-Adenda2”, quepuede consultar aquí). Si no con dificultad entenderá lo que se explicará a continuación.

Aquí debo hacer una advertencia: el sistema es un sistema simplificado. Con ello quiero decirque establecer un control de salida de referencias que no han entrado, o que ya no hay enstock, complicaría muchísimo el ejemplo. Por ello debéis ser conscientes de que “transfiero”ese control a vuestra supervisión manual, puesto que sólo os controlará las cantidadesglobales de producto, no referencia por referencia.

Dicho lo anterior pongámonos manos a la obra.

CREANDO NUESTRAS TABLAS DE REFERENCIAS DE PRODUCTO

Si recordamos la estructura de nuestra tabla productos veremos que teníamos un campollamado [Id], de tipo texto, que representaba nuestro identificador del producto. Este campova a ser muy importante, puesto que será el que nos hará de “enlace” entre el producto y lasreferencias de producto.Vamos a crearnos una nueva tabla, que guardaremos como TReferencias. Voy a utilizar sólotres campos, que son los básicos para que el ejemplo funcione, pero vosotros podríais añadirtodos los campos que necesitéis. Esos tres campos serán:

– 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

comentábamos antes

1 La BD de ejemplo os la podéis bajar aquí.

1Visítame en http://neckkito.siliconproject.com.ar

Page 2: GestionAlmacen-Adenda3

– La referencia en sí.

La estructura de la tabla podría 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. Esteformulario lo crearemos como “Formularios continuos”.Nos debería haber quedado una cosa así:

Si os fijáis he hecho “pequeñitos” los campos [IdRef], [IdAux] e [IdProd] y los he situado enun rincón del formulario. Vamos a seleccionar esos tres campos y vamos a sacar suspropiedades. Nos vamos a Pestaña Formato Visible, y situamos esa propiedad en NO.→

MODIFICANDO FENTRADASSituamos nuestro formulario FEntradas en vista diseño. A continuación insertamos unsubformulario y cuando nos salga el asistente lo configuramos así:

• Usar un formulario existente Seleccionamos FReferencias.→• Definimos nuestra propia relación:

◦ Campo del formulario: [IdProd]◦ Campo del subformulario: [IdProd]

• Definimos una segunda relación:◦ 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 pestaña Datossituamos la propiedad [Bloqueado] en SÍ.

A continuación añadimos, en la sección Detalle, un botón de comando, que guardaremos con el

2Visítame en http://neckkito.siliconproject.com.ar

Page 3: GestionAlmacen-Adenda3

nombre de cmdContarReferencias2. En su evento “Al hacer click” generamos este código3:

…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 = nRefEnd Sub…

Creo que no hace falta comentar mucho el código... Sólo hacer notar que hemos utilizado DAO,lo que implica que debemos tener registrada la referencia “Microsoft DAO 3.6 Object Library” omódulo equivalente4.

El formulario lleva un botón, que es cmdCerrar, en su encabezado. Vamos a modificarligeramente su código para que nos sirva de control para evitar “patinazos”.

El nuevo código sería 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 confirmación 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 incidenciaEnd Sub…

¿CUÁL ES EL PROCESO DE ENTRADA DE DATOS?A nivel de usuario el proceso, aunque creo que intuitivo, será el siguiente:

– 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 elsubformulario.

2 Para asignar un nombre a un control lo que debemos hacer es sacar las propiedades de ese control e irnos a la Pestaña Otras →Nombre. Ahí escribimos el nombre que queramos.

3 Para generar código debemos sacar las propiedades del control Pestaña Eventos, y nos situamos en la parte “blanca” a la derecha→del evento que queremos programar. Veremos un pequeño botón de puntos suspensivos. Si hacemos click sobre él nos apareceráuna ventana que nos pedirá qué operación deseamos realizar. Le indicamos que queremos “generar código”.

4 Para registrar una referencia debemos irnos, en el editor de VB, a Menú Herramientas Referencias... Se nos abrirá una ventana→ →mostrándonos todas las referencias disponibles. Buscamos la que nos interese, marcamos su check y aceptamos.

3Visítame en http://neckkito.siliconproject.com.ar

Page 4: GestionAlmacen-Adenda3

– Una vez finalizada la entrada de referencias hacemos click sobre el botón que noscuenta las referencias y, ahora sí, el número de unidades de entrada se escribe en elcampo correspondiente.

– Si nos olvidamos y le damos al botón para cerrar elformulario la aplicación nos avisa del fallo y nos permitevolver atrás para subsanarlo.

Este proceso será idéntico para lo que es la salida deartículos, que veremos a continuación.

MODIFICANDO FSALIDASEl proceso a realizar en FSalidas es casi exactamente el mismo que hemos hecho paraFEntradas. Lo voy a repetir aquí en plan “telegráfico” para que tengáis una guía de pasos. Acontinuación 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 mía propia◦ Creamos una primera relación

▪ Campo del formulario: [IdProd]▪ Campo del subformulario: [IdProd]

◦ Creamos una segunda relación▪ 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í (Pestaña Datos →

Bloqueado)• Insertamos un botón de comando que llamaremos cmdContarReferencias

A partir de aquí va a haber unas ligeras modificaciones. Empecemos por el código decmdContarReferencias. En su evento “Al hacer click” generamos el código 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 "Después de actualizar" de [CantS] Call CantS_AfterUpdateEnd Sub…

Os he marcado en negrita los cambios respecto del botón de FEntradas.

Cogemos el código del botón cmdCerrar del formulario y le cambiamos el código del evento “Alhacer click” por este otro:

…Private Sub cmdCerrar_Click() 'Declaramos las variables

4Visítame en http://neckkito.siliconproject.com.ar

Page 5: GestionAlmacen-Adenda3

Dim resp As Integer 'Comprobamos que haya valor en la cantidad de salida

If IsNull(Me.CantS.Value) Then 'No hay valor. Pedimos confirmación desalida 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 incidenciaEnd Sub…

De nuevo os marco en negrita las diferencias con el código del mismo botón de FEntradas.

CREANDO LAS CONSULTAS PARA VER REFERENCIAS EXISTENTES

Vamos a crearnos un sistema de consultas que nos permitirá sacar un listado de referenciasexistentes.

Empezaremos por la consulta CRefEntradas, que tendrá la siguiente estructura:

A continuación nos creamos la consulta CRefSalidas, con una estructura idéntica pero sobre latabla TSalidas. Así:

5Visítame en http://neckkito.siliconproject.com.ar

Page 6: GestionAlmacen-Adenda3

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

Fijaos en un par de detalles:

• La relación entre CRefEntradas y CRefSalidas es una combinación de tipo 2. Esosignifica que se muestran todos los registros de CRefEntradas y sólo los coincidentes deCRefSalidas.

• Una vez que tenemos la relación con una combinación de tipo 2 tenemos que filtraraquellos registros en los que el valor de [Referencia] de CRefSalidas sea nulo. ¿Por qué?Porque si es nulo quiere decir que aún no ha salido de nuestro almacén. De ahí quepodáis ver en la ilustración ese filtro sobre el campo [Referencia] de CRefSalidas.

• Incluimos el campo [IdProd] en la consulta porque nos va a servir posteriormente paradarnos más información en el informe que recogerá el stock de referencias.

REALIZANDO LOS INFORMESVamos a confeccionarnos tres informes: uno para ver sólo las entradas de referencias, otropara las salidas y otro para ver las referencias en stock.

La construcción de los informes va a ser muy similar en los tres casos. Así pues, vamos a porel primero.

Nos creamos un informe, que llamaremos RRefEntradas, que basaremos sobre la consultaCRefEntradas. Vamos a crearlo utilizando el asistente para informes. Cuando iniciemos elasistente lo configuraremos así (asistente de Access 2007. Si utilizamos otra versión puedehaber pequeñas diferencias en el proceso, pero con la información de pantalla no tendremosproblemas para seleccionar la opción correcta):

6Visítame en http://neckkito.siliconproject.com.ar

Page 7: GestionAlmacen-Adenda3

• Seleccionamos la consulta CRefEntradas y añadimos 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 distribución que más nos guste para elinforme. Yo he elegido “En pasos”.

• Seleccionamos el estilo de nuestro gusto• Como título escribimos RRefEntradas

Situamos nuestro informe en vista diseño y realizamos loscambios de diseño que consideremos oportunos.

Vamos a añadir un cuadro de texto en la sección <Encabezado deIdProd>, y vamos a eliminar la etiqueta. En el interior de esetextbox escribiremos la siguiente expresión:

=DBúsq("[CodProd]";"TProductos";"[Id]=" & [IdProd])

Con ese DBúsq lo que logramos es que al lado del identificador del producto nos salga elcódigo de producto. Si queremos la descripción deberíamos haber escrito:

=DBúsq("[DescProd]";"TProductos";"[Id]=" & [IdProd])

En definitiva, el informe a mí me ha salido así:

A continuación, tras cerrar este informe, vamos a copiarlo y pegarlo con el nombre deRRefSalidas.

Situamos RRefSalidas en vista diseño y sacamos sus propiedades. Nos vamos a la pestañaDatos Origen del registro, y seleccionamos del desplegable la consulta CRefSalidas.→

Realizamos los cambios de diseño oportunos.

Finalmente vamos a crearnos el informe para ver las referencias existentes en el almacén. Paraello creamos un nuevo informe a través del asistente para informes y lo configuramos así:

• Seleccionamos la consulta CRefExistentes y los campos [IdProd] y[CrefEntradas.Referencia]

• Añadimos un nivel de agrupamiento por [IdProd]• Añadimos una ordenación si nos interesa• Elegimos la distribución• Elegimos el estilo• Como título indicamos RRefExistentes

7Visítame en http://neckkito.siliconproject.com.ar

Page 8: GestionAlmacen-Adenda3

De nuevo insertamos un cuadro de texto junto a [IdProd] y copiamos-pegamos la expresiónanterior de DBúsq

Y ya tenemos nuestros informes.

PROGRAMANDO FMENUSólo nos queda programar los botones en FMenu para poderabrir esos informes.

Así pues, añadimos tres botones de comando, que llamaremos, respectivamente:

• cmdAbreRRefEntradas• cmdAbreRRefSalidas• cmdAbreRRefExistentes

Y los códigos que vamos a asignarles serán:

A cmdAbreRRefEntradas:

…Private Sub cmdAbreRRefEntradas_Click() DoCmd.OpenReport "RRefEntradas", acViewPreviewEnd Sub…

A cmdAbreRRefSalidas:

…Private Sub cmdAbreRRefSalidas_Click() DoCmd.OpenReport "RRefSalidas", acViewPreviewEnd Sub…

El tercer botón va a depender del valor seleccionado en el cuadro combinado que ya tenemosen FMenu. Si seleccionamos un productos el informe nos saldrá filtrado por ese producto. Sidejamos el valor del combo en blanco nos saldrá el informe completo.

Su código sería 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 más If vProd = 0 Then DoCmd.OpenReport "RRefExistentes", acViewPreview Else 'Si hay valor abrimos el informe filtrándolo DoCmd.OpenReport "RRefExistentes", acViewPreview, , "[IdProd]=" & vProd End IfEnd Sub…

Desgraciadamente filtrar por fechas requeriría complicar el ejemplo en demasía, por lo que no

8Visítame en http://neckkito.siliconproject.com.ar

Page 9: GestionAlmacen-Adenda3

realizaremos ese tipo de filtro.

PARA FINALIZAR EL EJEMPLOBueno... Gracias a vuestras peticiones la cosa se vacomplicando... je, je...

Espero que el ejemplo os sea útil o que os proporcione lasbases para poder ir desarrollando vuestra propia aplicación.

Un saludo, y...

¡suerte!

9Visítame en http://neckkito.siliconproject.com.ar