• User Newbie

    Paginazione risultati query

    Ciao a tutti, avrei bisogno di aiuto per implementare se possibile la paginazione dei risultati in un motore di ricerca asp su db access datato ma perfettamente funzionante.. Dovrei visualizzare max 8/10 risultati per pagina e la classica barra di navigazione tra le pagine. Vi posto il codice intanto per sapere se è possibile farlo e nel caso qual'è il modo migliore.. :arrabbiato:

    <% strBody = ""
    For i = 1 To Request.Form.Count
    strBody = strBody & Request.Form.Key(i) & ": " & Request.Form.Item(i) & "<br>"
    Next
    Trattativa=Request.Form ("Trattativa")
    Localita=Request.Form ("Localita")
    Categoria=Request.Form ("Categoria")
    sql="select * from immobili " 
    sql=sql & " where 1=1"
    if Trattativa<>"Tutte" then 
        sql=sql & " and Trattativa like '%" & Trattativa & "%'"
    end if
    if Localita<>"Tutte" then 
        sql=sql & " and Localita like '%" & Localita & "%'"
    end if
    if Categoria<>"Tutte" then 
        sql=sql & " and Categoria like '%" & Categoria & "%'"
    end if
    sql=sql & " order by Codice DESC "
    
    
    Set OBJdbConnection = Server.CreateObject("ADODB.Connection") 
    OBJdbConnection.Open"driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("immobili2.mdb")
    Set RS = Server.CreateObject("ADODB.RecordSet")
    RS.Open "Immobili", OBJdbConnection
    Set RS=OBJdbConnection.Execute(sql)
    %>
    <%
    If rs.EOF Then
    %>
    <p><div align=center><h1>Nessun immobile trovato</h1></p>
    <%
            Else
    
    
    response.write ("<div align=center><h1>Immobili trovati</h1><br><table width=100% border=1 bordercolor=white><tr><td align=center><h4>Anteprima</h4></td><td align=center><h4>Codice</h4></td><td align=center><h4>Categoria</h4></td><td align=center><h4>Trattativa</h4></td><td align=center><h4>Località</h4></td><td align=center><h4>Condizioni</h4></td><td align=center><h4>Metratura MQ</h4></td><td align=center><h4>Prezzo ?</h4></td><td align=center><h4>Descrizione</h4></td><td align=center><font color=red><h4>Video</h4></font></font></td></tr>"):i=0%>
    
    
    <%
    Do while NOT RS.EOF 
    i=i+1 %>
    
    
    <TR> 
    <td align=center>
    <%response.write" <img src=""" & RS("Anteprima") & """>"
    %></td>
    <td align=center>
    <%Codice=rs("Codice") 
    %>
    <a href="../<%=Codice%>.html" target=_blank>
    <%=Codice%></a></td>
    <td align=center><%response.write(RS("Categoria")) 
    Categoria=rs("Categoria")%></td> 
    <td align=center><%response.write(RS("Trattativa")) 
    Trattativa=rs("Trattativa")%></td> 
    <td align=center><%response.write(RS("Localita")) 
    Localita=rs("Localita")%></td> 
    <td align=center><%response.write(RS("Condizioni")) 
    Condizioni=rs("Condizioni")%></td> 
    <td align=center><%response.write(RS("Metratura")) 
    Metratura=rs("Metratura")%></td> 
    <td align=center><%response.write(RS("Prezzo")) 
    Prezzo=rs("Prezzo")%></td> 
    <td align=center>
    <a href="../<%=Codice%>.html" target=_blank>
    Visualizza dettagli</a>
    </td> 
    <td align=center><a href="../<%=Codice%>.html" target=_blank>
    <%response.write" <img src=""" & RS("Video") & """ border=0>"
    %></a></td>
    </tr> 
                
    <% 
    RS.MoveNext 
    Loop 
    RS.Close
    OBJdbConnection.Close
    Set OBJdbConnection = Nothing
    %>
    <%
            End If
            
    %>
    </table>
    
    

    accetto anche eventuali consigli su nuove soluzioni avendo a disposizione db mysql per migliorare le funzionalità del motore (chiaramente valuto anche proposte da retribuire...)


  • Moderatore

    Ciao Alcolico82, e passare a .NET con MSSQL nella sua versione free?
    Per l'accesso ai dati potresti usare per questa pagina (...e tutte le altre) Entity Framework. La paginazione risiederebbe nel controllo GridView, inoltre se avessi bisogno di velocizzare la presentazione dei dati sarebbe sufficiente costruire una StoredProcedure con la gestione del PageIndex. In questo modo i dati trasmessi dal Server al Client sarebbero solo quelli necessari alla presentazione e non l'intero DataSet​.

    Ne migliorerebbe enormemente sia la manutenibilità che la produttività.


  • User Newbie

    Ciao e grazie per la risposta, ammettendo la mia ignoranza in materia sinceramente ho capito ben poco.. Hai qualche esempio da mostrarmi o direttamente un lavoretto (retribuito) da propormi??


  • Moderatore

    Più che un esempio dovresti imparare a conoscere le tecnologie che ti ho proposto. .NET è il nuovo FrameWork di sviluppo di Microsoft, MSSQL è il DataBase, la versione free del 2008 (Express Edition) ha poche limitazioni, 10Gb di spazio disco occupabile, 1 CPU ed 1 Gb di RAM utilizzabili (http://recruitmentexchange.com/download/SQL2008_editions_features.pdf)

    Entity Framework: detto in soldoni, prima disegni il DB poi lo agganci alla Solution su Visual Studio e lui ti genera in automagico tutte le classi relative alle tabelle del DB, i membri di queste classi rappresentano a loro volta le colonne della tabella, già tipizzati (string, int, decimal, datetime, bool & so on...).

    La **GridView **è un controllo che disegna sulla pagina web una griglia (che puoi "stilizzare" come preferisci.) Ecco un esempio prendendo esempio dal tuo codice:

                                
    <asp:GridView ID="gvImmobili" runat="server" CellPadding="4" ForeColor="#333333"                                 GridLines="Horizontal" Width="100%" AllowPaging="True" 
                                    AutoGenerateColumns="False" EmptyDataText="Nessun immobile trovato" 
                                    ShowHeaderWhenEmpty="True" onrowcommand="gvImmobiliRowCommand" 
                                    onrowdatabound="gvImmobiliRowDataBound" 
                                    onpageindexchanging="gvImmobiliPageIndexChanging">
                                    <AlternatingRowStyle BackColor="White" />
                                    <Columns>
                                        <asp:BoundField DataField="Categoria" HeaderText="Categoria" />
                                        <asp:BoundField DataField="Trattativa" HeaderText="Trattativa" />
                                        <asp:BoundField DataField="Localita" HeaderText="Località" />
    ....
    Altri campi
                                    </Columns>
                                    <FooterStyle BackColor="#1C5E55" Font-Bold="True" ForeColor="White" />
                                    <HeaderStyle BackColor="#488E22" Font-Bold="True" ForeColor="White" HorizontalAlign="Left" />
                                    <PagerStyle BackColor="#488E22" ForeColor="White" HorizontalAlign="Center" />
                                    <RowStyle BackColor="#E3EAEB" />
                                    <SelectedRowStyle BackColor="#C5BBAF" Font-Bold="True" ForeColor="#333333" />
                                </asp:GridView>
    
    
    
    

    Mentre il codice "dietro le quinte" potrebbe essere qcs del genere:

    
                var lista = new Immobili().ListaImmobiliCompleta();
                gvImmobili.DataSource = lista;
                if (index.HasValue) gvImmobili.PageIndex = index.Value;
                gvImmobili.DataBind();
    
    
    
    

    That's all falk (o quasi...)

    ListaImmobiliCompleta()

    
    public Immobili[] ListaImmobiliCompleta()
    {
        return (from c in _oc.Immobili select c).ToArray();
    }
    
    

    Dove _oc è l'ObjectContext, ovvero il corrispottivo del mondo ADO, solo che non devi fare (o meglio non devi scrivere... :2: tutte le volte i metodi di accesso ai dati ecc...

    Per un eventuale offerta sul "lavoretto" mandami 2 righe di scpecifiche che ti valuto il lavoro...

    Ciao
    Marco


  • User

    Il sistema più rapido e performante di paginare dal mio punto di vista e farlo fare direttamente alla sorgente da SQL Server: esiste l'istruzione BETWEEN che serve appunto a questo (non so se sia disponibile solo da SQL Server 2008 in poi).
    Io ho fatto esattamente così, se vai a vedere il blog che ho realizzato in ASP.NET, ogni pagina contiene massimo 5 articoli.
    [...]


  • Moderatore

    Scusa IgorDR, non ho capito cosa intendi: L'istruziuone T-SQL BETWEEN serve a specificare un intervallo sì, ma fra due campi in un istruzione WHERE ad esempio

    
    **WHERE **@Parametro **BETWEEN **CAMPO1 **AND **CAMPO2
    
    

    non capisco come possa sposarsi con la paginazione di un RecordSet???


  • User

    WITH Risultati AS
    (
    SELECT IDColumn, ..., ROW_NUMBER() OVER (ORDER BY DateField) AS RowNum
    FROM MyTable
    )

    SELECT *
    FROM Risultati
    WHERE RowNum BETWEEN 10 AND 20;


  • Moderatore

    Sì, ma non è la **BETWEEN **che dovrebbe essere al centro dell'attenzione ma l'uso della Function ROW_NUMBER() che permette di attribuire una numerazione "volante" al RecordSet preso in considerazione, ed era proprio quello a cui mi riferivo con la frase: > inoltre se avessi bisogno di velocizzare la presentazione dei dati sarebbe sufficiente costruire una StoredProcedure con la gestione del PageIndex.

    La Function è disponibile dalla versione 2005 di SQL e l'ho usata di recente per risolvere un problema ad un cliente con un problema sulla visualizzazione di una pagina molto lenta. Lì il DB è proprio SQL Server 2005


  • User Newbie

    grazie per le risposte molto precise, già la cosa mi è più chiara e posso valutare il da farsi...


  • Moderatore

    [...]