miércoles, 22 de enero de 2014

Macro para traspaso y clasificación de informacion

La macro fue diseñada con el objetivo de facilitar la búsqueda de productos para nuestro proyecto final, puesto que se cuenta con una gran variedad de estos los cuales están clasificados de acuerdo a familias de productos. Aquí es donde radica su utilidad, por lo que puede ser aplicado para segmentos en donde la diferenciación de cada producto es muy alta y nos sirve para darle un orden en la base de datos. También se le agregaron macros para identificar cada uno de los atributos de los productos, de este modo con un solo clic podemos apreciar una lista con cada uno de las especificaciones.
En primer lugar para poder obtener en una nueva hoja de cálculo la lista de productos y de los atributos posibles, fue utilizada la función “While” en conjunto con la función “If” la cual nos es útil para traspasar información siempre y cuando se cumplan las condiciones especificadas, en este primer caso se requiere que las celdas no estén vacías y sus valores sean distintos de cero, mientras que el “While” nos permite realizar este traspaso de información uno por uno hacia abajo en la columna:
Worksheets("Hoja1").Activate
c = 3
a = 5
f = 2
While (f < 3000)
If Cells(f, 2) <> 0 And Cells(f, 2) <> "                 " Then
                Worksheets("Hoja2").Cells(a, c) = Cells(f, 2)   
                End If
                f = f + 1
                a = a + 1
En donde “f” representa la fila en la cual se empieza a realizar el traspaso de información de la hoja de origen, mientras que a representa la fila destinataria en la nueva hoja de cálculo. Adicional a esto se le agrego la función para limpiar la pantalla de datos para que esta se pueda realizar desde cero cuando se estime conveniente. Luego al agregarle botones de ejecución para las macros el Excel queda de la siguiente forma:



Posterior a esto, como los productos que utilizaremos en nuestro proyecto se clasifican en : Valvulas, Accesorio de Calderas, Instrumentacion y Automatizacion; para facilitar la búsqueda de estos según categorías se le adicionó un condicional para que estos se traspasen en columnas distintas según la familia a la cual pertenecen. Para esto fue requerido adicionar tambien comandos para eliminar espacios en blanco y de ordenación apra que estos se ubiquen sin depende de su orientación en la hoja de origen; para esto fue útil programas eliminación de duplicados y de ordenamiento:

Worksheets("Hoja1").Activate
c = 2
a = 4
f = 2
While (f < 3000)
                If Cells(f, 5).Value = 1 And Cells(f, 2) <> 0 And Cells(f, 2) <> "                 " Then     
                Worksheets("Hoja3").Cells(a, c) = Cells(f, 2)      
                End If
                f = f + 1
                a = a + 1
                Wend
Worksheets("Hoja3").Activate
ActiveSheet.Range("$B$4:$B$1520").RemoveDuplicates Columns:=1, Header:=xlNo
                ActiveWorkbook.Worksheets("Hoja3").Sort.SortFields.Clear
                ActiveWorkbook.Worksheets("Hoja3").Sort.SortFields.Add Key:=Range("B4"), _
                SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                 With ActiveWorkbook.Worksheets("Hoja3").Sort
                .SetRange Range("B4:B1520")
                .Header = xlGuess
                 .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
                End With
Al igual que en el caso anterior, se le agrego una macro para limpiar la hoja para que se pueda utilizar desde cero, además de agregarle un botón de ejecución de la clasificación de productos, quedando de la siguiente forma:





En mi opinión, si bien la programación es bastante simple, creo que el alcance de estas funciones puede otorgar un manejo de información mucho más eficiente, organizando productos dependiendo los atributos que estos posean, que facilite de esta forma la búsqueda de estos con mayor rapidez dependiendo sus funcionalidades y además permitiendo el traspaso de información de manera automatizada.

https://www.dropbox.com/s/pson9hg9sfwm9sy/Macros%20Blog.xlsm

En esta direccion pueden descargar el excel habilitado para macro, para que puedan ver el detalle de la programacion, es bastante simple si se realiza un correcto uso de variables locales. Saludos.
Leer más...

Macro para ingresar ordenes de pedidos a una base

