BeginnerCoderPete Ответов: 1

Как отсортировать время входа/выхода часов из SQL-сервера в datagridview


У меня есть таблица в SQL, которая содержит время часов, собранное из одной точки входа часов. Времена появляются в таблице примерно так:

pkClockingTime dtDateTime               fkEmployee
1              2017-02-06, 07:59:00.000 49
2              2017-02-06, 08:00:00.000 50
3              2017-02-06, 12:00:00.000 49
32             2017-02-06, 12:01:00.000 50
33             2017-02-06, 13:00:00.000 50
34             2017-02-06, 13:04:00.000 49
35             2017-02-06, 17:30:00.000 50
36             2017-02-06, 17:32:00.000 49


и так далее; это просто пример того, как два человека показывают часы в обычный день: часы входят в 8, часы выходят на обед в 12, часы возвращаются в 1, а затем идут домой в 5:30.

Если кто-нибудь может помочь или дать какой-нибудь совет, это было бы потрясающе!

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

На данный момент у меня есть он, отображающий время в порядке сотрудника и даты, создавая DataTable из TableAdapter и прикрепляя его к BindingSource, который привязан к DataGridView, но у него есть 2 строки на сотрудника в DataGridView, по одной для каждого Clock In/Out, где, как я хотел бы, все 4 раза на одной строке.

Я надеялся, что его можно изменить, чтобы вывести все 4 раза от сотрудника в одну и ту же дату на 1 строку

Код, который у меня есть до сих пор для создания DataTable, который выводит 2 строки на сотрудника, выглядит следующим образом:

Private Function FormatedClockingTimes() As DataTable
    Dim dtResults As New DataTable
    dtResults.Columns.Add("EmployeeID", GetType(Integer))
    dtResults.Columns.Add("Date", GetType(Date))
    dtResults.Columns.Add("ClockIn", GetType(DateTime))
    dtResults.Columns.Add("ClockOut", GetType(DateTime))

    Dim intLastEmployee As Integer = 0
    Dim intClockCounter As Integer = 0
    Dim drLastRow As DataRow
    Dim dtCurrentDate As Date
    Dim dtPreviousDate As Date

    For Each drSourceRow As DataRow In TblAttendanceTimesTableAdapter.GetData() 'Get the raw clocking times and loop through each row
        'increment the counter by 1
        intClockCounter += 1
        'Store the date from the row as CurrentDate
        dtCurrentDate = drSourceRow("dtDateTime").ToString
        'If previous date has not been set yet (its the first loop), then set the PreviousDate as the current date
        If (dtPreviousDate = Nothing) Then
            dtPreviousDate = dtCurrentDate
        End If
        'Check that the employee from this row is equal to the employee from previous row, unless the employee from last row is 0 (its the firs row in the loop)
        'Also, check the date from this row is equal to the date from previous row, as the PreviousDate was set on the first lopp to match curerent date, the first row of the loop will always onsert a new row in to the results table
        If ((drSourceRow("fkEmployee").ToString() = intLastEmployee Or intLastEmployee = 0) And dtCurrentDate.ToShortDateString = dtPreviousDate.ToShortDateString) Then
            If (intClockCounter = 1) Then 'If the counter is still 1, the add a new record.
                'Insert new row into the results table based on the current row in the loop of the raw clocking data
                dtResults.Rows.Add(drSourceRow("fkEmployee").ToString(), dtCurrentDate, drSourceRow("dtDateTime").ToString(), Nothing) 'Nothing is added last as it is the clock out time, which wont be set as this part of the loop always sets the clock in data
            Else
                'Update last row (newly inserted row in the results table) as clock out time
                drLastRow = dtResults.Rows(dtResults.Rows.Count - 1) 'this gets the last row index
                drLastRow("ClockOut") = drSourceRow("dtDateTime").ToString() 'now update the ClockOut on the last results row with the current row in the loop for the raw data 
                intClockCounter = 0 ' now that the clock out time has been set, we need to make the next loop insert a new row into the results data table again for the next clock in row, so we set the counter to 0
            End If
        Else
            'if the previous employee or date did not match, then assume its a clock in again for either a new employee or a new date
            dtResults.Rows.Add(drSourceRow("fkEmployee").ToString(), dtCurrentDate.ToShortDateString, drSourceRow("dtDateTime").ToString(), Nothing)
            'set the counter to 1 so that the next loop will update and not insert
            intClockCounter = 1
        End If
        'store the  employee from the current raw data row as last employee so that on the next lopp it can check last employee against its current employee
        intLastEmployee = drSourceRow("fkEmployee").ToString()
        'do same for date
        dtPreviousDate = dtCurrentDate
    Next
    'return the results data table to the function
    Return dtResults

1 Ответов

Рейтинг:
1

Graeme_Grant

Поскольку вы получаете свои данные из БД с помощью SQL, ключевое слово SQL ORDER BY сделает свое дело. Вот информация с сайта: SQL ORDER BY Keyword[^]