segunda-feira, 8 de setembro de 2008

DbLookup na Web

Quem de nós, desenvolvedores web, nunca precisou utilizar um Dblookup em uma pagina de web? E quando utilizava tinha que colocar em um campo para e fazer o famoso refresh da pagina? Pois caro amigo, passei por esse problema. Agora, venho aqui facilitar a vida dos colegas que precisa de uma solução rápida para o dblookup na web. Pense no seguinte: você precisa atualizar um campo ou fazer um innerHtml em um elemento através de um valor selecionado em um bendito campo combo. Mas isso sem fazer um refresh da pagina, pois vc sabe que quando dependendo do dado é perdido tudo que foi digitado. Vou aqui se utilizar de uma técnica parecida que vi no site CODESTORE, mas não irei utilizar o codigo que existe lá, só a ideia.
Para começar temos que criar uma Page com o nome doDBLookup. Pode ser qualquer, mas esse é como uma referencia para o que vamos fazer. Nessa page vamos adicionar um Computed Value com a seguinte formula:


server:=@UrlQueryString("server");
database:=@UrlQueryString("file");
view:=@UrlQueryString("view");
key:=@UrlQueryString("key");

fetch:=@If(@UrlQueryString("field")=""; @TextToNumber(@UrlQueryString("column"));@UrlQueryString("field"));

list := @DbLookup(""; server:database; view; key; fetch);

@If(@IsError(list); "Error"; @Implode(@Text(list);@NewLine))

Salve a page, pois ela será nossa pagina de pesquisa atravéz de QueryString.

Calma que você vai entender.

Agora, vamos a nossa biblioteca de scripts e criar uma nova biblioteca em JavaScript e adicionar o seguinte código:

function doLookup(oServer, oDb, oView, oKey, oColumn, oField){
/*
oServer = Servidor de Pesquisa
oDb = Bando de Dados de Pesquisa
OView = View que deseja pesquisar
oKey = Chave de pesquisa na view
oColumn = Numero da coluna de retorno;
oField = Nome do Campo que deseja o retorno;
*/
var x, objXMLHTTP, URL, postVars;
var f = document.forms[0];
try{
if(window.XMLHttpRequest){
objXMLHTTP = new XMLHttpRequest();
}else if(window.ActiveXObject){
try{
objXMLHTTP = new ActiveXObject("Msxml2.XMLHTTP");
}catch(e){
try{
objXMLHTTP = new ActiveXObject("Microsoft.XMLHTTP")
}catch(e){
return false;
}
}
}else{
return false;
};

URL = 'doDBLookup?openpage';
postVars = '&server=' + oServer+'&file='+oDb+'&view='+oView+'&key='+oKey+'&field='+oField+'&column='+oColumn;

objXMLHTTP.open('GET', URL+postVars, false);
objXMLHTTP.setRequestHeader("Content-type", "text/html; charset=iso-8859-1");
objXMLHTTP.setRequestHeader("Content-Language", "pt-br");
objXMLHTTP.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
objXMLHTTP.setRequestHeader("Connection", "close");

objXMLHTTP.send();

//responseText sendo atribuido a um campo
f.Result.value = objXMLHTTP.responseText;

x = null; objXMLHTTP = null; f = null, URL = null, postVars = null;
}catch(x){
alert('Erro ao carregar a página, tente novamente.');
x = null; objXMLHTTP = null; f = null, URL = null, postVars = null;
};
}

Meu amigo Thiago Diniz me ajudou a projetar esse código.
Salve a biblioteca, pois é atravéz dela que iremos instanciar na pagina onde faremos a busca. Esse código é reponsavel por receber os parametros e adiciona em um campo no código conforme comentário. No caso da consulta não for utilizar campo deixe o parametro vazio (''), agora se for utilizar campo deixe o parametro Coluna vazio ('').

Faça a chamada dessa biblioteca em seu formulário no HTML Head Content:

"< src =" \" language =" \" type =" \"> < /script > " + @NewLine

A função será disparada pelo campo que será a chave de pesquisa no onBlur:

doLookup(document.forms[0].Server.value, document.forms[0].Database.value, 'vocTipoDespesa', getSelectValue('dlgDespesa'), '2', '')


Segue a função getSelectValue:

function getSelectValue(name){
var indice = eval("document.forms[0]."+name+".selectedIndex");
var valor = eval("document.forms[0]."+name+".options["+indice+"].value");
return(valor);
}

Nenhum comentário: