RaydenFox Ответов: 2

Данные пользователей сохраняют только одну запись в ms access


Я пытаюсь сохранить данные о времени пользователя в базе данных между двумя датами, а затем распечатать их в crystal reports, но я получаю только одну дату вместо всех дат, которые у него есть. Чего мне не хватает в моем коде:

Public Sub getLogs(ByVal id As Integer, ByVal fromDate As Date, ByVal toDate As Date)
        Dim startDay, endDay As Date
        conn1 = New OleDbConnection
        conn1.ConnectionString = conCopy
        conn4 = New OleDbConnection
        conn4.ConnectionString = conCopy
        Dim query, query2 As String

        Try
            conn1.Open()
            query = "SELECT USERID,CHECKDATE," _
            & "MIN(IIF(CHECKTYPE='Check In',CHECKTIME,NULL) ) AS 'AM IN', " _
            & "MIN(IIF(CHECKTYPE='Break Out',CHECKTIME,NULL) ) AS 'LUNCH OUT', " _
            & "MAX(IIF(CHECKTYPE='Break In',CHECKTIME,NULL) ) AS 'LUNCH IN', " _
            & "MAX(IIF(CHECKTYPE='Check Out',CHECKTIME,NULL) ) AS 'PM OUT' " _
            & "FROM CHECKINOUT WHERE USERID = @ID " _
            & "GROUP BY USERID, CHECKDATE"

            cmd = New OleDbCommand(query, conn1)
            cmd.Parameters.Clear()
            cmd.Parameters.AddWithValue("@ID", Integer.Parse(id))
            
            Dim reader As OleDbDataReader = cmd.ExecuteReader

            conn4.Open()
            query2 = "INSERT INTO LOGDATES(ID,CHECKDATE,AMIN,LUNCHOUT,LUNCHIN,PMOUT) " _
            & "VALUES(@ID,@DATE,@AM,@LOUT,@LIN,@PM)"
            cmd2 = New OleDbCommand(query2, conn4)

            startDay = DateTime.Parse(fromDate)
            endDay = DateTime.Parse(toDate)

            If reader.HasRows Then

                While reader.Read
                    Do While startDay <= endDay
                        With cmd2
                            .Parameters.Clear()
                            .Parameters.AddWithValue("@ID", reader.Item(0))
                            .Parameters.AddWithValue("@DATE", DateTime.Parse(startDay).ToString("MM/dd/yyyy"))

                            If DateTime.Parse(startDay).ToString("MM/dd/yyyy") = DateTime.Parse(reader.Item(1)).ToString("MM/dd/yyyy") Then

                                If Not IsDBNull(reader.Item(2)) Then
                                    .Parameters.AddWithValue("@AM", DateTime.Parse(reader.Item(2)).ToString("HH:mm tt"))
                                Else
                                    .Parameters.AddWithValue("@AM", DBNull.Value)
                                End If

                                If Not IsDBNull(reader.Item(3)) Then
                                    .Parameters.AddWithValue("@LOUT", DateTime.Parse(reader.Item(3)).ToString("HH:mm tt"))
                                Else
                                    .Parameters.AddWithValue("@LOUT", DBNull.Value)
                                End If

                                If Not IsDBNull(reader.Item(4)) Then
                                    .Parameters.AddWithValue("@LIN", DateTime.Parse(reader.Item(4)).ToString("HH:mm tt"))
                                Else
                                    .Parameters.AddWithValue("@LIN", DBNull.Value)
                                End If

                                If Not IsDBNull(reader.Item(5)) Then
                                    .Parameters.AddWithValue("@PM", DateTime.Parse(reader.Item(5)).ToString("HH:mm tt"))
                                Else
                                    .Parameters.AddWithValue("@PM", DBNull.Value)
                                End If

                            Else
                                .Parameters.AddWithValue("@AM", DBNull.Value)
                                .Parameters.AddWithValue("@LOUT", DBNull.Value)
                                .Parameters.AddWithValue("@LIN", DBNull.Value)
                                .Parameters.AddWithValue("@PM", DBNull.Value)
                            End If

                            .ExecuteNonQuery()
                        End With

                        startDay = startDay.AddDays(1)
                    Loop
                End While

            Else
                Do While startDay <= endDay
                    With cmd2
                        .Parameters.Clear()
                        .Parameters.AddWithValue("@ID", Integer.Parse(id))
                        .Parameters.AddWithValue("@DATE", DateTime.Parse(startDay).ToString("MM/dd/yyyy"))
                        .Parameters.AddWithValue("@AM", DBNull.Value)
                        .Parameters.AddWithValue("@LOUT", DBNull.Value)
                        .Parameters.AddWithValue("@LIN", DBNull.Value)
                        .Parameters.AddWithValue("@PM", DBNull.Value)
                        .ExecuteNonQuery()
                    End With

                    startDay = startDay.AddDays(1)
                Loop
            End If

            conn1.Close()
            conn4.Close()
            reader.Close()
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

        Form2.Show()

    End Sub


Что я уже пробовал:

Я уже проверил запрос в ms access, и он действительно вернул все данные пользователей между датами, так что ошибка находится внутри моего vb-кода. Пожалуйста помочь....

phil.o

DateTime.Parse(fromDate)
Почему ты пытаешься разобрать в DateTime цените то, что уже является правильным DateTime ценность? Я даже удивлен, что этот код компилируется, потому что Parse метод принимает String значение, не DateTime ценность.
Parse методы предназначены для тех случаев, когда у вас есть String представление значения, из которого вы хотите получить правильное значение обратно.
Совет: вам не нужно ничего преобразовывать в строку, пока вы не захотите представить это значение конечному пользователю. Всегда работайте с правильными типами в первую очередь, и избегайте делать ставки назад и вперед от значения к строке. Например, чтобы сравнить две даты, сравните DateTime значения непосредственно, не сравнивайте их string представления.

И для вашего вопроса: поставьте точку останова в начале вашего метода, нажмите клавишу F5 и отладьте оттуда. Вам нужна помощь в использовании отладчика?

Richard Deeming

Он компилируется, потому что это VB.NET с помощью Option Strict Off - этот - просто компилируй, черт возьми!" флаг. :)

2 Ответов

Рейтинг:
9

RaydenFox

В течение почти одной недели отладки и настройки каждого цикла я, наконец, решил эту проблему. Вот мое решение:

cmd3 = New OleDbCommand(query, conn1)
            cmd3.Parameters.Clear()
            cmd3.Parameters.AddWithValue("@ID", id)
            
            Dim reader As OleDbDataReader = cmd.ExecuteReader
            schemaTable = New DataTable
            Dim adapter As New OleDbDataAdapter(cmd3)
            Dim i As Integer

            adapter.Fill(schemaTable)

            conn4.Open()
            query2 = "INSERT INTO LOGDATES(ID,CHECKDATE,AMIN,LUNCHOUT,LUNCHIN,PMOUT) " _
            & "VALUES(@ID,@DATE,@AM,@LOUT,@LIN,@PM)"
            cmd2 = New OleDbCommand(query2, conn4)

            startDay = DateTime.Parse(fromDate)
            endDay = DateTime.Parse(toDate)

            If reader.HasRows Then

                While reader.Read
                    i = 0
                    Do While startDay <= endDay
                        If i <= schemaTable.Rows.Count - 1 Then
                            With cmd2
                                .Parameters.Clear()
                                .Parameters.AddWithValue("@ID", reader.Item(0))

                                'MsgBox(DateTime.Parse(schemaTable.Rows(i)(1)).Date)

                                If DateTime.Parse(startDay).Date = DateTime.Parse(schemaTable.Rows(i)(1)).Date Then

                                    .Parameters.AddWithValue("@DATE", DateTime.Parse(schemaTable.Rows(i)(1)).Date)

                                    If Not IsDBNull(schemaTable.Rows(i)(2)) Then
                                        .Parameters.AddWithValue("@AM", DateTime.Parse(schemaTable.Rows(i)(2)).ToString("HH:mm tt"))
                                    Else
                                        .Parameters.AddWithValue("@AM", DBNull.Value)
                                    End If

                                    If Not IsDBNull(schemaTable.Rows(i)(3)) Then
                                        .Parameters.AddWithValue("@LOUT", DateTime.Parse(schemaTable.Rows(i)(3)).ToString("HH:mm tt"))
                                    Else
                                        .Parameters.AddWithValue("@LOUT", DBNull.Value)
                                    End If

                                    If Not IsDBNull(schemaTable.Rows(i)(4)) Then
                                        .Parameters.AddWithValue("@LIN", DateTime.Parse(schemaTable.Rows(i)(4)).ToString("HH:mm tt"))
                                    Else
                                        .Parameters.AddWithValue("@LIN", DBNull.Value)
                                    End If

                                    If Not IsDBNull(schemaTable.Rows(i)(5)) Then
                                        .Parameters.AddWithValue("@PM", DateTime.Parse(schemaTable.Rows(i)(5)).ToString("HH:mm tt"))
                                    Else
                                        .Parameters.AddWithValue("@PM", DBNull.Value)
                                    End If
                                    i = i + 1
                                Else
                                    .Parameters.AddWithValue("@DATE", DateTime.Parse(startDay).ToString("MM/dd/yyyy"))
                                    .Parameters.AddWithValue("@AM", DBNull.Value)
                                    .Parameters.AddWithValue("@LOUT", DBNull.Value)
                                    .Parameters.AddWithValue("@LIN", DBNull.Value)
                                    .Parameters.AddWithValue("@PM", DBNull.Value)
                                End If
                                .ExecuteNonQuery()
                            End With
                        End If
                        'i = i + 1
                        startDay = startDay.AddDays(1)
                    Loop
                End While


Я добавил еще одно соединение, заполнил им datatable и замкнул цикл внутри цикла date, просто используя оператор IF. Теперь он печатает все посещаемость пользователей вместе с датами, которые он/она отсутствовал.


Patrice T

Вы должны принять свое решение, это даст понять, что вопрос решен.

Рейтинг:
2

OriginalGriff

Без доступа к вашей БД и вашему коду, пока он работает, мы не можем сказать вам, что делать.
Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Если вы не знаете, как его использовать, то быстрый Google для "Visual Studio debugger" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


RaydenFox

Я выделяю код и запускаю его несколько раз. Проблема, которую я вижу, заключалась в том, что данные перестали увеличивать значения и просто перебирали даты. Может ли кто-нибудь помочь мне изменить код так, чтобы он также проходил через данные.

В то время как читатель.Читать
Делать тогда, когда параметр &ЛТ;= дату endday
Если Дата-Время.Разбора(когда параметр).ToString("MM/dd/yyyy") = Дата-Время.Разбор(читатель.Пункт(1)).ToString("ММ/ДД/гггг") Затем
MsgBox(читатель.Item(0) & "" & DateTime.Разбор(читатель.Пункт(1)).Метод toString("ММ/ДД/гггг") &ампер; "" &ампер; "равные")
Еще
MsgBox(читатель.Пункт(0) & "" & "не равен")
Конец, Если

когда параметр = когда параметр.AddDays(1)
Петля