Mina Yame Ответов: 1

Vb.net если цикл while является лучшим способом, чтобы проверить значения в каждой строке?


У меня была эта проблема прошлой ночью. Мне нужно прочитать каждую строку
Найти "А"
Если первая строка имеет значение True, то отображение
Если вторая строка имеет то же значение что и первая она будет проигнорирована и перейдет к следующей строке
и так далее ...
Далее идет
Найти "Б"
Если следующая строка не равна в текущей строке, то true и обработайте сначала значение(с переменной), а затем проверьте, совпадает ли следующая строка со следующей строкой
Если нет повторного отображения значения, то будет отображаться последнее обнаруженное значение "B"

Это примерная таблица, которая у меня есть

TABLE 

ID  Time                    Status      
42  2018-05-04 08:00:00     A
42  2018-05-04 09:00:00     A
42  2018-05-04 11:00:00     B
42  2018-05-04 13:00:00     A
42  2018-05-04 15:00:00     B
42  2018-05-04 18:00:00     B


Выход-фильтр со временем и статусом с датой

OUTPUT

ID  Time                    Status
12  2018-05-04 08:00:00     A
12  2018-05-04 11:00:00     B
12  2018-05-04 13:00:00     A
12  2018-05-04 18:00:00     B


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

Dim cmd As New SqlCommand("SELECT Name, Date, Time, Status From Table")
Dim ad As New SqlDataAdapter(cmd)
Dim dr As SqlClient.SqlDataReader = cmd.ExecuteReader()
Dim dt As New DataTable
For Each row As DataRow In dt.Rows
	For Each Item In dt.Rows
		Dim value = row.ToString("Status")
		If value = "A" Then
		'If true
		Dim dtr1 As DataRow
		dtr1 = dtt.NewRow()
		dtt.Rows.Add(row)

			If Item.Count > 1 Then
			'If another value is same as "A"
			'Nothing/Ignore
			ElseIf row(i).Item("Mode").ToString = "B" Then

			'If the value is "B"

				 If row(i).Item > 1 Then
				'But need to scan if theres another "B" 



					If row(i).Item > 1 Then
'Still Add the value even its "A" or "B" in the same date and foreign key
					 row = dtt.NewRow()
					dtt.Rows.Add(row)

					 Else
					'If theres no another "B"
					 row = dtt.NewRow()
					 dtt.Rows.Add(row)

					End If

				 Else

				'If theres no another "B" detected 

				 row = dtt.NewRow()
				dtt.Rows.Add(row)
					If row(i).Item > 1 Then


'Still Add the value even its "A" or "B" in the same date and foreign key

					row = dtt.NewRow()
					 dtt.Rows.Add(row)

					End If
				End If
			End If

		End If
	Next
Next


Это не делает никакого отображения :( я могу вам, пожалуйста, сказать мне, что не так с моим кодом
Спасибо Вам заранее за помощь.
Извините за мой плохой английский

1 Ответов

Рейтинг:
1

CHill60

Ну, есть "нет дисплея", потому что нет кода для отображения результатов. Я предполагаю, что вы имеете это в виду dtt быть пустой. Вам нужно отладить свою программу, чтобы понять, что происходит.

Когда вы отлаживаете свою программу (см. Освоение отладки в Visual Studio 2010 - руководство для начинающих[^] ) каково значение вашей переменной Value? Я думаю, что эта линия должна быть

Dim value As String = row("Status").ToString()
Ваше описание проблемы не соответствует вашим ожидаемым результатам.
Цитата:
Найти "А"
...
Далее идет
Найти "Б"
Это сделало бы ваши ожидаемые результаты
ID  Time                    Status      
42  2018-05-04 08:00:00     A
42  2018-05-04 11:00:00     B
Или интерпретируя другие части вашего описания результаты будут следующими
ID  Time                    Status      
42  2018-05-04 08:00:00     A
42  2018-05-04 11:00:00     B
42  2018-05-04 13:00:00     A
42  2018-05-04 15:00:00     B
Это также сбивает с толку, когда вы говорите "повторное значение" - повторное значение какого столбца? Я буду считать, что последний набор результатов верен...

Вы действительно хотите пересечь datatable r * r раз, где r-это количество строк?
For Each row As DataRow In dt.Rows
	For Each Item In dt.Rows

Вместо того чтобы "искать" A, а затем B, было бы лучше захватить статус первой записи ("A") и сравнить следующую с захваченным значением.например (NB этот код непроверен, и я нигде не нахожусь рядом с VS, поэтому он может не компилироваться, но достаточно показать результат)
Dim currStatus as String = ""

For Each row As DataRow In dt.Rows

	captureRow = row

	Dim value As String = row("Status").ToString()
	if value <> currStatus
		dtt.Rows.Add captureRow
		currStatus = value
	end if

next
Который работает как
First loop : 
	capture row = [42  2018-05-04 08:00:00     A]
	A <> "" so insert captured row 
	set currStatus = "A"

2nd loop :
	capture row = [42  2018-05-04 09:00:00     A]
	A = A so ignore captured row
	currStatus is still "A"
	
3rd loop :
	capture row = [42  2018-05-04 11:00:00     B]
	B <> A so insert captured row
	set currStatus = "B"
	
4th loop :
	capture row = [42  2018-05-04 13:00:00     A]
	A <> B so insert captured row
	set currStatus = "A"
	
5th loop :
	capture row = [42  2018-05-04 15:00:00     B]
	B <> A so insert captured row
	set currStatus = "B"
	
6th loop :
	capture row = [42  2018-05-04 18:00:00     B]
	B = B so ignore captured row
	currstatus is still "B"