Foros del Web » Programando para Internet » PHP »

Paginator y MSSQL

Estas en el tema de Paginator y MSSQL en el foro de PHP en Foros del Web. Es posible utilizar el paginator con MSSQL? Estoy intentando usarlo con una pequeña consulta que antes estaba en mysql y funcionaba bien, recientemente mudamos los ...
  #1 (permalink)  
Antiguo 10/03/2005, 09:33
 
Fecha de Ingreso: marzo-2005
Mensajes: 11
Antigüedad: 19 años, 1 mes
Puntos: 0
Exclamación Paginator y MSSQL

Es posible utilizar el paginator con MSSQL? Estoy intentando usarlo con una pequeña consulta que antes estaba en mysql y funcionaba bien, recientemente mudamos los datos a mssql y dejo de funcionar.... hice los cambios de lugar de donde decia mysql cambiarlo por mssql y da el siguiente error:

Warning: mssql_result() [function.mssql-result]: Bad row offset (0) in /usr/local/apache2/htdocs/reservas2/paginator.inc.php on line 180

Warning: mssql_query() [function.mssql-query]: message: Line 1: Incorrect syntax near 'LIMIT'. (severity 15) in /usr/local/apache2/htdocs/reservas2/paginator.inc.php on line 312

Warning: mssql_query() [function.mssql-query]: Query failed in /usr/local/apache2/htdocs/reservas2/paginator.inc.php on line 312

Fatal error: Call to undefined function mssql_error() in /usr/local/apache2/htdocs/reservas2/paginator.inc.php on line 316

Última edición por HDelgado; 10/03/2005 a las 09:37
  #2 (permalink)  
Antiguo 10/03/2005, 16:53
Avatar de jpinedo
Colaborador
 
Fecha de Ingreso: septiembre-2003
Ubicación: Lima, Perú
Mensajes: 3.120
Antigüedad: 20 años, 7 meses
Puntos: 41
Hola... el tema va mucho más allá de simplemente cambiar las funciones que utiliza PHP.
No sé casi nada de MSsql... pero creo que no utiliza la cláusula LIMIT, sino TOP.

Por ahora te recomiendo olvidarte de Paginator y buscar un script específico o aprender a paginar a mano y luego adaptar el Paginator o utilizar su forma de generar enlaces y propagar variables.
Por ejemplo:
- En Mysql cuando uno quiere obtener "N" registros empezando desde el registro número "N", agrega al sql: "LIMIT M,N".
- Tienes que averiguar cuál es lo análogo en mssql... con eso puede bastar.

Saludos

Última edición por jpinedo; 10/03/2005 a las 16:59
  #3 (permalink)  
Antiguo 10/03/2005, 20:54
 
Fecha de Ingreso: marzo-2005
Mensajes: 11
Antigüedad: 19 años, 1 mes
Puntos: 0
gracias... creo que tendre que buscar la forma de hacerlo a mano... (
  #4 (permalink)  
Antiguo 11/03/2005, 08:57
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
No sé como trabajas con MS SQL Server .. pero por ejemplo la capa de abstracción de BD:

ADOdb
http://adodb.sourceforge.net/

Parece que incorpora un método para paginación (además que permite usar várias BD distintas sin cambiar nada de tu código y poco de SQL).

Un saludo,
  #5 (permalink)  
Antiguo 13/11/2006, 11:34
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
He conseguido adaptar un poco el paginador de jpinedo al mssql. Tras cambiar las funciones mysql por las equivalentes mssql, he añadido lo siguiente en la línea 320 aprox.
Código PHP:
 // Calculamos desde qué registro se mostrará en esta página
 // Recordemos que el conteo empieza desde CERO.
 
$_pagi_inicial = ($_pagi_actual-1) * $_pagi_cuantos;
 
 
// Consulta SQL. Devuelve $cantidad registros empezando desde $_pagi_inicial

/*** modificacion para SQL SERVER ***/

    //echo("<br />pagi_sql: ".$_pagi_sql);

    
$_orderby_subquery2 "";
    
$_orderby_subquery1 "";
    
$_orderby_query "";
    
    if( 
eregi("(ORDER BY [a-z0-9\., ]+)"$_pagi_sql$regs) == false )
    {    
        
$_pagi_sql .= " ORDER BY Id ASC";
        
$_orderby_subquery1 "ORDER BY subquery.Id DESC";
        
$_orderby_query "ORDER BY query.Id ASC";
    }
    else
    {
        
$_orderby_subquery1 $regs[1];
        
$_orderby_query $regs[1];
        
    
// cambiamos los ASC por DESC o al reves
    
        
$_orderby_temp str_replace("ASC""DESC"$_orderby_subquery1);
        if( 
$_orderby_temp == $_orderby_subquery1)
        {
            
$_orderby_temp str_replace("DESC""ASC"$_orderby_subquery1);
        }
        
$_orderby_subquery1 $_orderby_temp;
    }

    
$top_subquery2 $_pagi_inicial $_pagi_cuantos;
    
$_pagi_subquery2 str_replace"SELECT""SELECT TOP ".$top_subquery2$_pagi_sql);
        
    
// calculo del valor de top de la subquery1
        
