• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Tesla

JavaScript + ASP = DOR DE CABEÇA!

4 mensagens neste tópico

Ora bem... então é o seguinte:

estou a criar uma aplicação com base em ASP + SQL Server. Neste momento deparei-me com uma situação de criação de uma listbox de acordo com a selecção feita noutra listbox.

Para resolver este problema, decidi criar um código misto de Javascript e ASP que me permite puxar todos os dados necessários para a página e assim fazer tudo apartir do cliente, indo uma unica vez ao servidor recolher informação. Long story short: estou a usar o JS + ASP para criar um código JS que a página leia de forma a actualizar a segunda listbox de acordo com a primeira... o código...

<script language="javascript">

function codigos(teste) 
{
document.encomenda.codigo.options.length = 0;

<% Set conn1 = Server.CreateObject("ADODB.Connection")
   conn1.open "cat", "publico", "cena"
   Set rst1 = Server.CreateObject("ADODB.Recordset")
   sql = "SELECT DISTINCT cliente FROM [dados]"
   rst1.Open sql, conn1, 3, 3
   rst1.movefirst

   Set conn2 = Server.CreateObject("ADODB.Connection")
   conn2.open "cat", "publico", "cena"
   Set rst2 = Server.CreateObject("ADODB.Recordset")
   sql1 = "SELECT cliente, codigo FROM [dados]"
   rst2.Open sql1, conn2, 3, 3
   rst2.movefirst
%>



switch (teste)
{
<% do until rst1.EOF
	contador=1	 %>

	case "<%=Rtrim(rst1.fields("cliente"))%>" :
		<% do until rst2.EOF %>
		<% if Rtrim(rst1.fields("cliente")) = Rtrim(rst2.fields("cliente")) then %>
		document.encomenda.codigo.options[<%=contador%>]=new Option("<%=Rtrim(rst2.fields("codigo"))%>","<%=Rtrim(rst2.fields("codigo"))%>");

		<% contador= contador+1
		   end if
		   rst2.movenext
		   loop %>
	break;
   <% rst1.movenext
      rst2.movefirst		
      loop 
      rst1.movefirst%>

	default : 
		document.encomenda.codigo.options[0]= new Option("CL","Escolha Código");
}		

return true;		

}




</script>

Isto cria o meu código JS com utilização predominante do switch. Acontece que quando os case são muitos ou têm muitas linhas dentro de cada um, o código flipa e já não faz nada. Se só mantiver as connexões  às BD's e colocar um alert para saber se o parametro passou... já funciona às mil maravilhas!

Estou a ficar frustrado... muito mesmo!  ;)

Obrigado pelo v/ feedback.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sem te responder aos teus stresses.. aqui ficam duas sugestões de borla ;)

1 - não estejas sempre a abrir <% e a fechar %> .. é pouco eficiente.. a interpretação da página está sempre a mudar de handler. E além disso o código fica um bocado "feio".. difícil de ler. Tenta usar Response.Write( … )

2 - porque usas os ciclos dos cursores da bd para gerar JavaScript para preencher combos.. e não os usas logo para escrever <options> para as combos directamente?

quanto à tua última afirmação.. só te posso dizer que o código que é executado no cliente (browser) não tem qualquer relação com a conecção à BD... é algo que corre no browser e não tem nada a ver com a BD e qualquer coisa assim... o browser não tem "consciência" da existência de BDs ou cenas assim

só olhei para o teu código na diagonal.. se tiver mais um tempinho depois vejo isso melhor

Espero ter ajudado :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pelo feedback.

Hoje só vou perder 1 hora com isto. Já ando à dois dias de volta do problema e cada vez me parece mais um beco sem saída... ainda que saiba que não o é!

Depois de tentar a sugestão de limpeza do código reporto qualquer coisa.

Até lá, qualquer outra ideia que permita ultrapassar este problema, é extremamente bem vinda.

Obrigado. ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E nem de propósito... uma hora depois de ter começado, resolvi o problema.

switch(teste)
{
	<%
	   	do until rst1.EOF
			contador=0
			response.write("case '"&RTrim(rst1.fields("cliente"))&"' :")
			do until rst2.EOF
				if RTrim(rst1.fields("cliente")) = RTrim(rst2.fields("cliente")) then
					response.write("document.encomenda.codigo.options["&contador&"]= new 

Option('"&Rtrim(rst2.fields("codigo"))&"','"&Rtrim(rst2.fields("codigo"))&"');")
					contador=contador+1
				end if
				rst2.movenext
				loop
		response.write("break;")
		rst2.movefirst
		rst1.movenext
		loop
		rst1.movefirst %>

	default : 
		document.encomenda.codigo.options[0]= new Option('Escolha Código','CL');
}		

Obrigado Rui! ;-)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora