Darse de alta en la web | Recuperar password   
Inicio / Foros / PHP / Paginar Resultados con PHp Y ODBC
9 respuestas recibidas | 78 visitas | Categoría PHP

Paginar Resultados con PHp Y ODBC

Avatar de cmarrero
Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2

(Nivel 2 - 70 posts)

#0 Offline cmarrero Usuario hace 6días 4h  
Hola, ya que con ODBC y SQL Server no pued utilizar LIMIT 10,30 no se como puedo hacer un paginador... Se que existe el Select TOP N... Pero no se utilizarlo para que me tirre valores por ejemplo de 10 al 20 y aque si coloco Select TOP 10 me tira los registros hasta el 10.

Mi consulta es la siguiente...

Código PHP:
$dns="ACU";
$conexion = odbc_connect("$dns","","","");

$strqry = "select a.PIN, a.ACCESS_DATE, a.TYPE, a.ACU_NUMBER, u.USER_CODE, u.USERS_GROUP_ID, u.FIRST_NAME, u.LAST_NAME FROM access a INNER JOIN users u ON u.USER_CODE = a.PIN where 1 = 1";
if ($fecha_desde !=="" and $fecha_hasta !==""){
$strqry.= "AND a.ACCESS_DATE BETWEEN '$inicio' AND '$fin'";
}
if ($user_id !=="Apellido y Nombre") {
$strqry.= " AND a.PIN='$user_id'";
}
$strqry.= " ORDER BY u.LAST_NAME ";

$consulta=odbc_exec($conexion,$strqry);
$registros=odbc_num_rows($consulta);
Greacias... saludos

Re: Paginar Resultados con PHp Y ODBC

Avatar de krowork
Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3

(Nivel 3 - 200 posts)

#1 Offline krowork Usuario hace 5días 11h  
Hola cmarrero:


Al parecer hay que hacer una subconsulta:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY id) as row FROM Base_de_datos ) as alias WHERE row > 4 and row <= 12

Esto sería lo mismo que Select * from Base_de_datos Limit 4,8

Un saludo

http://krowork.blogspot.com

No me funciona en mi consulta

Avatar de cmarrero
Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2

(Nivel 2 - 70 posts)

#2 Offline cmarrero Usuario hace 5días 10h  
Me podrias agregar esta subconsulta en mi consulta.... Ya que no me funciona.... por que si te fijas hago una concatenacion de acuerdo a si se envia o no un valor....


Código PHP


$strqry = "select a.PIN, a.ACCESS_DATE, a.TYPE, a.ACU_NUMBER, u.USER_CODE, u.USERS_GROUP_ID, u.FIRST_NAME, u.LAST_NAME FROM access a INNER JOIN users u ON u.USER_CODE = a.PIN where 1 = 1";
if ($fecha_desde !=="" and $fecha_hasta !==""){
$strqry.= "AND a.ACCESS_DATE BETWEEN '$inicio' AND '$fin'";
}
if ($user_id !=="Apellido y Nombre") {
$strqry.= " AND a.PIN='$user_id'";
}
$strqry.= " ORDER BY u.LAST_NAME ";



La consulta si condicionales seria asi....

Código PHP


select a.PIN, a.ACCESS_DATE, a.TYPE, a.ACU_NUMBER, u.USER_CODE, u.USERS_GROUP_ID, u.FIRST_NAME, u.LAST_NAME FROM access a INNER JOIN users u ON u.USER_CODE = a.PIN where 1 = 1 AND a.ACCESS_DATE BETWEEN '$inicio' AND '$fin' AND a.PIN='$user_id'  ORDER BY u.LAST_NAME



Ayuda plis

Re: Paginar Resultados con PHp Y ODBC

Avatar de krowork
Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3

(Nivel 3 - 200 posts)

#3 Offline krowork Usuario hace 5días 6h  
Existe otro método que no se si será el más eficiente, si tu tienes:

Código PHP


SELECT campo1,campo2 FROM tabla ORDER BY normal LIMIT offset,numero

SELECT * FROM (
    SELECT TOP numero * FROM(
    
        SELECT TOP numero+offset campo1,campo2 FROM tabla ORDER BY normal
        
    ) ORDER BY normal DESC
) ORDER BY normal


con lo cual tu SELECT quedaria:

Código PHP


SELECT * FROM (
    SELECT TOP numero * FROM(
    
        select TOP numero+offset a.PIN, a.ACCESS_DATE, a.TYPE, a.ACU_NUMBER, u.USER_CODE, u.USERS_GROUP_ID, u.FIRST_NAME, u.LAST_NAME FROM access a INNER JOIN users u ON u.USER_CODE = a.PIN where 1 = 1 AND a.ACCESS_DATE BETWEEN '$inicio' AND '$fin' AND a.PIN='$user_id'  ORDER BY u.LAST_NAME
        
    ) as newtb1 ORDER BY LAST_NAME DESC
) as newtb2 ORDER BY LAST_NAME



espero que este te rule, la verdad es que no he tenido delante nunca un sql server pero googleando he dado con eso

