Jump to content


Photo

Selects Sem Refresh


  • This topic is locked This topic is locked
Nenhuma resposta neste tópico

#1 felipecm

felipecm

    Expert

  • Usuários
  • 541 posts
  • Sexo:Não informado
  • Localidade:ABC / SP

Posted 21/01/2005, 19:55

Este script incorpora o JavaScript com o ASP para poder buscar dados do Banco de Dados sem o refresh (PostBack) da pagina, o que poderia acarretar em uma séria de problemas como manutenção dos estados, tempo de carregamento, etc.

Exemplo dele no Brinkster (apresenta instabilidade pelo host em alguns momentos)
http://www32.brinkst...dteam/combo.asp

Essa Sub que automatiza o processo, requer duas instruções SQL e a conexão com o banco de dados como parâmetro. Deve se usar da seguinte forma:

strSQL1 = "SELECT CODIGO, CAMPO FROM Tabela1"
strSQL2 = "SELECT CODIGO RELACIONADO, CODIGO, CAMPO FROM Tabela2"
GuardaValoresJS strSQL1, strSQL2, CONEXAO

Deve se seguir essa ordem, e apenas essa quantidade de campos na query SQL, para poder se relacionar entre as tabelas.

Para os usuarios SQL Server, o seguinte script foi testado:
CREATE TABLE dbo.tbEstados (
	CodEstado int NOT NULL ,
	Estado nvarchar (50) NULL 
) ON [PRIMARY]

CREATE TABLE dbo.tbCidades (
	CodEstado int NOT NULL ,
	CodCidade int NOT NULL ,
	Cidade nvarchar (50) NULL 
) ON [PRIMARY]

INSERT INTO tbEstados VALUES (1, 'São Paulo')
INSERT INTO tbEstados VALUES (2, 'Minas Gerais')
INSERT INTO tbEstados VALUES (3, 'Paraná')
INSERT INTO tbCidades VALUES (1, 1, 'São Paulo')
INSERT INTO tbCidades VALUES (1, 2, 'São Bernardo do Campo')
INSERT INTO tbCidades VALUES (1, 3, 'Santo André')
INSERT INTO tbCidades VALUES (1, 4, 'São Caetano do Sul')
INSERT INTO tbCidades VALUES (1, 5, 'Diadema')
INSERT INTO tbCidades VALUES (1, 6, 'Santos')
INSERT INTO tbCidades VALUES (2, 7, 'Varginha')
INSERT INTO tbCidades VALUES (2, 8, 'Poços de Caldas')
INSERT INTO tbCidades VALUES (2, 9, 'Belo Horizonte')
INSERT INTO tbCidades VALUES (3, 10, 'Curitiba')
INSERT INTO tbCidades VALUES (3, 11, 'Londrina')
INSERT INTO tbCidades VALUES (3, 12, 'Almirante Tamandaré')

É importante que vc utilize a função JavaScript na pagina pois ela fará os eventos dinamicos (load e change). A rotina vai gerar um arquivo que conterá todas os registros ordenados de forma ao JavaScript entenda, pois bem, o nome do arquivo pode ser alterado nessa linha (pode se incluir paths virtuais):
Linha 2:   Const strFile = "combos.js"

JAMAIS tenha o arquivo existente com codigos, pois a sub irá limpar e preencher com o conteúdo do Banco de Dados.
A pasta precisa ter permissão para gravar o arquivo (por exemplo no caso do Brinkster puis na pasta DB):
Linha 2:   Const strFile = "/MinhaConta/db/combos.js"

Para ajustar os textos padrão dos combos, temos:
Linha 59:  sTitle1 = "Selecione um Estado..."
Linha 60:  sTitle2 = "Selecione uma Cidade..."

