Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Didiron

[Resolvido] Problema com paginação

Recommended Posts

Boa tarde pessoal.

Tenho um script de paginação que está funcionando muito bem por sinal só que ele está com um pequeno problema, acredito eu de lógica.

Pois olha só:

 

imaginem que eu tenha 13 registros no banco de dados, e estou fazendo para que cada página seja exibido apenas 3 registros. Então ao certo ele deveria criar 5 páginas, ou seja 4 páginas com 3 registros cada e mais uma com apenas um registro. Só que meu sistema está exibindo apenas 4 páginas, ou seja exibe apenas 12 registros e o último ele simplesmente não exibe, ele só vai criar uma nova página quando o meu sistema tiver 15 registros, pois assim ficaria 5 páginas com três registros cada. Então ele só exibe todos os registros quando no banco de dados tiver o número de registros que possa ser divido no decorrer das páginas.

talvez tenha ficado um pouco confuso, mas dêem uma olhada no meu código:

 

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>


   <%
set cn = Server.CreateObject("Adodb.Connection")
cn.ConnectionString = ("Driver=MySQL ODBC 5.1 Driver;DataBase=funcionarios;Server=localhost;Uid=root;PassWord=130195;")
cn.open
'pega a pagina atual
pagina = request.ServerVariables("SCRIPT_NAME")

'numero de registros por pagina...
pageSize = 3

if(len(Request.QueryString("p")) = 0 )then
  paginaAtual = 1
else
  paginaAtual = CInt(Request.QueryString("p"))
end if

' conta o numero de registros...
sql = "SELECT COUNT(*) AS total FROM funcionarios"
set rs = cn.execute(sql)

'total de registros
recordCount = Cint(rs("total"))

'calculamos o numero de paginas...
If pageCount < 1 then
pageCount = 1
end if

pageCount = Clng(recordCount / pageSize)

rs.Close()


Flag1 = INT(paginaAtual / pagesize)

PI = INT(Flag1 * pagesize)

IF PI = 0 THEN
PI = 1
END IF
PF = PI + pagesize - 1

' selecionamos os registros...
sql = "SELECT * FROM funcionarios LIMIT " & (paginaAtual - 1) * pageSize & " , " & pageSize
set rs = cn.execute(sql)
          
do while not rs.eof
' aqui entra o q você quer exibir
  Response.Write rs("nome") &" - "& rs("cargo") & "<br>"
  rs.MoveNext()
loop

rs.Close()
set rs = nothing
cn.Close()
set cn = nothing

Response.Write ("<B><strong> Página " & paginaAtual & " de " & pagecount & " </strong></B><br>")
' cria os links de pagians...

if CInt(paginaAtual) > 1 then
Response.Write "<a href='"&pagina&"?p=" & paginaAtual - 1 &"'>Anterior</a> "
End IF

for i=1 to pageCount
  Response.Write("<a href='"&pagina&"?p=" & i & "'>" & i & "</a> ")
next
  

IF (CInt(paginaAtual) < pagecount) THEN
      Response.Write "<a href='"&pagina&"?p=" & paginaAtual + 1 & "'>Próxima</a> "
End if

%>


</body>
</html>

Se alguém conseguir me ajudar, eu agradeço.

Obs.: A parte de inserir code não está funcionando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema provavelmente está aqui:

Flag1 = INT(paginaAtual / pagesize)

Como o resultado de 13/3 é 4.3, ele arredonda para 4. No caso, você tem que somar + 1.

 

Sugiro não utilizar somente INT. Sempre verifique se o resultado é inteiro ou não. Caso não seja inteiro, utilize INT para arredondar e some mais 1.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então Hargon, tentei dessa forma mas não tive êxito:

 

 

 

if ((paginaAtual / pagesize) mod 2) = 0 then

Flag1 = (paginaAtual / pagesize)

 

else

Flag1 = int((paginaAtual / pagesize) + 1)

end if

Compartilhar este post


Link para o post
Compartilhar em outros sites

Altera aqui: pageCount = Clng(recordCount / pageSize)

 

pageCount = recordCount / pageSize

if (pageCount mod 2) = 0 then
pageCount = recordCount / pageSize

else
pageCount = cLng(recordCount / pageSize) + 1
end if