Uno de los grandes problemas de algunas empresas que no han actualizado sus formas de trabajo (como es el caso de Upmetal) es que no cuentan con un sistema que resuma las distintas ordenes y presupuestos que hacen los clientes a la empresa. Para ayudar a lograr este objetivo se propone una macro que ingrese los pedidos a una gran base de pedidos y que además les entregue un número de identificación (Id) a cada pedido.

La idea es lograr que mediante una interfaz como la siguiente:

 El departamento de ventas pueda ingresar datos que vayan llenando una base de datos como la siguiente:


Para lograr esto es que utilizaremos la herramienta de formularios (userforms) que nos ofrece Visual Basic.

Lo primero que debemos hacer es saber abrir la opción de generar nuevos formularios en nuestro proyecto. Para esto damos click derecho en cualquier lado del espacio en donde se muestran los formularios y módulos existentes en nuestro proyecto, vamos a insertar y clickeamos sobre la opción "UserForm".


En nuestra pantalla aparecerá el siguiente cuadro de trabajo:

Como podemos ver, el programa nos ofrece una cantidad de opciones para editar un cuadro de información; el cual se encuentra bajo el nombre "Cuadro de herramientas". También podemos editar la forma y vista de nuestra userform con la tabla que podemos ver en la ezquina inferior izquierda de la imagen. En nuestro caso le cambiaremos el nombre, de "userform1" (nombre estándar) a "Clientes".

El siguiente paso es llenar nuestro cuadro de la información que queremos que tenga. Lo primero es ingresar el texto que queremos que tenga, para esto vamos al cuadro de herramientas y clickeamos sobre la segunda opción (que es representada por una A mayúscula). Lo dibujamos con el tamaño que queramos sobre nuestra ventana userform y le damos el nombre que queremos que aparezca en la ventana:


Una vez habiendo nombrado la etiqueta; ingresamos el campo de texto que queremos que se vaya rellenando en nuestra ventana (por ejemplo si la etiqueta dice Nombre; un campo de texto en donde el usuario pueda ingresar su nombre); para esto nos dirigimos nuevamente al cuadro de herramientas y damos click sobre la tercera opción de este (es representado por un "ab"). Una vez que este se haya establecido del tamaño que queramos se aconseja cambiarle el nombre al del valor que representa (por ejemplo: "Nombre"), más adelante veremos porque esto es importante. Lo anterior se hace de la misma manera en que le cambiamos el nombre a nuestra userform (en la esquina inferior izquierda de nuestra pantalla).


Repetimos los dos pasos anteriores todas las veces que sea necesario, es decir toda la información que queramos incluir en nuestra base.

Una vez que tengamos lo anterior listo podemos  ingresar los botones que van a realizar la acción que nosotros mandemos en la macro. Para esto vamos al cuadro de herramientas y damos click sobre el décimo icono (un dibujo que busca asemejarse a un botón rectangular).


Una vez habiendo diseñado el botón a nuestro gusto y habiéndole puesto el nombre que queramos (en nuestro caso lo denominaremos "Ingresar"), damos doble click sobre el botón y aparecerá la siguiente ventana en nuestra pantalla:


Es en esta ventana donde programaremos gran parte de nuestra macro.

Lo primero que debemos generar es una variable local auxiliar que nos permita generar los id automáticamente para cada pedido y además que nos permita ordenar la información de la base sin necesidad de tocar esta. Para esto utilizaremos una local que vaya contando las celdas como auxiliar; esta la definiremos de la siguiente manera (Base es el nombre que le dimos a la hoja de cálculo en que queremos que se realice la acción):

Dim m As Integer

m = Application.WorksheetFunction.CountA(Sheets("Base").Range("A1:A1000"))

Una vez que tenemos lo anterior, podemos generar la macro que va automáticamente asignarle un Id a cada pedido que ingresemos. Lo anterior es tan simple como igualar el cuadro en que queremos que se sitúe la id a nuestra variable m.

Sheets("Base").Range("A6").Offset(m, 0).Value = m

Como queremos que la variable vaya bajando de una fila a la vez, incluimos en nuestra instrucción un offset que vaya bajando el número de filas según la cantidad de nuestra variable local "m" (es importante que en range pongamos el número de una fila superior a la primera que queremos que rellene, ya que el primer valor para m es igual 1).

Ahora tenemos que conectar la información que vamos rellenando en nuestra userform a las celdas de la base. Para esto debemos igualar la celda que esperamos rellenar con el valor del cuadro de texto que queramos conectar. Si el cuadro de texto que eremos conectar lo denominamos como "Cliente1" y nuestra userform como "Cliente" entonces la instrucción debiese tener la siguiente forma:

Sheets("Base").Range("B6").Offset(m, 0).Value = Cliente.Cliente1.Value

Lo anterior lo repetimos para todos los cuadros de texto que se deban rellenar. Una vez que hayamos completado esto, podemos ordenar que una vez que se hayan enviado los datos,  los cuadros de texto se borren; para esto tenemos que programar el siguiente código para cada cuadro:

Cliente.Cliente1.Value = ""

De esta manera habremos terminado nuestro botón de "Ingresar"; si queremos ingresar otro botón para cerrar el cuadro de texto seguimos el mismo proceso de crear un botón y simplemente le damos la siguiente instrucción:

Sheets("Menú").Select
Sheets("Menú").Visible = True
Cliente.Hide

En el último paso estaríamos "escondiendo" nuestra ventana y haciendo visible nuestro menú.

Finalmente nuestra ventana se vería como algo similar a lo siguiente:


El siguiente paso sería conectar nuestra userform a nuestro menú de interfaz en excel; para esto necesitaremos programar una pequeña macro. Damos click derecho sobre la pantalla en el mismo espacio donde clickeamos para generar nuestro formulario, sólo que ahora seleccionamos la opción de crear un módulo:


Y nos aparecerá una ventana como la siguiente:


En esta ventana debemos programar una macro que nos haga aparecer nuestra userform. Esta macro sería tan simple como lo siguiente:

Sub boton()
Cliente.Show

End Sub

Luego en nuestro excel insertamos un botón y le asignamos la macro anterior. Podemos generar otra macro que nos permita ver la base de datos, la que llevaría la siguiente instrucción:

Sub Mostrar()

Sheets("Base").Visible = True
Sheets("Base").Select
End Sub

Le asignamos esta base a otro botón en nuestro excel y llegamos al menú que nos habíamos propuesto en un principio; el cual con el click de un botón nos mostrará lo siguiente:

Si le damos click a "Ingresar", nuestra base se verá de la siguiente manera:


De esta manera cumplimos nuestro objetivo.

Si quieren ver como funciona la macro, pueden clickear sobre el siguiente enlace (¡No olviden habilitar las macros!): https://www.dropbox.com/s/2m0pjs8strtrvnz/Blog2.xlsm
Leer más...

Gimnasio "Vida Sana" y su Modelo de Datos

CONTEXTO

Los gimnasios son lugares cerrados en los que las personas pueden practicar algún tipo de deporte colectivo o realizar ejercicios tanto aeróbicos (clases) como anaeróbicos (máquinas). Para analizar un modelo MER, no nos centraremos en los que son los gimnasios donde se practican deportes colectivos, sino más bien en los gimnasios en los que se pueden realizar clases aeróbicas o simplemente tener una rutina anaeróbica (máquinas).

Personalmente me enfocaré en el tipo de gimnasio en el cual uno paga una inscripción. Dado lo anterior, para realizar un Modelo MER, vamos a crear un gimnasio ficticio para reconocer y modelar las relaciones que se crean entre las entidades, todo esto a modo de ejemplo.

El gimnasio “Vida Sana” nació de un negocio familiar donde trabajaban solamente 6 personas. Últimamente ha crecido considerablemente y es muy reconocida y demandada por las personas del sector, teniendo que llegar a un total de 14 empleados. Con este nuevo escenario se han visto en la dificultad de ordenar y controlar los datos de los alumnos.

SUPUESTOS

A modo de hacer más dinámico el modelo, vamos a ir mostrando la relación que existe entre las entidades, ya sea relaciones "muchos es a muchos" en los cuales necesitaré crear otra entidad para que la unión entre las dos entidades se haga de manera correcta y las relaciones "uno es a muchos". Todo esto lo iré mostramos a través de fotos de las relaciones.


Cada alumno del gimnasio puede realizar muchas clases durante el día y en distintos horarios, sin embargo puede realizar solo una clase a la vez.

El alumno puede realizar una clase en un mismo horario y en una misma sala.

