Pesquisa parametrizada com JQuery Plugin [resolvido]

Olá Pessoal!

Quero realizar uma pesquisa parametrizada com o JQuery Plugin, mas não encontrei o caminho correto;

Eu possuo um action que pesquisa todas as minhas notas no banco, através do método getListaFrom(
Mas ela necessita de dois parâmetros o id_regional e o resumo, os quais devem ser informados pelo usuário.

Abaixo está a action:

.
.
.
	@Action(value = "/listaNotaEntrada", results = { 
		      @Result(name = "ok", type = "json") 
	  }) 
	  
	  
	public String execute(){
	  	int to = (rows * page);
	  	int from = to - rows;

	  	System.out.println("listajson");	
	  	Connection conn = new ConnectionFactory().getConnection();

		vnes = new Ven_notaentradaDAO(conn).getListaFrom( from+1,to, sidx + " "+ sord , id_regional,resumo);	
		
		records = 40;
	 
	    //calculate the total pages for the query  
	    total =(int) Math.ceil((double)records / (double)rows); 
	  
		records = vnes.size()*page;
	    
		return "ok";
	}

Esta action é chamada pelo jQuery plugin, contudo não sei como faço para passar estes parâmetros.
Eu criei dois input text para receberem os valores, correspondentes e um botão para enviá-los.
Mas não sei como fazer para enviá-los e em sequência fazer com o JQuery Plugin mostre os dados
no grid.


	 	Id. Regional:  	<input type="text" id="text_idregional" name="id_regional" />
	 	Resumo:        	&lt;input type="text" id="text_resumo" name="resumo" /&gt;<br/>


	 &lt;s:url id="remoteurl" 	action="listaNotaEntrada"/&gt;
	 &lt;s:url id="editurl"    action="updatenotaentrada" /&gt;
	
	 &lt;sjg:grid  
	        id="Table"	        
	        caption="Entrada de Notas"  
	        dataType="json"  
	        href="%{remoteurl}"  
	        pager="true"  
	        navigator="true"
	    	navigatorAddOptions="{height:280,reloadAfterSubmit:true}"
	    	navigatorEditOptions="{height:280,reloadAfterSubmit:false}"
	    	navigatorEdit="true"
	    	navigatorView="true"
	    	navigatorDelete="true"	        
	    	navigatorDeleteOptions="{height:280,reloadAfterSubmit:true}"
	        gridModel="vnes" 
	        rowList="10,15,20" 
	        rowNum="15" 
	        rownumbers="true"
	        editurl="%{editurl}"
	    	editinline="false"
	    	multiselect="false"
	    	viewrecords="true" 
	    &gt; 
	        &lt;sjg:gridColumn 
	        	name="id_entrada" 
	        	index="id_entrada" 
	        	title="Id. Entrada" 
	        	formatter="integer" 
	        	sortable="false"
	        	width="100"
	    		editable="true" 
	    		edittype="text"
	        	/&gt; 
	        &lt;sjg:gridColumn 
	        	name="descricao" 
	        	index="descricao" 
	        	title="Descricao" 
	        	sortable="true"
	        	width="300"
	    		editable="true" 
	    		edittype="text" /&gt; 
	        &lt;sjg:gridColumn 
	        	name="id_regional" 
	        	index="id_regional" 
	        	title="Regional" 
	        	sortable="true"
	        	width="100"
	    		editable="true" 
	    		edittype="text" 
	        	/&gt;
	        &lt;sjg:gridColumn 
	        	name="ano" 
	        	index="ano" 
	        	title="Ano" 
	        	sortable="true"
	        	width="100"
	    		editable="true" 
	    		edittype="text"
	        	/&gt;
	        &lt;sjg:gridColumn 
	        	name="faturado" 
	        	index="faturado" 
	        	title="Faturado" 
	        	sortable="true"
				width="100"
	    		editable="true" 
	    		edittype="text"	        	
	        	/&gt;
	    &lt;/sjg:grid&gt;  



Pessoal, como posso fazer isto?

Pessoal, será q vcs entenderam minha dúvida? Se não por favor me avise q tento postar de outra forma.
Obrigado!

Olá Pessoal!
Puxa, não houve nenhuma resposta, acho que não expliquei bem.

Pessoal, o JQuery Plugin, tem uma pesquisa padrão, na qual conseguimos pesquisar por um campo do grid.

Em meu caso, preciso fazer uma pesquisa com mais do que um campo do grid, preciso fazê-la com dois campos.

Minha dificuldade está cem como faço isto. Eu pensei em criar dois input text’s e um botão. Daí quando o usuário informasse os
parâmetros eu passaria os parâmetros para a action e queria q o grid fosse populado.

mas desta forma não funciona. Alguém tem alguma idéia de como poderia fazer isto. Tenho certeza que alguém já passou por esta necessidade.

Bem, talvez não seja possível, mas queria ter uma idéia.

Valeu pessoal, obrigado pela força!

Olá Pessoal!

Eu vi um exemplo parecido com o q preciso no code.google, mas não consigo entender exatamente onde eu coloco os parâmetros
e os valores

&lt;script&gt; $(document).ready(function () { $("#yourGridId").jqGrid('searchGrid', {multipleSearch:true} ); }); &lt;/script&gt;

alguém já fez algo assim?

Olá Pessoal descobri que o que deve ser feito é acrescentar esta propriedade no JQuery Plugin ao montá-lo no html:

navigatorSearchOptions="{multipleSearch:true}"

Desta forma torna-se possível realizar a pesquisa por mais do que um campo simultaneamente.

Contudo a action não consegue receber os parãmetros selecionados na pesquisa.

De forma normal estes são recebidos pelos parãmetros:

       // Search Field 
	private String              searchField; 
	 
	// The Search String 
	private String              searchString;

Mas quando implemento o navigatorSearchOptions="{multipleSearch:true}"

Eles não conseguem receber os parâmetros.

Olha só precisava saber se deve ser implementado na action um outro field tipo searchMultiple
não sei algo deste tipo

Bem, pelo visto ninguém nunca precisou disto.

Mas de qualquer forma obrigado!

Olá Pessoal, ou olá para mim mesmo rsrs, afinal só tem comentário meu! Acredito que tenha sido o primeiro a precisar disto, de qualquer forma espero q possa ajudar alguém!

Pessoal, o que eu gostaria de fazer era fazer uma pesquisa com meus componentes e mostrá-la no jquery plugin, contudo não consegui. Mas a forma alternativa
foi pesquisar com o próprio, mas este não possuía uma forma de pesquisar vários campos simultaneamente. Depois de contato com muitos e principalmente com o Yoshi, consegui algo. Vamos lá

Este tópico deveria ser pesquisa avançada com jqGrid;

primeiro passo depois de baixar e instalar o jquery plugin e criar a action que receberá os parâmetros e realizará a pesquisa:

  • Na jsp realizar os imports e criar a tela de visualização:
&lt;%@ page language="java" contentType="text/html; charset=ISO-8859-1"    pageEncoding="ISO-8859-1"%&gt;
&lt;%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %&gt;
&lt;%@ taglib prefix="s" uri="/struts-tags"%&gt; 
&lt;%@ taglib prefix="sj" uri="/struts-jquery-tags"%&gt;
&lt;%@ taglib prefix="sjg" uri="/struts-jquery-grid-tags"%&gt;

&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"&gt;
&lt;title&gt;Insert title here&lt;/title&gt;

	&lt;sj:head jqueryui="true" jquerytheme="start" /&gt;
&lt;/head&gt;
&lt;body&gt;
	&lt;h1&gt;Notas&lt;/h1&gt;

	<br>

	&lt;div id="nota"&gt;
	 &lt;s:url id="remoteurl" 	action="listaNotaEntrada"/&gt;
	 &lt;sjg:grid  
	        id="gridnota"
	        name="gridnota"	        
	        caption="Entrada de Notas"  
	        dataType="json"  
	        href="%{remoteurl}"  
	        pager="true"  
	        navigator="true"
	    	navigatorAddOptions="{height:280,reloadAfterSubmit:true}"
	    	navigatorEditOptions="{height:280,reloadAfterSubmit:false}"
	    	navigatorEdit="true"
	    	navigatorView="true"
	    	navigatorDelete="true"	        
	    	navigatorDeleteOptions="{height:280,reloadAfterSubmit:true}"
	    	navigatorSearchOptions="{multipleSearch:true}"
	        gridModel="vnes" 
	        rowList="10,15,20" 
	        rowNum="15" 
	        rownumbers="true"
	        editurl="%{editurl}"
	    	editinline="false"
	    	multiselect="false"	    	
	    	viewrecords="true" 
	    &gt; 
	        &lt;sjg:gridColumn 
	        	name="id_entrada" 
	        	index="id_entrada" 
	        	title="Id. Entrada" 
	        	formatter="integer" 
	        	sortable="false"
	        	width="100"
	    		editable="true" 
	    		edittype="text"
	    		search="false"
	        	/&gt; 
	        &lt;sjg:gridColumn 
	        	name="descricao" 
	        	index="descricao" 
	        	title="Descricao" 
	        	sortable="true"
	        	width="300"
	    		editable="true" 
	    		edittype="text"
	    		search="false" 
	    		/&gt;
 
	        &lt;sjg:gridColumn 
	        	name="id_regional" 
	        	index="id_regional" 
	        	title="Regional" 
	        	sortable="true"
	        	width="100"
	    		editable="true" 
	    		edittype="text"
	    		search="true"
	    		searchoptions="{sopt:['eq']}" 
	        	/&gt;
	        &lt;sjg:gridColumn 
	        	name="resumo" 
	        	index="resumo" 
	        	title="Resumo" 
	        	sortable="true"
	        	width="100"
	    		editable="true" 
	    		edittype="text"
	    		search="true"
	    		searchoptions="{sopt:['eq']}" 
	        	/&gt;	        	
	        &lt;sjg:gridColumn 
	        	name="ano" 
	        	index="ano" 
	        	title="Ano" 
	        	sortable="true"
	        	width="100"
	    		editable="true" 
	    		edittype="text"
	    		search="false"
	        	/&gt;
	        &lt;sjg:gridColumn 
	        	name="faturado" 
	        	index="faturado" 
	        	title="Faturado" 
	        	sortable="true"
				width="100"
	    		editable="true" 
	    		edittype="text"
	    		search="false"	    		       	
	        	/&gt;
	    &lt;/sjg:grid&gt;	
	&lt;/div&gt;

&lt;/body&gt;
&lt;/html&gt;

O principal ponto na jsp é acrescentar a opção:

navigatorSearchOptions="{multipleSearch:true}"

Esta fará com que seja possível pesquisar por mais do que um campo simultaneamente;

O próximo passo é configurar a action para receber as informações.
Veja que por padrão os parâmetros da pesquisa são recebidos pelos fields ou properties:

  • searchField
  • searchString

Contudo quando se habilita a opção multiplesearch, ficaria ruim enviar tudo numa string, então o desenvolvedor da ferramente
decidiu enviar pela propertie:

  • filters

em formato JSON;

Desta forma ao implementar a action, além de acrescentar as properties: rows, page deve ser acrescetanda a propertie filters, bem como seus métodos getter´s e setter´s
O único detalhe nesta questão é que os dados virão com o formato JSON, daí é só baixar as lib´s do mesmo e deserializá-lo.

No meu caso eu não consegui pois sempre dava algum erro de alguma coisa, daí fiz uma “adaptação técnica de caráter permanente” (gambiarra) lendo a string e recuperando as informações q eu precisava.
veja a action abaixo:

package gsa.action;

import gsa.dao.ConnectionFactory;
import gsa.dao.Ven_notaentrada;
import gsa.dao.Ven_notaentradaDAO;
import gsa.util.CclUtil;
import gsa.util.FieldMember;

import java.sql.Connection;
import java.util.List;

import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;


@ParentPackage( value="json-default" )
public class ListaNotaEntradaJqAction {

	private int resumo = 0;
	private int id_regional = 0;

	private List&lt;Ven_notaentrada&gt; vnes;
 
	private String				field;	
	private	String				data;
	
	private String				filters;
	
	//get how many rows we want to have into the grid - rowNum attribute in the grid 
	private Integer             rows             = 0; 
	 
	//Get the requested page. By default grid sets this to 1. 
	private Integer             page             = 0; 
	 
	// sorting order - asc or desc 
	private String              sord = "asc"; 
	 
	// get index row - i.e. user click to sort. 
	private String              sidx=""; 
	 
	// Search Field 
	private String              searchField; 
	 
	// The Search String 
	private String              searchString = "0";
	
	private String				searchGrid;
	 
	// he Search Operation ['eq','ne','lt','le','gt','ge','bw','bn','in','ni','ew','en','cn','nc']  
	private String              searchOper; 
	 
	// Your Total Pages 
	private Integer             total            = 0; 
	 
	// All Record 
	private Integer             records          = 0; 

	
	public String getSearchGrid() {
		return searchGrid;
	}


	public void setSearchGrid(String searchGrid) {
		this.searchGrid = searchGrid;
	}

	
	
	public int getResumo() {
		return resumo;
	}


	public void setResumo(int resumo) {
		this.resumo = resumo;
	}


	public int getId_regional() {
		return id_regional;
	}


	public void setId_regional(int idRegional) {
		id_regional = idRegional;
	}
	
	public List&lt;Ven_notaentrada&gt; getVnes() {
		return vnes;
	}


	public void setVnes(List&lt;Ven_notaentrada&gt; vnes) {
		this.vnes = vnes;
	}


	public Integer getRows() {
		return rows;
	}


	public void setRows(Integer rows) {
		this.rows = rows;
	}


	public Integer getPage() {
		return page;
	}


	public void setPage(Integer page) {
		this.page = page;
	}


	public String getSord() {
		return sord;
	}


	public void setSord(String sord) {
		this.sord = sord;
	}


	public String getSidx() {
		return sidx;
	}


	public void setSidx(String sidx) {
		this.sidx = sidx;
	}


	public String getSearchField() {
		return searchField;
	}


	public void setSearchField(String searchField) {
		this.searchField = searchField;
	}


	public String getSearchString() {
		return searchString;
	}


	public void setSearchString(String searchString) {
		this.searchString = searchString;
	}


	public String getSearchOper() {
		return searchOper;
	}


	public void setSearchOper(String searchOper) {
		this.searchOper = searchOper;
	}


	public Integer getTotal() {
		return total;
	}


	public void setTotal(Integer total) {
		this.total = total;
	}


	public Integer getRecords() {
		return records;
	}


	public void setRecords(Integer records) {
		this.records = records;
	}


	
	public String getField() {
		return field;
	}


	public void setField(String field) {
		this.field = field;
	}


	public String getData() {
		return data;
	}


	public void setData(String data) {
		this.data = data;
	}
		

	public String getFilters() {
		return filters;
	}


	public void setFilters(String filters) {
	/*	JSONObject json	= new JSONObject().fromObject( filters );
		System.out.println( json.get("groupOP") );
		JSONArray jsona	=	new JSONArray().fromObject(json.getJSONArray("rules"));		
		System.out.println( jsona.getString(0));
		System.out.println( jsona.getString(1) );
		
		//{"groupOp":"AND","rules":[{"field":"id_regional","op":"eq","data":"1"},{"field":"resumo","op":"eq","data":"0"}]}		
		System.out.println("Converteu o bean"); */

		/*	
		JSONObject json = new JSONObject().fromObject(filters);
		JSONArray jsona	=	new JSONArray().fromObject(json.getJSONArray("rules"));
		
		System.out.println( jsona.size() );
		System.out.println( jsona.getString(0));		
		System.out.println( jsona.getString(1) );	
		System.out.println("ok");
		*/

		// aqui foi a classe q criei para receber o json e deserializá-lo. ele devolve uma list da classe FieldMember que tem os 3 campos retornados pelo filters:  "field", "op" e "data"
                // vou postar a classe abaixo, mas veja sou inciante em java deve ter uma forma muito mais elegante de fazer isto   
                // perceba q se o pluglin do json tivesse dado certo nada do que está abaixo seria necessário. quem sabe alguém consiga implementar e poste para gente
		CclUtil util 	= new CclUtil();
		List&lt;FieldMember&gt; fields = util.GetJsonValues(filters);

		int i = 0;
		for( FieldMember field : fields ) {
			if (i == 0 )
				id_regional = Integer.parseInt( field.getData());
			else
				resumo = Integer.parseInt( field.getData());						
			i++;
		}		 				
		
		this.filters = filters;
	}


	@Action(value = "/listaNotaEntrada", results = { 
		      @Result(name = "ok", type = "json"  ) 
	  }) 
	  
	  
	public String execute(){
	  	int to = (rows * page);
	  	int from = to - rows;
	  		  	
	  	System.out.println("listajson");	
	  	Connection conn = new ConnectionFactory().getConnection();

                // aqui vem o método da sua DAO com a pesquisa parametrizada por page e seus orders. Veja aqui os campos que eu precisava id_regional e resumo 
		vnes = new Ven_notaentradaDAO(conn).getListaFrom( from+1,to, sidx + " "+ sord , id_regional,resumo);	
		
		records = 40;
	 
	    //calculate the total pages for the query  
	    total =(int) Math.ceil((double)records / (double)rows); 
	  
		records = vnes.size()*page;
	    
		
		
		return "ok";
	}
	
}


classe auxiliares:

FieldMember

package gsa.util;

public class FieldMember {

	private String field;
	private String op;
	private String data;
	
	public String getField() {
		return field;
	}
	public void setField(String field) {
		this.field = field;
	}
	public String getOp() {
		return op;
	}
	public void setOp(String op) {
		this.op = op;
	}
	public String getData() {
		return data;
	}
	public void setData(String data) {
		this.data = data;
	}
	
	
	
}

CclUtil

package gsa.util;

import java.util.ArrayList;
import java.util.List;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class CclUtil {
		
	public List&lt;FieldMember&gt; GetJsonValues( String json ) {	
		JSONObject obj 			= new JSONObject().fromObject(json);
		JSONArray objarray		= new JSONArray().fromObject(obj.getJSONArray("rules"));
				
		List&lt;FieldMember&gt; fms	= new ArrayList&lt;FieldMember&gt;();

		//{"groupOp":"AND","rules":[{"field":"id_regional","op":"eq","data":"1"},{"field":"resumo","op":"eq","data":"0"}]}
		//{"field":"id_regional","op":"eq","data":"1"}
		
		for ( int i=0;i&lt;objarray.size();i++ ){
			String str = objarray.getString(i);
			str = str.replace("\"",""); 
			str = str.replace("{","");
			str = str.replace("}","");

			String[] fields = new String[3];
			for (int j = 0; j &gt;&lt; 3; j++) {								
				int index 	= str.indexOf(&quot;:&quot;);
				int index2 	= str.indexOf(&quot;,&quot;);
				boolean copiar = true;
			
				// copiar o conteúdo ainda não lido e ignorar o já lido. qdo não houver mais vírgulas copiar tudo o que restou (length)
				if ( index2 &lt; 0 ) {
					index2 = str.length();
					copiar = false;
				}
				
				fields[j] 	= str.substring( index+1,index2 );

				if ( copiar ) {
					str	= str.substring( index2+1);
				}
			}
			
			FieldMember fm	= new FieldMember();
			fm.setField( fields[0]);
			fm.setOp(fields[1]);
			fm.setData(fields[2]);
			
			fms.add(fm);			
		}
					
		return fms;
	}

}

Bem pessoal foi isso aí, espero q seja útil para pelo menos 1 pessoa, pq deu um trabalhao chegar até aqui, ufa, rsrs!

Valeu!

[quote=kweles]Olá Pessoal!

Quero realizar uma pesquisa parametrizada com o JQuery Plugin, mas não encontrei o caminho correto;

Eu possuo um action que pesquisa todas as minhas notas no banco, através do método getListaFrom(
Mas ela necessita de dois parâmetros o id_regional e o resumo, os quais devem ser informados pelo usuário.

Abaixo está a action:

.
.
.
	@Action(value = "/listaNotaEntrada", results = { 
		      @Result(name = "ok", type = "json") 
	  }) 
	  
	  
	public String execute(){
	  	int to = (rows * page);
	  	int from = to - rows;

	  	System.out.println("listajson");	
	  	Connection conn = new ConnectionFactory().getConnection();

		vnes = new Ven_notaentradaDAO(conn).getListaFrom( from+1,to, sidx + " "+ sord , id_regional,resumo);	
		
		records = 40;
	 
	    //calculate the total pages for the query  
	    total =(int) Math.ceil((double)records / (double)rows); 
	  
		records = vnes.size()*page;
	    
		return "ok";
	}

Esta action é chamada pelo jQuery plugin, contudo não sei como faço para passar estes parâmetros.
Eu criei dois input text para receberem os valores, correspondentes e um botão para enviá-los.
Mas não sei como fazer para enviá-los e em sequência fazer com o JQuery Plugin mostre os dados
no grid.


	 	Id. Regional:  	&lt;input type="text" id="text_idregional" name="id_regional" /&gt;
	 	Resumo:        	&lt;input type="text" id="text_resumo" name="resumo" /&gt;<br/>


	 &lt;s:url id="remoteurl" 	action="listaNotaEntrada"/&gt;
	 &lt;s:url id="editurl"    action="updatenotaentrada" /&gt;
	
	 &lt;sjg:grid  
	        id="Table"	        
	        caption="Entrada de Notas"  
	        dataType="json"  
	        href="%{remoteurl}"  
	        pager="true"  
	        navigator="true"
	    	navigatorAddOptions="{height:280,reloadAfterSubmit:true}"
	    	navigatorEditOptions="{height:280,reloadAfterSubmit:false}"
	    	navigatorEdit="true"
	    	navigatorView="true"
	    	navigatorDelete="true"	        
	    	navigatorDeleteOptions="{height:280,reloadAfterSubmit:true}"
	        gridModel="vnes" 
	        rowList="10,15,20" 
	        rowNum="15" 
	        rownumbers="true"
	        editurl="%{editurl}"
	    	editinline="false"
	    	multiselect="false"
	    	viewrecords="true" 
	    &gt; 
	        &lt;sjg:gridColumn 
	        	name="id_entrada" 
	        	index="id_entrada" 
	        	title="Id. Entrada" 
	        	formatter="integer" 
	        	sortable="false"
	        	width="100"
	    		editable="true" 
	    		edittype="text"
	        	/&gt; 
	        &lt;sjg:gridColumn 
	        	name="descricao" 
	        	index="descricao" 
	        	title="Descricao" 
	        	sortable="true"
	        	width="300"
	    		editable="true" 
	    		edittype="text" /&gt; 
	        &lt;sjg:gridColumn 
	        	name="id_regional" 
	        	index="id_regional" 
	        	title="Regional" 
	        	sortable="true"
	        	width="100"
	    		editable="true" 
	    		edittype="text" 
	        	/&gt;
	        &lt;sjg:gridColumn 
	        	name="ano" 
	        	index="ano" 
	        	title="Ano" 
	        	sortable="true"
	        	width="100"
	    		editable="true" 
	    		edittype="text"
	        	/&gt;
	        &lt;sjg:gridColumn 
	        	name="faturado" 
	        	index="faturado" 
	        	title="Faturado" 
	        	sortable="true"
				width="100"
	    		editable="true" 
	    		edittype="text"	        	
	        	/&gt;
	    &lt;/sjg:grid&gt;  



Pessoal, como posso fazer isto?

Pessoal, será q vcs entenderam minha dúvida? Se não por favor me avise q tento postar de outra forma.
Obrigado!

[/quote]