Hola, estoy intentando hacer un calendario en el cual 1º desactivo todos los días (esto lo hace bien) para luego marcar los días festivos (los obtengo de mi BD) y otros días de otra tabla de mi BD (estos deben estar activos). El problema que tengo es que obtengo este error:
System.IndexOutOfRangeException: No se puede encontrar la tabla 0. en esta línea de código:
For Each dr As DataRow In dsNoMoved.Tables(0).Rows
* Lo 1º que he hecho es comprobar que las variables de la query tengan valor, reciben el valor correcto.
* Lo 2º ha sido comprobar que la query funciona fuera de código. Funciona y además he provado con los mismo valores que recibiría. Me devuelve valores correctos.
Lo raro de lo que me sucede es que los días festivos me los marca bien pero los otros no, sin embargo estoy utilizando el mismo proceso.
He revisado el código muchas veces y no consigo encontrar el error.
Código:
'******************************************************************************************
'*************************************** CALENDARIO ***************************************
'******************************************************************************************
Private dsHolidays As DataSet
Private dsNoMoved As DataSet
Protected Sub activarcalendario(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnusuariocalendario.Click
MyCalendar.VisibleDate = Date.Today
FillHolidayDataset()
End Sub
Protected Sub FillHolidayDataset()
Dim firstDate As New DateTime(MyCalendar.VisibleDate.Year, MyCalendar.VisibleDate.Month, 1)
Dim lastDate As DateTime = GetFirstDayOfNextMonth()
Dim today As DateTime = Date.Today
dsHolidays = GetCurrentMonthData(firstDate, lastDate)
dsNoMoved = GetCurrentMonthNoMoved(firstDate, today)
End Sub
Protected Sub Calendar1_VisibleMonthChanged(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MonthChangedEventArgs) Handles MyCalendar.VisibleMonthChanged
FillHolidayDataset()
End Sub
Protected Function GetFirstDayOfNextMonth() As DateTime
Dim monthNumber, yearNumber As Integer
If MyCalendar.VisibleDate.Month = 12 Then
monthNumber = 1
yearNumber = MyCalendar.VisibleDate.Year + 1
Else
monthNumber = MyCalendar.VisibleDate.Month + 1
yearNumber = MyCalendar.VisibleDate.Year
End If
Dim lastDate As New DateTime(yearNumber, monthNumber, 1)
Return lastDate
End Function
Function GetCurrentMonthData(ByVal firstDate As DateTime, ByVal lastDate As DateTime) As DataSet
Dim dsFestivos As New DataSet
Try
Dim cs As ConnectionStringSettings
cs = ConfigurationManager.ConnectionStrings("MiConexion")
Dim connString As String = cs.ConnectionString
Dim dbConnection As New SqlConnection(connString)
Dim queryfestivos As String = "SELECT fecha_fest FROM fechas_festivos WHERE fecha_fest >= @firstDate AND fecha_fest < @lastDate"
Dim dbCommand As New SqlCommand(queryfestivos, dbConnection)
dbCommand.Parameters.Add(New SqlParameter("@firstDate", firstDate))
dbCommand.Parameters.Add(New SqlParameter("@lastDate", lastDate))
Dim sqlDataAdapter As New SqlDataAdapter(dbCommand)
sqlDataAdapter.Fill(dsFestivos)
Me.Label7.Text = lastDate
Catch ex As Exception
Me.lblerrorcalendario.Text = ex.ToString
End Try
Return dsFestivos
End Function
Function GetCurrentMonthNoMoved(ByVal firstDate As DateTime, ByVal today As DateTime) As DataSet
Dim dsNoMovido As New DataSet
Dim usuario As String = Me.tbusuariocalendario.Text
Me.Label5.Text = usuario
Me.Label6.Text = firstDate
Me.Label8.Text = today
Try
Dim cs As ConnectionStringSettings
cs = ConfigurationManager.ConnectionStrings("MiConexion")
Dim connString As String = cs.ConnectionString
Dim dbConnection As New SqlConnection(connString)
Dim querynomovido As String = "SELECT no_movido.fecha FROM no_movido, (SELECT id_vehiculo AS id_veh FROM vehiculo_adapt WHERE vehiculo_adapt.usuario = @usuario) WHERE no_movido.fecha >= @firstDate AND no_movido.fecha < @today AND no_movido.id_vehiculo = id_veh"
Dim dbCommand As New SqlCommand(querynomovido, dbConnection)
dbCommand.Parameters.Add(New SqlParameter("@usuario", usuario))
dbCommand.Parameters.Add(New SqlParameter("@firstDate", firstDate))
dbCommand.Parameters.Add(New SqlParameter("@today", today))
Dim sqlDataAdapter As New SqlDataAdapter(dbCommand)
sqlDataAdapter.Fill(dsNoMovido)
Catch ex As Exception
Me.lblerrorcalendario.Text = ex.ToString
End Try
Return dsNoMovido
End Function
Protected Sub Calendar1_DayRender(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.DayRenderEventArgs) Handles MyCalendar.DayRender
Dim nextDate As DateTime
'Deshabilitamos todos los días
If e.Day.IsOtherMonth Or Not e.Day.IsOtherMonth Then
e.Day.IsSelectable = False
End If
'Pintamos los no movidos y los habilitamos
If Not dsNoMoved Is Nothing Then
For Each dr As DataRow In dsNoMoved.Tables(0).Rows
nextDate = CType(dr("fecha"), DateTime)
If nextDate = e.Day.Date Then
e.Cell.BackColor = System.Drawing.Color.CornflowerBlue
e.Day.IsSelectable = True
End If
Next
End If
'Pintamos los festivos
If Not dsHolidays Is Nothing Then
For Each dr As DataRow In dsHolidays.Tables(0).Rows
nextDate = CType(dr("fecha_fest"), DateTime)
If nextDate = e.Day.Date Then
e.Cell.BackColor = System.Drawing.Color.Tomato
End If
Next
End If
End Sub
Espero que me puedan ayudar ya que llevo un par de días con esto y no puedo perder más tiempo. Muchas gracias.