PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 25 → Como paginar um retorno de um select ? Como fazer uma paginação de resultados?
Como paginar um retorno de um select ? Como fazer uma paginação de resultados?
Débuté par Boller, 14 aoû. 2023 18:50 - Aucune réponse
Membre enregistré
3 659 messages
Popularité : +175 (223 votes)
Posté le 14 août 2023 - 18:50
Oi pessoal,

Pergunta que me fizeram:

Como fazer uma paginação de resultados?

R.:

Simples, Vc nao coloca uma tabela com milhões de registro, usa paginação

Select *
from tabela
Limit nqtdeReg offset nqtdeRegpaginacao

Isso no Hfsql e no PostgreSQL rows


SELECT coluna1,
...
FROM tabela
WHERE ...
ORDER BY coluna1,
...
OFFSET @Offset ROWS
FETCH NEXT @Limit ROWS ONLY;


É inviável dar uma carga de milhões, bilhões de registros

Por isso que tem os botoes
<< < > >>


No seu caso você pode trocar a variável @Limit para @QtdPorPagina e @Offset para (@Pagina - 1) * @QtdPorPagina e utilizar da seguinte forma:

DECLARE @QtdPorPagina INT = 50,
@Pagina INT = 1;
Substituindo na sua query

DECLARE @QtdPorPagina INT = 50,
@Pagina INT = 1;

SELECT os.id,
os.dataHora,
material.nome AS nomeEquip,
cliente.nomeFantasia,
setor.nome AS NomeSetor,
os.motivoOs,
(SELECT SUM(itemMaterial.valorUnitario)
FROM os AS OS1
INNER JOIN itemMaterial ON itemMaterial.id = os.idItemMaterial
WHERE OS1.id = os.id ) AS TotalMaterial,
tipoOs.nome AS NomeTipoOS,
itemMaterial.nSerie,
itemMaterial.rm,
os.status
FROM os
INNER JOIN itemMaterial ON itemMaterial.id = os.idItemMaterial
INNER JOIN modelo ON modelo.id = itemMaterial.idModelo
INNER JOIN material ON material.id = itemMaterial.idMaterial
INNER JOIN cliente ON cliente.id = os.idCliente
INNER JOIN setor ON setor.id = os.idSetor
INNER JOIN usuario ON usuario.id = os.idUsuarioSolicitante
INNER JOIN tipoOs ON tipoOs.id = os.idTipoOs
WHERE cliente.id = (SELECT usuario.idCliente
FROM usuario
WHERE usuario.login = 'julio')
ORDER BY dataHora DESC
OFFSET (@Pagina - 1) * @QtdPorPagina ROWS
FETCH NEXT @QtdPorPagina ROWS ONLY;


Para SQL Server anterior ao 2012

Para obter um resultado parecido você pode utilizar a função ROW_NUMBER()para gerar o número da linha e trabalhar com essa informação da seguinte forma:

WITH resultado AS
(SELECT coluna1,
...,
ROW_NUMBER() OVER (ORDER BY coluna1, ...) AS linha
FROM tabela
WHERE ...)
SELECT *
FROM resultado
WHERE linha >= @Offset
AND linha < @Offset + @Limit


Veja também:

Para paginar é necessária uma ordenação (ORDER BY) dos registros para o seu caso:

SELECT * FROM table
ORDER BY 1 --Nome campo
OFFSET 10 ROWS FETCH NEXT 5 ROWS ONLY

Muita atenção

Ok

--
Adriano José Boller
______________________________________________
Consultor e Representante Oficial da
PcSoft no Brasil
+55 (41) 99949 1800
adrianoboller@gmail.com
skype: adrianoboller
http://wxinformatica.com.br/