Que tengan muy felices fiestas y que se cumplan todos sus deseos.
viernes, 24 de diciembre de 2010
Felicidadesssssssss!
Que tengan muy felices fiestas y que se cumplan todos sus deseos.
martes, 28 de septiembre de 2010
Cloud computing - Introducción
Lo que hoy en día se da a conocer como trabajar en la nube se presenta en tres categorías:
- Software como servicio (Software as a Service, SaaS).
- Servicios adjuntos (Attached Services).
- Plataformas en la nube (Cloud Platforms).
Estas 3 categorías son presentadas para diferentes ambientes de trabajo. Lo que se pretende y se apunta a desarrollar son servicios de aplicaciones en la nube. Algunas de estas pueden ser por ejemplo Google maps que ofrece los mapas on-line y brinda además herramientas para los desarrolladores para que utilicen esta aplicación para situar mapas en las aplicaciones desarrolladas por los mismos. Este tipo de plataforma de aplicaciones no aparecen muy a menudo. Pero como dijo David Chappell, "cuando aparece una plataforma de innovación exitosa, genera un enorme impacto".
En los próximos días voy a adentrarme más en esto y explicar quizás un poco mejor algunas de estas cosas. Es como mucha información de golpe y me sale toda junta. Tengo como que acomodar un poco todo lo almacenado. Además, un día largo el de hoy...
En breve la continuación de esto y con algo más práctico. Se viene interesante...
Saludos,
Mariano Llarin.-
viernes, 27 de agosto de 2010
ASP.NET - GridView con botones como columnas
domingo, 22 de agosto de 2010
Conectarse a bases de datos Sql Server CE
Formato del connectionString para una base de datos Sql Server CE:
"Connection.ConnectionString=“DataSource=My Documents\database.sdf"
Para utilizar esta conección desde visual studio desarrollando aplicaciones para dispositivos móviles deberemos declararla de la siguiente forma:
Espacios de nombres utilizados:
Imports System.Data.SqlServerCe
Imports System.Data.SqlClient
Guardar y leer archivos XML en dispositivos móviles.
Para crear el archivo XML, suponiendo que tenemos un dataset creado:
Dim FS As New System.IO.FileStream("windows\archivo.xml", _
System.IO.FileMode.Create)
Dim XMLTW As New System.Xml.XmlTextWriter( _
FS, System.Text.Encoding.Unicode)
' El dataset ya creado y con información. Lo guardo dentro del XMLTextWriter
DS.WriteXml(XMLTW, XmlWriteMode.WriteSchema)
XMLTW.Close()
Luego, para poder leerlo, realizamos lo siguiente:
Dim DS2 As New DataSet
Dim FS As New System.IO.FileStream("windows\archivo.xml", _
System.IO.FileMode.Open)
Dim XMLR As New System.Xml.XmlTextReader(FS)
DS2.ReadXml(XMLR, XmlReadMode.ReadSchema )
myXMLReader.Close()
Dim unaFila As DataRow
Dim i As Integer
For i = 0 To DS2.Tables("Archivo").Rows.Count - 1
unaFila = DS2.Tables("Archivo").Rows(i)
MessageBox.Show(("Archivo" & i.ToString & "= " & _ unaFila("Nombre")))
Next i
sábado, 21 de agosto de 2010
ASP.NET - Datos agrupados en GridView
En este caso voy a hacer un agrupado sin duplicar el header de la grilla, o sea que manteniendo un único header voy a crear un agrupado con la información que queramos agregar en el mismo y agregando algunos botones por medio de HTML para hacerlo un poco más completo.
Ejemplo:
Esta es la grilla vista desde la página aspx, en la misma pareciera que no se está agrupando nada pero cambia la vista luego de compilarse.
El código aspx sería el siguiente:
<asp:GridView ID="Grd" runat="server" AutoGenerateColumns="False" CellSpacing="1"
CaptionAlign="Top" CellPadding="1" DataKeyNames="Col1,Col2,Col11"
CssClass="Estilo16">
<RowStyle CssClass="Estilo16" BorderStyle="Solid" />
<Columns>
<asp:BoundField DataField="Col1" HeaderText="" Visible="False"><ItemStyle Height="20px" /></asp:BoundField>
<asp:BoundField DataField="Col2" HeaderText="" Visible="False" />
<asp:BoundField HeaderText="Col3" DataField="" ReadOnly="True" ><ItemStyle Width="12%" Height="20px" /></asp:BoundField>
<asp:BoundField DataField="Col4" HeaderText="" ReadOnly="True" ><ItemStyle Width="34%" Height="20px" /></asp:BoundField>
<asp:BoundField DataField="Col5" HeaderText="" ReadOnly="True" ><ItemStyle Width="10%" Height="20px" /></asp:BoundField>
<asp:BoundField DataField="Col6" HeaderText="" ReadOnly="True" ><ItemStyle Width="7%" Height="20px" /></asp:BoundField>
<asp:BoundField DataField="Col7" HeaderText="" ReadOnly="True" ><ItemStyle Width="7%" Height="20px" /></asp:BoundField>
<asp:BoundField DataField="Col8" HeaderText="" ReadOnly="True" ><ItemStyle Width="7%" Height="20px" /></asp:BoundField>
<asp:BoundField DataField="Col9" HeaderText="" ReadOnly="True" ><ItemStyle Width="5%" Height="20px" /></asp:BoundField>
<asp:BoundField DataField="Col10" HeaderText="" ReadOnly="True" ><ItemStyle Width="10%" Height="20px" /></asp:BoundField>
<asp:CommandField ButtonType="Image" HeaderText="" SelectImageUrl="~/imagenes/lupa.gif" ShowSelectButton="True" ><ItemStyle Width="5%" Height="20px" /></asp:CommandField>
<asp:CommandField ButtonType="Image" DeleteImageUrl="~/imagenes/btnBaja.png" HeaderText="" ShowDeleteButton="True" ><ItemStyle Width="4%" Height="20px" /></asp:CommandField>
<asp:BoundField DataField="Col10" HeaderText="" Visible="False" ReadOnly="True" />
<asp:BoundField DataField="Col11" HeaderText="" Visible="False" />
</Columns>
<HeaderStyle BackColor="#E8E8E8" CssClass="tabla" Height="29px" />
</asp:GridView>
Este es el código VB:
Private Sub Grd_RowDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewRowEventArgs) Handles Grd.RowDataBound
If e.Row.RowType = DataControlRowType.DataRow Then
Dim DRowV As DataRowView = e.Row.DataItem
Dim unColorFila As New Color
' Este código se utiliza con la recuperación de algunas columnas de un Stored procedure.
If Not IsDBNull(DRowV("NumeroCC")) Then
If DRowV("NumeroCC") > 0 Then
If Not IsDBNull(DRowV("Numero")) Then
If DRowV("Numero").ToString.Length > 0 Then
e.Row.Cells(4).Text = DRowV("NumeroCC").ToString & " - " & DRowV("Numero").ToString
End If
Else
e.Row.Cells(4).Text = DRowV("NumeroCC").ToString
End If
End If
End If
unColorFila = Color.FromArgb(255, 246, 246, 246)
If Not IsDBNull(DRowV("FechaVto")) And Not IsDBNull(DRowV("Cantidad")) And Not IsDBNull(DRowV("CantidadEntregada")) Then
If CType(DRowV("FechaVto"), Date) < Date.Now Then unColorFila = Color.FromArgb(255, 255, 229, 179)
If (CType(DRowV("Cantidad"), Decimal) <= CType(DRowV("CantidadEntregada"), Decimal)) Then unColorFila = Color.FromArgb(255, 232, 251, 227)
End If
e.Row.BackColor = unColorFila
If Not IsDBNull(DRowV("fecha")) Then
e.Row.Cells(5).Text = CType(DRowV("fecha"), Date).ToShortDateString
End If
If Not IsDBNull(DRowV("fechaVto")) Then
e.Row.Cells(6).Text = CType(DRowV("fechaVto"), Date).ToShortDateString
End If
If Not IsDBNull(DRowV("FechaAsignacion")) Then
e.Row.Cells(7).Text = CType(DRowV("FechaAsignacion"), Date).ToShortDateString
End If
'--------------------------------------------------------------------------------------
Dim table As Table = Grd.Controls(0)
'For Each row As GridViewRow In Grd.Rows
Dim realIndex As Int16 = table.Rows.GetRowIndex(e.Row)
Dim currentEmisor As String = Grd.DataKeys(e.Row.RowIndex).Values(0)
Dim currentID As Long = CType(Grd.DataKeys(e.Row.RowIndex).Values(2), Long)
' Estos son los campos para el agrupado.
If currentEmisor <> lastEmisor Or currentID <> lastID Then
' Acá creo la fila que va a cumplir la función del agrupado.
Dim groupHeaderRow As GridViewRow = New GridViewRow(realIndex, realIndex, DataControlRowType.Separator, DataControlRowState.Normal)
Dim newCell(2) As TableCell
' Agrupado con 2 columnas y un link
newCell(0) = New TableCell
newCell(0).ColumnSpan = 4
newCell(0).HorizontalAlign = HorizontalAlign.Left
newCell(0).CssClass = "tabla_botonera1"
newCell(0).Font.Bold = True
newCell(0).ControlStyle.BorderColor = Color.Transparent
newCell(0).ControlStyle.BorderStyle = BorderStyle.Solid
newCell(0).ControlStyle.BorderWidth = 0
If Not IsDBNull(DRowV("CompraDirecta")) Then
If DRowV("CompraDirecta").ToString = "1" Then
newCell(0).Text = "<span class=textoGris> Número: </span> <span class=txtgeneral>" & Grd.DataKeys(e.Row.RowIndex).Values(1) & "</span><span class=Estilo28> (Compra Directa)</span><span class=txtgeneral> " & currentEmisor & "</span><span class=mano onClick=MM_openBrWindow('Archivos_adjuntos.aspx?Id=" & currentID & "&ID_Nro=" & DRowV("Nro") & "','Archivos','resizable=yes','540','300','true')><strong> Archivos Adjuntos</strong></span>"
'newCell(0).Text = "<span class=textoGris> Número: </span> <span class=txtgeneral>" & Grd.DataKeys(e.Row.RowIndex).Values(1) & "</span><span class=Estilo28> (Compra Directa)</span><span class=txtgeneral> " & currentCategory & "</span><asp:linkbutton runat=server ID=lnkAdjuntos Text=Archivos Adjuntos cssclass=mano/>"
Else
newCell(0).Text = "<span class=textoGris> Número: </span> <span class=txtgeneral>" & Grd.DataKeys(e.Row.RowIndex).Values(1) & "</span><span class=txtgeneral> " & currentEmisor & "</span><span class=mano onClick=MM_openBrWindow('Archivos_adjuntos.aspx?Id=" & currentID & "&ID_Nro=" & DRowV("Nro") & "','Archivos','resizable=yes','540','300','true')><strong> Archivos Adjuntos</strong></span>"
'newCell(0).Text = "<span class=textoGris> Número: </span> <span class=txtgeneral>" & Grd.DataKeys(e.Row.RowIndex).Values(1) & "</span><span class=txtgeneral> " & currentCategory & "</span><asp:linkbutton runat=server ID=lnkAdjuntos Text=Archivos Adjuntos cssclass=mano/>"
End If
Else
newCell(0).Text = "<span class=textoGris> Número: </span> <span class=txtgeneral>" & Grd.DataKeys(e.Row.RowIndex).Values(1) & "</span><span class=txtgeneral> " & currentEmisor & "</span><span class=mano onClick=MM_openBrWindow('Archivos_adjuntos.aspx?Id=" & currentID & "&ID_Nro=" & DRowV("Nro") & "','Archivos','resizable=yes','540','300','true')><strong> Archivos Adjuntos</strong></span>"
'newCell(0).Text = "<span class=textoGris> Número: </span> <span class=txtgeneral>" & Grd.DataKeys(e.Row.RowIndex).Values(1) & "</span><span class=txtgeneral> " & currentCategory & "</span><asp:linkbutton runat=server ID=lnkAdjuntos Text=Archivos Adjuntos cssclass=mano/>"
End If
'onClick=MM_openBrWindow('Archivos_adjuntos.aspx','Archivos','resizable=yes','540','300','true')
' Columna con botón imprimir
newCell(1) = New TableCell
newCell(1).ColumnSpan = 2
newCell(1).VerticalAlign = VerticalAlign.Middle
newCell(1).HorizontalAlign = HorizontalAlign.Left
newCell(1).CssClass = "tabla_botonera1"
newCell(1).ControlStyle.BorderColor = Color.Transparent
newCell(1).ControlStyle.BorderStyle = BorderStyle.Solid
newCell(1).ControlStyle.BorderWidth = 0
If Not IsDBNull(DRowV("id_Urgencia")) Then
If DRowV("id_Urgencia").ToString = "1" Then
newCell(1).Text = "<img src=imagenes/Print.png width=16 height=16 align=absmiddle class=mano onClick=MM_openBrWindow('Imprimir.aspx?id=" & currentID & "','Imprimir','resizable=yes','800','600','true')><strong><span class=Estilo26> Urgente</span></strong>"
Else
newCell(1).Text = "<img src=imagenes/Print.png width=16 height=16 align=absmiddle class=mano onClick=MM_openBrWindow('Imprimir.asp?id=" & currentID & "','Imprimir','resizable=yes','800','600','true')>"
End If
Else
newCell(1).Text = "<img src=imagenes/Print.png width=16 height=16 align=absmiddle class=mano onClick=MM_openBrWindow('Imprimir.asp?id=" & currentID & "','Imprimir','resizable=yes','800','600','true')>"
End If
' Columna con nivel de urgencia
newCell(2) = New TableCell
newCell(2).ColumnSpan = 4
newCell(2).VerticalAlign = VerticalAlign.Middle
newCell(2).HorizontalAlign = HorizontalAlign.Left
newCell(2).CssClass = "tabla_botonera1"
newCell(2).ControlStyle.BorderColor = Color.Transparent
newCell(2).ControlStyle.BorderStyle = BorderStyle.Solid
newCell(2).ControlStyle.BorderWidth = 0
If Not IsDBNull(DRowV("id_Estado")) Then
If DRowV("id_Estado").ToString = "5" Then
newCell(2).Text = "<img src=imagenes/fondo_verde.png>"
Else
newCell(2).Text = "<img src=imagenes/fondo_naranja.png>"
End If
Else
newCell(2).Text = "<img src=imagenes/fondo_naranja.png>"
End If
groupHeaderRow.Cells.AddRange(newCell)
table.Controls.AddAt(realIndex, groupHeaderRow)
lastEmisor = currentEmisor
lastID = currentID
End If
End If
End Sub
Espero que con este código puedan crear sus propios agrupados, de una manera quizás más sencilla o algo bien completo para que la grilla sea bien útil y atractiva.
Saludos.
Mariano Llarin.-
Neuquén, Argentina.
viernes, 30 de julio de 2010
Conferencia de ASP.NET MVC 2.0
lunes, 14 de junio de 2010
Habilitar xp_cmdshell en sql server 2008
Mecanismo que crea un shell de comandos de Windows y lo pasa a una cadena para ejecutarlo desde sql. Los resultados se devuelven como filas de texto
USE master
GO
EXECUTE sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO
EXECUTE sp_configure 'xp_cmdshell', 1
RECONFIGURE WITH OVERRIDE
GO
EXECUTE sp_configure 'show advanced options', 0
RECONFIGURE WITH OVERRIDE
GO
sábado, 12 de junio de 2010
ASP.NET MVC - Introducción
- Que es?
ASP.NET MVC es un framework metodológico que divide la implementación de una aplicación en 3 roles: modelos, vistas y controladores.
Según el blog de Scott Guthrië...
- Los “modelos” de una aplicación basada en MVC son los componentes responsables de mantener el estado. Normalmente el estado se guarda en una base de datos (por ejemplo: podríamos tener la clase Producto que se utiliza para representar los datos de la tabla Productos en SQL Server)
- Las “vistas” son los componentes responsables de mostrar la interfaz de usuario de la aplicación. Esta UI se crea a partir del modelo de datos (por ejemplo: podríamos crear una vista “Edición” que muestre cajas de texto, controles desplegables (dropdownlist) y checkboxes dependiendo del estado actual de un objeto Producto)
- Los “controladores” de una aplicación basada en MVC son los componentes responsables de la interacción con el usuario final, manipular el modelo y por último elegir una vista para renderizar la UI. En una aplicación MVC la vista solo muestra la información, el controlador es el que administra y responde a las peticiones del usuario y a las interacciones.
Esta separación de la entidad permite tener agilidad y flexibilidad en la construcción y mantenimiento aplicaciones.
Por ejemplo, mediante la separación de las vistas, se puede establecer una iteración en la apariencia de su aplicación sin tocar en cualquiera la lógica de negocio. Además es posible separar el trabajo por roles, de modo que, por ejemplo, los diseñadores pueden trabajar en las vistas, mientras que los desarrolladores trabajan en el modelo.
ASP.NET MVC lleva el poder de este paradigma de desarrollo al desarrollo de aplicaciones ASP.NET, lo que permite utilizar las habilidades de desarrollo de .NET para construir aplicaciones MVC.
Este tipo de desarrollo brinda:
- Control completo sobre el marcado HTML
- Permite ricos AJAX y la integración jQuery
- Le permite crear URLs amigables SEO para su sitio
- De hacer pruebas de desarrollo impulsado por (TDD) fácil
Para obtener recursos de este framework visiten el siguiente link:
ASP.NET MVC
lunes, 31 de mayo de 2010
Crear un directorio virtual desde vb.net y asociar al sitio
Cuando accedemos a IIS es necesario escribir una dirección de este tipo: http://localhost. De esta forma, estaríamos accediendo en C:\Inetpub\wwwroot, que es llamado directorio particular. Por el contrario, en los directorios virtuales se accede con http://localhost/directorio_virtual, lo cual no tiene que coincidir que el directorio se encuentre en la carpeta de publicación del disco (es decir, no tiene porque exitir en C:\Inetpub\wwwroot\directorio_virtual) pero si existirá en otra ubicación del disco.
Vamos a realizar esto por código VB.NET y a través de una carpeta existente(con el contenido que irá al sitio) , la copiaremos en la carpeta virtual y asociaremos con IIS.
Para esto crearemos un procedimiento recursivo de modo que si dentro de la carpeta con archivos existe otra carpeta y archivos, podamos tambien copiarlos.
Private Sub CopiarArchivos(ByVal Ip_FolderFrom As String, ByVal Ip_FolderTo As String)
Dim strArchivos As String() = Directory.GetFiles(Ip_FolderFrom)
Dim strCarpetas As String() = Directory.GetDirectories(Ip_FolderFrom)
Dim NombreArchivo As String = ""
Dim NombreCarpeta As String = ""
' Recorro todos los subdirectorios del directorio.
For Each SubDirectorio As String In strCarpetas
' Creo la carpeta en el subdirectorio
NombreCarpeta = Mid(SubDirectorio, SubDirectorio.LastIndexOf("\") + 2,SubDirectorio.Length)
Directory.CreateDirectory(Ip_FolderTo & NombreCarpeta)
' Llamo de nuevo al procedimiento para copiar los archivos.
Call CopiarArchivos(Ip_FolderFrom & "\" & NombreCarpeta,Ip_FolderTo & NombreCarpeta & "\")
Next
' Recorro todos los archivos del directorio
For Each Archivo As String In strArchivos
' Copio cada archivo en la carpeta destino (Ruta de instalacion ingresada)
NombreArchivo = Mid(Archivo, Archivo.LastIndexOf("\") + 2, Archivo.Length)
If Not File.Exists(Ip_FolderTo & NombreArchivo) Then File.Copy(Archivo, Ip_FolderTo & NombreArchivo, False)
Next
End Sub
Con esta función podremos copiar los archivos y carpetas del sitio en la ubicación que elijamos.
Luego con esto realizado podremos agregar la función que nos permita crear en IIS el sitio web apuntado al directorio virtual.
Espacio utilizado: System.DirectoryServices
Private Sub CreateVirtualDir(ByVal WebSite As String, ByVal AppName As String, ByVal Path As String)
Try
Dim IISSchema As New System.DirectoryServices.DirectoryEntry("IIS://" & WebSite & "/Schema/AppIsolated")
Dim CanCreate As Boolean = Not IISSchema.Properties("Syntax").Value.ToString.ToUpper() = "BOOLEAN"
IISSchema.Dispose()
If CanCreate Then
Dim PathCreated As Boolean
Try
Dim IISAdmin As New DirectoryEntry("IIS://" & WebSite & "/W3SVC/1/Root")
'Crear el sitio y asociar al directorio virtual
Dim VDir As DirectoryEntry = IISAdmin.Children.Add(AppName, "IIsWebVirtualDir")
VDir.Properties("Path").Item(0) = Path
VDir.Properties("AppFriendlyName").Item(0) = AppName
VDir.Properties("EnableDirBrowsing").Item(0) = False
VDir.Properties("AccessRead").Item(0) = True
VDir.Properties("AccessExecute").Item(0) = True
VDir.Properties("AccessWrite").Item(0) = False
VDir.Properties("AccessScript").Item(0) = True
VDir.Properties("AuthNTLM").Item(0) = True
VDir.Properties("EnableDefaultDoc").Item(0) = True
VDir.Properties("DefaultDoc").Item(0) = "index.aspx" ' Pagina por defecto.
VDir.Properties("AspEnableParentPaths").Item(0) = True
VDir.CommitChanges()
'the following are acceptable params
'INPROC = 0
'OUTPROC = 1
'POOLED = 2
VDir.Invoke("AppCreate", 1)
Me.Hide()
frmFinInstalacion.Show()
Catch Ex As Exception
If PathCreated Then
System.IO.Directory.Delete(Path)
End If
If Ex.GetHashCode.ToString() = "7588182" Then
Throw New Exception("El directorio virtual ya se encuentra creado.")
Else
Throw Ex
End If
End Try
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
Espero que esto sea útil para más de uno ya que es un poco complicado hacer estas cosas sin un instalador y a veces necesario.
Saludos.
Mariano Llarin.-