<%

  Const strFile = "combos.js"

  Sub GuardaValoresJS (sqlCboPai, sqlCboFilho, objConnection)
    'mail/msn: fmosca@ajato.com.br

    Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
    Set objRs = Server.CreateObject("ADODB.Recordset")

    strPath = Server.MapPath(strFile)

    If Not objFSO.FileExists(strPath) Then
      Set objStream = objFSO.CreateTextFile(strPath, True)
    Else
      Set objStream = objFSO.OpenTextFile(strPath, 2)
    End If

    objRs.Open sqlCboPai, objConnection
    If Not objRs.Eof Then
      arrPai = objRs.GetRows()
    End If
    objRs.Close

    objRs.Open sqlCboFilho, objConnection
    If Not objRs.Eof Then
      arrFilho = objRs.GetRows()
    End If
    objRs.Close

    With objStream
      .WriteLine "arrPai = new Array(" & UBound(arrPai, 2) & ");"
      .WriteLine "arrFilho = new Array(" & UBound(arrFilho, 2) & ");" & vbCrLf
      For i = 0 To UBound(arrPai, 2)
        .WriteLine "arrPai[" & i & "] = new Array('" & arrPai(0, i) & "', '" & Replace(arrPai(1, i),"'", "\'") & "');"
      Next
      .WriteLine ""
      For i = 0 To UBound(arrFilho, 2)
        .WriteLine "arrFilho[" & i & "] = new Array('" & arrFilho(0, i) & "', '" & arrFilho(1, i) & "', '" & Replace(arrFilho(2, i), "'", "\'") & "');"
      Next
    End With

    objStream.Close

    Set objStream = Nothing
    Set objFSO = Nothing
    Set objRs = Nothing
  End Sub

  'strConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("db.mdb")
  strConnString = "Provider=SQLOLEDB; Server=(local); Initial Catalog=Northwind; User Id=sa; Password="

  Set objConn = Server.CreateObject("ADODB.Connection")
  objConn.Open strConnString

  strSQL1 = "SELECT CodEstado, Estado FROM tbEstados ORDER BY Estado"
  strSQL2 = "SELECT CodEstado, CodCidade, Cidade FROM tbCidades ORDER BY Cidade"
  GuardaValoresJS strSql1, strSql2, objConn

  sTitle1 = "Selecione um Estado..."
  sTitle2 = "Selecione uma Cidade..."

  objConn.Close
  Set objConn = Nothing

%>
<html>
<head>
<script language="JavaScript" src="<%=strFile%>"></script>
<script language="JavaScript">

function PopulaFilho()
{
  document.frmDados.cboCidade.options.length = 0;
  document.frmDados.cboCidade.options.add(new Option('<%=sTitle2%>'));

  for (i=0; i<arrFilho.length; i++)
  {
    if (arrFilho[i][0] == document.frmDados.cboEstado.value)
      document.frmDados.cboCidade.options.add(new Option(arrFilho[i][2], arrFilho[i][1]));
  }
}

function PopulaPai()
{
  document.frmDados.cboEstado.options.length = 0;
  document.frmDados.cboEstado.options.add(new Option('<%=sTitle1%>'));
  document.frmDados.cboCidade.options.add(new Option('<%=sTitle2%>'));

  for (i=0; i<arrPai.length; i++)
    document.frmDados.cboEstado.options.add(new Option(arrPai[i][1], arrPai[i][0]));
}

</script>
<style>
  .cboStyle
  {
  	font-family: verdana;
  	font-size: 11px;
  	width: 250px;
  	background-color: #f0f0f0;
  }
</style>
</head>
<body onLoad="PopulaPai()" style="font-family:verdana; font-size:12px; font-weight:bold">
  <form name="frmDados">
    Estados:<br><select name="cboEstado" onChange="PopulaFilho();" class="cboStyle"></select><br><br>
    Cidades:<br><select name="cboCidade" class="cboStyle"></select>
  </form>
</body>
</html>

Agradeço a grande ajuda de pchardnet e Without a Nick. (y)

E façam o que quiserem com o codigo, só não tira o credito, de resto.. a vontade. :lol:


-----------------------------------------------------------------------------------------------
Para uma maior organização desta seção, todas as duvidas relacionadas a este tutorial devem ser tiradas na seguinte sala:
http://forum.wmonlin...p?showforum=113
MCAD, MCP




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq