Concurso – Desarrollo Web Express

Ya salió la lista de ganadores del concurso.
 
2000 dólares para el primer puesto y 1000 dólares para el segundo.
 
Además cientos de premios, como hosting gratuito durante 1 año, entre otros.
 
Lista de ganadores: http://msdn.microsoft-web.com/

Pasar vectores y dataset a servicios web

Primero que nada, veo que alguien lee lo que pongo :), así que hago honor a mi compromiso de dar, desde mi punto de vista, alguna solución a esos problemas en el desarrollo.
 
Para pasar valores a un servicio web, esto se hace, en el modelo simple, en texto plano con una estructura XML pre establecida. Esta se establece en base a una descripción WSDL que, en .Net, es facilmente accesible ya que el mismo Visual Studio la crea cuando creamos un servicio web.
 
Para poder ver esta descripción, solo debemos agregarle a la dirección URL del servicio ?WSDL, y esta retorna un XML con todos los parametros necesarios para ejecutar el famoso servicio web.
 
Ahora, que es aquello que podemos enviarle, como parametro desde .Net a un servicio web?. En pocas palabras, todo aquello que sea SERIALIZABLE. Esto, resumiendolo, es todo aquello que pueda ser convertido, en sus datos, a XML. Podríamos tomarnos un buen rato en explicar todos los procesos, así que para introducción creo que basta 😀
 
De esta forma, cualquier cosa que pueda ser transformado en un XML, puede ser enviado a un servicio web.
 
En el caso de un dataview, un datatable, y otros objetos similares, que no cuentan con esta propiedad, simplemente no se admiten para la transferencia de datos.
 
Pero, lo curioso es que un DataSet si puede ser enviado. Un DataSet, como contenedor de DataTables si, pero el DataTable solo no. Y es otro tema que puede tomar varias líneas explicarlo 🙂
 
En todo caso, aquí les dejo código para que puedan enviar arrays y dataset a los servicios webs. Nada del otro mundo en todo caso 🙂
 

<WebMethod()> _

Public Function MetodoArray(ByVal strArray() As String, ByVal intIndice As Integer) As String

Return strArray(intIndice)

End Function

<WebMethod()> _

Public Function MetodoDataSet(ByVal oDs As DataSet, ByVal intIndice As Integer) As String

Return oDs.Tables(0).Rows(0).Item(intIndice).ToString

End Function

 

Y la prueba desde el código en un formulario web:

 

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

Dim MiArray(10) As String

For i As Integer = 0 To 9

MiArray(i) = i.ToString

Next

Dim oWs As New ServicioWeb.WebService

Me.Label1.Text = oWs.MetodoArray(MiArray, 1)

End Sub


Pedido

Realmente debo decir que no sé quienes me leen, ya que veo muchas entradas en el blog.
 
Lamentablemente, me gustaría poder publicar mas seguido, especialmente código en ASP.net
 
Por esto, hago un pedido a ustedes, aquellos que me leen, que me den ideas de que cosas les gustaría que publique.
 
Y así ponerme a trabajar, además de ayudarme a entender que se maneja normalmente en el mercado.
 
Así que los invito a que cuelguen sobre este post todas las ideas que les gustaría ver resueltas (No me pidan aplicaciones completas 🙂 ), y trataré de colocar código al respecto.
 
Saludos.

Cuando uno espera… llega!

Bueno, eso, hace un tiempo atrás apliqué para orador de INETA.
 
Y hoy, me llegó un correo con mi aprobación.
 
De más está decir que me encuentro muy contento!.

DataSet como RecordSet

Muchas veces, y me ha pasado, nos cuesta despegarnos de modelos de programación adquiridos en lenguajes no .Net
 
Por ejemplo, en Visual Basic 6, donde, he tenido el placer de programar durante mucho tiempo.
 
Este es el caso, donde los datos se manejaban con RecordSets.
 
Actualmente, con DataSets, XML, y demás objetos, muchas veces tenemos un poco de miedo al cambio. Así que, para aquellos que aún quieren trabajar con RecordSets, pero usando DataSets y XML, les coloco una clase que emula las funcionalidades básicas del antiguo objeto, implementando lo nuevo.
 

Imports System.Data

Public

Class RecordSet

Implements IDisposable

#Region "Local Variables"

Private _strPath As String = ""

Private _strCurrentTable As String = ""

Public Enum RecordsetProperties

DischargeChanges

AutoUpdateChanges

End Enum

Private Enum ActionStatus

StandBy

NewRecord

End Enum

Private _EnuStatus As ActionStatus

Private _EnuActions As RecordsetProperties

Private _Ds As DataSet

Private _lngI As Long = -1

Private _Dr As DataRow

#

End Region

#

Region "New Functions"

Public Sub New(ByVal Path As String, ByVal Table As String, ByVal Action As RecordsetProperties)

_strPath = Path

_strCurrentTable = Table

_EnuActions = Action

ResetObject()

End Sub

Public Sub New(ByVal Path As String, ByVal Table As String)

_strPath = Path

_strCurrentTable = Table

_EnuActions = RecordsetProperties.DischargeChanges

ResetObject()

End Sub

Public Sub New(ByVal Path As String)

_strPath = Path

_EnuActions = RecordsetProperties.DischargeChanges

ResetObject()

End Sub

Public Sub New()

_EnuActions = RecordsetProperties.DischargeChanges

ResetObject()

End Sub

#

End Region

#Region "Open Functions"

Public Function Open(ByVal Path As String, ByVal Table As String, ByVal Action As RecordsetProperties) As Boolean

_strPath = Path

_strCurrentTable = Table

_EnuActions = Action

Try

_Ds =

New DataSet

_Ds.ReadXml(_strPath)

ResetObject()

Return True

Catch ex As Exception

Throw ex

End Try

End Function

Public Function Open(ByVal Path As String, ByVal Table As String) As Boolean

_strPath = Path

_strCurrentTable = Table

Try

_Ds =

New DataSet

_Ds.ReadXml(_strPath)

ResetObject()

Return True

Catch ex As Exception

Throw ex

End Try

End Function

Public Function Open(ByVal Table As String) As Boolean

If _strPath.Trim.Length <> 0 Then

_strCurrentTable = Table

If _strCurrentTable.Trim.Length <> 0 Then

Try

_Ds = New DataSet

_Ds.ReadXml(_strPath)

ResetObject()

Return True

Catch ex As Exception

Throw ex

End Try

Else

Throw New Exception("No table name given")

End If

Else

Throw New Exception("No path given")

End If

End Function

Public Function Open() As Boolean

If _strPath.Trim.Length <> 0 Then

If _strCurrentTable.Trim.Length <> 0 Then

Try

_Ds =

New DataSet

_Ds.ReadXml(_strPath)

ResetObject()

Return True

Catch ex As Exception

Throw ex

End Try

Else

Throw New Exception("No table name given")

End If

Else

Throw New Exception("No path given")

End If

End Function

#

End Region

#Region "Common Functions"

Private Sub ResetObject()

_lngI = -1

_EnuStatus = ActionStatus.StandBy

End Sub

#

End Region

#Region "RecordSet handling"

Public Function MoveNext() As Boolean

Try

_lngI += 1

If _lngI < _Ds.Tables(_strCurrentTable).Rows.Count Then

Return True

Else

Return False

End If

Catch ex As Exception

Throw ex

End Try

End Function

Public Function MoveBack() As Boolean

Try

_lngI -= 1

If _lngI >= 0 Then

Return True

Else

_lngI = 0

Return False

End If

Catch ex As Exception

Throw ex

End Try

End Function

Public Function MoveLast() As Boolean

Try

_lngI = _Ds.Tables(_strCurrentTable).Rows.Count – 1

Return True

Catch ex As Exception

Throw ex

End Try

End Function

Public Function MoveFirst() As Boolean

Try

_lngI = 0

Return True

Catch ex As Exception

Throw ex

End Try

End Function

#

End Region

#

Region "Administrative Functions"

Public Function getItem(ByVal ColumnName As String) As String

Try

Return _Ds.Tables(_strCurrentTable).Rows(_lngI).Item(ColumnName)

Catch ex As Exception

Throw ex

End Try

End Function

Public Function getItem(ByVal ColumnIndex As Integer) As String

Try

Return _Ds.Tables(_strCurrentTable).Rows(_lngI).Item(ColumnIndex)

Catch ex As Exception

Throw ex