Obs. Dê uma olhada na forma de saber se é inteiro ou não, pq 7 é um número inteiro e não é multiplo de 2. Está errado isso.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então hargon, não consegui entender muito o que voce quis dizer, pois o mod retorna o resto de uma divisão e se o resto for 0 então é inteiro..

Fiz as alterações que você pediu e quando no bd tem 16 registros ele funcionou, ele criou uma sexta página para esse registro, mas se eu insiro mais um registro ele simplesmente exibe assim:

 

carlos - pescaador

felipe - lula

Página 6 de 5,66666666666667

Anterior 1 2 3 4 5

 

Se eu deixo 16 ele fica correto se eu inserir mais um registro ele fica da maneira que eu mostrei acima.

 

Meu código:

 

<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>


   <%
set cn = Server.CreateObject("Adodb.Connection")
cn.ConnectionString = ("Driver=MySQL ODBC 5.1 Driver;DataBase=funcionarios;Server=localhost;Uid=root;PassWord=130195;")
cn.open
'pega a pagina atual
pagina = request.ServerVariables("SCRIPT_NAME")

'numero de registros por pagina...
pageSize = 3

if(len(Request.QueryString("p")) = 0 )then
  paginaAtual = 1
else
  paginaAtual = CInt(Request.QueryString("p"))
end if

' conta o numero de registros...
sql = "SELECT COUNT(*) AS total FROM funcionarios"
set rs = cn.execute(sql)

'total de registros
recordCount = Cint(rs("total"))

'calculamos o numero de paginas...
If pageCount < 1 then
pageCount = 1
end if

pageCount = recordCount / pageSize

if (pageCount mod 2) = 0 then
pageCount = recordCount / pageSize

else
pageCount = cLng(recordCount / pageSize) + 1
end if

rs.Close()


if ((paginaAtual / pagesize)  mod 2) = 0 then
	Flag1 = (paginaAtual / pagesize) 

else
	Flag1 = int((paginaAtual / pagesize))+1 
end if


PI = INT(Flag1 * pagesize)

IF PI = 0 THEN
PI = 1
END IF
PF = PI + pagesize - 1

' selecionamos os registros...
sql = "SELECT * FROM funcionarios LIMIT " & (paginaAtual - 1) * pageSize & " , " & pageSize
set rs = cn.execute(sql)
          
do while not rs.eof
' aqui entra o q você quer exibir
  Response.Write rs("nome") &" - "& rs("cargo") & "<br>"
  rs.MoveNext()
loop

rs.Close()
set rs = nothing
cn.Close()
set cn = nothing

Response.Write ("<B><strong> Página " & paginaAtual & " de " & pagecount & " </strong></B><br>")
' cria os links de pagians...

if CInt(paginaAtual) > 1 then
Response.Write "<a href='"&pagina&"?p=" & paginaAtual - 1 &"'>Anterior</a> "
End IF

for i=1 to pageCount
  Response.Write("<a href='"&pagina&"?p=" & i & "'>" & i & "</a> ")
next
  

IF (CInt(paginaAtual) < pagecount) THEN
      Response.Write "<a href='"&pagina&"?p=" & paginaAtual + 1 & "'>Próxima</a> "
End if

%>


</body>
</html>

Compartilhar este post


Link para o post
Compartilhar em outros sites

existem alguns exemplos ótimo de páginação no fórum, e você pode comparar a lógica, olha este

 

code de PAGINAÇÃO que é muito bom simples e bem funcional.

 

 

 

 

 

<%
' Definindo o caminho do banco de dados
caminho = "bds/cadastro.mdb"

' Fazendo a conexão com o banco de dados (paginacao.mdb)
set objconn = Server.CreateObject("ADODB.Connection")
DSN = "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath(caminho)
objconn.Open DSN

' String SQL para consulta
SQL = "select * from cadastro order by cliente"

' Abrindo o registro
SET objRS = Server.CreateObject("ADODB.Recordset")
objRS.Open SQL,objconn,3

' Se não encontrar nada escreve a mensagem
' Senão lista os registros
If objRS.EOF Then
Response.Write("Nenhum registro foi encontrado")
Else
' Definindo o número de registros por página
objRS.PageSize = 10

' Recupera o valor da variável pagina
pagina = Request.QueryString("pagina")

