viernes, julio 28, 2006

Función VB.NET para manejo de errores

Cuando ocurre algún error en nuestro código muchas veces preferimos mostrarle al usuario un mensaje simple como "Hay problemas técnicos, intente más tarde" y recibir justo en ese momento un correo informándonos dónde ocurrió el error y por qué ocurrió.

La función RutinaError se utiliza cada vez que un error es cachado en nuestro código. Recibe 4 parámetros: mensaje de error, ubicación donde ocurrió el error, una cadena cualquiera que nos permite enviar más información y por último el nombre de la rutina donde ocurrió el error.

Como vemos, no es necesario especificar ningún correo origen o destino. Al final explicaremos esto.

A continuación tenemos las rutinas involucradas:


Function RutinaError(ByVal strMsg As String, ByVal strTrack As String, ByVal StrMoreBody As String, ByVal StrNombreRutina As String) As String
Dim MensajeGeneralError As String
MensajeGeneralError = "&nbsp;<image src='Advise.gif'>"
MensajeGeneralError += "<span style='color:red;font-weight:bold;size:11px;font-family:arial;'"
MensajeGeneralError += "<b> Ha ocurrido un error en la comunicación. Puede ser ocasionado por saturación en el sistema o por su conexión de Internet. Por favor intente de nuevo más tarde.</b>"
MensajeGeneralError += "</span><br><br>"

Dim StrDest As String = ""
StrDest += "user@mipagina.com
Dim StrRem As String = ""
StrRem += "errores@mipagina.com"

Dim strServerName As String = Request.ServerVariables("LOCAL_ADDR")
Dim StrRemoteAddr As String = Request.ServerVariables("REMOTE_ADDR")
Dim strBody As String
strBody = "<FONT face='Verdana' size='1'>"
strBody += "<b>Servidor: </b>" & strServerName & "<br><br>"
strBody += "<b>Mensaje: </b>" & strMsg & "<br><br>"
strBody += "<b>Error: </b>" & strTrack & "<br><br>"
strBody += "<b>Rutina: </b>" & StrNombreRutina & "<br><br>"
strBody += "<b>IP Cliente: </b>" & StrRemoteAddr & "<br><br>"
strBody += StrMoreBody
strBody += "</FONT>"
Dim StrSubject As String = "[" & strServerName & "] Problema en " & Request.ServerVariables("URL")

'ENVIO DE CORREO
If InStr(strBody, "aborted") = 0 Then EnvioCorreo(StrDest, StrRem, StrSubject, strBody)

Return MensajeGeneralError
End Function


Sub EnvioCorreo(ByVal strPara As String, ByVal strDe As String, ByVal strTitulo As String, ByVal strCuerpo As String)
Dim objCorreo As New System.Web.Mail.MailMessage
objCorreo.To = strPara
objCorreo.From = strDe
objCorreo.Subject = strTitulo
objCorreo.Body = strCuerpo
objCorreo.BodyFormat = MailFormat.Html
System.Web.Mail.SmtpMail.Send(objCorreo)
End Sub


Veamos un pequeño ejemplo de cómo se implementaría:


Try
    {... aquí ocurrirá algún error ...}
Catch ex As Exception
    Dim StrMensaje As String = ""
    StrMensaje = RutinaError(ex.Message, ex.StackTrace, "Más texto", "RutinaX()")
    Response.Write(StrMensaje)
End Try


Los correos han sido especificados dentro de RutinaError y no dentro del bloque Catch. De este modo cuando el correo errores@mipagina.com cambie a errores@mipaginanueva.com entonces sólo será necesario un pequeño cambio y todos los errores que se generen en nuestro sitio irán a parar al nuevo correo.

Si tienen alguna duda de cómo implementarlo no duden en contactarnos.

Cálculos y manejo de cadenas

Function CambiaMes(intMes As Integer) As String
  If intMes = 1 Then CambiaMes = "Ene"
  If intMes = 2 Then CambiaMes = "Feb"
  If intMes = 3 Then CambiaMes = "Mar"
  If intMes = 4 Then CambiaMes = "Abr"
  If intMes = 5 Then CambiaMes = "May"
  If intMes = 6 Then CambiaMes = "Jun"
  If intMes = 7 Then CambiaMes = "Jul"
  If intMes = 8 Then CambiaMes = "Ago"
  If intMes = 9 Then CambiaMes = "Sep"
  If intMes =10 Then CambiaMes = "Oct"
  If intMes =11 Then CambiaMes = "Nov"
  If intMes =12 Then CambiaMes = "Dic"
End Function


La siguiente función calcula la edad dependiendo de la fecha proporcionada.
Function CalculaEdad(ByVal dtFechaNac As Date) As Integer
  Dim Edad As Integer = DateTime.Today.Year - dtFechaNac.Year
  If DateTime.Today.Month > dtFechaNac.Month Then Edad -= 1
  If dtFechaNac.Month = DateTime.Today.Month Then
    If DateTime.Today.Day > dtFechaNac.Day Then Edad -= 1
  End If
  Return Edad
End Function


Function DateToDisplay(ByVal dtFecha As Date, ByVal StrFormato As String) As String
Dim StrFechaDia, StrFechaMes, StrFechaAno As String

StrFechaDia = dtFecha.Day
StrFechaMes = dtFecha.Month
If dtFecha.Day > 0 And dtFecha.Day < 10 Then StrFechaDia = "0" & dtFecha.Day
If dtFecha.Month > 0 And dtFecha.Month < 10 Then StrFechaMes = "0" & dtFecha.Month
StrFechaAno = dtFecha.Year

If StrFormato = "0" Then
Return StrFechaDia & "/" & StrFechaMes & "/" & StrFechaAno
ElseIf StrFormato = "A" Then
Return StrFechaDia & "-" & CambiaMes(dtFecha.Month) & "-" & StrFechaAno
End If
End Function

Funciones VB.NET para manejo de base de datos

Resumen de Rutinas:
1. GetDataSetBD(String SQL)
2. EjecutaComando(String SQL)





Function GetDataSetBD(ByVal StrSQL As String) As DataSet
Dim dbConnection As New SqlConnection(ConfigurationManager.AppSettings("MyDataBaseKey"))
Dim objAdapter As New SqlDataAdapter(StrSQL, dbConnection)
Dim ds As New DataSet()
Try
objAdapter.Fill(ds)
Catch ex As Exception
Throw New Exception(ex.Message, ex.InnerException)
Finally
objAdapter.Dispose()
If dbConnection.State = ConnectionState.Open Then dbConnection.Close()
dbConnection.Dispose()
End Try
Return ds
End Function


Overloads Function EjecutaComando(ByVal strsql As String, ByVal sqlparametros As SqlParameter()) As Boolean
Dim bolaccion As Boolean
Dim objcn As New SqlConnection(ConfigurationManager.AppSettings("MyDataBaseKey"))
objcn.Open()

Dim objcmd As SqlCommand = objcn.CreateCommand()
Dim objTran As SqlTransaction
objTran = objcn.BeginTransaction()
objcmd.Connection = objcn
objcmd.Transaction = objTran
Try
With objcmd
.CommandText = strsql
For Each objpar As SqlParameter In sqlparametros
.Parameters.Add(objpar)
Next
.ExecuteNonQuery()
End With
objTran.Commit()
bolaccion = True
Catch ex As SqlException
objTran.Rollback()
If objcn.State = ConnectionState.Open Then objcn.Close()
objTran.Dispose()
objcmd.Dispose()
objcn.Dispose()

Throw New Exception(ex.Message, ex.InnerException)
Finally
If objcn.State = ConnectionState.Open Then objcn.Close()
objTran.Dispose()
objcmd.Dispose()
objcn.Dispose()
End Try
Return bolaccion
End Function

Overloads Function EjecutaComando(ByVal strsql As String, ByVal sqlparametros As SqlParameter(), ByVal tipo As Integer) As Integer
Dim intID As Integer
Dim objcn As New SqlConnection(ConfigurationManager.AppSettings("MyDataBaseKey"))
objcn.Open()

