Jump to content

Construir formulário de pesquisa


RicardoGaio
 Share

Recommended Posts

Viva!

O que me traz aqui desta vez é pretender construir um formulário de pesquisa (e.g., http://s1.postimage.org/MofwS.jpg) e, de seguida, apresenta-lo numa gridview na página pesquisaresultados.aspx.

Os filtros podem ser todos "accionados", nenhum ou a pesquisa ser conjugada/personalizada segundo a necessidade do utilizador.

Já andei a tentar fazer segundo este site: ression.microsoft.com/en-us/dd571513.aspx'>http://expression.microsoft.com/en-us/dd571513.aspx, mas a pesquisa conjugada não surte efeito...

Alguém pode disponibilizar algum exemplo, dica, tutorial, site, ... que me possa ajudar nesta questão?

Desde já agradeço a atenção dispensada,

Um abraço, Ricardo

Link to comment
Share on other sites

Viva Bruno!

Não entendi a tua questão...

Estou a pensar validar os campos

se = alguma_coisa_seleccionada então

    integrar_na_clausula_SQL

senão

    não_integrar_clausula_SQL

e construir o SQL da seguinte forma:

Select * from tabela where 1=1

if dropdown1 <> "" then

and campo1_da_tabela = valor_da_dropdown1

if dropdown2 <> "" then

and campo2_da_tabela = valor_da_dropdown2

...

Algo do género do exemplo de cima. Estou a pensar desta forma, pois era assim que fazia no ASP. Não sei se será a melhor maneira / mais correcta...

Agradeço as dicas.

Um abraço, Ricardo

Link to comment
Share on other sites

Obrigado Bruno,

Mas partindo um pouco mais de trás...

Tendo um form com os filtros (pesquisa.aspx) e pretendendo mostrar noutra (resultados.aspx), como deverei fazer?

Pelo exemplo que segui no link do 1º post, não consegui os resultados pretendidos, pois não permite a conjugação dos filtros conforme as necessidades.

No ASP clássico, conseguia fazer, no ASP.NET, como ainda sou muito "verdinho", ando um bocado à nora...

Um abraço, Ricardo

Link to comment
Share on other sites

A conjugação dos filtros podes fazer á mesma na Query,

se tiveres 3 campos de pesquisa usas uma query do tipo:

select * from Tabela

where campo1 = @campo1

and campo2 = @campo2

and (@campo3 is null OR campo3 = @campo3) --> Campo Opcional

como nos exemplos que te enviei.

Matraquilhos para Android.

Gratuito na Play Store.

https://play.google.com/store/apps/details?id=pt.bca.matraquilhos

Link to comment
Share on other sites

Viva!

Desde já obrigado por todas as dicas.

Andei um tempo "afastado" e agora deparei-me com este exemplo, http://www.mikesdotnetting.com/Article/68/An-ASP.NET-Search-Engine-with-MS-Access-for-optional-search-criteria, que "quase" encaixa no que pretendo fazer.

Vou estuda-lo e adaptá-lo, pois pretendo o pesquisa.aspx e o resultados.aspx, e, este exemplo, faz tudo na mesma página...

Fica aqui o código para mais alguém que precise (está completo e funcional, basta ter a BD Northwind.mdb na pasta App_Data):

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Resultados.aspx.vb" Inherits="Resultados" %>
<!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 runat="server">
    <title>Pesquisa personalizada</title>
</head>
<body>
    <form id="form1" runat="server">
      First name: <asp:TextBox ID="txtFirstName" runat="server" /><br />
      Last name: <asp:TextBox ID="txtLastName" runat="server" /><br />
      Job Title: <asp:TextBox ID="txtTitle" runat="server" /><br />
      City: <asp:TextBox ID="txtCity" runat="server" /><br />
      <asp:Button ID="Button1" runat="server" Text="Search" />
      <br />
       <asp:GridView 
          ID="GridView1" 
          runat="server" 
          DataSourceID="AccessDataSource1" 
          AllowPaging="True" 
          PageSize="5" EnableModelValidation="True" AllowSorting="True" 
                AutoGenerateColumns="False" EmptyDataText="Nenhum registo encontrado..." >
            <Columns>
                <asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" />
                <asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" />
                <asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" />
                <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
                <asp:BoundField DataField="HomePhone" HeaderText="HomePhone" SortExpression="HomePhone" />
            </Columns>
         </asp:GridView>
            <asp:AccessDataSource 
              ID="AccessDataSource1" 
              runat="server" 
              DataFile="~/App_Data/Northwind.mdb"
              SelectCommand="SELECT FirstName, LastName, Title, City, HomePhone 
                FROM Employees WHERE   
                (@FirstName IS NULL OR FirstName LIKE '%' +  @FirstName + '%') AND 
                (@LastName IS NULL OR LastName LIKE '%' + @LastName + '%') AND  
                (@Title IS NULL OR Title LIKE '%' + @Title + '%') AND  
                (@City IS NULL OR City LIKE '%' + @City + '%')" 
              CancelSelectOnNullParameter="False">
              <SelectParameters>
            	<asp:ControlParameter ControlID="txtFirstName" Name="FirstName" Type="String" />
            	<asp:ControlParameter ControlID="txtLastName" Name="LastName" Type="String" />
            	<asp:ControlParameter ControlID="txtTitle" Name="Title" Type="String" />
            	<asp:ControlParameter ControlID="txtCity" Name="City" Type="String" />
              </SelectParameters>
            </asp:AccessDataSource>
    </form>
</body>
</html>

No .vb:

Partial Class Resultados
    Inherits System.Web.UI.Page

    Protected Sub AccessDataSource1_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) Handles AccessDataSource1.Selecting
        If Not IsPostBack Then
            e.Cancel = True
        End If
    End Sub
