Array
(
)

Pesquisa Generica

Hal9000
   - 19 mai 2008

Olá a todos!

Estou tentando fazer uma pesquisa genérica para usar em todas as telas do meu sistema, seria uma tela popup que retornaria a chave primaria do registro escolhido. Até ai tudo bem, mas quando eu retorno a Chave para a tela que chamou eu precisaria realizar uma consulta completa no banco e então trazer todos os campos na tela, mas usando java script não consigo disparar a minha rotina que retorna todos os campos, baseada na chave que escolhi. Eu poderia colocar um botão mas então o usuário teria dois trabalhos o de clicar no item pesquisado e depois no botão ´carregar´ para preencher todos os campos (arghhhh..) Eu poderia retornar tudo com variáveis de sessão mas ai a minha tela de pesquisa deixaria de ser genérica. :(

Alguém tem alguma solução? Que meios vc´s nas telas de pesquisa?
Afinal dá pra disparar uma função code Behind com Java Script?
ou o jeito é usar um botão (Arghhhh..) carregar?

:?: :?: :?:

Ricardo Silva
   - 20 mai 2008

Veio tem que fazer isto usando ajax...

a Microsoft tem um pacote as.net Ajax que faz isso
www.asp.net

se naum me engano vc faz uma metodo servido (WebMethod) estatica no code Behind e em javaScript vc utiliza o PageMethods para chamar seu metodo servidor e consumilo.
é que estou com presa... se interesa eu te explico mais tarde.

entra no site acima e da uma pesquisada...

na duvida soh posta

Hal9000
   - 26 mai 2008

Então...

Dei uma pesquisada nos Web Service e Web Methods, não não achei nada relativo a disparar o Code-Behind. meu problema é que eu quero passar só a PK da tela de pesquisa que seria uma PopUp para a tela que a chamou. Mas então eu preciso fazer uma pesquisa para carregar os dados na tela principal assim que eu fechar minha tela de pesquisa. Ohhhh Vida. no Desktop isso é tão facil :(

Será que não tem nenhum link com um exemplo de como se pode fazer isso? Continuo procurando...

Ricardo Silva
   - 26 mai 2008

no começo era dificil de entender.... axava que burlava a Orientação Objeto
Mas depois eu li e reli, depois li denovo estes dois pote
da uma lida nesles, se naum entr]ender le denovo.... ajuda pra karalh..
http://imasters.uol.com.br/artigo/7951/ajax/passando_um_dataset_do_aspnet_para_o_javascript/

http://www.linhadecodigo.com.br/ArtigoImpressao.aspx?id=1275

na duvida soh posta

Hal9000
   - 26 mai 2008

Olá RicaJedidia

Eu acho que vou ficar louco de tando ler rs...

Gostei desse link sobre a passagem do DataSet vou ver com mais calma, mas fiquei preocupado com uma coisa agora. Eu pretendo fazer uma rotina genérica para pesquisa então seria uma página com um grid que receberia um SQL para preencher um grid sempre com dois parametros ´Código´ , ´Descrição´ e teria um botão select para eu Capturar a Pk do campo e então disparar uma função que carregaria os campos na tela que chamou o PopUp. Perfeito! Mas...

Me toquei agora: Como eu vou disparar uma função na minha popup se sendo que essa função tá na página que a chamou?!? Minha esperança era a de usar o PostBack, mas testei e quando fecho o PopUp ele não gera um PostBack na página que chamou. :(

Eu poderia centralizar todas as minhas buscas na minha página de pesquisa, mas... (arghhhh...)

Vc tem ideia do que eu teria que usar para disparar a função que está na outra página?!?

Agora tb não vou desistir! Tenho que fazer esse negocio funcionar!!! Mas sem gambiarra rs...

Ricardo Silva
   - 26 mai 2008

como diz meu prof....
´Amiguinhuuu....´ existe um metodo nas paginas Filhos (popUp) que podem xamar o dom da pagina pai.

se eu naum estou enganado é assim:
#Código

window.opener.document.forms[0].TextBox1.value = "pagina PopUp"


desculpe se estiver errado... mas procura algo sobre ´window.opner´ q vc se da bem....

Ah e ler vc vai ter q ler mesmuuu naum tem outro geito... a não ser se vc tercerizar - fora de cogitação neh....

na duvida soh posta

Hal9000
   - 26 mai 2008

Opa!

Não, não esse metodo eu conheço e uso:
´window.opener.document.forms[0].TextBox1.value = ´pagina PopUp´

A atribuição de valor não me adianta. Eu preciso é quando fechar meu PopUp disparar uma função que está no form que chamou o PopUp Originalmente.

Exemplo:

Tenho um Botão Pesquisar no form Cliente que abre um popup com minha pesquisa genérica. quando eu escolho um cliente no popup eu recupero a PK dele, e disparo uma Função lá no meu form cliente que vai fazer uma pesquisa no banco e recuperar todos os dados na tela.

O problema é como disparar essa função? Eu poderia fazer um teste com uma variável de sessão no load da pagina cliente, mas o fechamento do popup não faz a pagina cliente executar um post back.

De volta a prancheta... Alguma idéia? :(

Hal9000
   - 29 mai 2008

Poxa ninguém tem idéia de como fazer isso?!? :(

Burnbr
   - 30 mai 2008

Cara tente ver um pouco de Ajax para ver se resolve
Att

Hal9000
   - 01 jun 2008

Provavelmente vou ter que usar Page Methods, mas ainda tenho o problema de: Como chamar um page method da pagina que chamou o pop, estando na pagina de pop up :!: :?: :!:

Alguém??? Alguém sabe????

Andrecerveira
   - 04 jun 2008

Sou novo em ASP.NET e AJAX também. 4 meses de exp.

Gostaria de saber se você ja conseguiu resolver este problema. Visto que eu ainda não.

Fico agradecido por ajudas.

Andrecerveira
   - 04 jun 2008


Citação:
Sou novo em ASP.NET e AJAX também. 4 meses de exp.

Gostaria de saber se você ja conseguiu resolver este problema. Visto que eu ainda não.

Fico agradecido por ajudas.


Na verdade estava pensando em usar Modal PopUp Extender do AjaxControlToolKit que eh bastante prático e elegante, mas não achei alguma explicação de como abrir página .aspx ao invés de Painel. Alguém sabe me dizer se páginas aspx podem ser abertas no conteúdo do Modal PopUp Extender?

Ricardo Silva
   - 05 jun 2008

o q se pode fazer é um controle personalizado.
e adicionar dinamicamente. não me pergunte como fazer isso... cada caso um caso.
e o Modal PopUp Extender tem uma propriedade de Dispose, q vc pode disparar qlqr PageMethods.

estuda lah...

Hal9000
   - 05 jun 2008

O Gente! Não sabia que o ModalPopup podia abrir página Aspx... Vou testar e assim que conferir os resultados eu posto aqui...

Ohhhh! A solução se aproxima... Tomara.. :)

Andrecerveira
   - 05 jun 2008

Então o Modal PopUp Extender não permite que outra página .aspx seja aberta como conteúdo dele, apenas controle personalizado?

Andrecerveira
   - 09 jun 2008

Hal. Eu fiz o seguinte e tive um bom resultado.
Abri meu popUp utilizando o seguinte código no evento click do botão da página chamadora (pagina1.aspx):

protected void btnSacBusca_Click(object sender, ImageClickEventArgs e)
{
string Jscript;
Jscript = ´<script type=´text/javascript´ language=´javascript´>´ + ´window.open(´pagina2.aspx?chamada = pagina1´,´_Nome´,´width=614,height=510,left=270,top=100´) </script>´;
ClientScript.RegisterStartupScript(GetType(), ´abrirjanela´, Jscript, false);
}

Ao invés de utilizar passagem de parâmetros por queryString (?chamada = pagina1) poderia alimentar uma variável de sessão.

Quando abro a página2.aspx neste popUp, o evento Page_Load da mesma faz uma verificação se é postBack ou não.
Se não for, significa que alguma foi aberto pela primeira vez.

if(!this.IsPostBack)
{
if ((Request[´chamada´] == null) == false) //verifica se existe a passagem de parâmetro por queryString. Foi bom para eu fazer esta verificação pois esta página eu também abro sem ser em popUp. E quando abro diretamente não preciso informar quem foi a página chamadora.
//Se for ter que verificar a SESSION eu utilizaria desta forma
{
if(Request[´chamada´].ToString() == ´pagina1´)
//if (Session[´Chamada´].ToString() == ´pagina1´)
{
//aqui mesmo eu executo alguns métodos como uma busca através de um parâmetro que vem da primeira página.
}
}
...
}
...

//Evento do botão OK que retorna para a página chamadora (pagina1)
protected void btnOK_Click(object sender, EventArgs e)
{
if ((Request[´chamada´] == null) == false)
{
if(Request[´chamada´].ToString() == ´pagina1´)
{
//aqui chamo o método que você estava precisando chamar e que estava presente na págna1.aspx
//Na verdade não entendi se este método está em uma classe. Se está no form aspx ou mesmo se é um método estático.
//No meu caso ficou mais organizado manter este método aqui no form pagina2.aspx do que presente na página1.aspx. com oestava antes.

//aqui executo o método como por exemplo:
variavel1 = buscaNomeCliente(cpfCliente);
variavel2 = buscaEnderecoCliente(CEPCliente);

//para retornar para a página chamadora (pagina1.aspx) utilizei JavaScript

string strScript = ´<script>window.opener.document.getElementById(´ctl00$ContentPlaceHolder1$txtNomeCliente´).value = ´´;
strScript += variavel1;
strScript += ´´;window.opener.document.getElementById(´ctl00$ContentPlaceHolder1$txtEnderecoCliente´).value = ´´;
strScript += variavel2;
strScript += ´´;self.close()´;
strScript += ´</script>´;
ClientScript.RegisterClientScriptBlock(GetType(), ´teste´, strScript);
}
}

Neste meu script window.opener eu consegui apenas popular na página chamadora (pagina1) controles do tipo TextBox.
Creio que exista algum comando javascript que deva ser inserido ou modficado na linha window.opener.document... que popule labels.

Bom, descrevi aqui atualmente como consegui CONTORNAR o problema descrito acima por você e por mim.

Poxa, espero ter ajudado mas, caso alguém tenha uma solução mais elegante, por favor, não deixem de postar.

Falow. Até mais.

André Cerveira.

Ricardo Silva
   - 11 jun 2008

eu pensei nisso:

Code BeHide
#Código

    #region privates
    private string _caption;
    private string _codigo;
    private string _descricao;
    private string _table;
    private int _i;
    endregion
    region Properties
    public string Caption {
        get { return _caption; }
        set { _caption = value; }
    }
    public string Codigo {
        get { return _codigo; }
        set { _codigo = value; }
    }
    public string Descricao {
        get { return _descricao; }
        set { _descricao = value; }
    }
    public string Tabela {
        get { return _table; }
        set { _table = value; }
    }
    endregion

    private DataTable consultar(string where, string value) {
        string query = "SELECT " + _codigo + " as codigo , " + _descricao + " as descricao FROM " + _table + where;
        SqlCommand comando = new SqlCommand(query);
        comando.Parameters.Add("@VALUE", SqlDbType.VarChar, 50).Value = value;

        return SysHouse.Persistencia.Persistir.consultar(comando).Tables[0];
    }
    private DataTable consultar(string value) {
        DataTable dt = null;

        if(SysHouse.Documento.isNumber(value))
            dt = consultar(" WHERE " + _codigo + " = @VALUE", value);
        else
            dt = consultar(" WHERE " + _descricao + " LIKE @VALUE ORDER BY " + _descricao, value + "¬");

        if(dt.Rows.Count == 0)
            if(SysHouse.Documento.isNumber(value))
                dt = consultar(" WHERE " + _codigo + " >= @VALUE", value);
            else
                dt = consultar(" WHERE " + _descricao + " >= @VALUE ORDER BY " + _descricao, value + "¬");
        
        if(dt.Rows.Count == 0) {
            string jScript = "";
            jScript += "<script type=´text/javascript´> ";
            jScript += "alert(´Nenhum registro econtrado.´);";
            jScript += "</script>";

            Page.ClientScript.RegisterStartupScript(Page.GetType(), "MSG", jScript, false);
        }
        return dt;
    }

Preenche as propriedades da pagina, que forma passadas por Parametros. eu fiz por QueryStrig, mas pode ser feito por Session sem problema.
#Código
protected void Page_Load(object sender, EventArgs e) {
        //testePesquisa.aspx?codigo=COD_CID&descricao=NOM_CID&tabela=CIDADES&caption=Pesquisa&texto=&campo=TextBox1
        if(Request.QueryString["codigo"] != null)
            Codigo = Request.QueryString["codigo"].ToString();
        if(Request.QueryString["descricao"] != null)
            Descricao = Request.QueryString["descricao"].ToString();
        if(Request.QueryString["tabela"] != null)
            Tabela = Request.QueryString["tabela"].ToString();
        
        if(!IsPostBack){
            if(Request.QueryString["caption"] != null)
                Caption = Request.QueryString["caption"].ToString();
            if(Request.QueryString["texto"] != null)
                txtTexto.Text = Request.QueryString["texto"].ToString();
            if(Request.QueryString["campo"] != null) {
                string jScript = "";
                jScript += "<script type=´text/javascript´> ";
                jScript += "setCampo(´" + Request.QueryString["campo"].ToString() + "´);";
                jScript += "</script>";

                ScriptManager.RegisterStartupScript(this.Page, this.GetType(), "_set", jScript, false);
            }

            Title = _caption + " " + _table;
            txtTexto_TextChanged(sender, e);
        }
    }

aqui eu faço a consulta
#Código
protected void txtTexto_TextChanged(object sender, EventArgs e) {
        DataTable dt = consultar(txtTexto.Text);

        grid.DataSource = dt;
        grid.DataBind();
    }

aki eh pra fazer uma graça.
#Código
protected void grid_RowDataBound(object sender, GridViewRowEventArgs e) {
        if(e.Row.RowType == DataControlRowType.DataRow && (
            e.Row.RowState == DataControlRowState.Alternate || 
            e.Row.RowState == DataControlRowState.Normal)) {

            e.Row.Attributes.Add("onMouseOver", "this.style.cursor=´hand´;");

            e.Row.Attributes.Add("id", _i.ToString());

            e.Row.Attributes.Add("value", int.Parse(e.Row.Cells[0].Text).ToString("00000"));

            e.Row.Attributes.Add("descricao", e.Row.Cells[1].Text);

            e.Row.Attributes.Add("onKeyDown", "SelectRow();");
            
            e.Row.Attributes.Add("onClick", "MarkRow(" + _i.ToString() + ");");

            e.Row.Attributes.Add("onDblClick", "returnRow();");
            
            _i++;
        }
    }

função javaScript pra complementar a graça
#Código
var currentRowId = 0;
        var _oldColor;
        var _campo;

        function SetNewColor(source){
            _oldColor = source.style.backgroundColor;
            source.style.backgroundColor = ´#0054e3´;    
        }
        function SetOldColor(source){
            source.style.backgroundColor = _oldColor;
        }
        function SelectRow(){
            if (event.keyCode == 40)
                MarkRow(currentRowId+1);
            else if (event.keyCode == 38)
                MarkRow(currentRowId-1);
            if (event.keyCode == 13)
                returnRow();            
        }
        function MarkRow(rowId){
            if (document.getElementById(rowId) == null)
                return;
            if (document.getElementById(currentRowId) != null){
                document.getElementById(currentRowId).style.backgroundColor = _oldColor;
                document.getElementById(currentRowId).style.color= ´Black´;
            }
            currentRowId = rowId;
            SetNewColor(document.getElementById(rowId));
            //document.getElementById(rowId).style.backgroundColor = ´#0054e3´;
            document.getElementById(rowId).style.color= ´White´;
        }
        function returnRow(){
            window.opener.document.forms[0].document.getElementById(_campo).value = "";
            window.opener.document.forms[0].document.getElementById(_campo).value = document.getElementById(currentRowId).value + " - " + document.getElementById(currentRowId).descricao;
                       
            //window.opener.document.forms[0].TextBox1.value = "";
            //window.opener.document.forms[0].TextBox1.value = document.getElementById(currentRowId).value + " - " + document.getElementById(currentRowId).descricao;
            close();
        }        
        function setCampo(value){
            _campo = value;
        }

code Asp. a pagina ta com ajax.
#Código
<div>
        <asp:ScriptManager ID="ScriptManager1" runat="server">
        </asp:ScriptManager>
        <asp:Label ID="Label1" runat="server" Text="Texto:"></asp:Label>
        <asp:TextBox ID="txtTexto" runat="server" AutoPostBack="True" OnTextChanged="txtTexto_TextChanged"
            Width="250px"></asp:TextBox>
        <hr />
        <div style="width: 400px; height: 250px; background-color: white; border-right: 1px solid; border-top: 1px solid; overflow: auto; border-left: 1px solid; border-bottom: 1px solid;">
            <asp:UpdatePanel ID="UpdatePanel1" runat="server">
                <ContentTemplate>
            <asp:GridView ID="grid" runat="server" OnRowDataBound="grid_RowDataBound" AutoGenerateColumns="False">
                <Columns>
                    <asp:BoundField DataField="codigo" HeaderText="Código">
                        <HeaderStyle HorizontalAlign="Left" />
                        <ItemStyle HorizontalAlign="Right" Width="90px" />
                    </asp:BoundField>
                    <asp:BoundField DataField="descricao" HeaderText="Descriç&227;o">
                        <HeaderStyle HorizontalAlign="Left" />
                        <ItemStyle HorizontalAlign="Left" Width="300px" />
                    </asp:BoundField>
                </Columns>
            </asp:GridView>
                </ContentTemplate>
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="txtTexto" EventName="TextChanged" />
                </Triggers>
            </asp:UpdatePanel>
        </div>
    
    </div>
        <hr />
        <asp:Label ID="Label2" runat="server" Text="Duplo Clique para Selecionar"></asp:Label>


Andrecerveira
   - 11 jun 2008

Por favor. Poste também o conteúdo da classe SysHouse. Gostaria de visualizar seus métodos de persistência.

Ricardo Silva
   - 12 jun 2008

entaum veio...

o sysHouse é uma dll, q montamos aki na empresa...
eu não tenhuuu permissão de divulga-la....
mas assim... o interessante eh a passagem de parametro para montar a pesquisa generica...

se tiver algumna duvida qnto a isso é soh posta...

Signori
   - 31 jul 2008


Citação:
O Gente! Não sabia que o ModalPopup podia abrir página Aspx... Vou testar e assim que conferir os resultados eu posto aqui...

Ohhhh! A solução se aproxima... Tomara.. :)


Cara olha os ultimos posts desse tópico ai...
http://forum.devmedia.com.br/viewtopic.php?t=89934

axo que pode te ajudar.
flw