Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
GESTIÓN DE DRUGSTORE
BASES DE DATOS
TABLA CATEGORIAS
CAMPO TIPO DE DATOS OTRAS PROPIEDADES
idcat BigInt Aceptar valores Null = False
Identidad = True
Incremento de Identidad = 1
Clave principal = True
nombrecat NVarChar Longitud = 50
Aceptar valores Null = False
activa Bit Aceptar valores Null = False
Valor predeterminado = 1
Tabla 10. Creación de la tabla Categorias.
TABLA PRODUCTOS
CAMPO TIPO DE DATOS OTRAS PROPIEDADES
id BigInt Aceptar valores Null = False
Identidad = True
Incremento de Identidad = 1
Clave principal = True
categoriaID BigInt Aceptar valores Null = False
Valor por defecto = 0
descripcion NVarChar Longitud = 50
Aceptar valores Null = False
codproveedor NVarChar Longitud = 50
Aceptar valores Null = False
Stock BigInt Aceptar valores Null = False
Valor por defecto = 0
stockminimo BigInt Aceptar valores Null = False
Valor por defecto = 0
preciodecosto Real Aceptar valores Null = False
Valor por defecto = 0
Proyecto con base de datos: gestión de drugstore
TABLA PRODUCTOS
CAMPO TIPO DE DATOS OTRAS PROPIEDADES
preciodeventa Real Aceptar valores Null = False
Valor por defecto = 0
Activo Bit Aceptar valores Null = False
Valor por defecto = 1
Tabla 11. Creación de la tabla Productos.
La tabla Numeracion llevará tan solo un campo, que será el que contabilice las nuevas
operaciones, como si se tratara de una numeración correlativa de facturas.
TABLA NUMERACIÓN
Campo Tipo de datos Otras propiedades
numticket BigInt Aceptar valores Null = False
Tabla 12. Creación de la tabla Numeracion.
Por último, la tabla Ventas será la encargada de almacenar el historial de cada venta
registrada en el drugstore. En la Tabla 13 vemos los campos que contendrá.
TABLA VENTAS
CAMPO TIPO DE DATOS OTRAS PROPIEDADES
Idm BigInt Aceptar valores Null = False
Identidad = True
Incremento de Identidad = 1
Fecha Datetime
nroventa BigInt Aceptar valores Null = False
Id BigInt Aceptar valores Null = False
cantidad BigInt Aceptar valores Null = False
preciounitario Real Aceptar valores Null = False
subtotal Real Aceptar valores Null = False
Tabla 13. Creación de la tabla Ventas.
Luego nos queda crear la vista, que llamaremos vw_ventas. Para esto, desde el
mismo SQL Server Management Studio, presionamos el botón derecho del
mouse sobre la carpeta Vistas y, del menú contextual, elegimos Nueva vista… Agre-
gamos a continuación las tablas Ventas y Productos. De la primera seleccionamos
los campos nroventa, id, cantidad, preciounitario y subtotal; y de la segunda, sola-
mente descripcion. Establecemos una relación entre el campo ventas.id y
productos.id, la cual se basará en Seleccionar todas las filas desde ventas . Por
último, guardamos la vista con el nombre mencionado. La estructura debe quedar
como se observa en la Figura 25.
BASES DE DATOS
A continuación vamos a generar un nuevo proyecto del tipo Windows Forms Appli-
cation, llamado Drugstore. Al form1 lo renombramos como frmMain y le agre-
gamos cuatro controles Button. El primero se llama btnABMCat y en su propiedad
Text ponemos ABM Categorías. El segundo se denomina btnProductos , y su
propiedad Text será ABM Productos. El tercero es btnSTKMinimo y su propiedad
Text será Stock Mínimo. Al cuarto botón lo llamamos btnVenta y su propiedad Text
será Ventas. Esta será la pantalla principal de la aplicación, desde donde ingresa-
remos a los distintos módulos que componen el sistema para administrar los
productos, categorías, stock mínimo y ventas.
Figura 26. El diseño de la pantalla inicial debe quedar como se muestra en esta figura.
permitirá, a su vez, crear el DataSet que incluirá todos los objetos creados en la base
de datos. Agregamos un nuevo Form, lo llamamos frmABMCategorias. Arrastramos a
él un control DataGridView, en donde seleccionamos un nuevo origen de datos.
Seguimos el asistente de nuevo origen de datos, seleccionando como base de datos
SQL Server el archivo drugstore.mdf. Luego seleccionamos todas las tablas y vistas de
dicha base, y guardamos el DataSet con el nombre DrugstoreDataSet. El BindingSource
vinculado a categorías será CategoriasBindingSource. Por último, editamos las
columnas de DataGridView1 para ajustar sus propiedades como lo indica la Tabla 14.
CAMPO VALORES
Codigo Header Text = Código
DataGridViewCellStyle.Alignment = MiddleRight
Width = 50
nombrecat Header Text = Nombre de categoría
DataGridViewCellStyle.Alignment = MiddleLeft
Width = 270
Activa Header Text = Activa
Width = 40
Tabla 15. Ajuste de propiedades de DataGridView1 en ABM Categorías.
CategoriasBindingSource.EndEdit()
CategoriasTableAdapter.Update(DrugstoreDataSet.categorias)
MessageBox.Show(“Se ha actualizado la tabla CATEGORIAS.”)
Me.Close()
COMBOBOX
Propiedad Valor
Origen de datos CategoriasBindingSource
Mostrar miembro Nombrecat
Miembro de valor Idcat
Valor seleccionado categoriaID
Tabla 15. Configuración del enlace a datos de comboBox1
para mostrar los datos de la tabla Categorías.
Para hacer efectivo el uso del ComboBox1, podemos probarlo y luego ocultar el campo
CategoriaIDTextBox, ya que no lo utilizaremos para nada. El resultado de la creación
de dicho Form debe quedar tal como lo indica la Figura 27.
Como el módulo ABM productos puede tener una cantidad importante de registros,
debemos incluir una opción de filtro por el nombre o parte del nombre de un producto.
En la barra de herramientas ProductosBindingNavigator agregamos algunos objetos más.
El primero será un textBox llamado txtBuscoDesc, y luego, un Button denominado
ProductosLimpiarBindingItem, cuyo valor Text = Limpiar búsqueda. Dentro de la
propiedad Text_Changed() de txtBuscoDesc incluimos el siguiente código:
If trim(txtBuscoDesc.Text) = “” then
Me.ProductosBindingSource.RemoveFilter()
Else
Me.ProductosBindingSource.Filter = “descripcion LIKE ‘*” &
trim(txtBuscoDesc.Text) & “*’”
endif
Me.ProductosBindingSource.RemoveFilter()
Me.txtBuscoDesc.Text = “”
Luego creamos un nuevo Form, al cual llamaremos frmSTKM, y cuya propiedad Text será
Consulta de Stock Mínimo. Su finalidad es saber cuándo los productos del drugstore
sobrepasan un stock mínimo identificado. Esto se conoce como punto de nuevo
BASES DE DATOS
pedido, para prevenir que el negocio que utiliza dicho software se quede sin stock de
mercadería. Agregamos un control DataGridView, enlazamos los datos de la grilla a
ProductosBindingSource y personalicemos la vista de los campos mostrados. Para esto,
vamos al menú de Tareas y elegimos Editar columnas…. Luego, seleccionamos las
columnas id, descripcion, codproveedor, stock y stockminimo. Como será una ventana
de solo consulta, desmarcamos las acciones de agregar, edición, eliminación y reor-
denación de columnas. Agregamos una nueva consulta de datos denominada
FillBySTKMinimo(), dentro de la cual especificamos la siguiente sentencia SQL:
SELECT id, descripcion, stock, stockminimo FROM productos WHERE (stock <=
stockminimo)
Esto permitirá conocer qué productos tienen un stock por debajo del punto de pedido.
Figura 29. La consulta nos permite ver los productos que están
por debajo de su punto mínimo de pedido.
✱ MÚLTIPLES CONSULTAS
Cada objeto BindingSource nos permite crear múltiples consultas ingresando un criterio distinto
para cada una. Esto hará que el resultado pueda visualizarse mucho más rápido aplicando la
invocación nombredelBindingSource.FillByNombreDeConsulta(). Así evitaremos efectuar reite-
radas consultas a un motor de datos si este ya tiene predefinidos los resultados en caché.
Proyecto con base de datos: gestión de drugstore
FRMVENTA
CONTROL NOMBRE PROPIEDADES
Button btnNuevaVenta Text = Nueva venta
btnCancelar Text = Cancelar venta
Enabled = False
btnGrabar Text = Grabar venta
Enabled = False
Label Label5 Text = Venta:
lblVenta Text = 0
TextAlign = MiddleRight
textBox txtSelecciono
Button btnSelecciona Text = Seleccionar
Label lblDesc Text = Descripción del producto
lblStk Text = Stock actual
lblImporte Text = Importe unitario
lblSubt Text = Sub total
textBox txtCantidad
DataGridView gridProd Origen de datos = ProductosBindingSource
Deshabilitar las propiedades de acciones.
Visible = False
Campos a visualizar: ID, descripcion, Stock, Importe, Activo
Button btnAgregar Agregar
DataGridView gridVenta Origen de datos = vwVentasBindingSource
Deshabilitar las propiedades de acciones menos Eliminación.
Campos a visualizar: ID, descripcion, cantidad, Importe, Subtotal, nroventa.
Campo ID.Width = 0
Campo nroVenta.Width = 0
Label lblTotal Text = 0.00
Tabla 16. Creación del frmVenta con sus controles y propiedades.
Server permite crear funciones propias a través del lenguaje TRANSACT SQL, las cuales
aceptan parámetros y pueden realizar determinadas acciones sobre una o más tablas. Son
utilizadas generalmente cuando deben realizarse cálculos complejos, los cuales conviene que
sean procesados en el motor de la base de datos.
BASES DE DATOS
El diseño final de este Form debe quedar como muestra la Figura 30.
Figura 30. Distribución de los controles del formulario de ventas. El tamaño de gridProd
se manejará mediante código, por lo que se muestra compactado en pantalla.
Acto seguido, agregamos el código en el interior de cada control para que el proyecto
quede funcional. Añadimos al principio de la clase frmVenta la incorporación de los
namespaces de datos y realizamos también la declaración de la variable con la cadena
de conexión a la base de datos:
Imports System.Data.Sql
Imports System.Data.SqlClient
Creamos una función que grabará un nuevo número cuando se confirme una venta:
con.Open()
cmd.ExecuteNonQuery()
graboNuevoNro = True
End Function
Sub cambioBotones()
btnNuevaVenta.Enabled = Not btnNuevaVenta.Enabled
btnCancelar.Enabled = Not btnCancelar.Enabled
btnGrabar.Enabled = Not btnGrabar.Enabled
End Sub
Creamos una función que nos traerá de la base de datos el último número utilizado
y le sumará 1 para crear una nueva venta:
SQL Server, dentro de su lenguaje TRANSACT SQL, incluye también diversas funciones de
cifrado, que permiten cifrar, descifrar, firmar digitalmente y validar firmas digitales realizadas
con este lenguaje. Las funciones de encriptación son útiles cuando hay que cifrar contraseñas
en un motor de base de datos.
Proyecto con base de datos: gestión de drugstore
Me.gridProd.Width = 608
End If
End Sub
Al igual que la mayoría de los lenguajes que permite el acceso a datos mediante sentencias SQL,
Visual Basic puede aprovechar las ventajas de este lenguaje de transacciones y realizar
operaciones como la creación de una base de datos, tablas, vistas y otros objetos dentro de un
SQL Server, o cualquier otro motor que estemos utilizando.
BASES DE DATOS
porte.Text), “c”)
End If
End Sub
Sub calculoTotal()
Dim cn As New SqlConnection(cnString)
Dim sqlQ As String = “SELECT sum(subtotal) AS Total FROM ventas WHERE
nroventa = “ & CSng(lblVenta.Text)
Dim cmd As New SqlCommand(sqlq, cn)
Dim Reader As SqlDataReader
cn.Open()
cmd.Connection = cn
cmd.CommandText = sqlQ
Reader = cmd.ExecuteReader
Reader.Read()
Dim d As Double = CDbl(Reader.Item(0))
lblTotal.Text = Format(d, “c”)
Reader.Close()
End Sub
Una vez definida la cantidad de lo que se está vendiendo, lo vinculamos a la venta actual:
Falta limpiar los campos y dejar la pantalla lista para poder realizar una nueva venta:
Sub LimpioCampos()
Me.VwventasBindingSource.Filter = “nroventa = 0”
lblVenta.Text = “0”
txtSelecciono.Text = “”
lblTotal.Text = “0.00”
lblDesc.Text = “Descripción del producto”
lblStk.Text = “Stock actual”
lblImporte.Text = “Importe unitario”
txtCantidad.Text = “”
lblSubt.Text = “Subtotal”
End Sub
BASES DE DATOS
Puede suceder que la venta se cancele, con lo cual tenemos que deshacer los
productos agregados y liberar el número de venta para una próxima:
Con este código, nuestro proyecto ya es funcional. Solo resta agregar el código que
llame a cada Form desde frmMain, y podremos probar el sistema:
btnProductos_Click(…)
frmABMProductos.Show()
End Sub
btnSTKMinimo_Click(…)
frmSTKM.ShowDialog()
End Sub
✱ PLANIFICACION DE UN SISTEMA
btnVenta_Click(…)
frmVenta.ShowDialog()
End Sub
Figura 32. Debemos recordar que cada producto que agreguemos necesita
tener el precio de compra y el de venta por separado.
BASES DE DATOS
Podemos personalizar los colores de cada DataGridView para indicar con ellos las dife-
rencias entre columnas, y así visualizar cómodamente los resultados en pantalla.
Figura 33. La columna Stock muestra el stock real, mientras que la columna
Mínimo muestra el punto de pedido para cada producto.
Figura 36. Iniciando una nueva venta con su nuevo número de operación.