Немного OT, но превращение входа включения - выключения с препроцессором является определенно субоптимальным в C++. Существуют хорошие инструменты входа как Apache log4cxx, которые являются открытым исходным кодом и не ограничивают, как Вы распределяете свое приложение. Они также позволяют Вам изменять регистрирующиеся уровни без перекомпиляции, иметь очень низко наверху, если Вы становитесь выходящими из системы, и даете Вам шанс повернуть выходить из системы полностью в производстве.
Если вы хотите применить пейджинг в MS Acces, используйте этот
SELECT *
FROM (
SELECT Top 5 sub.ClientCode
FROM (
SELECT TOP 15 tblClient.ClientCode
FROM tblClient
ORDER BY tblClient.ClientCode
) sub
ORDER BY sub.ClientCode DESC
) subOrdered
ORDER BY subOrdered.ClientCode
, где 15 - StartPos + PageSize , а 5 - Размер страницы .
ИЗМЕНИТЬ для комментария:
Вы получаете ошибку, потому что вы пытаетесь сослаться на имя столбца, назначенное на том же уровне запроса, а именно rownumber . Если вы измените свой запрос на:
SELECT *
FROM (
SELECT ClientCode,
(SELECT COUNT(c2.ClientCode)
FROM tblClient AS c2
WHERE c2.ClientCode <= c1.ClientCode) AS rownumber
FROM tblClient AS c1
)
WHERE rownumber BETWEEN 0 AND 15
, он не должен выдавать вам ошибки, но я не думаю, что это тот результат, который вам нужен.
См. ответ astander для исходного ответа, но вот моя окончательная реализация, которая учитывает некоторые правила парсера ODBC ( для первых 15 записей после пропуска 30):
SELECT *
FROM (
SELECT Top 15 -- = PageSize
*
FROM
(
SELECT TOP 45 -- = StartPos + PageSize
*
FROM tblClient
ORDER BY Client
) AS sub1
ORDER BY sub1.Client DESC
) AS clients
ORDER BY Client
Разница в том, что мне нужно, чтобы разбиение на страницы работало при сортировке по имени клиента, и мне нужны все столбцы (ну, на самом деле только подмножество, но я разбираюсь в этом в самый внешний запрос).