Как отсортировать время входа/выхода часов из 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