Un alumno puede tomar muchas clases y una clase puede ser tomada por varios alumnos.

En cada sala se realizan muchas clases durante el día, pero esas clases deben ser dadas en distintos horarios.




Un profesor puede realizar muchas clases durante el día en distintos horarios y distintas salas. Sin embargo, el profesor puede dar solo una clase en un mismo horario y una misma sala.

Cada sala puede ser ocupada por muchas clases, pero cada clase puede ocupar solo una sala.





EXPLICACIÓN DEL MODELO

A modo de resumen se muestra el Modelo MER final en el cual se muestras todas las relaciones explicadas anteriormente.



Leer más...

miércoles, 8 de enero de 2014

Creando un Modelo de Datos para un Restaurante

En esta entrada, abordaremos la creación de un modelo de datos para un restaurante, utilizando Microsoft Access 2013®. 

1.- Descripción del problema y algunas definiciones


Probablemente, la mayoría de nosotros ha tenido la posibilidad de comer en un restaurante. Para unificar conceptos y antes de hablar sobre la construcción del modelo de datos, diremos que un restaurante es un establecimiento comercial donde se sirven platos para ser consumidos en el local o para llevar. Por lo tanto, para brindar dicho servicio, un restaurante debe adquirir de sus proveedores, una serie de insumos para preparar los platos. Asimismo, debe contar con personal adecuado para realizar las distintas funciones (camarero, cocinero, etcétera) y con la infraestructura física para recibir a los clientes que comerán en el local (establecimiento, mesas, sillas y otros).


Al ingresar un cliente al restaurante, éste será recibido por un camarero, quién tomará su pedido. Posteriormente, se genera un detalle con los platos que se deben preparar para un determinado pedido. El cocinero se encargará de elaborar dichos platos, los que serán consumidos por los clientes. Al terminar de consumir, se registrará la venta, incorporando todos los montos que deberán ser cancelados por los clientes (incluyendo propina y/o IVA, entre otros).  

Si bien, ya tenemos una idea de cómo funciona un restaurante, aún necesitamos una base de datos, la que se define como una estructura de orden y funcionamiento para las variables que consideraremos. Cuando tengamos una noción de cómo serán la base de datos y el funcionamiento de nuestra organización, podremos dar inicio a la construcción del modelo de datos. Específicamente, un modelo de datos es un esquema que ordena y gobierna esta información, en donde existen reglas de vinculación. 

Dicho lo anterior, podemos comenzar a construir el modelo de datos. En primer lugar, determinaremos las principales entidades (con su nombre en singular) y codificaciones, que participarán en el modelo incluyendo, entre paréntesis, sus atributos claves:

  • Proveedor (Rut Proveedor)
  • Insumo (Código Insumo)
  • Plato (Código Plato)
  • Cliente (Rut Cliente)
  • Pedido (Id Pedido)
  • Venta (Código Venta)
  • Mesa (Id Mesa)
  • Personal (Rut Personal)
  • Turno (Código Turno)
  • Tipo Personal (Código Tipo)

Nota 1: Las tablas "Turno" y "Tipo Personal" corresponden a codificaciones de "Personal".

Nota 2: Se podrían considerar otras entidades adicionales, pero la finalidad no es entregar un modelo complejo, sino explicar claramente cómo operaría un modelo de datos general para un restaurante.


2.- Reglas de Vinculación y Supuestos


Luego de definir las entidades, debemos establecer algunas reglas de vinculación y supuestos, tales como:

2.1.- Reglas:

En primer lugar, cuando existan relaciones de “muchos es a muchos” entre algunas entidades, se construirá una tabla intermedia, que tendrá el nombre de las entidades que la conforman. Esto, ocurre en las siguientes relaciones (la tabla intermedia aparece en paréntesis):

  • Proveedor e Insumo (Proveedor_Insumo)
  • Insumo y Plato (Insumo_Plato)
  • Pedido y Plato (Pedido_Plato)

En segundo lugar, existirán relaciones “uno es a mucho”, las que reflejan a todas las relaciones restantes en el modelo de datos que vamos a presentar. Algunas de ellas son:
  • Personal_1 y Pedido
  • Personal y Plato
  • Turno y Personal
  • Turno y Personal_1
  • Entre otras

