Автор Тема: теоретический вопрос: следующая запись в произвольном рекордсете  (Прочитано 2792 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Xander

  • санитар леса
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1780
  • +0/-0
  • 2
    • Просмотр профиля
Допустим есть произвольный рекордсет - упорядочен по алфавиту и еще по двум независимым числовым столбцам. Есть уникальные ID, которые идут вразбивку. Задача: найти следующую строку после произвольной строки с известным ID.

Мне пока что пришел в голову только следующий вариант:
1. выбрать строку с известным ID и занести ключевые значения в локальные переменные
2. выбрать первую из множества строк, где все ключевые параметры больше, чем сохраненные в локальных переменных.

Что-то похоже я смог запустить в консоли MSSQL, но вот в скрипт я эти три команды перенести не могу, после объявления переменных они уже не видны в следующей команде:

Comm.CommandText="DECLARE @typeID int, @makerID int,@obj nvarchar(40);"
   Comm.Execute
   Comm.CommandText="SELECT @typeID=TypeID, @makerID=MakerID,@obj=Object FROM tth_tblCoordinate WHERE ID=32;"
   Comm.Execute
   Set test = Server.CreateObject("ADODB.Recordset")
   GetRS.CursorType = 1
   GetRS.LockType = 3
   GetRS.Open "SELECT TOP 1 FROM tth_tblCoordinate WHERE TypeID>@typeID AND MakerID>@makerID AND Object>@obj", adoCon

-------------------
Microsoft OLE DB Provider for SQL Server ошибка \'80040e14\'

Must declare the variable \'@typeID\'.


Похоже придется делать хранимую процедуру, но делать это ради такого пустяка не хочется.

Гляньте пожалуйста, я не упустил простых и очевидных решений?
А то больно громоздко получается.
•••Jah\'d never let us down!•••

Оффлайн Макс

  • vir magni ingenii
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 3534
  • +0/-0
  • 2
    • Просмотр профиля
Xander
может я не так понял, что понимается под фразой:
Цитировать
Допустим есть произвольный рекордсет
У тебя уже есть экземпляр класса ADODB.RecordSet ? Если так, почему не пройтись по нему и не найти нужную запись. Рекордсет ведь упорядочен как надо. Находишь запись с указанным ID, тогда следующая  запись будет та, что тебе нужна.

ЗЫ
насчет твоего примера, а почему ты заносишь данные в локальные переменные MSSQL ? Разве нельзя занести в локальные переменные VB ? (я ASP не знаю, так что могу задавать глупые вопросы)
First learn computer science and all the theory. Next develop a programming style. Then forget all that and just hack. ( George Carrette )

Оффлайн Xander

  • санитар леса
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1780
  • +0/-0
  • 2
    • Просмотр профиля
Не хотел лишние данные гонять между скриптом и базой, так что о использовании рекордсета целиком и не подумал. Некрасиво как-то...

а с локальными переменными vb все можно гораздо проще сделать, чем так, как я сначала сказал. В два запроса правда.

Зря я сразу себя средствами SQL ограничил :)
•••Jah\'d never let us down!•••

Оффлайн Xander

  • санитар леса
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1780
  • +0/-0
  • 2
    • Просмотр профиля
Что-то странное у меня получается.

Мне, по сути, нужно из всех результатов, возвращаемых запросом
SELECT ID,MakerID,TypeID,Object FROM tth_tblCoordinate ORDER BY TypeID,MakerID,Object

выбрать ту строку ,которая находится непосредственно под какой-то строкой с известным ID.
Вот, допустим я за один запрос выбрал нужные значения в переменные TypeID, MakerID,Object.
Дальше такой запрос:

query="SELECT * FROM (tth_tblCoordinate) WHERE "
query = query & "(TypeID>" & TypeID & " AND MakerID> "& MakerID &") OR "
query = query & "(TypeID=" & TypeID & " AND MakerID="& MakerID &" AND Object>\'" & Object & "\') "
query = query & "ORDER BY TypeID,MakerID,Object"

Но он выдает не совсем то, что мне нужно. Упорядочивание уже по-другому идет, записи идут не в том порядке.

Ни у кого идей нету?

А то с пролистыванием полного рекордсета непосредственно в скрипте медленно получается.
•••Jah\'d never let us down!•••

Оффлайн Phoinix

  • RW
  • Ветеран
  • *****
  • Сообщений: 1097
  • +0/-0
  • 2
    • Просмотр профиля
    • http://phoinix.ucoz.ru
Xander
Я для таких вещей обычно использую зеркальный массив, т.е. при выборке данных из базы я присваиваю элементу массива ID значение номера строки.

@mass[ID] = (номер строки запроса);

Оффлайн Xander

  • санитар леса
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1780
  • +0/-0
  • 2
    • Просмотр профиля
Phoinix
не совсем понял, это делается непосредственно при выборке из базы, или уже в скрипте, обрабатывающем результат запроса?
•••Jah\'d never let us down!•••

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28