http://krowork.blogspot.com

hice la prueba y no funciona

Avatar de cmarrero
Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2

(Nivel 2 - 70 posts)

#4 Offline cmarrero Usuario hace 4días 23h  
Hice la prueba y no funciona, cargue la consulta que me pasaste, la analice un poco y no entiendo muy bien como funcionan las SubQuery... pero te paso un ejemplo que quise hacer para que es lo que me consultaba...

Código PHP


$dns="ACU";
$conexion = odbc_connect("$dns","","","");

$strqry = "SELECT * FROM ( SELECT TOP 10 * FROM ( SELECT TOP 30+40 a.PIN, a.ACCESS_DATE, a.TYPE, a.ACU_NUMBER, u.USER_CODE, u.USERS_GROUP_ID, u.FIRST_NAME, u.LAST_NAME FROM access a INNER JOIN users u ON u.USER_CODE = a.PIN where 1 = 1 ";
if ($fecha_desde !=="" and $fecha_hasta !==""){
$strqry.= "AND a.ACCESS_DATE BETWEEN '$inicio' AND '$fin'";
}
if ($user_id !=="Apellido y Nombre") {
$strqry.= "AND a.PIN='$user_id'";
}
$strqry.= "ORDER BY u.LAST_NAME ) as newtb1 ORDER BY LAST_NAME DESC) as newtb2 ORDER BY LAST_NAME ";
$consulta=odbc_exec($conexion,$strqry);
$registros=odbc_num_rows($consulta);




Bueno, y me tira el siguiente error

Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][SQL Native Client][SQL Server]Ejecutando SQL directamente, sin cursor., SQL state 01000 in SQLExecDirect in C:\servidor\web\REPORTES_ACU\libreria\paginacion.php on line 89

Warning: odbc_num_rows(): supplied argument is not a valid ODBC result resource in C:\servidor\web\REPORTES_ACU\libreria\paginacion.php on line 90

Warning: odbc_fetch_array(): supplied argument is not a valid ODBC result resource in C:\servidor\web\REPORTES_ACU\libreria\paginacion.php on line 271

La linea 89 y 90 esta
$consulta=odbc_exec($conexion,$strqry);
$registros=odbc_num_rows($consulta);

Si me pudieras decir que estoy haciendo mal... Gracias...

Estube buscando en Google y todo... y he dado con un moton de ejemplos, pero como no se bien como hacer una consulta con subconsultas no las entiendo bien, lei sobre el tema y estoy medio duro para entenderlas bien...

Ahora no puedo creer que algo tan simple en MySQL como LIMIT... no este en SQL server....

Gracias por responder...

Re: Paginar Resultados con PHp Y ODBC

Avatar de krowork
Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3

(Nivel 3 - 200 posts)

#5 Offline krowork Usuario hace 4días 13h  
A ver si conseguimos que esto funcione,

En ppo, te voy a explicar un poco lo que yo entiendo que hace en los dos ejemplos que te he puesto.
El primero:
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY id) as row FROM Base_de_datos ) as alias WHERE row > 4 and row <= 12

En este caso hacemos una select de una tabla que creamos a partir de otra SELECT, a esta nueva tabla la llamamos alias y tiene lo mismo que la tabla original además de una columna más en dónde se indica el número de fila que es. A esta columna la llamamos row. La SELECT principal hace una select de la tabla alias en donde selecciona solo aquellas filas cuyo campo row este comprendido entre 5 y 12

El segundo ejemplo:
SELECT * FROM (
SELECT TOP numero * FROM(

SELECT TOP numero+offset campo1,campo2 FROM tabla ORDER BY normal

) alias tbl1 ORDER BY normal DESC
) alias tbl2 ORDER BY normal

La SELECT más interna hace una selección de las primeras filas (segun el orden que deseemos) pero selecciona las que ya hemos visto (en anteriores páginas) y las de la próxima página. En la segunda SELECT se ordena al revés para obtener solo aquellas que no hemos visto (las TOP numero con el orden al revés). La tercera SELECT (o select principal) lo único que hace es volver a ordenar según el criterio establecido.

Espero que esto ayude

http://krowork.blogspot.com

EJEMPLOS CUAL?

Avatar de cmarrero
Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2

(Nivel 2 - 70 posts)

#6 Offline cmarrero Usuario hace 4días 8h  
Bien, viendo los ejemplos, veo que lo mas facil de utilizar es lo primero, pero se me complica todo al utilizar INNER JOIN para juntar tablas y etc... el ejemploq ue me diste de

SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (ORDER BY id) as row FROM Base_de_datos ) as alias WHERE row > 4 and row <= 12...

Lo entiendo bien ahora, pero trato de colocar esta idea en mi codigo y termino con millones de errores, lo unico que necesito es poder seleccionar de la 10 a la 20 para luego de acuerdo a si eso funciona, hago un buen paginador en php, nunca necesite hacer este tipod e consultas, debido a que con MySQL tiene LIMIT y es muy facil de utilizar...

Te voy a molestar con una ultima peticion... que me muestres con este ejemplo como quedaria con la consulta que yo he realizado ya que se me confunde todo con los INNER JOIN que he realizado.. y los condicionales para concatenar la sentencia SQL...
Gracias....

POsteo de nuevo mi consulta SQL...

Código PHP


$dns="ACU";
$conexion = odbc_connect("$dns","","","");

$strqry = "select a.PIN, a.ACCESS_DATE, a.TYPE, a.ACU_NUMBER, u.USER_CODE, u.USERS_GROUP_ID, u.FIRST_NAME, u.LAST_NAME FROM access a INNER JOIN users u ON u.USER_CODE = a.PIN where 1 = 1";
if ($fecha_desde !=="" and $fecha_hasta !==""){
$strqry.= "AND a.ACCESS_DATE BETWEEN '$inicio' AND '$fin'";
}
if ($user_id !=="Apellido y Nombre") {
$strqry.= " AND a.PIN='$user_id'";
}
$strqry.= " ORDER BY u.LAST_NAME ";

$consulta=odbc_exec($conexion,$strqry);
$registros=odbc_num_rows($consulta);



Saludos y muchas gracias

Re: Paginar Resultados con PHp Y ODBC

Avatar de krowork
Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3 Nivel 3

(Nivel 3 - 200 posts)

#7 Offline krowork Usuario hace 4días 7h  
Según yo creo debería ser así, para asegurar le he puesto un alias a todos los campos de la tabla alias (valga la redundancia) para poder utilizarlos en la SELECT ppal y no obtener el campo row.

Código PHP


<?php
$where
='1';
if (
$fecha_desde !=="" and $fecha_hasta !=="")
  
$where.= " AND a.ACCESS_DATE BETWEEN '$inicio' AND '$fin'";

if (
$user_id !=="Apellido y Nombre")
  
$where.= " AND a.PIN='$user_id'";

$consulta='SELECT PIN, ACCESS_DATE, TYPE, ACU_NUMBER, USER_CODE, USERS_GROUP_ID, FIRST_NAME, LAST_NAME FROM ( SELECT select a.PIN as PIN, a.ACCESS_DATE as ACCESS_DATE, a.TYPE as TYPE, a.ACU_NUMBER as ACU_NUMBER, u.USER_CODE as USER_CODE, u.USERS_GROUP_ID as USERS_GROUP_ID, u.FIRST_NAME as FIRST_NAME, u.LAST_NAME as LAST_NAME,  ROW_NUMBER() OVER (ORDER BY u.LAST_NAME) as row  FROM access as a INNER JOIN users as u ON u.USER_CODE = a.PIN WHERE '. $where .') as alias WHERE row > 10 and row < 21 ORDER BY LAST_NAME';
?>


Lo malo de esta opcion es que tienes que sacar la consulta entera en la select interna, mientras que en la otra opción sólo la sacas la consulta entera cuando llegas la ultima página (podría mejorarse haciendo una consulta alrevés cuando se sobrepasa la mitad de las páginas así siempre como mucho se obtendría la mitad de las filas de la consulta sin paginar).

Ya me dirás si rula y dios bendiga al LIMIT!

http://krowork.blogspot.com

PROBARE.

Avatar de cmarrero
Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2

(Nivel 2 - 70 posts)

#8 Offline cmarrero Usuario hace 4días 4h  
Bueno voy a probar esto que me propones...

Con respecto a que Dios Bendiga al LIMIT... Estoy resando para que asi sea... je...

Gracias por responder... Esto se me esta complicando muchisimo mas de lo que esperaba...

Saludos

NO FUNCIONA

Avatar de cmarrero
Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2 Nivel 2

(Nivel 2 - 70 posts)

#9 Offline cmarrero Usuario hace 4días 4h  
Primero chequee que la sintaxis este bien escrita, lo probe... y me tira el siguiente error

Warning: odbc_exec() [function.odbc-exec]: SQL error: [Microsoft][SQL Native Client][SQL Server]Ejecutando SQL directamente, sin cursor., SQL state 01000 in SQLExecDirect in C:\servidor\web\REPORTES_ACU\libreria\validacion.php on line 91

Warning: odbc_num_rows(): supplied argument is not a valid ODBC result resource in C:\servidor\web\REPORTES_ACU\libreria\validacion.php on line 92

Warning: odbc_fetch_array(): supplied argument is not a valid ODBC result resource in C:\servidor\web\REPORTES_ACU\libreria\validacion.php on line 273

Volvi a chequear todo, y parece todo correcto (creo), y no ahi caso...

Ya no se como resolver esto... Gracias Krowork por responder, pero parece que me van a hechar del laburo por un simple paginador (como explicarle a mi jefe, que no entiende nada de programacion que no existe LIMIT en SQL Server)... y bueno... ya veremos si sale... gracias...

Responder mensaje

Para poder participar debes estar registrado e identificado. Si no estás registrado como usuario de PHP-Hispano, :: Registrar ::
Login / Password   

Web alojada en Zilos

php-hispano.net 2002 - 2008 | XHTML 1.0
Datos Legales | Webmaster