Nota 3
: Se duplicó la tabla "Personal" para reflejar las distintas funciones de los camareros y los cocineros, tal que "Personal" corresponde a los cocineros y "Personal_1" a los camareros. La codificación que los diferencia es el "Código Tipo".

2.2.- Supuestos:

  • Existe sólo un local y no consideraremos la presencia de una carta.
  • Todos los insumos tendrán un código asociado.
  • Los Precios de los insumos pueden variar dependiendo del Proveedor, por lo que el atributo "Precio_Insumo" se colocó en la tabla intermedia "Proveedor_Insumo".
  • Existirán distintos tipos de platos y presentaciones, según requerimientos de los clientes.
  • Los pedidos sólo podrán ser solicitados para “Consumo en Local” o “Retiro en Local”. Esto se reflejará en la categoría “Tipo_Pedido” dentro de la tabla Pedido. 
  • Las mesas se encontrarán enumeradas.
  • Supondremos que el número de comensales es apropiado para las distintas mesas. De lo contrario, se debiese cumplir que el número de comensales dentro de un pedido, debe ser menor o igual a la capacidad máxima de la mesa.
  • Existirán una fecha de pedido, que puede ser distinta o no a la fecha de venta.
  • Por simplicidad, suponemos que el Personal del restaurante está compuesto por cocineros (Personal) y camareros (Personal_1). De lo contrario, se deben agregar los otros cargos dentro de "Tipo_Personal".
  • Un camarero (Personal_1) puede atender pedidos en distintas mesas, pero un pedido debe ser atendido por solo un camarero.
  • Supondremos que los clientes serán identificados por su Rut. Lo anterior, es para simplificar lo referente a pedidos para retiro en local. De lo contrario, se debe incluir un “Código_Cliente” dentro de la tabla "Cliente".
  • Inicialmente, supondremos que existen los insumos suficientes para preparar los platos. De lo contrario el camarero (Personal_1) debe informárselo al cliente.
 

3.- Definición y Explicación del Modelo



Al ingresar un cliente – o un grupo de ellos – al restaurante es recibido por un camarero, quién lo acomodará en una mesa, y le ofrecerá las distintas alternativas de platos, que son preparados en el local. Cuando los comensales se deciden, el camarero toma nota del detalle del pedido y lo lleva a los cocineros. Posteriormente, el personal de cocina preparará los platos que serán servidos a los clientes. Es importante recalcar que, para poder atender a clientes en el local, es necesario que existan mesas y asientos disponibles que se ajusten a las necesidades de los clientes.

Para preparar los distintos platos se requieren insumos, los que son obtenidos por medio de distintos proveedores. Asimismo, un mismo plato tendrá diferentes presentaciones, las que dependerán de las preferencias del cliente por determinados sabores, tamaños, porciones, etc.

Tras finalizar su comida, el Camarero retira los platos y procede a registrar la venta asociada pedido, incorporando todos los montos que deberán ser cancelados por los clientes. Luego de pagar, los comensales hacen abandono del restaurante.
Otra alternativa, consiste en que el cliente solicite un pedido para retirar en el local en una fecha determinada. Posteriormente, el cliente acudirá al establecimiento a pagar y retirar su pedido. Cabe señalar que la fecha de pedido y la fecha de venta pueden ser diferentes (debiese existir alguna diferencia para que los cocineros puedan preparar los platos y el cliente se desplace al local en el intertanto).  

Finalmente, cabe señalar que al registrar la venta del pedido, éste podrá ser cancelado de diversas formas como, por ejemplo, en efectivo, cheque al día, tarjeta bancaria, etcétera. 


4.- Presentación del Modelo


Expuesto todo lo anterior, llegó la hora de construir nuestro modelo de datos utilizando Microsoft Access 2013®. 

En primer lugar, se construyen las tablas que representaran a cada una de las entidades relevantes para nuestro caso, incluyendo las categorías claves, foráneas y  las demás. 

En segundo lugar, se construyen las tablas intermedias para las relaciones "muchos es a muchos".

Finalmente, debemos establecer las relaciones entre las distintas tablas siguiendo las reglas de vinculación y supuestos mencionados anteriormente. Como resultado, podremos obtener un modelo de datos como el que se muestra a continuación:

Modelo de Datos de un Restaurante utilizando Microsoft Access 2013®.

Por si aún quedan algunas dudas, a continuación podrán descargar el archivo de Access® para que puedan revisarlo en su computador. Además, adjunto la captura de pantalla del modelo de datos y una presentación con el fin de sintetizar los conceptos más importantes.

Documento de Access
  
Captura de Pantalla del Modelo de Datos 


Link Opcional Presentación PDF 

Link Opcional Presentación PPT 

Publicado el 29 de diciembre de 2013 por Pierre Mariani R.
(Actualizado el 08 de enero de 2014 según feedback recibido)

  
Leer más...

lunes, 6 de enero de 2014

Normas en la industria de los alimentos

INDUSTRIA SALMONERA

Se entiende por agroindustria a toda actividad que implique el procesamiento de productos generados en la agricultura y pesca. Durante los últimos diez años se ha observado una rápida expansión del sector agroindustrial, la que responde a la interacción de un conjunto de factores de variada índole, que le han conferido un nivel interesante de competitividad externa. 

Específicamente, se presentan cinco subsectores agroindustriales:
- Vitivinícola.
- Procesador de frutas y hortalizas.
- Lácteo.
- Avícola. 
- Pesquero.

Nos concentraremos en la Industria Salmonera ya que la agroindustria es muy amplia, y lo relacionaremos directamente con El Reglamento Sanitario de los Alimentos (RSA), el cual establece las condiciones sanitarias a que deberá ceñirse la producción,  importación, elaboración, envase, almacenamiento, distribución y venta de alimentos para uso humano, con el objeto de proteger la salud y nutrición de la población y garantizar el suministro de alimentos sanos e inocuos.
                                        
Se aplica a todas las personas naturales o jurídicas, que se relacionen o intervengan en los procesos aludidos anteriormente, así como a los establecimientos, medios de transporte y distribución destinados a dichos fines.


 Para saber más sobre el reglamento RSA, visitar este sitio del Minsal:



Para facilitar el entendimiento de este sector, utilizaremos la empresa Australis Seafood como ejemplo para generar y explicar nuestro modelo de datos. En esta empresa, existe el siguiente proceso productivo:


Agua Dulce: Esta etapa corresponde a la de reproducción de los distintos pescados, en agua dulce, en donde hay un proceso de selección, se monitorea el crecimiento y se controla el peso y la talla.

En los estanques se miden diversos factores que inciden en el desarrollo de las especies, tales como:

-       Suministro de Agua.
-       Niveles de Oxígeno por unidad de cultivo.
-       Balance nutricional y cantidad de alimento.
-       Control sanitario de los peces
-       Medición de los parámetros físicos, químicos y ambientales.

Las ovas de peces fecundadas son incubadas en sistemas especialmente acondicionados hasta alcanzar la talla del alevín. La posterior crianza y engorda del alevín en los estanques permite alcanzar la condición de smolt.

Engorda de Salmones y Truchas: Esta etapa es donde evidentemente se "engorda" a los peces y se hace en agua de mar para buscar un peso ideal entre 3 y 5 kilos. Luego, cuando se cumplen las condiciones pertinentes, se cosechan y trasladan hacia los centros de procesamiento.

Los centros de producción en donde se lleva a cabo la engorda de salmónidos cuenta con personal eficiente y capacitado.

La cosecha de Salmón coho y trucha se realizan a los 2,5 y 3 kg. respectivamente, mientras que la cosecha de Salmón salar se realiza a los 4,5 kg.


Proceso y Comercialización: En esta etapa, se lleva a cabo la matanza del pez a través de un proceso indoloro para él, y luego se pasa al punto de comercialización, en donde se envasa, almacena, vende y distribuye para hacerlas llegar al cliente.

La planta de proceso primaria, Fitz Roy, es un centro la cual recibe la materia prima (salmón o trucha entera) y mediante la utilización de tecnología de punta y mano de obra calificada, transforma esta materia prima en productos con valor agregado, de acuerdo a los requerimientos de los clientes en los mercados de destino.

Para más información acerca de su proceso productivo, visitar el siguiente link:




Ahora bien, dentro de la industria salmonera, podemos identificar su comportamiento y sus relaciones:



Para mayor información, ver el siguiente vídeo:



http://www.youtube.com/results?search_query=australis+seafood&sm=3


Leer más...