if( $top_subquery2 $_pagi_totalReg )
        {
            
$top_subquery1 $_pagi_totalReg $_pagi_inicial;
        }
        else
        {
            
$top_subquery1 $_pagi_cuantos;
        }
        
    
$_pagi_subquery1 =     $_pagi_subquery1 "SELECT TOP ".$top_subquery1." * FROM (".$_pagi_subquery2.") as subquery ".$_orderby_subquery1;
        
    
//echo("<br />subquery2: ".$_pagi_subquery2);
    //echo("<br />subquery1: ".$_pagi_subquery1);
    // creamos la query final    
    
$_pagi_sqlLim "SELECT * FROM (".$_pagi_subquery1.") as query ".$_orderby_query;

    
//echo("<br />query final: ".$_pagi_sqlLim);
        
// $_pagi_sqlLim = $_pagi_sql." LIMIT $_pagi_inicial,$_pagi_cuantos";

/*** modificacion para SQL SERVER ***/

 
$_pagi_result ExecuteQuery($_pagi_sqlLim); 
Funciona bien con consultas simples, pero falla con consultas a más de una tabla. Invito a cualquiera a desarrollar el código.

Un saludo

Última edición por jerkan; 15/11/2006 a las 05:14 Razón: Fallos corregidos
  #6 (permalink)  
Antiguo 13/11/2006, 11:43
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por jerkan Ver Mensaje
He conseguido adaptar un poco el paginador de jpinedo al mssql. Tras cambiar las funciones mysql por las equivalentes mssql, he añadido lo siguiente en la línea 320 aprox.
Código PHP:
 // Calculamos desde qué registro se mostrará en esta página
 // Recordemos que el conteo empieza desde CERO.
 
$_pagi_inicial = ($_pagi_actual-1) * $_pagi_cuantos;
 
 
// Consulta SQL. Devuelve $cantidad registros empezando desde $_pagi_inicial

/*** modificacion para SQL SERVER ***/

    //echo("<br />pagi_sql: ".$_pagi_sql);
    
    
$top_subquery2 $_pagi_inicial $_pagi_cuantos;
    
$_pagi_subquery2 str_replace"SELECT""SELECT TOP ".$top_subquery2$_pagi_sql);

    
$_pagi_orderby_subquery1 "";
    
$_pagi_orderby_query "";
    
    if( 
eregi("(ORDER BY [a-z0-9\., ]+)"$_pagi_sql$regs) == false )
    {    
        
$_pagi_orderby_subquery1 "ORDER BY subquery.Id DESC";
        
$_pagi_orderby_query "ORDER BY query.Id ASC";
    }
    else
    {        
        
$_pagi_orderby_subquery1 $regs[1];
        
$_pagi_orderby_query $regs[1];
    }
    
    
// cambiamos los ASC por DESC o al reves
    
        
$_pagi_orderby_temp str_replace("ASC""DESC"$_pagi_orderby_subquery1);
        if( 
$_pagi_orderby_temp == $_pagi_orderby_subquery1)
        {
            
$_pagi_orderby_temp str_replace("DESC""ASC"$_pagi_orderby_subquery1);
        }
        
$_pagi_orderby_subquery1 $_pagi_orderby_temp;

    
// calculo del valor de top de la subquery1
        
if( $top_subquery2 $_pagi_totalReg )
        {
            
$top_subquery1 $_pagi_totalReg $_pagi_inicial;
        }
        else
        {
            
$top_subquery1 $_pagi_cuantos;
        }
        
    
$_pagi_subquery1 =     $_pagi_subquery1 "SELECT TOP ".$top_subquery1." * FROM (".$_pagi_subquery2.") as subquery ".$_pagi_orderby_subquery1;
        
    
//echo("<br />subquery2: ".$_pagi_subquery2);
    //echo("<br />subquery1: ".$_pagi_subquery1);
    // creamos la query final    
    
$_pagi_sqlLim "SELECT * FROM (".$_pagi_subquery1.") as query ".$_pagi_orderby_query;

    
//echo("<br />query final: ".$_pagi_sqlLim);
        
// $_pagi_sqlLim = $_pagi_sql." LIMIT $_pagi_inicial,$_pagi_cuantos";

/*** modificacion para SQL SERVER ***/

 
$_pagi_result ExecuteQuery($_pagi_sqlLim); 
Funciona bien con consultas simples, pero falla con consultas a más de una tabla. Invito a cualquiera a desarrollar el código.

Un saludo
Estaría bueno que te contactaras con Jpinedo (autor original del "Paginator" que modificastes) a ver si pueden sacar alguna versión "for MS SQL Server".

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
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 06:58.