Академический Документы
Профессиональный Документы
Культура Документы
Objetivos:
Tratar el acceso a bases de datos desde Visual Basic .NET, haciendo uso del
modelo de acceso a datos incluido en la plataforma .NET Framework: ADO .NET.
Contenido de la Unidad:
1. Acceso de datos con ADO .NET.
1.1. Beneficios de ADO .NET.
2. Una visión general de ADO .NET.
3. Espacios de nombres y clases en ADO .NET.
4. Las clases Connection.
5. Las clases Command.
6. Las clases DataReader.
7. Conjunto de Datos y enlace (Data Biding)
7.1. La clase DataSet.
7.2. Las clases DataAdapter.
7.3. Data Binding. Enlace de datos a controles.
8. El control DataGrid.
9. Caso de estudio.
Bibliografía.
Fco. Javier Ceballos. Microsoft Visual Basic .NET. Lenguajes y Aplicaciones.
2ª Edición. 2006. Capítulo 12.
Plazo de realización.
1
Dos sesiones de clases con duración de 2 horas cada una.
2
1. Acceso de datos con ADO .NET.
ADO .NET es la nueva versión del modelo de objetos ADO (ActiveX Data Objects), es
decir, la estrategia que ofrece Microsoft para el acceso a datos. ADO .NET ha sido ampliado
para cubrir todas las necesidades que ADO no ofrecía, y está diseñado para trabajar con
conjuntos de datos desconectados, lo que permite reducir el tráfico de red. ADO .NET utiliza
XML como formato universal de transmisión de los datos.
ADO .NET posee una serie de objetos que son los mismos que aparecen en la versión
anterior de ADO, como pueden ser el objeto Connection o Command, e introduce nuevos
objetos tales como el objeto DataReader, DataSet o DataView.
Interoperabilidad
Mantenimiento
En el ciclo de vida de una aplicación los cambios poco sustanciales y modestos son
permisibles. Pero cuando es necesario abordar un cambio estructural o arquitectónico del
sistema, la tarea se vuelve demasiado compleja y a veces inviable. Esto es una gran
desventaja de los sistemas actuales, pues muchas veces se trata de una cuestión de
actualización de los procesos de la propia empresa. Además, cuanto más se aumenta el
proceso de la operativa de la empresa, las necesidades de proceso crecen hasta desbordar
3
las máquinas. Es por ello que se separa la estructura de un programa en varias capas. Una
de esas capas es la de datos, que es fundamental desarrollar correctamente. Gracias a los
DataSets, la tarea de portar y aumentar los procesos de datos y de negocio será más
sencillo: el intercambio de información a través de XML, hace que sea más sencilla la tarea
de estructurar en más capas la aplicación, convirtiéndola en más modular y fácil de
mantener.
Programación
Rendimiento
Escalabilidad
4
se mantiene una memoria de proceso y conexión, un conjunto de bloqueos de recursos
como puedan ser tablas, índices, etc., y una comprobación de sus permisos; todo ello
consume tiempo y recursos. ADO .NET favorece la escalabilidad, puesto que su modelo de
conexión Off-Line evita que se mantengan los recursos reservados más tiempo del
considerado necesario. Esto permite que más usuarios por unidad de tiempo puedan
acceder a la aplicación sin problemas de tiempos.
ADO .NET ha sido ampliado para cubrir todas las necesidades que ADO no ofrecía.
Está diseñado para trabajar con conjuntos de datos desconectados, lo que permite reducir
el tráfico de red, utilizando XML como formato universal de transmisión de los datos. ADO
.NET posee una serie de objetos que son los mismos que aparecen en la versión anterior
de ADO, como pueden ser el objeto Connection o Command, e introduce nuevos objetos
tales como el objeto DataReader, DataSet o DataView. A continuación vamos a comentar
brevemente los objetos principales que posee ADO .NET.
Los espacios de nombre que utiliza ADO .NET son principalmente System.Data y
System.Data.OleDb , System.Data.SqlClient o MySql.Data.MySqlClient, en el caso de
MySqlClient hay que instalar el componente, luego agregar la referencia MySql.Data.
System.Data ofrece las facilidades de codificación para el acceso y manejo de datos,
mientras que System.Data.OleDb, System.Data.SqlClient y System.Data.MySqlClient
contienen los proveedores; en el primer caso, los proveedores genéricos de OLE DB, en
el segundo, los proveedores nativos de SQL Server y en el tercero los proveedores de
MySQL que se instalaron para la plataforma .NET.
5
Otro objeto importante dentro del modelo de objetos de ADO .NET es el objeto
System.Data.DataSet (conjunto de datos). Este nuevo objeto representa un conjunto de
datos de manera completa, pudiendo incluir múltiples tablas junto con sus relaciones. Para
acceder a una tabla determinada el objeto DataSet ofrece la colección Tables.
Para poder crear e inicializar las tablas del DataSet debemos hacer uso del objeto
DataAdapter, que igualmente, posee las tres versiones, es decir, el objeto SqlDataAdapter
para SQL Server, OleDbDataAdapter genérico de OLE DB y MysqlDataAdapter.
Otro objeto de ADO .NET es DataReader, que representa un cursor de sólo lectura y
que sólo permite desplazamiento hacia adelante (read-only/forward-only), cada vez existe
un único registro en memoria, el objeto DataReader mantiene abierta la conexión con el
origen de los datos hasta que es cerrado. Al igual que ocurría con otros objetos de ADO
.NET, de este objeto tenemos tres versiones, se trata de los objetos SqlDataReader,
OleDbDataReader y MySqlDataReader.
6
3. Espacios de nombres y clases en ADO .NET.
DataSet. Almacén de datos por excelencia en ADO .NET. Representa una base de
datos desconectada del proveedor de datos. Almacena tablas y sus relaciones.
DataTable. Un contenedor de datos. Estructurado como un conjunto de filas
(DataRow) y columnas (DataColumn).
7
DataRow. Registro que almacena n valores. Representación en ADO .NET de una
fila/tupla de una tabla de la base de datos.
DataColumn. Contiene la definición de una columna. Metadatos y datos asociados
a su dominio.
DataRelation. Enlace entre dos o más columnas iguales de dos o más tablas.
Constraint. Reglas de validación de las columnas de una tabla.
DataColumnMapping. Vínculo lógico existente entre una columna de un objeto del
DataSet y la columna física de la tabla de la base de datos.
DataTableMapping. Vínculo lógico existente entre una tabla del DataSet y la tabla
física de la base de datos.
Además de estas clases, existe otro grupo de clases consistente en las clases
específicas de un proveedor de datos. Estas clases conforman los aspectos particulares de
un fabricante de proveedores de datos .NET. Tienen una sintaxis con el formato XXXClase,
donde “XXX” es un prefijo que determina el tipo de plataforma de conexión a datos. Se
definen los espacios de nombre: System.Data.SqlClient, System.Data.OleDb y
MySql.Data.MySqlClient.
8
SqlDataAdapter Clase adaptadora entre un objeto DataSet y sus
OleDbDataAdapter operaciones físicas en la base de datos (select,
MySqlDataAdapter insert, update y delete).
En los ejemplos con datos que vamos a realizar, se ha utilizado SQL Server 2005
como servidor de datos.
Debemos recordar que existen dos implementaciones para algunos de los objetos de
ADO .NET, cada uno específico del origen de datos con el que nos vamos a conectar. Esto
ocurre con el objeto Connection, que tiene dos versiones, una como proveedor de datos de
SQL Server, a través de la clase System.Data.SqlClient.SqlConnection, y otra como
proveedor de datos OLEDB, a través de la clase Sysem.Data.OleDb.OleDbConnection.
Por norma general, del objeto Connection utilizaremos los métodos Open() y Close(),
para abrir y cerrar conexiones respectivamente, con el almacén de datos adecuado. Aunque
tenemos el recolector de basura que gestiona de forma automática los recursos y objetos
que no son utilizados, es recomendable cerrar las conexiones de forma explícita utilizando
el método Close( ).
9
Las conexiones se abrirán de forma explícita utilizando el método Open(), pero
también se puede hacer de forma implícita utilizando un objeto DataAdapter.
Imports System.Data.SqlClient
‘………
Try
' crear el objeto de conexión
Dim oConexion As New SqlConnection()
' pasar la cadena de conexión
oConexion.ConnectionString ="Data Source= localhost\sqlexpress;
Initial Catalog=bd_prueba_date_adapter;Integrated Security=True"
' abrir conexión
oConexion.Open()
MessageBox.Show("Conectado")
' cerrar conexión
oConexion.Close()
MessageBox.Show("Desconectado")
Catch oExcep As SqlException
' si se produce algún error, lo capturamos mediante el objeto
' de excepciones particular para el proveedor de SQL Server
MessageBox.Show("Error al conectar con datos" & _
ControlChars.CrLf & _
10
oExcep.Message & ControlChars.CrLf & _
oExcep.Server)
End Try
Imports System.Data.OleDb
‘…..
'....
Try
' crear el objeto de conexión
Dim oConexion As New OleDbConnection()
oConexion.ConnectionString = "Provider= Microsoft.Jet.OLEDEB.4.0; Data Source =
C:.\\..\\..\\tfnos.mdb;"
' abrir conexión
oConexion.Open()
MessageBox.Show("Conectado")
' cerrar conexión
oConexion.Close()
MessageBox.Show("Desconectado")
Catch oExcep As OleDbException
' si se produce algún error, lo capturamos mediante el objeto
' de excepciones particular para el proveedor de OLEDB
MessageBox.Show("Error al conectar con datos" & _
ControlChars.CrLf & _
oExcep.Message & ControlChars.CrLf & _
oExcep.Source())
End Try
Imports MySql.Data.MySqlClient
‘…..
'....
Try
' crear el objeto de conexión
Dim oConexion As New MySqlConnection()
oConexion.ConnectionString = " server=localhost;user
id=root;password=12345;database=inventario;"
' abrir conexión
oConexion.Open()
11
MessageBox.Show("Conectado")
' cerrar conexión
oConexion.Close()
MessageBox.Show("Desconectado")
Catch oExcep As MySqlException
' si se produce algún error, lo capturamos mediante el objeto
' de excepciones particular para el proveedor de MYSQL
MessageBox.Show("Error al conectar con datos" & _
ControlChars.CrLf & _
oExcep.Message & ControlChars.CrLf & _
oExcep.Source())
End Try
Las clases Command de ADO .NET serán las usaremos para realizar tales
operaciones. El objeto Command nos va a permitir ejecutar una sentencia SQL o un
procedimiento almacenado sobre la fuente de datos a la que estamos accediendo. A través
de un objeto Command también podremos obtener un conjunto de resultados del almacén
de datos. En este caso, los resultados se pasarán a otros objetos de ADO .NET, como
DataReader o DataAdapter; estos dos objetos los comentaremos más adelante.
12
(únicamente aplicable al objeto OleDbCommand); y Text que indica que es una
sentencia SQL. EL valor por defecto es Text.
Connection. Devuelve el objeto SqlConnection, OleDbConnection o
MySqlConnection utilizado para ejecutar el objeto Command correspondiente.
Parameters. Colección de parámetros que se pueden utilizar para ejecutar el objeto
Command, esta colección se utiliza cuando deseamos ejecutar sentencias SQL que
hacen uso de parámetros, esta propiedad devuelve un objeto de la clase
SqlParameterCollection , un objeto de la clase OleDbParameterCollection o
MySqlParameterCollection. Estas colecciones contendrán objetos de la clase
SqlParameter, OleDbParameter y MySqlParameter, respectivamente, para
representar a cada uno de los parámetros utilizados. Estos parámetros también son
utilizados para ejecutar procedimientos almacenados.
13
primer lugar utilizamos un constructor de la clase, que recibe como parámetro la sentencia
a ejecutar y la conexión. Como vamos a ejecutar una sentencia que no produce un conjunto
de resultados, emplearemos el método ExecuteNonQuery( ). Observe también el lector en
este ejemplo, que la conexión sólo permanece abierta en el momento de ejecutar el
comando; esta es la técnica recomendable que debemos utilizar para todas las operaciones
con datos: mantener abierta la conexión el menor tiempo posible.
Para crear cada uno de los parámetros utilizaremos la clase SqlParameter, mientras
que para añadir los parámetros usaremos la colección Parámeters del objeto SqlCommand
y su método Add( ).
Respecto a la creación de los parámetros, podemos observar que es muy flexible, ya
que como vemos en este ejemplo, cada uno de ellos se crea de un modo distinto,
especificando el nombre, tipo de dato y valor.
14
"VALUES(@nombre_autor)"
' crear comando
Dim oComando As New SqlCommand(sSQL, oConexion)
' añadir parámetros al comando
oComando.Parameters.Add(New SqlParameter("@nombre_autor", "Autor8"))
Dim iResultado As Integer
oConexion.Open() ' abrir conexión
iResultado = oComando.ExecuteNonQuery() ' ejecutar comando
oConexion.Close() ' cerrar conexión
MessageBox.Show("Registros añadidos:" & iResultado)
15
A diferencia del resto de objetos, que siguen un esquema desconectado de
manipulación de datos, los DataReader permanecen conectados durante todo el tiempo
que realizan el recorrido por los registros que contienen. Las clases que implementan este
tipo de objeto son SqlDataReader y OleDbDataReader.
Una vez vistas las propiedades, vamos a comentar los métodos más destacables.
Close( ). Cierra el objeto DataReader liberando los recursos correspondientes.
GetXXX( ). El objeto DataReader presenta un conjunto de métodos que nos van
a permitir obtener los valores de las columnas contenidas en el mismo en forma
de un tipo de datos determinado, según el método GetXXX empleado. Existen
diversos métodos GetXXX atendiendo al tipo de datos de la columna, algunos
ejemplos son GetBoolean(), GetInt32(), GetString(), GetChar(), etc. Como
parámetro a este método le debemos indicar el número de orden de la columna
que deseamos recuperar.
NextResult( ). Desplaza el puntero actual al siguiente conjunto de registros,
cuando la sentencia es un procedimiento almacenado de SQL o una sentencia
SQL que devuelve más de un conjunto de registros, no debemos confundir este
método con el método MoveNext() de ADO, ya que en este caso no nos movemos
al siguiente registro, sino al siguiente conjunto de registros.
Read( ). Desplaza el cursor actual al siguiente registro permitiendo obtener los
valores del mismo a través del objeto DataReader. Este método devolverá True si
16
existen más registros dentro del objeto DataReader, False si hemos llegado al
final del conjunto de registros. La posición por defecto del objeto DataReader en
el momento inicial es antes del primer registro, por lo tanto para recorrer un objeto
DataReader debemos comenzar con una llamada al método Read(), y así
situarnos en el primer registro.
El objeto DataSet nos proporciona el mejor concepto sobre datos desconectados: una
copia en el cliente de la arquitectura de la base de datos, basada en un esquema XML que
la independiza del fabricante, proporcionando al desarrollador la libertad de trabajo
independiente de la plataforma.
17
las columnas de la fila actual. Existen además, colecciones y objetos para representan las
relaciones, claves y valores por defecto existentes dentro de un objeto DataSet.
Para poder crear e inicializar las tablas del DataSet debemos hacer uso del objeto
DataAdapter, que posee las tres versiones, es decir, el objeto SqlDataAdapter para SQL
Server , OleDbDataAdapter genérico de OLE DB y MySqlDataAdapter.
18
Fig.2 DataSet.
Un objeto DataAdapter puede contener desde una sencilla sentencia SQL, como
hemos visto en el apartado anterior, hasta varios objetos Command.
La clase DataAdapter dispone de cuatro propiedades, que nos van a permitir asignar
a cada una, un objeto Command (SqlCommand, OleDbCommand o MySqlCommand ) con
las operaciones estándar de manipulación de datos. Estas propiedades son las siguientes.
InsertCommand. Objeto de la clase Command, que se va a utilizar para realizar
una inserción de datos.
SelectCommand. Objeto de la clase Command que se va a utilizar para ejecutar
una sentencia Select de SQL.
UpdateCommand. Objeto de la clase Command que se va a utilizar para realizar
una modificación de los datos.
DeleteCommand. Objeto de la clase Command que se va a utilizar para realizar
una eliminación de datos.
19
encuentra asociado a la propiedad SelectCommand, los datos obtenidos del origen de datos
se cargarán en el objeto DataSet que pasamos por parámetro.
20
Fig. 3 DataAdapter.
Respecto al código del formulario, en primer lugar, vamos a declarar varios objetos de
acceso a datos a nivel de la clase para poder tenerlos disponibles en diversos métodos.
Imports MySql.Data.SqlClient
21
oConexion.Close() ' cerrar conexión
' enlazar dataset con datagrid;
' en DataSource se asigna el dataset,
' en DataMember el nombre de la tabla del
' dataset que mostrará el datagrid
Me.dgvAutor.DataSource = oDataSet
Me.dgvAutor.DataMember = "AUTOR"
Me.dgvAutor.Columns("Id_Autor").HeaderText = "Id Autor"
Me.dgvAutor.Columns("Nombre_Autor").HeaderText = "Nombre Autor"
End Sub
22
End Sub
Enlace simple (Simple Data Binding). Este tipo de enlace consiste en una
asociación entre un control que puede mostrar un único dato y el objeto que actúa
como contenedor de datos. El ejemplo más ilustrativo es el control TextBox.
Enlace complejo (Complex Data Binding). En este enlace, el control que actúa
como interfaz o visualizador de datos, dispone de la capacidad de mostrar varios
o todos los datos del objeto que contiene la información. El control más común es
el control DataGridView, que ya hemos visto inicialmente en un apartado anterior,
y que trataremos con más detenimiento próximamente.
Binding. Clase que permite crear un enlace (binding) para un control, indicando
la propiedad del control que mostrará los datos, el DataSet del que se extraerá la
información, y el nombre de la tabla-columna, cuyos datos pasarán a la propiedad
del control.
DataBindings. Colección de que disponen los controles, con la información de
enlaces a datos. Gracias a su método Add( ), podemos añadir un objeto Binding,
para que el control muestre los datos que indica el enlace.
23
8. El control DataGrid.
En ADO .NET existe un control específico para mostrar los datos de una o varias
tablas contenidas en un DataSet. Se trata del DataGrid que permite crear, de manera
automática, un enlace complejo con los datos, ahorrando trabajo de escritura de código
pues tiene implementadas muchas funciones útiles para mostrar y manipular campos de
una o varias tablas.
El control DataGrid de los formularios Windows Forms muestra datos en una serie
de filas y columnas. En el caso más sencillo, la cuadrícula está enlazada a un origen de
datos con una sola tabla que no tiene relaciones. En ese caso, los datos aparecen en filas
y columnas simples, como en una hoja de cálculo.
Si el control DataGrid está enlazado a datos con varias tablas relacionadas y está
habilitado el desplazamiento en la cuadrícula, ésta mostrará controles de expansión en
cada fila. Un control de expansión permite el desplazamiento desde una tabla primaria a
una tabla secundaria. Al hacer clic en un nodo se muestra la tabla secundaria y al hacer clic
en el botón Atrás se muestra la tabla primaria original. De este modo, la cuadrícula muestra
las relaciones jerárquicas entre tablas.
24
Para que funcione el control DataGrid, debe estar enlazado a un origen de datos por
medio de las propiedades DataSource y DataMember. Este enlace hace que el control
DataGrid señale a una instancia de un objeto de origen de datos (como DataSet o
DataTable). Mediante el control DataGrid se muestran los resultados de las acciones que
se ejecutan en los datos. La mayoría de las acciones específicas para datos no se ejecutan
por medio del control DataGrid , sino a través del origen de datos.
DataSource: el DataSet que contiene la tabla cuyos campos son mostrados por
el DataGrid.
DataMember: la tabla seleccionada dentro de las que componen el DataSet.
El control DataGrid puede utilizarse para mostrar una única tabla o las relaciones
jerárquicas entre un conjunto de tablas. Cuando el control DataGrid muestra una tabla y la
propiedad AllowSorting está establecida en true, es posible ordenar los datos de nuevo
haciendo clic en los encabezados de columna. El usuario puede también agregar filas y
modificar celdas.
Aparte de los eventos comunes de control tales como MouseDown, Enter y Scroll,
el control DataGrid admite eventos asociados con la edición y el desplazamiento dentro de
la cuadrícula. La propiedad CurrentCell determina cuál es la celda seleccionada. Cuando el
usuario se desplaza a una nueva celda, se provoca el evento CurrentCellChanged. Cuando
el usuario se desplaza a una nueva tabla (a través de relaciones primarias o secundarias),
se produce el evento Navigate. El evento BackButtonClick se produce cuando el usuario
hace clic en el botón Atrás mientras ve una tabla secundaria; el evento
25
ShowParentDetailsButtonClick se produce cuando se hace clic en el icono para mostrar u
ocultar filas primarias.
on delete cascade
);
insert into producto values(null,'LAPIZ',1,2);
insert into producto values(null,'CUADERNO',1,1);
insert into producto values(null,'AZUCAR',4,1);
26
insert into producto values(null,'PASTA DE DIENTE',2,2);
insert into producto values(null,'MELAZA',5,1);
drop table kardex;
create table kardex(
codigo bigint auto_increment,
cod_producto bigint,
tipo varchar(7),
cantidad integer,
precio float,
fecha_ing date,
fecha_vence date,
constraint kardexpk primary key(codigo),
constraint kardexfk foreign key(cod_producto) references
producto(cod_producto) on
--existencias
select nombre_producto, entrada - salida as total from (select
a.nombre_producto, (select sum(cantidad) from kardex where
cod_producto=a.cod_producto and tipo='ENTRADA') as entrada , (select
sum(cantidad) from kardex where cod_producto=a.cod_producto and
tipo='SALIDA') AS salida from producto a ) as con order by nombre_producto;
27
Añada al formulario los controles que se muestran en la Fig. 424 y que se describen
a continuación.
28
DataGridView Name DataGridView1
Recuerde asignar la propiedad TabIndex a cada uno de los controles, el título del
formulario y asignar la apariencia deseada (tipo de fuente, color, tamaño de la fuente, etc.).
AGREGAR UN MODULO
Imports MySql.Data.MySqlClient
Module Module1
Public Function conectar()
Dim conexion = New MySqlConnection
Try
conexion.ConnectionString = "server=localhost;user
id=root;password=12345;database=inventario;"
conexion.Open()
Catch ex As MySqlException
MessageBox.Show("No se ha podido realizar la conexion a la base de datos.")
End
End Try
Return conexion
End Function
Function cargar_grid(ByVal sql As String, ByVal conn As MySqlConnection)
Dim da As New MySqlDataAdapter(sql, conn)
Dim ds As New DataSet
'llenar el dataset
da.Fill(ds)
Return ds.Tables(0)
End Function
End Module
‘declaracion de la importacion
Imports MySql.Data.MySqlClient
‘declarar un objeto de tipo coneccion fuera de cualquier procedimiento
Dim conn As New MySqlConnection
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
conn = conectar()
'cargar el datagridview con los datos del dataset
Dim SQL As String
Sql = "SELECT a.cod_producto,a.nombre_producto as
Producto,b.nombre_presentacion as Presentacion,c.nombre_tipo as Tipo
FROM producto a,presentacion b,tipo c where
a.cod_presentacion=b.cod_presentacion and a.cod_tipo=c.cod_tipo order by
a.nombre_producto"
DataGridView1.DataSource = cargar_grid(SQL, conn)
29
'cargar los datos del combo presentacion
SQL = "SELECT cod_presentacion,nombre_presentacion FROM
presentacion order by cod_presentacion"
Dim da1 As New MySqlDataAdapter(SQL, conn)
Dim ds1 As New DataSet
da1.Fill(ds1)
If ds1.Tables(0).Rows.Count > 0 Then
With Me.cbpresentacion
.DataSource = Nothing
.Items.Clear()
.DataSource = ds1.Tables(0)
.DisplayMember = "nombre_presentacion"
.ValueMember = "cod_presentacion"
.SelectedIndex = -1
End With
End If
'cargar los datos del combo tipo
SQL = "SELECT cod_tipo,nombre_tipo FROM tipo order by cod_tipo"
da1 = New MySqlDataAdapter(SQL, conn)
ds1 = New DataSet
da1.Fill(ds1)
If ds1.Tables(0).Rows.Count > 0 Then
With Me.cbtipo
.DataSource = Nothing
.Items.Clear()
.DataSource = ds1.Tables(0)
.DisplayMember = "nombre_tipo"
.ValueMember = "cod_tipo"
.SelectedIndex = -1
End With
End If
End Sub
End Sub
30
Private Sub btguardar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btguardar.Click
If ctnombre.Text = "" Then
MessageBox.Show("Digite el nombre del producto")
ctnombre.Focus()
Exit Sub
End If
If cbpresentacion.SelectedIndex = -1 Then
MessageBox.Show("Seleccione la presentacón del producto")
cbpresentacion.Focus()
Exit Sub
End If
If cbtipo.SelectedIndex = -1 Then
MessageBox.Show("Seleccione el tipo del producto")
cbpresentacion.Focus()
Exit Sub
End If
If MessageBox.Show("Desea guardar el registro?", "Sistema de Inventario",
MessageBoxButtons.YesNo, MessageBoxIcon.Question,
MessageBoxDefaultButton.Button1) = Windows.Forms.DialogResult.No Then
Exit Sub
End If
Dim SQL, var As String
SQL = "select cod_producto from producto WHERE cod_producto = '" &
ctcod_producto.Text & "'"
Dim cmd As New MySqlCommand(SQL, conn)
cmd.CommandType = CommandType.Text
Dim lectura As MySqlDataReader = cmd.ExecuteReader()
If lectura.HasRows Then
var = "Actualizado"
SQL = "UPDATE producto set nombre_producto='" & ctnombre.Text & "' " & _
",cod_presentacion=" & cbpresentacion.SelectedValue & _
",cod_tipo=" & cbtipo.SelectedValue & _
" where cod_producto='" & ctcod_producto.Text & "'"
Else
var = "Guardado"
SQL = "INSERT INTO producto values(null,'" & ctnombre.Text & "'" & _
"," & cbpresentacion.SelectedValue & "," & _
cbtipo.SelectedValue & ")"
End If
lectura.Close()
cmd.CommandText = SQL
cmd.ExecuteNonQuery()
MessageBox.Show("Registro " & var)
btnuevo_Click(Nothing, Nothing)
SQL = "SELECT a.cod_producto,a.nombre_producto as
Producto,b.nombre_presentacion as Presentacion,c.nombre_tipo as Tipo FROM
producto a,presentacion b,tipo c where a.cod_presentacion=b.cod_presentacion and
a.cod_tipo=c.cod_tipo order by a.nombre_producto"
DataGridView1.DataSource = cargar_grid(SQL, conn)
End Sub
31
Código necesario para el botón Borrar
Private Sub btborrar_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles btborrar.Click
If ctcod_producto.Text = "" Then
MessageBox.Show("Seleccione un producto")
Exit Sub
End If
If MessageBox.Show("Desea eliminar el registro?", "Sistema de
Inventario", MessageBoxButtons.YesNo, MessageBoxIcon.Question,
MessageBoxDefaultButton.Button1) = Windows.Forms.DialogResult.No Then
Exit Sub
End If
Dim SQL As String
SQL = "delete from producto WHERE cod_producto = '" &
ctcod_producto.Text & "'"
Dim cmd As New MySqlCommand(SQL, conn)
cmd.CommandType = CommandType.Text
cmd.ExecuteNonQuery()
MessageBox.Show("Registro borrado")
btnuevo_Click(Nothing, Nothing)
SQL = "SELECT a.cod_producto,a.nombre_producto as
Producto,b.nombre_presentacion as Presentacion,c.nombre_tipo as Tipo
FROM producto a,presentacion b,tipo c where
a.cod_presentacion=b.cod_presentacion and a.cod_tipo=c.cod_tipo order by
a.nombre_producto"
DataGridView1.DataSource = cargar_grid(SQL, conn)
End Sub
32
Me.cbtipo.SelectedValue = lectura("cod_tipo").ToString
End If
lectura.Close()
End Sub
Ejercicio Propuesto.
Se debe realizar los formularios necesarios para las tablas Tipo, Presentacion y Kardex.
Se deben hacer los siguientes reportes: Catálogo de producto, reporte de entradas, reporte
de salidas y reporte de existencias.
Nota: La entrega de la práctica será el 7 de mayo
33