* Paginando o grid

A paginação do grid é feita em duas etapas. 

A primeira delas é na geração do JSON, em dados.prg

(1) Recebo do navegador a página para onde devo ir
(2) Verifico se tal página existe, se não existir retorno uma mensagem de erro
(3) Se existir carrego os dados da página

Nessa etapa farei apenas o dados.prg

Na próxima etapa faremos o javascript.

Vou assumir que o tamanho da página é 3 registros. Esse valor vai ficar fixo em dados.prg

Vamos por partes.

Para receber um valor get use AP_GetPairs, ele retorna um HASH com os valores enviados através do método GET do navegador

[code]
   LOCAL hGet := AP_GetPairs()
   LOCAL nPagina := VAL( hb_HGetDef( hGet , "pagina" , "1" )) // Se não informar a página recebe 1 (primeira página) 
[/code]

Agora é só adaptar a página enviada ao comando SQL. Criei duas tags: ":registroPorPagina" e ":offset" para poder substituir com StrTran.

":registroPorPagina" vou trocar pelo número de registro por página (fixei em 3)
":offset" é o ponto onde vou começar a contar (se a partir do primeiro, do décimo, etc)

Infelizmente o MS Access é muito fraco para paginar, mas o SQL Server, PostgreSQL, MySQL , etc
tem comandos bem simples. O caso do MS Access ficou tão chato que eu tive que recorrer a um comando que eu criei dias atrás para facilitar a exibição
do SQL.

Enfim, no MS Access ficou assim :
[code]
        SELECT TOP :registroPorPagina tb01.*
            FROM emp AS tb01
            LEFT JOIN (
                SELECT TOP :offset empno FROM emp ORDER BY empno ASC
            ) AS tb02
            ON tb01.empno = tb02.empno
        WHERE ISNULL(tb02.empno)
        ORDER BY tb01.empno ASC

[/code]

Se fosse MySQL/PostgreSQL, por exemplo, bastaria o seguinte :
[code]
"SELECT * FROM emp LIMIT :registroPorPagina OFFSET :offset
[/code]

Bem, agora é só realizar as substituições na Query
[code]
   cSQLReturn := StrTran( cSQL , ":registroPorPagina" , hb_ntos( nRegistroPorPagina ) )
   cSQLReturn := StrTran( cSQLReturn , ":offset" , hb_ntos( nRegistroPorPagina * ( nPagina  )  ) ) 
[/code]   

Já temos os dados da página atual, mas falta saber se existe a página seguinte e a anterior para habilitar os botões quando chegarmos no Javascript.
Criei duas variáveis lógicas (lNextPage e lPreviousPage) para retornar em formato JSON.

para saber se tem a próxima página o jeito é repetir a query com nPagina+1 (se o reccount do ADO voltar zero então não tem, e lNextPage é falso)
para saber se tem a página anterior é só verificar se nPagina-1 é <= 0 (se for então não tem página e lPreviousPage é falso)