End Class

Espero que seja útil para mais alguém...

Um abraço, Ricardo

Link to comment
Share on other sites

Obrigado por partilhares  🙂

Viva Rechousa!

Nem tens que agradecer.  😉

Estamos aqui para isso... Espero que seja útil para outros, tal como é para mim. Isto quem é muito verdinho em ASP.NET, como eu ?, anda aqui um bocado à nora. E este exemplo, na minha opinião, está muito simples e objectivo.

Agora estou a tentar fazer o que disse em cima (formpesquisa.aspx e formresultado.aspx)... Ando de novo  :wallbash:, mas espero conseguir fazer o que pretendo.

Estou a fazer assim:

-formpesquisa.aspx

    <body>
    <form id="form1" runat="server">
    <div>
      First name: <asp:TextBox ID="txtFirstName" runat="server" /><br />
      Last name: <asp:TextBox ID="txtLastName" runat="server" /><br />
      Job Title: <asp:TextBox ID="txtTitle" runat="server" /><br />
      City: <asp:TextBox ID="txtCity" runat="server" /><br />
      <asp:Button ID="Button1" runat="server" Text="Pesquisar" 
            PostBackUrl="~/formresultado.aspx" />
      <br />
    </div>
    </form>
</body>

-formresultado.aspx

<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView 
          ID="GridView1" 
          runat="server" 
          DataSourceID="AccessDataSource1" 
          AllowPaging="True" 
          PageSize="5" EnableModelValidation="True" AllowSorting="True" 
                AutoGenerateColumns="False" EmptyDataText="Nenhum registo encontrado..." >
            <Columns>
                <asp:BoundField DataField="FirstName" HeaderText="FirstName" SortExpression="FirstName" />
                <asp:BoundField DataField="LastName" HeaderText="LastName" SortExpression="LastName" />
                <asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" />
                <asp:BoundField DataField="City" HeaderText="City" SortExpression="City" />
                <asp:BoundField DataField="HomePhone" HeaderText="HomePhone" SortExpression="HomePhone" />
            </Columns>
         </asp:GridView>

        <asp:AccessDataSource ID="AccessDataSource1" runat="server" 
            DataFile="~/App_Data/Northwind.mdb" 
            SelectCommand="SELECT FirstName, LastName, Title, City, HomePhone 
                FROM Employees WHERE   
                (@FirstName IS NULL OR FirstName LIKE '%' +  @strFirstName + '%') AND 
                (@LastName IS NULL OR LastName LIKE '%' + @strLastName + '%') AND  
                (@Title IS NULL OR Title LIKE '%' + @strTitle + '%') AND  
                (@City IS NULL OR City LIKE '%' + @strCity + '%')" 
              CancelSelectOnNullParameter="False">

               <SelectParameters>
                <asp:FormParameter FormField="txtFirstName" Name="strFirstName" Type="String" />
                <asp:FormParameter FormField="txtLastName" Name="strLastName" Type="String" />
                <asp:FormParameter FormField="txtTitle" Name="strTitle" Type="String" />
                <asp:FormParameter FormField="txtCity" Name="strCity" Type="String" />
            </SelectParameters>
        </asp:AccessDataSource>
    </div>
    </form>