End Try

End Function

Public Function RecordCount() As Long

Try

Return _Ds.Tables(_strCurrentTable).Rows.Count

Catch ex As Exception

Throw ex

End Try

End Function

Public Function DeleteRecord() As Boolean

Try

_Ds.Tables(_strCurrentTable).Rows(_lngI).Delete()

Select Case _EnuActions

Case RecordsetProperties.AutoUpdateChanges

Save()

End Select

Return True

Catch ex As Exception

Throw ex

End Try

End Function

Public Function UpdateRecord(ByVal ColumnName As String, ByVal Value As String) As Boolean

Try

Select Case _EnuStatus

Case ActionStatus.NewRecord

_Dr(ColumnName) = Value

Return True

Case ActionStatus.StandBy

_Ds.Tables(_strCurrentTable).Rows(_lngI).Item(ColumnName) = Value

Select Case _EnuActions

Case RecordsetProperties.AutoUpdateChanges

Save()

End Select

Return True

End Select

Catch ex As Exception

Throw ex

End Try

End Function

Public Function UpdateRecord(ByVal ColumnIndex As Integer, ByVal Value As String) As Boolean

Try

Select Case _EnuStatus

Case ActionStatus.StandBy

_Ds.Tables(_strCurrentTable).Rows(_lngI).Item(ColumnIndex) = Value

Select Case _EnuActions

Case RecordsetProperties.AutoUpdateChanges

Save()

End Select

Return True

Case ActionStatus.NewRecord

_Dr(ColumnIndex) = Value

Return True

End Select

Catch ex As Exception

Throw ex

End Try

End Function

Public Function FinalizeRecord() As Boolean

Try

If _EnuStatus = ActionStatus.NewRecord Then

_Ds.Tables(_strCurrentTable).Rows.Add(_Dr)

_EnuStatus = ActionStatus.StandBy

Select Case _EnuActions

Case RecordsetProperties.AutoUpdateChanges

Save()

End Select

Return True

Else

Return False

End If

Catch ex As Exception

Throw ex

End Try

End Function

Public Function NewRecord() As Boolean

Try

_Dr = _Ds.Tables(_strCurrentTable).NewRow

_EnuStatus = ActionStatus.NewRecord

Return True

Catch ex As Exception

Throw ex

End Try

End Function

Public Function Save() As Boolean

Try

_Ds.WriteXml(_strPath)

Return True

Catch ex As Exception

Throw ex

End Try

End Function

Public Function SaveAs(ByVal Path As String) As Boolean

Try

_Ds.WriteXml(Path)

Return True

Catch ex As Exception

Throw ex

End Try

End Function

#

End Region

#

Region ".Net Functions"

Public Overridable Sub Dispose() Implements IDisposable.Dispose

Try

_Ds.Dispose()

_Ds =

Nothing

 

Catch ex As Exception

End Try

End Sub

#

End Region

End

Class


Conferencia .Net

Este Jueves 13 de Julio estaré dictando mi primer conferencia en Santiago (Chile).
 
Tema a tratar: .Net para desarrolladores Java y Visual Basic 6.
 
En terminos generales, tocaremos temas introductorios sobre .Net, para aquellos desarrolladores que aún están pensando en si optan por esta tecnología.
 
Veremos las ventajas de desarrollar con .Net y que nuevo mundo se nos plantea.
 
Para mas información, pueden entrar a la sección de eventos del sitio web de Microsoft.

Un año más…

Bueno, debo decir que hasta el viernes he estado con los nervios de punta. Por un lado, el equipo con el que desarrollo, por algún motivo dejó de funcionar. El depurador de Visual Studio se saltaba lineas, no asignaba valores a las variables.
 
Además, lo de Argentina en la copa mundial. Pekerman… porque no metiste a Messi?????
 
Y por último, era mi último día como MVP, y estaba en análisis mi nominación.
 
Hasta las 6:30, nada pasaba, y me fuí a casa, sin poder terminar mi trabajo, con la amargura del mundial, y sin MVP.
 
Pero parece que el clima mejoraba para el fin de semana. Brasil perdió , Portugal sacó a los Ingleses, y hoy, tengo un correo que dice que soy MVP por un año más.
 
Ahora solo me queda esperar que la maquina funcione.