Dim objcmd As SqlCommand = objcn.CreateCommand()
Dim objTran As SqlTransaction
objTran = objcn.BeginTransaction()
objcmd.Connection = objcn
objcmd.Transaction = objTran
Try
With objcmd
.CommandText = strsql
For Each objpar As SqlParameter In sqlparametros
.Parameters.Add(objpar)
Next
intID = .ExecuteScalar
End With
objTran.Commit()

Catch ex As SqlException
objTran.Rollback()
If objcn.State = ConnectionState.Open Then objcn.Close()
objTran.Dispose()
objcmd.Dispose()
objcn.Dispose()

Throw New Exception(ex.Message, ex.InnerException)
Finally
If objcn.State = ConnectionState.Open Then objcn.Close()
objTran.Dispose()
objcmd.Dispose()
objcn.Dispose()
End Try
Return intID
End Function

Sub RunSQLBD(ByVal StrSQL As String)
Dim dbConnection As New SqlConnection(ConfigurationManager.AppSettings("MyDataBaseKey"))
Dim dbCommand As New SqlCommand(StrSQL, dbConnection)
Try
dbConnection.Open()
dbCommand.ExecuteNonQuery()
Finally
dbConnection.Close()
End Try
End Sub
Function RunSQLBD_ID(ByVal StrSQL As String) As String
Dim dbConnection As New SqlConnection(ConfigurationManager.AppSettings("MyDataBaseKey"))
Dim dbCommand As New SqlCommand(StrSQL, dbConnection)
Dim StrResult As String
Try
dbConnection.Open()
StrResult = dbCommand.ExecuteScalar()
Finally
dbConnection.Close()
End Try
Return StrResult
End Function

jueves, julio 27, 2006

Confirm en ASP.NET

Bueno despues de haber revisado infinidad de ideas para poder crear un boton de confirmacion a la ora ya sea de insertar un registro, editar o borrar el registro, he aqui la que me parecio mas practica.

Primero el script de confirmacion:


< script type="text/javascript">
function Notifica(elem,Notif)
{
//elem es el elemento a editar
//Notif es la accion que se haria, este ejemplo realiza 2 acciones diferentes
if (Notif==1)
{
return confirm( 'Se marcara como X: '+ elem+ ', ¿esta usted de acuerdo?');
}
else
{
return confirm( 'Se marcara y: '+ elem+ ', ¿esta usted de acuerdo?');
}
}
<script>


Yo estoy utilizando la version 2 de .net y empleando la nueva propiedad de onclientClick.
Nota: Aqui lo estoy haciendo en un gridview y por eso estoy llamando a mi objeto con sender

sender.onclientClick = "return Notifica('" & sender.CommandName & "','" & sender.CommandArgument & "');"

para los que usan la version 1.1:

sender.Attributes.Add("onclick","return Notifica('" & sender.CommandName
& "','" & sender.CommandArgument & "');")



Para finalizar debo de hacer notar que debe de llebar siempre el return funcion()
ya que a la hora de aceptar realizaria el postback normal de nuestro boton, o si se rechaza no se ejecutara el postback.





Yo lo he estado utilizando y me funciona, y espero que a ustedes tambien.

Cualquier duda o comentario no duden.

lunes, julio 24, 2006

Repositorio

Hace tiempo que vengo utilizando la siguiente url: http://www.codekeep.net/ para poder almacenar rutinas reutilizables

Ya tengo algunas aunque no son muchas, pero han sido vistas bastantes ocaciones creo yo.

¿Que mas hay?

No solo es para .NET ahi encontraran bastantes rutinas para SQL, jscript, asp, php, perl, xml, etc..

La verdad que si quieren tener en un solo lugar las rutinas que mas utilizan y para que no esten abriendo otros proyectos en las que utilizaron las rutinas, realmente si es de gran ayuda este sitio ya que centralizan su información.

Lo unico es que pide registrarse, y esto es gratuito.

Ojala y les sea de ayuda.

Objetivo del Blog

Vamos a tratar de crear una buena fuente de información, para desarrollo de .net, y alguno que otro articulo de tecnología relacionada, como SQL.

Tratare de centrarme en ASP.NET
Controles de usuario ASCX
Y alguna que otra utileria que espero les sirva.