Обновление с учетом этого набора данных: я вижу, куда вы идете с этим. Обратите внимание, что в НЕКОТОРЫХ случаях нет строки перед заданной, поэтому она возвращает только 2, а не 3. Здесь я обновил версию CTE. Снимите комментарий с ДРУГОЙ строки, чтобы увидеть 3, а не 2, так как перед выбранной строкой стоит один с этим Itemid.
Добавлена переменная, демонстрирующая, как это лучше, позволяя вам получить 1 до и после или 2 до / после, если вы измените это число (т.е. передаете параметр) - и если меньше строк, или ни один не до или после того, как он получает столько, сколько может в рамках этого ограничения.
Настройка данных для всех версий:
Declare @OderDetail table
(
Id int primary key,
OrderId int,
ItemId int,
OrderDate DateTime2,
Lookup varchar(15)
)
INSERT INTO @OderDetail
VALUES
(1, 10, 1, '2018-06-11', 'A'),
(2, 10, 2, '2018-06-11', 'BE'), --this
(3, 2, 1, '2018-06-04', 'DR'),
(4, 2, 2, '2018-06-04', 'D'), --this
(5, 3, 2, '2018-06-14', 'DD'), --this
(9, 4, 2, '2018-06-14', 'DD'),
(6, 4, 2, '2018-06-14', 'R'),
--(10, 10, 2, '2018-06-02', 'BE'), -- un-comment to see one before
(23, 4, 2, '2018-06-14', 'R');
DECLARE
@ItemId int = 2,
@orderid int = 2;
Обновленная версия CTE:
DECLARE @rowsBeforeAndAfter INT = 1;
;WITH cte AS (
SELECT
Id,
OrderId,
ItemId,
OrderDate,
[Lookup],
ROW_NUMBER() OVER (ORDER BY OrderDate,Id) AS RowNumber
FROM @OderDetail
WHERE
ItemId = @itemId -- all matches of this
),
myrow AS (
SELECT TOP 1
Id,
OrderId,
ItemId,
OrderDate,
[Lookup],
RowNumber
FROM cte
WHERE
ItemId = @itemId
AND OrderId = @orderid
)
SELECT
cte.Id,
cte.OrderId,
cte.ItemId,
cte.OrderDate,
cte.[Lookup],
cte.RowNumber
FROM ctE
INNER JOIN myrow
ON ABS(cte.RowNumber - myrow.RowNumber) <= @rowsBeforeAndAfter
ORDER BY OrderDate, OrderId;
Возможно, вы хотите использовать метод CTE ( См. Оригинал в конце этого [ 1114]) однако:
Просто чтобы указать, это дает правильные результаты, но, вероятно, это не то, к чему вы стремитесь, так как это зависит от порядка строк и идентификатора элемента не фактической строки с этими двумя значениями :
SELECT TOP 3
a.Id,
a.OrderId,
a.ItemId,
a.Lookup
FROM @OderDetail AS a
WHERE
a.ItemId = @ItemId
Чтобы исправить это, вы можете использовать ORDER BY
и TOP 1
с некрасивым UNION
. (ОБНОВЛЕНО с сортировкой по дате и! = По идентификатору.)
SELECT
u.Id,
u.OrderId,
u.OrderDate,
u.ItemId,
u.Lookup
FROM (
SELECT
a.Id,
a.OrderId,
a.OrderDate,
a.ItemId,
a.Lookup
FROM @OderDetail AS a
WHERE
a.ItemId = @ItemId
AND a.OrderId = @orderid
UNION
SELECT top 1
b.Id,
b.OrderId,
b.OrderDate,
b.ItemId,
b.Lookup
FROM @OderDetail AS b
WHERE
b.ItemId = @ItemId
AND b.OrderId != @orderid
ORDER BY b.OrderDate desc, b.OrderId
UNION
SELECT top 1
b.Id,
b.OrderId,
b.OrderDate,
b.ItemId,
b.Lookup
FROM @OderDetail AS b
WHERE
b.ItemId = @ItemId
AND b.OrderId != @orderid
ORDER BY b.OrderDate asc, b.OrderId
) AS u
ORDER BY u.OrderDate asc, u.OrderId
Возможно, что-то вроде этого:
If DataGridView1.RowCount > 0 Then
Dim MyDesiredIndex As Integer = 0
If DataGridView1.CurrentRow.Index < DataGridView1.RowCount - 1 Then
MyDesiredIndex = DataGridView1.CurrentRow.Index + 1
End If
DataGridView1.ClearSelection()
DataGridView1.CurrentCell = DataGridView1.Rows(MyDesiredIndex).Cells(0)
DataGridView1.Rows(MyDesiredIndex).Selected = True
End If
Примечание 1: , возможно, эти две строки не необходимы. Я havenВґt доказал его
DataGridView1.ClearSelection()
DataGridView1.CurrentCell = DataGridView1.Rows(MyDesiredIndex).Cells(0)
Примечание 2: примечание, что, если мы находимся в последней строке, оно переходит к первому
Необходимо установить свойство Selected конкретной строки на истинный. Я думаю, что VB был бы чем-то вроде этого:
someDGV.Rows(index).Selected = True
Вы могли сделать это этот путь:
If DataGridView1.CurrentRow.Index < DataGridView1.Rows.Count Then
DataGridView1.Rows(DataGridView1.CurrentRow.Index + 1).Selected = True
End If