</body>

-formresultado.aspx.vb

Partial Class formresultado
    Inherits System.Web.UI.Page

    Protected Sub AccessDataSource1_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceSelectingEventArgs) Handles AccessDataSource1.Selecting
        If Not IsPostBack Then
            e.Cancel = True
        End If
    End Sub
End Class

Mas está sempre a retornar "Nenhum registo encontrado...:wallbash:🙂 ?

Dá-me a ideia que ele no formresultado.aspx não está a conseguir ir buscar os valores do formpesquisa.aspx...

Alguém me sabe dizer o que estou a fazer mal?

(esta tentativa é um "mix" deste exemplo: http://www.mikesdotnetting.com/Article/68/An-ASP.NET-Search-Engine-with-MS-Access-for-optional-search-criteria e deste: http://expression.microsoft.com/en-us/dd571513.aspx)

Um abraço, Ricardo

Link to comment
Share on other sites

Boas,

Isso é um pouco complicado, porque estas a fazer por um datasource, ou seja pelo wizard, com isso é um pouco mais dificil de detectar os erros.

Mas aconselho a veres primeiro no acess mesmo fazeres uma consulta a veres se obtens resultados.

Se não obteres resultados o problema está no teu sql.

Cumprimentos Paulo Silva

Link to comment
Share on other sites

Obrigado Paulo pelo teu contributo!  😛 :P

Até fiz umas alterações / personalizações para entender melhor, ficou assim:

<body>
    <form id="form1" runat="server">
      First name: <asp:TextBox ID="txtFirstName" runat="server" /><br />
      Last name: <asp:TextBox ID="txtLastName" runat="server" /><br />
      Job Title: 
      <asp:DropDownList ID="lstTitle" runat="server" AppendDataBoundItems="True">
          <asp:ListItem Value="">Escolha...</asp:ListItem>
          <asp:ListItem Value="Sales Representative">Sales Representative</asp:ListItem>
          <asp:ListItem Value="Vice President, Sales">Vice President, Sales</asp:ListItem>
          <asp:ListItem Value="Sales Manager">Sales Manager</asp:ListItem>
          <asp:ListItem Value="Inside Sales Coordinator">Inside Sales Coordinator</asp:ListItem>
      </asp:DropDownList>
      <br />
      City: 
      <asp:DropDownList ID="lstCity" runat="server" AppendDataBoundItems="True">
          <asp:ListItem Value="">Escolha...</asp:ListItem>
          <asp:ListItem Value="Seattle">Seattle</asp:ListItem>
          <asp:ListItem Value="Tacoma">Tacoma</asp:ListItem>
          <asp:ListItem Value="Kirkland">Kirkland</asp:ListItem>
          <asp:ListItem Value="Redmond">Redmond</asp:ListItem>
          <asp:ListItem Value="London">London</asp:ListItem>
      </asp:DropDownList>
      <br />
      <asp:Button ID="Button1" runat="server" Text="Search" />
      <br />
         <asp:GridView 
          ID="GridView1" 
          runat="server" 
          DataSourceID="AccessDataSource1" 
          AllowPaging="True" 
          PageSize="5" EnableModelValidation="True" AllowSorting="True" 
                AutoGenerateColumns="False" EmptyDataText="Nenhum registo encontrado..." >
            <Columns>
                <asp:BoundField DataField="MyFirstName" HeaderText="FirstName" SortExpression="MyFirstName" />
                <asp:BoundField DataField="MyLastName" HeaderText="LastName" SortExpression="MyLastName" />
                <asp:BoundField DataField="MyTitle" HeaderText="Title" SortExpression="MyTitle" />
                <asp:BoundField DataField="MyCity" HeaderText="City" SortExpression="MyCity" />
                <asp:BoundField DataField="MyHomePhone" HeaderText="HomePhone" SortExpression="MyHomePhone" />
            </Columns>
         </asp:GridView>
            <asp:AccessDataSource 
              ID="AccessDataSource1" 
              runat="server" 
              DataFile="~/App_Data/Northwind.mdb"
              SelectCommand="SELECT MyFirstName, MyLastName, MyTitle, MyCity, MyHomePhone 
                FROM MyEmployees 
                WHERE (@strFirstName IS NULL OR MyFirstName LIKE '%' +  @strFirstName + '%') 
                AND (@strLastName IS NULL OR MyLastName LIKE '%' + @strLastName + '%') 
                AND (@strTitle IS NULL OR MyTitle LIKE '%' + @strTitle + '%') 
                AND (@strCity IS NULL OR MyCity LIKE '%' + @strCity + '%')" 
              CancelSelectOnNullParameter="False">
              <SelectParameters>
            	<asp:ControlParameter ControlID="txtFirstName" Name="strFirstName" Type="String" />
            	<asp:ControlParameter ControlID="txtLastName" Name="strLastName" Type="String" />
            	<asp:ControlParameter ControlID="lstTitle" Name="strTitle" Type="String" />
            	<asp:ControlParameter ControlID="lstCity" Name="strCity" Type="String" />
              </SelectParameters>
            </asp:AccessDataSource>
    </form>
</body>

e funciona.

No meu caso concreto e com acesso a SQL Server tenho assim:

<body>
    <form id="form1" runat="server">
    <div>
        <asp:DropDownList ID="lstCategorias" runat="server" 
            DataSourceID="DataSource_Categorias" DataTextField="Categoria_Nome" 
            DataValueField="Categoria_ID">
        </asp:DropDownList>
        <asp:SqlDataSource ID="DataSource_Categorias" runat="server" 
            ConnectionString="<%$ ConnectionStrings:Escolas2010_ConnectionString %>" 
            SelectCommand="SELECT Categoria_Nome, Categoria_ID FROM Categorias">
        </asp:SqlDataSource>
        <asp:DropDownList ID="lstPrioridades" runat="server" 
            DataSourceID="DataSource_Prioridades" DataTextField="Prioridade_Nome" 
            DataValueField="Prioridade_ID">
        </asp:DropDownList>
        <asp:SqlDataSource ID="DataSource_Prioridades" runat="server" 
            ConnectionString="<%$ ConnectionStrings:Escolas2010_ConnectionString %>" 
            SelectCommand="SELECT Prioridade_ID, Prioridade_Nome FROM Prioridades">
        </asp:SqlDataSource>
        Titulo:
        <asp:TextBox ID="txtTitulo" runat="server"></asp:TextBox>
        <asp:Button ID="Button1" runat="server" Text="Pesquisar..." />
        <br /><br />
        <asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
            AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="Pedido_ID" 
            DataSourceID="SqlDataSource3" EnableModelValidation="True" 
            EmptyDataText="Sem dados...">
            <Columns>
                <asp:BoundField DataField="Pedido_ID" HeaderText="Pedido_ID" 
                    InsertVisible="False" ReadOnly="True" SortExpression="Pedido_ID" />
                <asp:BoundField DataField="Pedido_Titulo" HeaderText="Pedido_Titulo" 
                    SortExpression="Pedido_Titulo" />
            </Columns>
        </asp:GridView>
        <asp:SqlDataSource ID="SqlDataSource3" runat="server" 
            ConnectionString="<%$ ConnectionStrings:Escolas2010_ConnectionString %>" 
            SelectCommand="SELECT Pedido_ID, Pedido_Via, Pedido_Estado, Pedido_Autor, Pedido_Categoria, Pedido_Prioridade, Pedido_Titulo 
                           FROM Pedidos 
                           WHERE (@Param_Cat IS NULL OR Pedido_Categoria LIKE '%' +  @Param_Cat + '%')
                           AND (@Param_Prior IS NULL OR Pedido_Prioridade LIKE '%' + @Param_Prior + '%')
                           AND (@Param_Tit IS NULL OR Pedido_Titulo LIKE '%' + @Param_Tit + '%')">
            <SelectParameters>
                <asp:ControlParameter ControlID="lstCategorias" Name="Param_Cat" Type="String" />
                <asp:ControlParameter ControlID="lstPrioridades" Name="Param_Prior" Type="String" />
                <asp:ControlParameter ControlID="txtTitulo" Name="Param_Tit" Type="String" />
            </SelectParameters>
        </asp:SqlDataSource>
    </div>
    </form>
</body>

Mas só funciona se preencher todos os campos e com dados que existam na BD, caso contrário não devolve nada...

Tenho andado a pesquisar como fazer no code-behind (tal como fazia no ASP), mas não encontro nada com que me esteja a entender...  ?

Se tiveres algum exemplo simples, de preferencia completo, e/ou literatura aconselhada, e se puderes envia. Desde já agradeço.  🙂

Um abraço, Ricardo

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.