Как поставить курсор?

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Как поставить курсор?

Сообщение avenger » 26 июл 2006, 15:06

Здравствуйте.

Как поставить курсор после TIBSQL.ExecQuery на последнюю запись?
А потом перемещать его вверх?

С уважением, Иван.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 26 июл 2006, 15:26

Никак. Этот компонент не буферизирует записи.

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 26 июл 2006, 15:48

CyberMax писал(а):Никак. Этот компонент не буферизирует записи.
Тогда можно как нибудь вывести 10 последних записей, отсортированных в обратном порядке?

Т.е.

Код: Выделить всё

SELECT FIRST 10
  U.USERID, U.FIO, U.ISVIP, M.*,
  RU.USERID AS REPLY_USERID, RU.FIO AS REPLY_FIO, RM.DATETIME AS REPLY_DATETIME, RM."MESSAGE" AS REPLY_MESSAGE
FROM MESSAGES M
  JOIN USERS U ON U.USERID = M.USERFK AND      M.MESSAGEID <= 5000 AND M.CHANNELFK = 14
  LEFT OUTER JOIN MESSAGES RM ON M.REPLYMID = RM.MESSAGEID
  LEFT OUTER JOIN USERS RU ON RU.USERID = RM.USERFK
ORDER BY M.DATETIME DESC
Если выполнить этот запрос, то сортировка будет не та, а записи те.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 26 июл 2006, 15:59

Варианты.

1. Пересортировать на клиенте. Выборка маленькая, нефиг делать. Кстати, ClientDataSet это чудненько умеет делать, если самому влом.

2. Впендюрить оный запрос в СП и тянуть из неё с нужным ордер бу.

3. Аналогично со вьюхой (наверное, я с ними не работаю)

4. Аналогично с select from select в FB2.

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 26 июл 2006, 16:04

А зачем тебе так извращаться-то? Загрузил бы записи в TIBDataSet да крутил бы их так, как тебе хочется...
В любом случае, Merlin уже огласил возможные варианты решения.

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 26 июл 2006, 16:06

Merlin писал(а):Варианты.
А так изврат?

Код: Выделить всё

SELECT
    U.USERID,
    U.FIO,
    U.ISVIP,
    M.*,
    RU.USERID AS REPLY_USERID,
    RU.FIO AS REPLY_FIO,
    RM.DATETIME AS REPLY_DATETIME,
    RM."MESSAGE" AS REPLY_MESSAGE
FROM
    MESSAGES M
    JOIN USERS U ON U.USERID = M.USERFK
        AND M.CHANNELFK = 14
        AND M.MESSAGEID <= 5000
        AND  /* Вот ЭТО */
        M.MESSAGEID >= (
            SELECT FIRST 1 SKIP 10
                M.MESSAGEID
            FROM
                MESSAGES M
            WHERE
                M.MESSAGEID <= 5000 AND M.CHANNELFK = 14
            ORDER BY M.DATETIME DESC
            )
    /* end Вот ЭТО */
    LEFT OUTER JOIN MESSAGES RM ON M.REPLYMID = RM.MESSAGEID
    LEFT OUTER JOIN USERS RU ON RU.USERID = RM.USERFK
ORDER BY
    M.DATETIME
[Модератор: немного отформатировал запрос, чтобы легче читался]
Последний раз редактировалось avenger 26 июл 2006, 16:10, всего редактировалось 2 раза.

avenger
Сообщения: 141
Зарегистрирован: 25 окт 2005, 11:53

Сообщение avenger » 26 июл 2006, 16:09

CyberMax писал(а):Загрузил бы записи в TIBDataSet да крутил бы их так, как тебе хочется...
Да компонент этот уж очень "громоздкий"... Select выполняется 1-н раз, вот и хочется как проще. Хочется IBSQL обойтись...

Ответить