' Se a variável pagina for vazio, indica que a página sera a primeira
' Senão a variável pagina recebe o valor da página corrente, definida acima
If pagina = "" Then
objRS.AbsolutePage = 1
pagina = 1
Else
objRS.AbsolutePage = pagina
End If
%>
<%
' Imprime o número de registros, o total de páginas e a página atual
Response.Write("<table><tr><td><FONT FACE=Verdana SIZE=1 COLOR=#000000><B>Foram encontrados" & objRS.RecordCount & " registros" & vbcrlf )
Response.Write("<br>Mostrando página <b>" & pagina & "</b> de <b>" & objRS.PageCount & "" & vbcrlf )
Response.Write("<br><FONT FACE=Verdana SIZE=1 COLOR=#000000><B>Busca Avançada <a href='#' onClick=javascript:window.open('../busca_avc.asp','','width=200,height=50,scrollbars=no, resizable=no,left=00,top=0');>aqui</a></B></FONT></td></tr></table>")
%>

<%
' Criando a barra de navegação
' Se a variável pagina for maior que 1 então imprime o botão Anterior com link
' Senão imprime sem link
If CInt(pagina) > 1 Then
Response.Write("<center><FONT FACE=Verdana SIZE=1 COLOR=#000000><B><a href='" & Request.ServerVariables("SCRIPT_NAME") & "?pagina=" & pagina-1 & "'>Anterior</a> ")
Else
Response.Write("<center><FONT FACE=Verdana SIZE=1 COLOR=#000000><B>Anterior")
End If

' Lista todas as páginas encontradas
if objRs.PageCount < 11 then
 For i = 1 To objRS.PageCount
   response.write("<a href='" & Request.ServerVariables("SCRIPT_NAME") & "?pagina=" & i & "'>" & i & "</a> ")
 Next
end if

if objRs.PageCount > 10 then
     inicio=pagina
     fim=pagina + 9
     tot = pagina + 9
     if tot > ObjRS.PageCount then
       inicio = pagina-((pagina+9)-ObjRs.PageCount)
       fim = inicio+9
     end if
     for i = inicio to fim
         response.write("<a href='" & Request.ServerVariables("SCRIPT_NAME") & "?pagina=" & i & "'>" & i & "</a> ")
     next
end if


' Se a variável pagina for menor que o total de páginas então imprime o botão Próxima com link
' Senão imprime sem link
If CInt(pagina) < objRS.PageCount Then
Response.Write("<a href='" & Request.ServerVariables("SCRIPT_NAME") & "?pagina=" & pagina+1 & "'>Próxima</a></B></FONT></center>")
Else
Response.Write("Próxima</B></FONT></center>")
End If
End If
%>




<%While Not objRS.EOF AND cont < objRS.PageSize%>
<tr bgcolor="#0099CC" bordercolor="0">
   <td height="7" width="110" align="left"><font size="1" face="Verdana"><b><%=objRS("cliente")%></b></font></td>
   <td height="7" width="110" align="center"><font size="1" face="Verdana"><b><%=objRS("fone")%></b></font></td>
   <td height="7" width="83" align="center"><font size="1" face="Verdana"><b><%=objRS("endereco")%></b></font></td>
   <td height="7" width="70" align="center"><font size="1" face="Verdana"><b><%=objRS("numero")%></b></font></td>
   <td height="7" width="107" align="center"><font size="1" face="Verdana"><b><%=objRS("bairro")%></b></font></td>
   <td height="7" width="55" align="center">
   <a href="../action_altera.asp?id=<%=objRS("id")%>" OnClick="return confirm('Deseja Realmente Alterar ?')">
   <img src="imagens/edit.gif" width="16" height="16" border="0" alt="Clic aqui para Alterar.">
   </a>  
 </td>
<%
cont = cont + 1
objRS.MoveNext
Wend
%>
</tr>
</table>
<%
' Fecha e destroi os objetos RS e conn
objRS.Close : objconn.Close
Set RS = Nothing : Set objconn = Nothing
%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Didiron, no caso sua lógica estaria correta se todas as páginas fossem múltiplos de 2. 7/3 não terá resto 0, concorda?

 

O correto, seria:

<%
pageCount = recordCount / pageSize

If (pageCount > cLng(pageCount)) Then
	pageCount = cLng(pageCount) + 1
End If

pageCount = cLng(pageCount)
%>

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.