438 lines
18 KiB
VB.net
438 lines
18 KiB
VB.net
Option Explicit On
|
|
Option Strict On
|
|
|
|
Imports Extensiones
|
|
Imports Microsoft.Reporting.WebForms
|
|
Imports System.Data
|
|
|
|
Partial Class Inventarios_RepMaximoMinimo
|
|
Inherits ClsPaginas
|
|
|
|
#Region " PROPIEDADES "
|
|
Private Property PS As String
|
|
Get
|
|
If ViewState("PS") Is Nothing Then
|
|
Return ""
|
|
Else
|
|
Return ViewState("PS").ToString
|
|
End If
|
|
End Get
|
|
Set(value As String)
|
|
ViewState("PS") = value
|
|
End Set
|
|
End Property
|
|
|
|
Private Property DTOCDetalle As DataTable
|
|
Get
|
|
If ViewState("DTOCDetalle") Is Nothing Then
|
|
Return New DataTable
|
|
Else
|
|
Return DirectCast(ViewState("DTOCDetalle"), DataTable)
|
|
End If
|
|
End Get
|
|
Set(value As DataTable)
|
|
ViewState("DTOCDetalle") = value
|
|
End Set
|
|
End Property
|
|
|
|
Private ReadOnly Property PermiteClasificacion2 As Boolean
|
|
Get
|
|
Return (UsuarioActual.CveEmpresa.Contiene(72, 80))
|
|
End Get
|
|
End Property
|
|
#End Region
|
|
|
|
Private Sub Inventarios_RepMaximoMinimo_Load(sender As Object, e As EventArgs) Handles Me.Load
|
|
If Not IsPostBack Then
|
|
CargaCombos()
|
|
End If
|
|
End Sub
|
|
|
|
#Region " INICIALIZA VALORES "
|
|
Private Sub CargaCombos()
|
|
|
|
DdlSubProyecto.DataSource = GlobalDTSubProyectos(-1, -1, UsuarioActual.Empresa.CveEmpresa, 1)
|
|
DdlSubProyecto.DataBind()
|
|
DdlSubProyecto.Items.Insert(0, New ListItem("Todas", "-1"))
|
|
|
|
DdlAlmacen.DataSource = GlobalDTAlmacenUsuarios(UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, CveTipoAlmacen:=-1) 'GlobalDTAlmacen(UsuarioActual.CveEmpresa)
|
|
DdlAlmacen.DataBind()
|
|
DdlAlmacen.Items.Insert(0, New ListItem("Todos", "-1"))
|
|
|
|
DdlAlmacenModal.DataSource = GlobalDTAlmacenUsuarios(UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, CveTipoAlmacen:=-1)
|
|
DdlAlmacenModal.DataBind()
|
|
DdlAlmacenModal.Items.Insert(0, New ListItem("Seleccione Almacén", "-1"))
|
|
|
|
'DdlPSModal.DataSource = GlobalDTPSSimplificado(UsuarioActual.CveEmpresa)
|
|
'DdlPSModal.DataBind()
|
|
'DdlPSModal.Items.Insert(0, New ListItem("Seleccione", "-1"))
|
|
UpModalMaximoMinimo.Update()
|
|
|
|
|
|
DdlClasificacion2.DataSource = GlobalDTClasificaciones2(UsuarioActual.CveEmpresa)
|
|
DdlClasificacion2.DataBind()
|
|
DdlClasificacion2.Items.Insert(0, New ListItem("Todas", "-1"))
|
|
'BLOQUEA DDL CLASIFICACION
|
|
DivClaisficacionLabel.Visible = PermiteClasificacion2
|
|
DivClasificacion2.Visible = PermiteClasificacion2
|
|
TdModalClasificacion2.Visible = PermiteClasificacion2
|
|
|
|
End Sub
|
|
|
|
Private Sub DdlSubProyecto_SelectedIndexChanged(sender As Object, e As EventArgs) Handles DdlSubProyecto.SelectedIndexChanged
|
|
|
|
'Dim DtSubptoyecto As DataTable = GlobalDTSubProyectos(-1, -1, UsuarioActual.Empresa.CveEmpresa, 1).FiltraParametros(String.Format(" CveSubProyecto ={0}", DdlSubProyecto.SelectedValue.ToEntero)) 'GlobalDTSucursales(" CveSucursal = ")
|
|
DdlAlmacen.Items.Clear()
|
|
'If DtSubptoyecto.Rows.Count > 0 Then
|
|
'Dim CveSucursal As Integer = DtSubptoyecto(0)("CveSucursal").ToString.ToEntero
|
|
DdlAlmacen.DataSource = GlobalDTAlmacenUsuarios(UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, CveTipoAlmacen:=-1).FiltraParametros(String.Format("CveSubProyecto={0}", DdlSubProyecto.SelectedValue.ToEntero))
|
|
DdlAlmacen.DataBind()
|
|
DdlAlmacen.Items.Insert(0, New ListItem("Todos", "-1"))
|
|
'Else
|
|
' DdlAlmacen.DataSource = Nothing
|
|
' DdlAlmacen.DataBind()
|
|
'End If
|
|
|
|
'GvDatos.DataSource = Nothing
|
|
'GvDatos.DataBind()
|
|
|
|
'DdlAlmacen.SelectedIndex = 0
|
|
OrdenaDatos()
|
|
UpDatos.Update()
|
|
UpTitulos.Update()
|
|
|
|
End Sub
|
|
#End Region
|
|
|
|
#Region " CARGA DATOS "
|
|
Private Sub BtnFiltrar_Click(sender As Object, e As EventArgs) Handles BtnFiltrar.Click
|
|
CargaGrid()
|
|
OrdenaDatos()
|
|
End Sub
|
|
Private Sub CargaGrid()
|
|
Dim ObjMaxMin As New ClsInventarios
|
|
|
|
If ObjMaxMin.RepMaximoMinimo(DdlSubProyecto.SelectedValue.ToEntero, DdlAlmacen.SelectedValue.ToEntero, DdlClasificacion2.SelectedValue.ToEntero, UsuarioActual.CveEmpresa) Then
|
|
GvDatos.DataSource = ObjMaxMin.DtResultados
|
|
Else
|
|
GvDatos.DataSource = Nothing
|
|
End If
|
|
|
|
|
|
If DdlAlmacen.SelectedValue.ToEntero > 0 Then
|
|
GvDatos.Columns(9).Visible = True
|
|
Else
|
|
GvDatos.Columns(9).Visible = False
|
|
End If
|
|
|
|
ObjMaxMin.Dispose()
|
|
GvDatos.DataBind()
|
|
UpDatos.Update()
|
|
End Sub
|
|
Private Sub OrdenaDatos()
|
|
|
|
'If (GvDatos.Rows.Count > 0) Then
|
|
' GvDatos.UseAccessibleHeader = True
|
|
' GvDatos.HeaderRow.TableSection = TableRowSection.TableHeader
|
|
' RegistraScript("OrdenarGV();", "ScriptOrdenamiento")
|
|
'End If
|
|
End Sub
|
|
|
|
Protected Sub GvDatos_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GvDatos.RowDataBound
|
|
If e.Row.RowType = DataControlRowType.DataRow Then
|
|
e.Row.FCLiteral("LtCodigo").Text = $"<a class=""Texto"" target='_blank' href=""/Ventas/ProductosServicios.aspx?CvePS={e.Row.DataKey("CvePS")}"">{e.Row.DBCampo("Codigo")}</a>"
|
|
e.Row.FCLabel("LtDescripcion").Text = $"<a class=""Texto"" target='_blank' href=""/Ventas/ProductosServicios.aspx?CvePS={e.Row.DataKey("CvePS")}"">{e.Row.DBCampo("PS")}</a>"
|
|
|
|
|
|
|
|
If e.Row.FCLinkButton("LnkPteRecibir").Text = "-" Then
|
|
e.Row.FCLinkButton("LnkPteRecibir").Visible = False
|
|
e.Row.FCLabel("LblPteRecibir").Visible = True
|
|
End If
|
|
|
|
|
|
|
|
|
|
End If
|
|
End Sub
|
|
#End Region
|
|
|
|
#Region " PENDIENTE POR RECIBIR "
|
|
Private Sub GvDetalleOrdenCompra_RowDataBound(sender As Object, e As GridViewRowEventArgs) Handles GvDetalleOrdenCompra.RowDataBound
|
|
|
|
If e.Row.RowType = DataControlRowType.DataRow Then
|
|
e.Row.FCLiteral("LtlOc").Text = $"<a class=""Texto"" target='_blank' href=""/OC/OC.aspx?OC={e.Row.DataKey("CveOrdenCompra")}"">{e.Row.DBCampo("OC")}</a>"
|
|
End If
|
|
End Sub
|
|
Public Sub Click_VerDetalleOC(sender As Object, e As EventArgs)
|
|
|
|
Dim GvRow As GridViewRow = DirectCast(DirectCast(sender, LinkButton).NamingContainer, GridViewRow)
|
|
Dim activo As Boolean = False
|
|
Dim CvePs As Integer = GvRow.DataKey("CvePS").ToString.ToEntero
|
|
Dim CodigoPS As String = GvRow.DataKey("CodigoPS").ToString
|
|
Dim Descripcion As String = GvRow.DataKey("PS").ToString
|
|
|
|
PS = Descripcion
|
|
Dim objInventarios As New ClsInventarios
|
|
|
|
If objInventarios.RepMaximoMinimoDetalleGet(DdlSubProyecto.SelectedValue.ToEntero, CvePs, UsuarioActual.Empresa.CveEmpresa) Then
|
|
DTOCDetalle = objInventarios.DtResultados
|
|
GvDetalleOrdenCompra.DataSource = objInventarios.DtResultados
|
|
End If
|
|
OrdenaDatos()
|
|
objInventarios.Dispose()
|
|
GvDetalleOrdenCompra.DataBind()
|
|
|
|
LtlTitulo.Text = String.Format("{0}", CodigoPS)
|
|
RegistraScript("$('#ModalDetalleOrdenCompra').modal({ backdrop: 'static', keyboard: false})", "ModalDetalle")
|
|
|
|
UpModaletalle.Update()
|
|
End Sub
|
|
#End Region
|
|
|
|
#Region " MODAL "
|
|
Private Sub LnkDefinir_Click(sender As Object, e As EventArgs) Handles LnkDefinir.Click
|
|
HFDefinir.Value = "I"
|
|
DdlAlmacenModal.SelectedIndex = 0
|
|
DdlPSModal.SelectedValue = "-1"
|
|
DdlPSModal.SelectedText = "Seleccione"
|
|
TxtMaximo.Text = ""
|
|
TxtMinimo.Text = ""
|
|
DdlAlmacenModal.Enabled = True
|
|
DdlPSModal.Enabled = True
|
|
LbAgregarMaximoMinimo.Text = "Agregar"
|
|
UpModalMaximoMinimo.Update()
|
|
RegistraScript(String.Format("$('#{0}').modal();", "ModalMaximoMinimo"))
|
|
End Sub
|
|
|
|
Private Sub LbAgregarMaximoMinimo_Click(sender As Object, e As EventArgs) Handles LbAgregarMaximoMinimo.Click
|
|
If DdlPSModal.SelectedValue.ToEntero > 0 Then
|
|
|
|
Using ObjInventario As New ClsInventarios
|
|
|
|
If HFDefinir.Value = "I" Then
|
|
If ObjInventario.AddAlmacenMaximoMinimo(DdlAlmacenModal.SelectedValue.ToEntero, DdlPSModal.SelectedValue.ToEntero, TxtMaximo.Text.ToDouble, TxtMinimo.Text.ToDouble, UsuarioActual.CveUsuario) Then
|
|
Alert("El Máximo/Mínimo se agregó correctamente.", TipoMensaje.MsgInformacion)
|
|
End If
|
|
ElseIf HFDefinir.Value = "U" Then
|
|
If ObjInventario.UpdateAlmacenMaximoMinimo(DdlAlmacenModal.SelectedValue.ToEntero, DdlPSModal.SelectedValue.ToEntero, TxtMaximo.Text.ToDouble, TxtMinimo.Text.ToDouble, UsuarioActual.CveUsuario) Then
|
|
Alert("El Máximo/Mínimo se actualizó correctamente.", TipoMensaje.MsgInformacion)
|
|
End If
|
|
End If
|
|
End Using
|
|
|
|
CargaGrid()
|
|
RegistraScript(String.Format("$('#{0}').modal('hide');", "ModalMaximoMinimo"))
|
|
Else
|
|
Alert("Seleccione un producto o servicio", TipoMensaje.MsgAdvertencia)
|
|
End If
|
|
End Sub
|
|
|
|
Protected Sub UpdateMaximoMinimo(sender As Object, e As EventArgs)
|
|
Dim GvRow As GridViewRow = DirectCast(DirectCast(sender, LinkButton).NamingContainer, GridViewRow)
|
|
HFDefinir.Value = "U"
|
|
Dim CveAlmacen As Integer = GvRow.DataKey("CveAlmacen").ToString.ToEntero
|
|
Dim CvePS As Integer = GvRow.DataKey("CvePS").ToString.ToEntero
|
|
Dim strPS As String = GvRow.DataKey("PS").ToString()
|
|
Dim strAlmacen As String = GvRow.DataKey("Almacen").ToString()
|
|
Dim Maximo As String = GvRow.DataKey("Maximo").ToString
|
|
Dim Minimo As String = GvRow.DataKey("Minimo").ToString
|
|
|
|
DdlAlmacenModal.Enabled = False
|
|
DdlPSModal.Enabled = False
|
|
|
|
DdlAlmacenModal.SelectedValue = "-1"
|
|
DdlAlmacenModal.SelectedValueExist(CveAlmacen.ToString())
|
|
If (DdlAlmacenModal.SelectedValue = "-1") Then
|
|
DdlAlmacenModal.Items.Add(New ListItem(strAlmacen, CveAlmacen.ToString()))
|
|
End If
|
|
DdlAlmacenModal.SelectedValueExist(CveAlmacen.ToString())
|
|
DdlPSModal.SelectedText = strPS
|
|
DdlPSModal.SelectedValue = CvePS.ToString
|
|
TxtMaximo.Text = Maximo
|
|
TxtMinimo.Text = Minimo
|
|
LbAgregarMaximoMinimo.Text = "Actualizar"
|
|
UpModalMaximoMinimo.Update()
|
|
RegistraScript(String.Format("$('#{0}').modal();", "ModalMaximoMinimo"))
|
|
|
|
End Sub
|
|
|
|
#End Region
|
|
|
|
|
|
|
|
#Region "I M P R I M I R "
|
|
Protected Sub LnkExportar_Click(sender As Object, e As EventArgs) Handles LnkExportar.Click
|
|
|
|
GvDatos.ExportToExcel("RepFacturas_" & Now.ToShortDateString())
|
|
|
|
End Sub
|
|
|
|
Private Sub GenerarPDF()
|
|
Dim ObjDatos As New ClsInventarios
|
|
|
|
If ObjDatos.RepMaximoMinimo(DdlSubProyecto.SelectedValue.ToEntero, DdlAlmacen.SelectedValue.ToEntero, DdlClasificacion2.SelectedValue.ToEntero, UsuarioActual.CveEmpresa) Then
|
|
|
|
If ObjDatos.DtResultados.Rows.Count > 0 Then
|
|
|
|
Dim Imagen As New System.IO.FileInfo(String.Format("{0}/Logo.png", UsuarioActual.Empresa.Ruta))
|
|
Dim logouri = String.Format("{0}://{1}:{2}/Empresas/{3}/Logo.png", Request.Url.Scheme, Request.Url.Host, Request.Url.Port, UsuarioActual.CveEmpresa)
|
|
Dim dt As DataTable = ObjDatos.DtResultados
|
|
Dim params As New List(Of ReportParameter)
|
|
params.Add(New ReportParameter("SubProyecto", DdlSubProyecto.SelectedItem.Text))
|
|
params.Add(New ReportParameter("Almacen", DdlAlmacen.SelectedItem.Text))
|
|
params.Add(New ReportParameter("NombreEmpresa", UsuarioActual.Empresa.Empresa))
|
|
params.Add(New ReportParameter("UsuarioImprimio", UsuarioActual.Nombre))
|
|
params.Add(New ReportParameter("FechaImpresion", Now.ToDateTime.ToShortDateString))
|
|
If Imagen.Exists Then
|
|
params.Add(New ReportParameter("LogoPath", logouri))
|
|
Else
|
|
params.Add(New ReportParameter("LogoPath", ""))
|
|
End If
|
|
ImprimirPDF("Empresas/Grales/Formatos/RepMaximosMinimos.rdlc", dt, params, "ReporteMaxMin")
|
|
|
|
Else
|
|
Alert("No hay datos consultados", TipoMensaje.MsgAdvertencia)
|
|
End If
|
|
Else
|
|
Alert("No hay datos consultados", TipoMensaje.MsgAdvertencia)
|
|
End If
|
|
|
|
End Sub
|
|
Protected Sub LnkPdf_Click(sender As Object, e As EventArgs) Handles LnkPdf.Click
|
|
GenerarPDF()
|
|
End Sub
|
|
|
|
Protected Sub LnkImprimirDetalle_Click(sender As Object, e As EventArgs)
|
|
|
|
If DTOCDetalle.Rows.Count > 0 Then
|
|
|
|
Dim Imagen As New System.IO.FileInfo(String.Format("{0}/Logo.png", UsuarioActual.Empresa.Ruta))
|
|
Dim logouri = String.Format("{0}://{1}:{2}/Empresas/{3}/Logo.png", Request.Url.Scheme, Request.Url.Host, Request.Url.Port, UsuarioActual.CveEmpresa)
|
|
Dim dt As DataTable = DTOCDetalle
|
|
Dim params As New List(Of ReportParameter)
|
|
|
|
params.Add(New ReportParameter("SubProyecto", DdlSubProyecto.SelectedItem.Text))
|
|
params.Add(New ReportParameter("Almacen", DdlAlmacen.SelectedItem.Text))
|
|
params.Add(New ReportParameter("NombreEmpresa", UsuarioActual.Empresa.Empresa))
|
|
params.Add(New ReportParameter("UsuarioImprimio", UsuarioActual.Nombre))
|
|
params.Add(New ReportParameter("FechaImpresion", Now.ToDateTime.ToShortDateString))
|
|
params.Add(New ReportParameter("PS", PS))
|
|
|
|
If Imagen.Exists Then
|
|
params.Add(New ReportParameter("LogoPath", logouri))
|
|
Else
|
|
params.Add(New ReportParameter("LogoPath", ""))
|
|
End If
|
|
ImprimirPDF("Empresas/Grales/Formatos/RepMaximosMinimosDetalle.rdlc", dt, params, "ReporteMaxMinDetalle")
|
|
|
|
Else
|
|
Alert("No hay datos consultados", TipoMensaje.MsgAdvertencia)
|
|
End If
|
|
OrdenaDatos()
|
|
|
|
End Sub
|
|
|
|
#End Region
|
|
|
|
|
|
#Region " PERSONALIZAR COLUMNAS "
|
|
Private Sub BtnPersonalizar_Click(sender As Object, e As EventArgs) Handles BtnPersonalizar.Click
|
|
|
|
If ChkClasificacion2.Checked Then
|
|
GvDatos.Columns(1).Visible = True
|
|
Else
|
|
GvDatos.Columns(1).Visible = False
|
|
End If
|
|
|
|
If ChkMarca.Checked Then
|
|
GvDatos.Columns(3).Visible = True
|
|
Else
|
|
GvDatos.Columns(3).Visible = False
|
|
End If
|
|
|
|
RegistraScript("$('#DivPersonalizar').modal('hide')")
|
|
CargaGrid()
|
|
End Sub
|
|
#End Region
|
|
|
|
Protected Sub LnkUpFile_Click(sender As Object, e As EventArgs)
|
|
Dim Filesgral As List(Of Archivo) = TxtArchivoMaxMin.getfiles().Archivos
|
|
Dim continuar As Boolean = Filesgral.Count > 0
|
|
Dim stringError As String = ""
|
|
Dim fileItem As Archivo = If(continuar, Filesgral(0), Nothing)
|
|
|
|
If continuar Then
|
|
Dim FileExtension As String = fileItem.Extencion.ToUpper()
|
|
|
|
If FileExtension = "XLS" Or FileExtension = "XLSX" Or FileExtension = "CSV" Then
|
|
Else
|
|
continuar = False
|
|
stringError = "No se inserto un archivo de tipo Excel"
|
|
End If
|
|
End If
|
|
|
|
Dim DTEXcel As DataTable = New DataTable()
|
|
If continuar Then
|
|
DTEXcel = Extensiones.ModExtensiones.ReadExcelFile(fileItem.FileUrl, True)
|
|
DTEXcel.Columns.Add(New DataColumn("CvePS", GetType(Integer)))
|
|
DTEXcel.Columns.Add(New DataColumn("CveAlmacen", GetType(Integer)))
|
|
Dim dtAlmacen As DataTable = GlobalDTAlmacenUsuarios(UsuarioActual.CveUsuario, UsuarioActual.CveEmpresa, CveTipoAlmacen:=-1)
|
|
For Each drow As DataRow In DTEXcel.Rows
|
|
Dim Drps As DataTable = GlobalDTPS(UsuarioActual.CveEmpresa, -1, "-1", -1, -1, drow("Codigo").ToString())
|
|
Dim dralmacen As DataRow = dtAlmacen.FiltroPrimero(String.Format("Almacen='{0}'", drow("Almacen")))
|
|
If Drps.Rows.Count > 0 Then
|
|
drow("CvePS") = Drps.Rows(0)("CvePS")
|
|
End If
|
|
If Not IsNothing(dralmacen) Then
|
|
drow("CveAlmacen") = dralmacen("CveAlmacen")
|
|
End If
|
|
DTEXcel.AcceptChanges()
|
|
Next
|
|
continuar = True
|
|
End If
|
|
If continuar Then
|
|
|
|
Using ObjMaxMin As New ClsInventarios
|
|
ObjMaxMin.IniciaTransacSQL()
|
|
Dim DtResultados As New DataTable
|
|
If ObjMaxMin.RepMaximoMinimo(-1, -1, -1, UsuarioActual.CveEmpresa) Then
|
|
DtResultados = ObjMaxMin.DtResultados
|
|
End If
|
|
For Each drow As DataRow In DTEXcel.Select("CvePS>0 AND CveAlmacen >0")
|
|
If continuar Then
|
|
If IsNothing(DtResultados.FiltroPrimero(String.Format("CveAlmacen={0} AND CvePS={1}", drow("CveAlmacen").ToString().ToEntero(), drow("CvePS").ToString().ToEntero()))) Then
|
|
continuar = ObjMaxMin.AddAlmacenMaximoMinimo(drow("CveAlmacen").ToString().ToEntero(), drow("CvePS").ToString().ToEntero(), drow("Maximo").ToString().ToDouble(), drow("Minimo").ToString().ToDouble(), UsuarioActual.CveUsuario)
|
|
Else
|
|
continuar = ObjMaxMin.UpdateAlmacenMaximoMinimo(drow("CveAlmacen").ToString().ToEntero(), drow("CvePS").ToString().ToEntero(), drow("Maximo").ToString().ToDouble(), drow("Minimo").ToString().ToDouble(), UsuarioActual.CveUsuario)
|
|
End If
|
|
End If
|
|
Next
|
|
If continuar Then
|
|
ObjMaxMin.Commit()
|
|
Else
|
|
ObjMaxMin.RollBack()
|
|
End If
|
|
End Using
|
|
End If
|
|
If continuar Then
|
|
CargaGrid()
|
|
Alert("los cambios se han guardado satisfactoriamente")
|
|
RegistraScript("$('#DmodalCargarMaximosMinimos').modal('hide');")
|
|
End If
|
|
End Sub
|
|
Protected Sub LnkCargarMaximosMinimos_Click(sender As Object, e As EventArgs)
|
|
TxtArchivoMaxMin.Text = ""
|
|
RegistraScript("$('#DmodalCargarMaximosMinimos').modal();")
|
|
Upcargamasiva.Update()
|
|
End Sub
|
|
Protected Sub LnkDescargarFormato_Click(sender As Object, e As EventArgs)
|
|
Using ObjMaxMin As New ClsInventarios
|
|
If ObjMaxMin.RepMaximoMinimo(-1, -1, -1, UsuarioActual.CveEmpresa) Then
|
|
ObjMaxMin.DtResultados.FiltraParametros("", "", New String() {"Codigo", "Almacen", "Maximo", "Minimo"}).ExportToExcel(String.Format("MaximosyMinimos{0:dd-MM-yyyy}", DateTime.Now))
|
|
End If
|
|
|
|
End Using
|
|
End Sub
|
|
End Class
|