RaydenFox Ответов: 3

Добавление данных в существующую строку в datatable


Я пытаюсь объединить 4 различных оператора select из одной таблицы в один datatable с помощью visual studio 2008, но я могу добавить их только как новую строку. Это код, который я делаю:

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

Я уже пробовал datatable.merge, и он все еще добавляется как новая строка. Пожалуйста, помогите!!

Try
           conn1.Open()
           query1 = "SELECT USERID, CHECKDATE,MIN(CHECKTIME) AS [AM IN] FROM CHECKINOUT WHERE " _
           & "USERID = 562 AND CHECKTYPE = 'Check In' GROUP BY USERID,CHECKDATE"
           query2 = "SELECT MIN(CHECKTIME) AS [LUNCH OUT] FROM CHECKINOUT WHERE USERID = 562 " _
           & "AND CHECKTYPE = 'Break Out' GROUP BY USERID,CHECKDATE"
           query3 = "SELECT MAX(CHECKTIME) AS [LUNCH IN] FROM CHECKINOUT WHERE USERID = 562 " _
           & "AND CHECKTYPE = 'Break In' GROUP BY USERID, CHECKDATE"
           query4 = "SELECT MAX(CHECKTIME) AS [CHECK OUT] FROM CHECKINOUT WHERE USERID = 562 " _
           & "AND CHECKTYPE = 'Check Out' GROUP BY USERID, CHECKDATE"

           mainTable.Columns.Add("ID")
           mainTable.Columns.Add("DATE")
           mainTable.Columns.Add("CHECK IN")
           mainTable.Columns.Add("LUNCH OUT")
           mainTable.Columns.Add("LUNCH IN")
           mainTable.Columns.Add("CHECK OUT")

           cmd = New OleDbCommand(query1, conn1)
           Dim reader As OleDbDataReader
           reader = cmd.ExecuteReader

           While reader.Read
               Dim irow As DataRow = mainTable.NewRow
               irow("ID") = reader.Item(0)
               irow("DATE") = DateTime.Parse(reader.Item(1)).ToString("MM/dd/yyyy")
               irow("CHECK IN") = DateTime.Parse(reader.Item(2)).ToString("HH:mm tt")
               mainTable.Rows.Add(irow)
           End While

           reader.Close()
           cmd.Dispose()

           cmd2 = New OleDbCommand(query2, conn1)
           Dim reader2 As OleDbDataReader
           reader2 = cmd2.ExecuteReader

           While reader2.Read
               Dim irow As DataRow = mainTable.NewRow
               irow("LUNCH OUT") = DateTime.Parse(reader2.Item(0)).ToString("HH:mm tt")
               mainTable.Rows.Add(irow)
           End While

           conn1.Close()

       Catch ex As Exception
           MsgBox(ex.Message)
       End Try
       Return mainTable

3 Ответов

Рейтинг:
23

Maciej Los

Если вы хотите выполнить 4 запроса, вы должны сделать это в цикле. Но(!)... я бы предложил изменить набор запросов на один. Это было бы что-то вроде этого:

SELECT DISTINCT USERID, CHECKDATE, 
    [CheckIn] = MIN(CASE WHEN CHECKTYPE = 'Check In' THEN CHECKTIME ELSE NULL END),
    [LunchIN] = MIN(CASE WHEN CHECKTYPE = 'Lunch In' THEN CHECKTIME ELSE NULL END),
    [LunchOut] = MAX(CASE WHEN CHECKTYPE = 'Lunch Out' THEN CHECKTIME ELSE NULL END),
    [CheckOut] = MAX(CASE WHEN CHECKTYPE = 'Check Out' THEN CHECKTIME ELSE NULL END)
FROM CHECKINOUT
WHERE WHERE USERID = 562
GROUP BY USERID, CHECKDATE


Другой способ заключается в использовании СТЕРЖЕНЬ[^].


RaydenFox

Я попробовал ваш ответ, но у меня есть синтаксическая ошибка отсутствует оператор в [CheckIn] = MIN(случай, когда CHECKTYPE = 'Check In', а затем CHECKTIME ELSE NULL END)

RaydenFox

Спасибо за ваше предложение и изменил данный код на оператор IIF , и теперь он работает, единственная проблема, которая у меня есть прямо сейчас, - это когда нулевое значение передается переменной, которая будет отформатирована на сегодняшний день, она показывает "преобразование типа DBNull в строку не допускается"
кстати для будущих ссылок и может помочь другим это код который я сделал

ВЫБЕРИТЕ CHECKINOUT.ИДЕНТИФИКАТОР ПОЛЬЗОВАТЕЛЯ,CHECKINOUT.CHECKDATE,
МИН(ЕСЛИ(CHECKINOUT.Проверить CHECKTYPE='в',CHECKINOUT.CHECKTIME,NULL) ) И КАК 'Я',
МИН(ЕСЛИ(CHECKINOUT.Перерыв CHECKTYPE='выход',CHECKINOUT.CHECKTIME,NULL) ) И КАК 'ОБЕД',
MAX(IIF(CHECKINOUT.CHECKTYPE='Break In',CHECKINOUT.CHECKTIME,NULL) ) как 'обед в',
МАКС(ЕСЛИ(CHECKINOUT.Проверить CHECKTYPE='выход',CHECKINOUT.CHECKTIME,NULL) ) И КАК 'ПМ'С
ИЗ CHECKINOUT, ГДЕ CHECKINOUT.USERID = 563
ГРУППИРОВКА ПО CHECKINOUT.USERID, CHECKINOUT.CHECKDATE

Maciej Los

Всегда пожалуйста.

Рейтинг:
11

RaydenFox

Спасибо за ваше предложение и изменил данный код на оператор IIF , и теперь он работает, единственная проблема, которая у меня есть прямо сейчас, - это когда нулевое значение передается переменной, которая будет отформатирована на сегодняшний день, она показывает "преобразование типа DBNull в строку не допускается"
кстати для будущих ссылок и может помочь другим это код который я сделал

ВЫБЕРИТЕ CHECKINOUT.ИДЕНТИФИКАТОР ПОЛЬЗОВАТЕЛЯ,CHECKINOUT.CHECKDATE,
МИН(ЕСЛИ(CHECKINOUT.Проверить CHECKTYPE='в',CHECKINOUT.CHECKTIME,NULL) ) И КАК 'Я',
МИН(ЕСЛИ(CHECKINOUT.Перерыв CHECKTYPE='выход',CHECKINOUT.CHECKTIME,NULL) ) И КАК 'ОБЕД',
MAX(IIF(CHECKINOUT.CHECKTYPE='Break In',CHECKINOUT.CHECKTIME,NULL) ) как 'обед в',
МАКС(ЕСЛИ(CHECKINOUT.Проверить CHECKTYPE='выход',CHECKINOUT.CHECKTIME,NULL) ) И КАК 'ПМ'С
ИЗ CHECKINOUT, ГДЕ CHECKINOUT.USERID = 563
ГРУППИРОВКА ПО CHECKINOUT.USERID, CHECKINOUT.CHECKDATE


Рейтинг:
1

W∴ Balboos, GHB

Поскольку все ваши данные имеют общую ссылку, то есть userID, вы можете сделать серию соединений в таблице.

SELECT A.userID, A.checkDate, A.CheckIN, B.LunchIn, C.LunchOut, D.CheckOut
FROM A 
LEFT JOIN CHECKIN B ON A.userid = b.userID
LEFT JOIN CHECKIN C ON A.userid = c.userID
LEFT JOIN CHECKIN D ON A.userid = d.userID
Две ноты:
- Я предполагаю, что вы не можете выписаться, обедать, обедать вне дома, если вы сначала не зарегистрируетесь, так как вы не можете сделать ничего из этого, пока вы на самом деле не "доберетесь туда"
- Используя левое соединение, нулевые значения возвращаются автоматически там, где нет совпадения.


RaydenFox

Эти 4 запроса взяты из одной таблицы я только хочу получить разное время каждой даты используя MIN и MAX