Post on 08-Nov-2014
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 1
OBJETIVO
Crear una aplicación para demostrar un caso de mantenimiento de datos con tablas de SQL Server usando
procedimientos almacenados.
Pasos
1. Abrir la base de datos llamada FACTURACION_NET en SQL Server.
2. Crear una tabla llamada FACTURA que tenga la siguiente estructura:
3. Crear otra tabla llamada DETALLE_FACTURA que tenga la siguiente estructura:
4. Crear otra tabla llamada ARTICULOS que tenga la siguiente estructura:
5. Crear otra tabla llamada INDICES para controlar la cantidad de facturas ingresadas en el sistema
y defina la siguiente estructura:
6. Mediante el Analizador de Consultas de SQL Server, proceda a ingresar un registro con el comando
INSERT para controlar la factura:
TABLA INDICE
Facturas 0
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 2
7. Relacionar las tablas considerando el siguiente diagrama:
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 3
8. Ingresar registros a la tabla artículos tal como se indica en la siguiente cuadrícula:
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 4
9. Crear un procedimiento almacenado llamado SP_NUEVO_CODIGO para generar el nuevo código de la
factura y otros documentos:
CREATE PROCEDURE SP_NUEVO_CODIGO
@TABLA VARCHAR(20),
@INDICE INT OUTPUT
AS
SELECT @INDICE=INDICE
FROM INDICES WHERE TABLA=@TABLA
GO
10. Crear un procedimiento SP_INCREMENTAR para actualizar el contador o cantidad de facturas
grabadas en el sistema con el siguiente código:
CREATE PROCEDURE SP_INCREMENTAR
@TABLA VARCHAR(20)
AS
BEGIN TRANSACTION
UPDATE INDICES SET INDICE = INDICE + 1
WHERE TABLA = @TABLA
IF @@ERROR = 0
COMMIT TRANSACTION
ELSE
BEGIN
ROLLBACK TRANSACTION
END
GO
11. Crear un store procedure llamado SP_GRABAR_CABECERA_FACTURA en la base de datos para
agregar nuevos clientes, debe tener el siguiente código:
CREATE PROCEDURE SP_GRABAR_CABECERA_FACTURA
@XIDFACTURA CHAR(10),
@XFECHAFAC DATETIME,
@XIGV DECIMAL(12,2),
@XSUBTOTAL_FAC DECIMAL(12,2),
@XANULADO CHAR(1),
@XTRANSFERIDO CHAR(1),
@XDESC_FAC DECIMAL(12,2),
@XIDCLIENTE CHAR(10)
AS
BEGIN TRANSACTION
INSERT FACTURA
(IDFACTURA,FECHAFAC,IGV,SUBTOTAL_FAC,ANULADO,TRANSFERIDO,DESC_FAC,IDCLIENTE)
VALUES(@XIDFACTURA,@XFECHAFAC,@XIGV,@XSUBTOTAL_FAC,@XANULADO,@XTRANSFERIDO,@XDES
C_FAC,@XIDCLIENTE)
IF @@ERROR = 0
COMMIT TRANSACTION
ELSE
BEGIN
ROLLBACK TRANSACTION
END
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 5
GO
12. Crear un store procedure llamado SP_GRABAR_DETALLE_FACTURA en la base de datos para
agregar nuevos clientes, debe tener el siguiente código:
CREATE PROCEDURE SP_GRABAR_DETALLE_FACTURA
@XIDFACTURA CHAR(10),
@XIDARTICULO CHAR(10),
@XCANT_DET INT,
@XPREC_DET DECIMAL(12,2),
@XIMPORTE DECIMAL(12,2)
AS
BEGIN TRANSACTION
INSERT DETALLE_FACTURA(IDFACTURA,IDARTICULO,CANT_DET,PREC_DET,IMPORTE)
VALUES(@XIDFACTURA,@XIDARTICULO,@XCANT_DET,@XPREC_DET,@XIMPORTE)
IF @@ERROR = 0
COMMIT TRANSACTION
ELSE
BEGIN
ROLLBACK TRANSACTION
END
GO
13. Crear un store procedure llamado SP_FACTURA_DOC en la base de datos para visualizar la factura
creada, debe tener el siguiente código:
CREATE PROCEDURE SP_FACTURA_DOC
@XIDFACTURA CHAR(10)
AS
SELECT F.IDFACTURA,F.FECHAFAC,C.NOM_CLI,C.APE_CLI,
DF.CANT_DET,A.MODELO,A.CARACTERISTICAS,DF.PREC_DET,
DF.IMPORTE
FROM DETALLE_FACTURA DF,ARTICULOS A,FACTURA F,CLIENTES C
WHERE (DF.IDARTICULO=A.IDARTICULO)AND (DF.IDFACTURA=F.IDFACTURA)
AND (F.IDCLIENTE=C.IDCLIENTE)
AND (F.IDFACTURA=@XIDFACTURA)
GO
14. Crear un Trigger llamado Tr_Dismin_STock_F que controle el Stock de los productos para la tabla
Detalle de Factura y debe activarse al realizar una inserción, debe programar el siguiente código:
create trigger Tr_Dismin_STock_F
on Detalle_Factura
for Insert
as
Declare @Idarticulo char(10),
@Cant_det int
Select @Idarticulo = Idarticulo, @Cant_det = Cant_det from Inserted
Begin Transaction
Update Articulos Set Stock_arti = Stock_arti - @Cant_det
where Idarticulo=@Idarticulo
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 6
if (@@error=0)
Begin
commit transaction
print 'Se Actualizo el Stock'
End
else
Begin
rollback transaction
print 'Se Deshizo el Ingreso'
End
15. Diseñar el siguiente formulario:
El formulario debe tener los siguientes controles:
Para Número de Factura un TextBox llamado TXTIDFACTURA, para el DNI Cliente un TextBox
llamado TXTDNI, al costado del DNI del Cliente crear un Botón de Comando llamado Button1, para
Apellidos Cliente un TextBox llamado TXTAPELLIDO, para Dirección un TextBox llamado
TXTDIRECCION, para Nombre de Artículo un ComboBox llamado CMBARTICULOS, al costado de
este ComboBox debe crear un botón de comando llamado BTNARTICULOS, para Plataforma
Operativa un TextBox llamado TXTPLATAFORMA, para Cantidad un TextBox llamado
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 7
TXTCANTIDAD, para Precio Unitario un TextBox llamado TXTPRECIO, para SubTotal un TextBox
llamado TXTIMPORTE, para el otro SubTotal un control TextBox llamado TXTSUB_TOTAL, para IGV
un TextBox llamado TXTIGV, para Total Factura un TextBox llamado TXTTOTAL.
Crear un CommandButton Agregar Item llamado BTNAGREGAR y configure la propiedad Enabled en
False, un CommandButton para Eliminar Item llamado BTNELIMINAR y configure la propiedad
Enabled en False, un CommandButton para Grabar Factura llamado BTNGRABAR, un CommandButton
para Visualizar Previo llamado BTNPREVIO. Para estos dos últimos botones ponga la propiedad
Enabled en False.
Además, crear un DataGrid con título llamado Detalles de Facturas, debe tener como nombre
DataGrid1.
16. El formulario creado debe llamarse FACTURA
17. Agregar otro formulario al sistema llamado BUS_CLIENTES_FACT que tenga la siguiente
presentación:
El formulario debe tener un GroupBox llamado GroupBox1, dentro del GroupBox debe crear seis
RadioButtons con los nombres RB_DNI, RB_CODIGO, RB_DISTRITO, RB_NOMBRE, RB_APELLIDO,
RB_RUC, hacia la derecha crear un Label1 y dentro de la etiqueta crear tres etiquetas más llamadas:
LBLETIQUETA, LBLRUC, LBLEMAIL.
Crear un ComboBox llamado CmbDistritos, un Button llamado BtnAceptar, y un control DataGrid
llamado DataGrid1.
18. Programar el siguiente código al formulario BUS_CLIENTES_FACT para definir su funcionalidad:
Antes de Public Class:
Imports System.Data
Imports System.Data.SqlClient
Después de Public Class:
Private DS As New DataSet()
Private XIDDISTRITO As String
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 8
19. Programar el siguiente código para el resto de controles:
Evento Load del Formulario:
Try
Dim da As New SqlDataAdapter("SP_BUSCAR_CLIENTES", CN)
da.SelectCommand.CommandType = CommandType.StoredProcedure
da.Fill(DS, "CLIENTES")
DataGrid1.DataSource = DS.Tables("CLIENTES")
da = New SqlDataAdapter("SELECT * FROM DISTRITOS", CN)
da.Fill(DS, "DISTRITOS")
Dim DR As DataRow
For Each DR In DS.Tables("DISTRITOS").Rows
CMBDISTRITOS.Items.Add(DR("NOM_DIS"))
Next
da = Nothing
Catch EX As Exception
MsgBox(EX.Message)
End Try
Evento CurrentCellChanged del DataGrid1:
Try
Dim CELDA As New DataGridCell()
CELDA = DataGrid1.CurrentCell
FRMFACTURAS.TXTDNI.Text = DataGrid1(CELDA.RowNumber, 6)
FRMFACTURAS.TXTAPELLIDO.Text = DataGrid1(CELDA.RowNumber, 2)
FRMFACTURAS.TXTDIRECCION.Text = DataGrid1(CELDA.RowNumber, 3)
DataGrid1.Select(DataGrid1.CurrentRowIndex)
LBLETIQUETA.Text = Trim(DataGrid1(CELDA.RowNumber, 1)) + " " + Trim(DataGrid1(CELDA.RowNumber,
2))
LBLRUC.Text = "R.U.C. : " + DataGrid1(CELDA.RowNumber, 5)
LBLEMAIL.Text = "E-Mail : " + DataGrid1(CELDA.RowNumber, 7)
FRMFACTURAS.IDCLIENTE = DataGrid1(CELDA.RowNumber, 0)
'MsgBox(FRMFACTURAS.IDCLIENTE)
Catch EX As Exception
MsgBox("Debe Seleccionar Registros validos", MsgBoxStyle.Exclamation + MsgBoxStyle.OKOnly,
"SISTEMA DE FACTURACION .NET")
End Try
Evento TextChanged de la caja de Texto TXTBUSCAR
If RB_DNI.Checked = True Then
Dim DV As New DataView(DS.Tables("CLIENTES"))
DV.RowFilter = "DNI_CLI LIKE '" + TXTBUSCAR.Text + "%'"
DataGrid1.DataSource = DV
DV = Nothing
End If
If RB_NOMBRE.Checked = True Then
Dim DV As New DataView(DS.Tables("CLIENTES"))
DV.RowFilter = "NOM_CLI LIKE '" + TXTBUSCAR.Text + "%'"
DataGrid1.DataSource = DV
DV = Nothing
End If
If RB_APELLIDO.Checked = True Then
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 9
Dim DV As New DataView(DS.Tables("CLIENTES"))
DV.RowFilter = "APE_CLI LIKE '" + TXTBUSCAR.Text + "%'"
DataGrid1.DataSource = DV
DV = Nothing
End If
If RB_RUC.Checked = True Then
Dim DV As New DataView(DS.Tables("CLIENTES"))
DV.RowFilter = "RUC_CLI LIKE '" + TXTBUSCAR.Text + "%'"
DataGrid1.DataSource = DV
DV = Nothing
End If
If RB_CODIGO.Checked = True Then
Dim DV As New DataView(DS.Tables("CLIENTES"))
DV.RowFilter = "IDCLIENTE LIKE '" + TXTBUSCAR.Text + "%'"
DataGrid1.DataSource = DV
DV = Nothing
End If
Evento SelectedIndexChanged del ComboBox CmbDistritos:
Dim DV As New DataView(DS.Tables("CLIENTES"))
DV.RowFilter = "NOM_DIS = '" + CMBDISTRITOS.Text + "'"
DataGrid1.DataSource = DV
DV = Nothing
Evento CheckedChanged del RadioButton RB_DNI:
TXTBUSCAR.Visible = True
CMBDISTRITOS.Visible = False
Evento CheckedChanged del RadioButton RB_CODIGO:
TXTBUSCAR.Visible = True
CMBDISTRITOS.Visible = False
Evento CheckedChanged del RadioButton RB_DISTRITO:
TXTBUSCAR.Visible = False
CMBDISTRITOS.Visible = True
Evento CheckedChanged del RadioButton RB_NOMBRE:
TXTBUSCAR.Visible = True
CMBDISTRITOS.Visible = False
Evento CheckedChanged del RadioButton RB_APELLIDO:
TXTBUSCAR.Visible = True
CMBDISTRITOS.Visible = False
Evento CheckedChanged del RadioButton RB_RUC:
TXTBUSCAR.Visible = True
CMBDISTRITOS.Visible = False
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 10
Evento Click del botón BTNACEPTAR:
FRMFACTURAS.CMBARTICULOS.Enabled = True
FRMFACTURAS.BTNARTICULOS.Enabled = True
FRMFACTURAS.TXTCANTIDAD.Enabled = True
FRMFACTURAS.BTNAGREGAR.Enabled = True
FRMFACTURAS.DataGrid1.Enabled = True
Me.Close()
20. Agregar Un módulo al proyecto llamado Modulo_Formularios y antes de la sección Module programar
las siguientes instrucciones para tener acceso a la Arquitectura de Datos y al Cliente de SQL Server
y acceder a los objetos de la base de datos de SQL Server.
Imports System.Data
Imports System.Data.SqlClient
21. Programar en el Módulo las siguientes variables:
Public CN As New SqlConnection()
Public frmbusclientesfact As BUS_CLIENTES_FACT
22. En el Módulo programar la función f_generar_codigo para autogenerar el Código de la Factura y otros
posibles documentos:
Public Function f_generar_codigo(ByVal tabla As String) As String
Dim cmd As New SqlCommand()
Dim prm As SqlParameter
Try
cmd.Connection = CN
cmd.CommandType = CommandType.StoredProcedure
cmd.CommandText = "SP_NUEVO_CODIGO"
prm = New SqlParameter("@tabla", tabla)
prm.SqlDbType = SqlDbType.VarChar : prm.Size = 20
prm.Direction = ParameterDirection.Input
cmd.Parameters.Add(prm)
prm = New SqlParameter()
prm.ParameterName = "@indice"
prm.SqlDbType = SqlDbType.Int
prm.Direction = ParameterDirection.Output
cmd.Parameters.Add(prm)
cmd.ExecuteNonQuery()
Catch ex As Exception
f_generar_codigo = "FALLO"
Exit Function
End Try
Dim xindice As Integer = cmd.Parameters("@indice").Value + 1
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 11
Dim Ncmd As New SqlCommand()
Ncmd.CommandText = "SP_INCREMENTAR"
Ncmd.CommandType = CommandType.StoredProcedure
Ncmd.Connection = CN
prm = New SqlParameter("@TABLA", tabla)
prm.SqlDbType = SqlDbType.VarChar : prm.Size = 20
prm.Direction = ParameterDirection.Input
Ncmd.Parameters.Add(prm)
Ncmd.ExecuteNonQuery()
Select Case UCase(tabla)
Case "USUARIOS"
f_generar_codigo = "Usu" + Format(xindice, "000")
Case "DISTRITO_LIMA"
f_generar_codigo = "Lima-" + Format(xindice, "00")
Case "DISTRITO_CALLAO"
f_generar_codigo = "Callao-" + Format(xindice, "00")
Case "CLIENTES"
Return "Cli" + Format(xindice, "000")
Case "FACTURAS"
f_generar_codigo = Format(xindice, "0000000000")
Case "ARTICULOS"
f_generar_codigo = "Art" + Format(xindice, "000")
Case "BOLETA"
f_generar_codigo = Format(xindice, "0000000000")
End Select
End Function
23. Antes de Public Class declarar las siguientes instrucciones para tener acceso a la Arquitectura de
Datos y al Cliente de SQL Server y acceder a los objetos de la base de datos de SQL Server.
Imports System.Data
Imports System.Data.SqlClient
24. Después de la sección Código Generado por el diseñador de Windows Form, declarar las siguientes
variables:
Public Shared DS As DataSet
Public Shared IDCLIENTE As String
Private IDARTICULO As String
25. Programar el evento Load del formulario con el siguiente código:
DS = New DataSet()
Try CN.ConnectionString = "DATA SOURCE=(LOCAL);INITIAL CATALOG=FACTURACION_NET;USER ID=SA" CN.Open()
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 12
Dim DT As DataTable
DT = New DataTable("Detalle")
Dim dc As New DataColumn("Codigo")
dc.ReadOnly = True
dc.DataType = System.Type.GetType("System.String")
DT.Columns.Add(dc)
dc = New DataColumn("Descripcion")
dc.DataType = System.Type.GetType("System.String")
DT.Columns.Add(dc)
dc = New DataColumn("Cantidad")
dc.DataType = System.Type.GetType("System.Int32")
DT.Columns.Add(dc)
dc = New DataColumn("Precio")
dc.DataType = System.Type.GetType("System.Single")
DT.Columns.Add(dc)
dc = New DataColumn("Importes")
dc.DataType = System.Type.GetType("System.Single")
dc.Expression = "precio * cantidad"
DT.Columns.Add(dc)
DS.Tables.Add(DT)
DataGrid1.DataSource = DS.Tables("Detalle")
Dim da As New SqlDataAdapter("select * from articulos", CN)
da.Fill(DS, "ARTICULOS")
Dim DR As DataRow
For Each DR In DS.Tables("ARTICULOS").Rows
CMBARTICULOS.Items.Add(DR("MODELO"))
Next
Catch EX As Exception
MsgBox(EX.Message)
End Try
26. Programar el evento SelectedIndexChanged del ComboBox artículos con el siguiente código:
Dim DV As New DataView(DS.Tables("ARTICULOS"))
DV.RowFilter = "MODELO='" + CMBARTICULOS.Text + "'"
TXTDESCRIPCION.Text = DV.Item(0)("CARACTERISTICAS")
IDARTICULO = DV.Item(0)("IDARTICULO")
TXTPLATAFORMA.Text = DV.Item(0)("PLATAFORMA")
TXTPRECIO.Text = DV.Item(0)("PRE_ARTI")
DV = Nothing
TXTCANTIDAD.Text = ""
TXTCANTIDAD.Focus()
27. Programar el vento TextChanged de la caja de texto Cantidad con el siguiente código:
Dim IMPORTE As Integer = Val(TXTCANTIDAD.Text) * Val(TXTPRECIO.Text)
TXTIMPORTE.Text = Format(IMPORTE, "###,###.##")
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 13
28. Defina el siguiente procedimiento llamado Validar_Opciones con el siguiente código:
Public Sub validar_opciones()
If DS.Tables("detalle").Rows.Count = 0 Then
BTNELIMINAR.Enabled = False
BTNGRABAR.Enabled = False
Else
BTNELIMINAR.Enabled = True
BTNGRABAR.Enabled = True
End If
End Sub
29. Programar el evento Clic del botón Agregar Item con el siguiente código:
If Not IsNumeric(TXTCANTIDAD.Text) Then
MsgBox("Debe Ingresar Cantidades Validas", MsgBoxStyle.Exclamation +
MsgBoxStyle.OKOnly, "SISTEMA DE FACTURACION .NET")
Exit Sub
End If
If CInt(TXTCANTIDAD.Text) <= 0 Then
MsgBox("Debe Ingresar Cantidades Validas", MsgBoxStyle.Exclamation +
MsgBoxStyle.OKOnly, "SISTEMA DE FACTURACION .NET")
Exit Sub
End If
Dim xx As Integer
For xx = 0 To DS.Tables("detalle").Rows.Count - 1
If CMBARTICULOS.Text = DS.Tables("detalle").Rows(xx)("descripcion") Then
MsgBox("El articulo " + CMBARTICULOS.Text + " ya existe", MsgBoxStyle.Exclamation +
MsgBoxStyle.OKOnly, "SYSTEMA DE FACTURACION .NET")
DataGrid1.Select(xx)
Exit Sub
End If
Next
Dim DV As New DataView(DS.Tables("ARTICULOS"))
DV.RowFilter = "IDARTICULO = '" + IDARTICULO + "'"
Dim STOCK As Integer = DV.Item(0)("STOCK_ARTI")
DV = Nothing
If Val(TXTCANTIDAD.Text) > STOCK Then
MsgBox("La cantidad Supera el Stock " + Chr(13) + "Solo hay " + STOCK.ToString + " " +
CMBARTICULOS.Text, MsgBoxStyle.Exclamation + MsgBoxStyle.OKOnly, "SISTEMA DE
FACTURACION .NET")
TXTCANTIDAD.Focus()
TXTCANTIDAD.BackColor = Color.Red
TXTCANTIDAD.ForeColor = Color.White
TXTCANTIDAD.Text = STOCK.ToString
Exit Sub
End If
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 14
Try
Dim dr As DataRow
dr = DS.Tables("detalle").NewRow
dr("codigo") = IDARTICULO
dr("descripcion") = CMBARTICULOS.Text
dr("precio") = CSng(TXTPRECIO.Text)
dr("cantidad") = CInt(TXTCANTIDAD.Text)
DS.Tables("detalle").Rows.Add(dr)
TXTCANTIDAD.BackColor = Color.White
TXTCANTIDAD.ForeColor = Color.Black
Call TOTALES()
Catch EX As Exception
MsgBox(EX.Message)
End Try
Call validar_opciones()
30. Crear un procedimiento llamado Totales para calcular los totales de la factura, programarlo con el
siguiente código:
Public Sub TOTALES()
Dim DR As DataRow
Dim TOTAL, SUB_TOTAL, XIGV As Single
For Each DR In DS.Tables("DETALLE").Rows
TOTAL = TOTAL + DR("IMPORTES")
Next
XIGV = (TOTAL * 0.19) / 1.19
SUB_TOTAL = TOTAL - XIGV
TXTSUB_TOTAL.Text = Format(SUB_TOTAL, "###,###.00")
TXTIGV.Text = Format(XIGV, "###,###.00")
TXTTOTAL.Text = Format(TOTAL, "###,###.00")
End Sub
31. Programar el evento Click del botón de comando Eliminar Item con el siguiente código:
Dim indice As Integer = DataGrid1.CurrentRowIndex
DS.Tables("detalle").Rows(indice).Delete()
Call TOTALES()
Call validar_opciones()
32. Programar el evento CurrentCellChanged del control DataGrid con el siguiente código:
Try
DataGrid1.Select(DataGrid1.CurrentRowIndex)
Catch ex As Exception
MsgBox("Debe Seleccionar registros validos", MsgBoxStyle.Exclamation + MsgBoxStyle.OKOnly,
"SISTEMA DE FACTURACION .NET")
End Try
33. Crear dos procedimientos uno para limpiar controles llamado Limpiar y otro para desactivar controles
llamado Opciones:
Private Sub limpiar()
Dim obj As Object
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 15
For Each obj In Me.Controls
If TypeOf obj Is TextBox Then
obj.text = ""
End If
Next
DS.Tables("detalle").Clear()
End Sub
Private Sub opciones()
CMBARTICULOS.Enabled = False
TXTCANTIDAD.Enabled = False
BTNAGREGAR.Enabled = False
BTNELIMINAR.Enabled = False
End Sub
34. Programar el evento Click del botón Grabar Factura con el siguiente código:
If BTNGRABAR.Text = "&Nueva Factura" Then
Call limpiar()
Call opciones()
BTNGRABAR.Text = "&Grabar Factura"
BTNGRABAR.Enabled = False
BTNPREVIO.Enabled = False
Else
BTNGRABAR.Text = "&Nueva Factura"
BTNPREVIO.Enabled = True
Dim nuevo_codigo As String = f_generar_codigo("FACTURAS")
If nuevo_codigo = "FALLO" Then
MsgBox("FALLO LA AUTOGENERACION DEL CODIGO")
Exit Sub
End If
TXTIDFACTURA.Text = nuevo_codigo
Try
Dim CMD As New SqlCommand()
CMD.Connection = CN
CMD.CommandType = CommandType.StoredProcedure
CMD.CommandText = "SP_GRABAR_CABECERA_FACTURA"
Dim PRM As New SqlParameter("@XIDFACTURA", TXTIDFACTURA.Text)
PRM.SqlDbType = SqlDbType.Char : PRM.Size = 10
PRM.Direction = ParameterDirection.Input
CMD.Parameters.Add(PRM)
PRM = New SqlParameter("@XFECHAFAC", Today)
PRM.SqlDbType = SqlDbType.DateTime
PRM.Direction = ParameterDirection.Input
CMD.Parameters.Add(PRM)
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 16
PRM = New SqlParameter("@XIGV", Val(TXTIGV.Text))
PRM.SqlDbType = SqlDbType.Decimal
PRM.Direction = ParameterDirection.Input
CMD.Parameters.Add(PRM)
PRM = New SqlParameter("@XSUBTOTAL_FAC", Val(TXTSUB_TOTAL.Text))
PRM.SqlDbType = SqlDbType.Decimal
PRM.Direction = ParameterDirection.Input
CMD.Parameters.Add(PRM)
PRM = New SqlParameter("@XANULADO", "0")
PRM.SqlDbType = SqlDbType.Char : PRM.Size = 1
PRM.Direction = ParameterDirection.Input
CMD.Parameters.Add(PRM)
PRM = New SqlParameter("@XTRANSFERIDO", "0")
PRM.SqlDbType = SqlDbType.Char : PRM.Size = 1
PRM.Direction = ParameterDirection.Input
CMD.Parameters.Add(PRM)
PRM = New SqlParameter("@XDESC_FAC", CSng("0.0"))
PRM.SqlDbType = SqlDbType.Decimal
PRM.Direction = ParameterDirection.Input
CMD.Parameters.Add(PRM)
PRM = New SqlParameter("@XIDCLIENTE", IDCLIENTE)
PRM.SqlDbType = SqlDbType.Char : PRM.Size = 10
PRM.Direction = ParameterDirection.Input
CMD.Parameters.Add(PRM)
CMD.ExecuteNonQuery()
Catch EX As Exception
MsgBox(EX.Message)
Exit Sub
End Try
Try
Dim XX As Integer
For XX = 0 To DS.Tables("DETALLE").Rows.Count - 1
Dim CMD As New SqlCommand()
Dim PRM As New SqlParameter()
CMD.Connection = CN
CMD.CommandType = CommandType.StoredProcedure
CMD.CommandText = "SP_GRABAR_DETALLE_FACTURA"
PRM = New SqlParameter("@XIDFACTURA", Trim(TXTIDFACTURA.Text))
PRM.SqlDbType = SqlDbType.Char : PRM.Size = 10
PRM.Direction = ParameterDirection.Input
CMD.Parameters.Add(PRM)
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 17
PRM = New SqlParameter("@XIDARTICULO", DataGrid1(XX, 0))
PRM.SqlDbType = SqlDbType.Char : PRM.Size = 10
PRM.Direction = ParameterDirection.Input
CMD.Parameters.Add(PRM)
PRM = New SqlParameter("@XCANT_DET", DataGrid1(XX, 2))
PRM.SqlDbType = SqlDbType.Int
PRM.Direction = ParameterDirection.Input
CMD.Parameters.Add(PRM)
PRM = New SqlParameter("@XPREC_DET", DataGrid1(XX, 3))
PRM.SqlDbType = SqlDbType.Decimal
PRM.Direction = ParameterDirection.Input
CMD.Parameters.Add(PRM)
PRM = New SqlParameter("@XIMPORTE", DataGrid1(XX, 4))
PRM.SqlDbType = SqlDbType.Decimal
PRM.Direction = ParameterDirection.Input
CMD.Parameters.Add(PRM)
CMD.ExecuteNonQuery()
Next
Catch EX As Exception
MsgBox(EX.Message)
Exit Sub
End Try
MsgBox("Se Grabo la Factura No : " + TXTIDFACTURA.Text, MsgBoxStyle.Information +
MsgBoxStyle.OKOnly, "SISTEMA DE FACTURACION .NET")
End If
35. Programar el botón de comando Button1 del formulario Factura con el siguiente código para llamar al
formulario que busque los Clientes y llame los datos para la factura:
frmbusclientesfact = New BUS_CLIENTES_FACT()
frmbusclientesfact.Show()
If TXTDNI.Text <> "" Then
CMBARTICULOS.Enabled = True
End If
36. Agregar al proyecto otro formulario llamado BUS_ARTICULOS_FACT para registrar los productos o
artículos que no existan cuando se llaman desde la factura, el formulario debe tener el siguiente
diseño:
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 18
Para que el formulario quede como tal, debe crear los siguientes controles:
El formulario debe tener un GroupBox llamado GroupBox1, dentro del GroupBox debe crear tres
RadioButtons con los nombres RB_CODIGO, RB_MODELO y RB_PLATAFORMA, hacia la derecha
crear otro GroupBox llamado GroupBox2 con siete etiquetas, una caja de texto y un botón de
comando, las etiquetas que están con bordes deben tener los siguientes nombres: LBLARTICULO,
LBLPRECIO y LBLIMPORTE, para la caja de texto al lado de Cantidad debe tener el nombre
TXTCANTIDAD y para el botón Agregar Articulo debe tener el nombre BTNAGREGAR.
Así mismo debe crear un ComboBox llamado CMBPLATAFORMA un botón Volver llamado
BTNACEPTAR y un DataGrid llamado DataGrid1.
37. Programar el siguiente código al formulario BUS_ARTICULOS_FACT para definir su funcionalidad:
Antes de Public Class:
Imports System.Data
Imports System.Data.SqlClient
Después de Public Class:
Private DS As New DataSet()
Private XIDARTICULO As String
38. Programar el siguiente código para el resto de controles:
Private Sub BUS_ARTICULOS_FACT_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
Dim da As New SqlDataAdapter("select * from articulos", CN)
da.Fill(DS, "Articulos")
DataGrid1.DataSource = DS.Tables("ARTICULOS")
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 19
da = New SqlDataAdapter("select distinct plataforma from articulos", CN)
da.Fill(DS, "PLATAFORMA")
Dim DR As DataRow
For Each DR In DS.Tables("PLATAFORMA").Rows
CMBPLATAFORMA.Items.Add(DR("PLATAFORMA"))
Next
End Sub
Private Sub TXTBUSCAR_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles TXTBUSCAR.TextChanged
If RB_CODIGO.Checked = True Then
Dim DV As New DataView(DS.Tables("ARTICULOS"))
DV.RowFilter = "IDARTICULO LIKE '" + TXTBUSCAR.Text + "%'"
DataGrid1.DataSource = DV
DV = Nothing
End If
If RB_MODELO.Checked = True Then
Dim DV As New DataView(DS.Tables("ARTICULOS"))
DV.RowFilter = "MODELO LIKE '" + TXTBUSCAR.Text + "%'"
DataGrid1.DataSource = DV
DV = Nothing
End If
End Sub
Private Sub RB_CODIGO_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles RB_CODIGO.CheckedChanged
TXTBUSCAR.Visible = True
CMBPLATAFORMA.Visible = False
TXTBUSCAR.Focus()
End Sub
Private Sub RB_MODELO_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles RB_MODELO.CheckedChanged
TXTBUSCAR.Visible = True
CMBPLATAFORMA.Visible = False
TXTBUSCAR.Focus()
End Sub
Private Sub RB_PLATAFORMA_CheckedChanged(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles RB_PLATAFORMA.CheckedChanged
TXTBUSCAR.Visible = False
CMBPLATAFORMA.Visible = True
End Sub
Private Sub CMBPLATAFORMA_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles CMBPLATAFORMA.SelectedIndexChanged
Dim DV As New DataView(DS.Tables("ARTICULOS"))
DV.RowFilter = "PLATAFORMA = '" + CMBPLATAFORMA.Text + "'"
DataGrid1.DataSource = DV
DV = Nothing
End Sub
Private Sub DataGrid1_CurrentCellChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles
DataGrid1.CurrentCellChanged
Try
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 20
Dim CELDA As DataGridCell
CELDA = DataGrid1.CurrentCell
XIDARTICULO = DataGrid1(CELDA.RowNumber, 0)
LBLARTICULO.Text = DataGrid1(CELDA.RowNumber, 1)
lblprecio.Text = DataGrid1(CELDA.RowNumber, 4)
DataGrid1.Select(DataGrid1.CurrentRowIndex)
Catch ex As Exception
MsgBox("Debe Seleccionar Registros validos", MsgBoxStyle.Exclamation + MsgBoxStyle.OKOnly,
"SISTEMA DE FACTURACION .NET")
End Try
TXTCANTIDAD.Focus()
End Sub
Private Sub BTNAGREGAR_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
BTNAGREGAR.Click
If Not IsNumeric(TXTCANTIDAD.Text) Then
MsgBox("Debe Ingresar Cantidades Validas", MsgBoxStyle.Exclamation + MsgBoxStyle.OKOnly,
"SISTEMA DE FACTURACION .NET")
Exit Sub
End If
If CInt(TXTCANTIDAD.Text) <= 0 Then
MsgBox("Debe Ingresar Cantidades Validas", MsgBoxStyle.Exclamation + MsgBoxStyle.OKOnly,
"SISTEMA DE FACTURACION .NET")
Exit Sub
End If
Dim xx As Integer
For xx = 0 To FRMFACTURAS.DS.Tables("detalle").Rows.Count - 1
If LBLARTICULO.Text = FRMFACTURAS.DS.Tables("detalle").Rows(xx)("descripcion") Then
MsgBox("El articulo " + LBLARTICULO.Text + " ya existe", MsgBoxStyle.Exclamation +
MsgBoxStyle.OKOnly, "SYSTEMA DE FACTURACION .NET")
FRMFACTURAS.DataGrid1.Select(xx)
Exit Sub
End If
Next
Dim DV As New DataView(DS.Tables("ARTICULOS"))
DV.RowFilter = "IDARTICULO = '" + XIDARTICULO + "'"
Dim STOCK As Integer = DV.Item(0)("STOCK_ARTI")
DV = Nothing
If Val(TXTCANTIDAD.Text) > STOCK Then
MsgBox("La cantidad Supera el Stock " + Chr(13) + "Solo hay " + STOCK.ToString + " " +
LBLARTICULO.Text, MsgBoxStyle.Exclamation + MsgBoxStyle.OKOnly, "SISTEMA DE FACTURACION .NET")
TXTCANTIDAD.Focus()
TXTCANTIDAD.BackColor = Color.Red
TXTCANTIDAD.ForeColor = Color.White
TXTCANTIDAD.Text = STOCK.ToString
Exit Sub
End If
Try
Dim dr As DataRow
dr = FRMFACTURAS.DS.Tables("detalle").NewRow
dr("codigo") = XIDARTICULO
dr("descripcion") = LBLARTICULO.Text
dr("precio") = CSng(lblprecio.Text)
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 21
dr("cantidad") = CInt(TXTCANTIDAD.Text)
FRMFACTURAS.DS.Tables("detalle").Rows.Add(dr)
FRMFACTURAS.TXTCANTIDAD.BackColor = Color.White
FRMFACTURAS.TXTCANTIDAD.ForeColor = Color.Black
Call FRMFACTURAS.TOTALES()
Catch EX As Exception
MsgBox(EX.Message)
End Try
Call FRMFACTURAS.validar_opciones()
End Sub
Private Sub TXTCANTIDAD_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles TXTCANTIDAD.TextChanged
Dim importe As Integer
importe = Val(lblprecio.Text) * Val(TXTCANTIDAD.Text)
lblimporte.Text = Format(importe, "###,###.00")
End Sub
Private Sub BTNACEPTAR_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles
BTNACEPTAR.Click
Me.Close()
End Sub
39. Programar el boton de comando llamado BTNARTICULOS del formulario Facturas con el siguiente
código:
Dim FRMBUS_ARTICULOS As New BUS_ARTICULOS_FACT()
FRMBUS_ARTICULOS.Show()
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 22
40. Al ejecutar el proyecto proceder a elaborar una factura tal como se indica en el siguiente modelo:
41. Para poner operativo el botón Visualizar previo, debe diseñar un reporte con Crystal Report con la
siguiente presentación:
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 23
42. Programar el evento Click del botón Visualizar Previo con el siguiente código:
Try
Dim DS_PREVIO As New DataSet()
Dim PRM As SqlParameter
Dim DA As New SqlDataAdapter("SP_FACTURA_DOC", CN)
DA.SelectCommand.CommandType = CommandType.StoredProcedure
PRM = New SqlParameter("@XIDFACTURA", Trim(TXTIDFACTURA.Text))
PRM.SqlDbType = SqlDbType.Char : PRM.Size = 10
PRM.Direction = ParameterDirection.Input
DA.SelectCommand.Parameters.Add(PRM)
DA.SelectCommand.ExecuteNonQuery()
'------------------------------------------
DA.Fill(DS_PREVIO, "FACTURA")
VISUAL BASIC .NET
MANTENIMIENTO DE DATOS
REGISTRO DE FACTURAS
LABORATORIO PROF. ING. DANTE GARCIA
PAGINA 24
Dim reporte_factura As New RPT_FACTURA()
Dim V_FACTURA As New REPORTE()
reporte_factura.SetDataSource(DS_PREVIO.Tables("FACTURA"))
V_FACTURA.CrystalReportViewer1.ReportSource = reporte_factura
V_FACTURA.MdiParent = FRMPRINCIPAL
V_FACTURA.Text = "Factura No : " + Me.TXTIDFACTURA.Text
V_FACTURA.Show()
DS_PREVIO = Nothing
Catch EX As Exception
MsgBox(EX.Message)
Exit Sub
End Try
43. Al presionar el Botón de Visualizar Previo, se mostrará el reporte de la factura generada tal como se
indica: