Foros del Web » Programando para Internet » PHP »

Paginar con PHP - SQL Server

Estas en el tema de Paginar con PHP - SQL Server en el foro de PHP en Foros del Web. Como modifico mi query SQL Server para poder paginar ya que los ejemplos de paginacion son com MySql y utilizan limit. $conex = odbc_connect("MISERVER", "sa", ...
  #1 (permalink)  
Antiguo 20/12/2002, 12:23
Avatar de Chuty  
Fecha de Ingreso: noviembre-2002
Ubicación: el bar de la esquina
Mensajes: 609
Antigüedad: 22 años
Puntos: 2
Paginar con PHP - SQL Server

Como modifico mi query SQL Server para poder paginar ya que los ejemplos de paginacion son com MySql y utilizan limit.

$conex = odbc_connect("MISERVER", "sa", "sa");
$consulta = "select COD_PAIS, COD_CORP, NUM_FIR, NOM_CLI, GRP_LEG
from tabla_db
where cod_corp='$entidad'
order by cod_pais ";
$resultado = odbc_do($conex, $consulta);
$Num_Campos = odbc_num_fields($resultado);
$Num_Filas = 0;
// Se recorre el cursor
while (odbc_fetch_row($resultado))
{
$Num_Filas++;
echo "<TR>";
for ($i = 1; $i <= $Num_Campos; $i++)
{
echo "<TD ><font face='Courier New' size='2'>";
if (odbc_result($resultado, $i))
echo odbc_result($resultado, $i);
echo "</TD>";
} //de los campos de una tupla: el for
echo "</TR>";echo "\n";
} // de todas las tuplas respuesta: el while

// ********* Si noy hay datos se indica *******************
if ($Num_Filas == 0)
{
echo "<TR><TD COLSPAN=9><CENTER>";
echo "<b>debe seleccionar una Entidad</b>";
echo "</CENTER></TD></TR>\n";
}
echo "</TABLE>\n";
echo "<BR><HR><BR>\n";

// ********* indica la cantidad de Filas y Campos *********
echo "<B>Número de filas: $Num_Filas<BR>\n";

echo "</CENTER>";

//Se liberan recursos y se cierra la conexión
odbc_free_result($resultado);
odbc_close($conex);

Bueno desde ya muchas gracias y felices fiestas

Última edición por Chuty; 03/06/2008 a las 10:51
  #2 (permalink)  
Antiguo 20/12/2002, 12:25
Avatar de urjose  
Fecha de Ingreso: diciembre-2001
Mensajes: 5.286
Antigüedad: 22 años, 10 meses
Puntos: 1
Mala noticia

Llevo buscando eso mismo desde hace meses y no he encontrado nada y nadie me ha sabido responder.

Creo que los foros PHPBB usan también SQL Server y tienen paginación, así que podrías bajarte el foro y ver como paginan.

Yo lo he querido hacer pero por cuestiones de tiempo no he podido.

Saludos
  #3 (permalink)  
Antiguo 20/12/2002, 12:48
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 23 años
Puntos: 69
No urjosé... phpBB utiliza unicamente mySQL por el momento, aunque tienen planeado acoplarle una clase de abtracción de Bases de datos en un futuro.

saludos.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
  #4 (permalink)  
Antiguo 20/12/2002, 12:55
Avatar de urjose  
Fecha de Ingreso: diciembre-2001
Mensajes: 5.286
Antigüedad: 22 años, 10 meses
Puntos: 1
Puf
pues salio peor.

LOL
Tons no hay solución.
  #5 (permalink)  
Antiguo 20/12/2002, 13:53
Nok
 
Fecha de Ingreso: abril-2001
Mensajes: 302
Antigüedad: 23 años, 7 meses
Puntos: 0
Un acercamiento?

Hola, aca les dejo un enlace a una posible solucion, es algo avanzada, y nose, si es aplicable a PHP pero por las dudas...


http://www.aspfaqs.com/webtech/062899-1.shtml

Saludos.
  #6 (permalink)  
Antiguo 21/12/2002, 14:14
Ex Colaborador
 
Fecha de Ingreso: junio-2002
Mensajes: 9.091
Antigüedad: 22 años, 5 meses
Puntos: 16
Hola,

Nunca he usado las funciones ODBC ni otras BD que no sean MySQL. Pero he visto que en el manual que odbc_fetch_row() acepta un segundo parametro que es el numero de registro que quieres leer. Entonces creo que se puede usar ese segundo parametro para solo leer los registros de un intervalo. Si lo probais comentad los resultados.

Espero haber sido de ayuda.
__________________
Josemi

Aprendiz de mucho, maestro de poco.
  #7 (permalink)  
Antiguo 21/12/2002, 21:01
Avatar de urjose  
Fecha de Ingreso: diciembre-2001
Mensajes: 5.286
Antigüedad: 22 años, 10 meses
Puntos: 1
Por cierto:

Cita:
Database Server Support
phpBB uses a database abstraction layer to enable seamless support of several database servers:
MySQL 3.2x,
PostgreSQL 7.x,
Microsoft SQL Server 7/2000
Microsoft Access (via ODBC)
...with more databases available in the future
Y ahora que me puse a pensar yo instale los foros PHPBB con SQL Server.

  #8 (permalink)  
Antiguo 26/12/2002, 14:40
Avatar de Chuty  
Fecha de Ingreso: noviembre-2002
Ubicación: el bar de la esquina
Mensajes: 609
Antigüedad: 22 años
Puntos: 2
parte de la solucion ayuda....

Bueno gracias por los datos aportados
pero estube probando algunas cosas y se que puede funcionar, por ejemplo mi codigo es

<?php

// Se establece la conexión con la fuente de datos
$conex = odbc_connect("MISERVER", "sa", "sa");
$consulta = "select COD_PAIS, COD_CORP, NUM_FIR, NOM_CLI, GRP_LEG
from mibase.tmp_cliente
where cod_corp='clientes'
order by cod_pais ";
$resultado = odbc_do($conex, $consulta);
$Num_Campos = odbc_num_fields($resultado);
$Num_Filas = 0;
// Se recorre el cursor
while (odbc_fetch_row($resultado))
{
$Num_Filas++;
echo "<TR>";
for ($i = 1; $i <= $Num_Campos; $i++)

echo "</TR>";echo "\n";
} // de todas las tuplas respuesta: el while

// ********* Si noy hay datos se indica *******************
if ($Num_Filas == 0)
{
echo "<TR><TD COLSPAN=9><CENTER>";
echo "No hay clientes";
echo "</CENTER></TD></TR>\n";
}
echo "</TABLE>\n";
echo "<BR><HR><BR>\n";

// ********* indica la cantidad de Filas y Campos *********
echo "<B>Número de filas: $Num_Filas<BR>\n"; // aca tengo el num de Filas

//Buscar 15 registros

$sql="select top 15 COD_PAIS, COD_CORP, NUM_FIR, NOM_CLI, GRP_LEG
from mibase.tmp_cliente
where cod_corp='clientes'
order by cod_pais ";

$resulta2 = odbc_do($conex, $sql);

ahora biene el problema

if ($row=odbc_fetch_array($resulta2)) // que funsion remplaza a mysql_fetch_array ...
{
echo "<TABLE BORDER='0'>";
DO
{
echo "<TR><TD> ".$row["documento"]."</TD> </TR>";
}
WHILE ($row=odbc_fetch_array($resulta2));
echo "</TABLE>";
}

//PAGINACIÓN
echo "<HR><TABLE BORDER='0' ALIGN='center' WIDTH='95%'><TR>";

//Muestra por pantalla el número total de artículos encontrados
echo "<TD ALIGN='left'> Encontrados $Num_Filas artículos </TD>";

echo"<TD ALIGN='RIGHT'>";
echo "<FONT FACE='Arial' SIZE='-1' COLOR='#336699'>Páginas: </FONT>";

//Mientras $i no sea igual o superior al total encontrado se incrementa de 15 en 15. $i representa el identificador en la Tabla del número de registro que se buscará en el siguiente Select.

//$a es el número de págians encontrado.

FOR ($i=0; $i< $quants; $i=$i+15)
{
$a=$a+1; //Incrementamos el número de página

//Si $n (número de registro donde empieza la busqueda actual actual) es igual a $i se marca en negrita para resaltar la página en la que estamos.
IF ($n==$i)
{
//Ponemos el link a la misma página peró con un número de registro cada vez diferente
echo "<A HREF='doc.php?num=".$i."'>[<B>".$a."< /B>] </A> ";
}
ELSE
{
echo "<A HREF='doc.php?num=".$i."'>' [".$a."] </A> ";
}
}
echo "</TD></TR></TABLE>";

//Se liberan recursos y se cierra la conexión
odbc_free_result($resultado);
odbc_free_result($resulta2);
odbc_close($conex);
?>

Bueno desde ya muchas gracias y espero que hallan pasado una feliz navidad salu2
  #9 (permalink)  
Antiguo 31/12/2002, 09:38
 
Fecha de Ingreso: enero-2002
Ubicación: Stgo.
Mensajes: 60
Antigüedad: 22 años, 9 meses
Puntos: 0
bueno hace tiempo encontre un script para paginar con sql server aqui va la funcion
/ **************************************************
****/
/* Funcion paginar
* actual: Pagina actual
* total: Total de registros
* por_pagina: Registros por pagina
* enlace: Texto del enlace
* maxpags: El máximo de páginas a presentar simultáneamente (opcional)
* Devuelve un texto que representa la paginacion
*/
function paginar($actual, $total, $por_pagina, $enlace, $maxpags=0) {
$total_paginas = ceil($total/$por_pagina);
$anterior = $actual - 1;
$posterior = $actual + 1;
$minimo = $maxpags ? max(1, $actual-ceil($maxpags/2)): 1;
$maximo = $maxpags ? min($total_paginas, $actual+floor($maxpags/2)): $total_paginas;
if ($actual>1)
$texto = "<a href=\"$enlace$anterior\">«</a> ";
else
$texto = "<b>«</b> ";
if ($minimo!=1) $texto.= "... ";
for ($i=$minimo; $i<$actual; $i++)
$texto .= "<a href=\"$enlace$i\">$i</a> ";
$texto .= "<b>$actual</b> ";
for ($i=$actual+1; $i<=$maximo; $i++)
$texto .= "<a href=\"$enlace$i\">$i</a> ";
if ($maximo!=$total_paginas) $texto.= "... ";
if ($actual<$total_paginas)
$texto .= "<a href=\"$enlace$posterior\">»</a>";
else
$texto .= "<b>»</b>";
return $texto;
}


esta la llamas desde el programa aqui va un ejemplo


<?php
session_start();
include("conexionbd.php");
$myconn = conectarse();
$color='#FFFFCC';
echo "<div align='center'><img src='imagenes/repasignacion.png' width='554' height='102'></div>";

if (!isset($pag)) $pag = 1; // Por defecto, pagina 1
$tampag = 2;
$reg1 = ($pag-1) * $tampag;
$result = mssql_query("SELECT PROYECTOS.Reg_ID, ASIGNACION_PRESUPUESTARIA.Asignacion_codigo, PROYECTOS.Pry_ID, PROYECTOS.Sub_sec_ID,PROYECTOS.Com_id, PROYECTOS.Pry_nom, PROYECTOS.Pry_financ, PROYECTOS.Pry_monto, PROYECTOS.Pry_FNDR, PROYECTOS.Pry_monto_RS, PROYECTOS.Pry_cos_tot, PROYECTOS.Pry_creacion
FROM ASIGNACION_PRESUPUESTARIA INNER JOIN PROYECTOS ON ASIGNACION_PRESUPUESTARIA.Reg_ID = PROYECTOS.Reg_ID AND ASIGNACION_PRESUPUESTARIA.Codigo = PROYECTOS.Pry_ID
WHERE (ASIGNACION_PRESUPUESTARIA.Asignacion_marca = 1) AND (ASIGNACION_PRESUPUESTARIA.Reg_ID = '$region') AND (PROYECTOS.Reg_ID = '$region')");
$total = mssql_num_rows($result);
if (mssql_num_rows($result)){
echo "Fecha Reporte :".date("m/d/y");
echo "<br>";
echo "<table border = '1'> \n";
echo "<tr>
<td align=center bgcolor='$color'>Region</b></td>
<td align=center bgcolor='$color'>Nº Asignacion</b></td>
<td align=center bgcolor='$color'>Codigo Proyectos</b></td>
<td align=center bgcolor='$color'>Codigo Subsector</b></td>
<td align=center bgcolor='$color'>Codigo Comuna</b></td>
<td align=center bgcolor='$color'>Nombre Proyecto</b></td>
<td align=center bgcolor='$color'>Financiamiento</b></td>
<td align=center bgcolor='$color'>Monto Asignado</b></td>
<td align=center bgcolor='$color'>Monto FNDR</b></td>
<td align=center bgcolor='$color'>Monto RS</b></td>
<td align=center bgcolor='$color'>Costo Total</b></td>
<td align=center bgcolor='$color'>Año Creacion</b></td></tr>\n";
for ($i=$reg1; $i<min($reg1+$tampag, $total); $i++) {
mssql_data_seek($result, $i);
$row = mssql_fetch_array($result);
echo "<tr><td>".$row["Reg_ID"]."</td>".
"<td>".$row["Asignacion_codigo"]."</td>".
"<td>".$row["Pry_ID"]."</td>".
"<td>".$row["Sub_sec_ID"]."</td>".
"<td>".$row["Com_id"]."</td>".
"<td>".$row["Pry_nom"].

"<td>".$row["Pry_financ"]."</td>".
"<td>".$row["Pry_monto"]."</td>".
"<td>".$row["Pry_FNDR"]."</td>".
"<td>".$row["Pry_monto_RS"]."</td>".
"<td>".$row["Pry_cos_tot"].
"<td>".$row["Pry_creacion"].

"</td></tr> \n";
}
echo "</table> \n";
echo paginar($pag, $total, $tampag, "cliente.php?pag=");
}
else{
echo "¡ No se ha encontrado ningún registro !";}
echo "<div align='center'><a href ='reporasignacion.php'>Volver al Menu </a></div>";
mssql_close($myconn) ;
?>

cualquier cosa me avisas a mi me funciona perfectamente

  #10 (permalink)  
Antiguo 13/01/2003, 10:10
Avatar de Chuty  
Fecha de Ingreso: noviembre-2002
Ubicación: el bar de la esquina
Mensajes: 609
Antigüedad: 22 años
Puntos: 2
Gracias cote por el codigo pero no entiendo como haces la llamada al query sin utilizar odbc_connect ya que vos utilisas $result = mssql_query, te agradeceria si me podes esplicar un poco mas como funsiona o como adapto tu codigo al mio que esta anterior al tuto. desde ya gracias. si queres contestarme por mail y si no por el foro para que le quede a otro usuario.
saludos Chuty
  #11 (permalink)  
Antiguo 13/01/2003, 10:32
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 10 meses
Puntos: 129
Por el código q se usa para "paginar" .. lo que se hace es una consulta con el total de registros que arroja la consulta y luego se mueve el puntero interno con mssql_data_seek() para mostar los registros q correspondan a la pagina en cuestion (paginada) que inicia el bulce FOR:

Código PHP:
//..
for ($i=$reg1$i<min($reg1+$tampag$total); $i++) {
mssql_data_seek($result$i);
$row mssql_fetch_array($result);
//... 
A nivel optimización no es de lo mejor .. pues para cada "página" se está haciendo una consulta al total de registros (obtenindo todos sus registros) para luego descartar la mayoria.ç

En el SQL de SQL server no hay un TOP? .. o similar al LIMIT de Mysql? ... Creo q por ahí deberia verse el tema por lo menos para dar el inicio del registro a leer y luego el xxx_data_seek() para obtener los registros q se tengan q mostrar por página.

Un saludo,
  #12 (permalink)  
Antiguo 13/01/2003, 11:08
Avatar de Chuty  
Fecha de Ingreso: noviembre-2002
Ubicación: el bar de la esquina
Mensajes: 609
Antigüedad: 22 años
Puntos: 2
Cluster en sql si hay top. generalmente se utiliza el top en sql para las consultas de una gran base de datos de esa forma te permite traer por ejemplo los 150 primeros registros.

un ejemplo de la utilizacion del TOP en SQL Server:

$sql="select top 150 COD_PAIS, COD_CORP, NUM_FIR, NOM_CLI, GRP_LEG
from mibase.tmp_clientes
where cod_corp='Organizacion' and cod_pais='ar'
order by cod_pais ";

desde ya gracias, pero me falta la solucion y la que dio cute creo que es una punta. salu2
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:30.