quarta-feira, 2 de julho de 2003

0

Desmarcar todas as checks com um clique

<HTML>
<HEAD>
<SCRIPT LANGUAGE="JavaScript">
  var checkflag = "false";
  function check(field) {
   if (checkflag == "false") {
    for (i = 0; i < field.length; i++) {
     field[i].checked = true;}
     checkflag = "true";
    return "Uncheck All";}
   else {
    for (i = 0; i < field.length; i++) {
     field[i].checked = false;}
     checkflag = "false";
    return "Check All";}
  }
  </script>
</HEAD>


<BODY>
<FORM NAME="form1">
<INPUT TYPE="checkbox" name="teste" OnClick="check(document.form1.teste);">
<INPUT TYPE="checkbox" name="teste">
<INPUT TYPE="checkbox" name="teste">
<INPUT TYPE="checkbox" name="teste">
<INPUT TYPE="checkbox" name="teste">
</FORM>
</BODY>
</HTML>



Esta matéria foi postada originalmente no ASP4Developers por Bernardo Heynemann (site), que na época era "Oracle Certified Professional em Oracle 8i, Certificado Oracle 9i New Features, Desenvolvedor VB (6 anos)/ ASP(5 anos) / VBScript(5 anos) / JavaScript(5 anos).". Hoje, vai saber...

segunda-feira, 23 de junho de 2003

0

Exibindo a lista dos usuários logados atualmente

Salve,


neste artigo, iremos descrever o processo de criação de uma listagem dos usuários logados no site, quer sejam anônimos ou autenticados, tal como possuímos aqui no ASP4Developers, na aba "onliners" aí ao lado. Isso é interessante para manter os usuários cientes de que não estão sozinhos, possibilitando uma maior interação entre os mesmos.


Antes de mais nada, precisaremos trabalhar com o Global.asa. Se seu host não suportar seu uso, infelizmente, não há como fazer o que estamos propondo. Chovendo no molhado, o Global.asa deve estar no diretório raiz da pasta virtual, criada no IIS ou PWS. Iniciaremos com o Application_OnStart, onde iremos inicializar a variável que armazenará a lista dos usuários.

Sub Application_OnStart()
 Application("UsuariosLogados") = "<usuarios />"
End Sub

Antes que você pense: "Lá vem o Rubens com aquele papo de XML", já adianto que vai ser com XML mesmo. Não há um motivo específico para isso. Poderíamos armazenar arrays, strings separadas por vírgulas, ou mesmo um objeto Dictionary. Acho XML mais interessante, pois permite que façamos testes com estruturas simples, que podem ser facilmente migradas para outras, mais complexas, além de nos familiarizarmos com aplicações que fazem uso do XML. Como veremos adiante, isso *não* deixa o código mais complicado.


Ok, vamos agora alimentar a variável de aplicação. Toda vez que um usuário acessar a aplicação (leia-se: quando o Session_OnStart for disparado), incluiremos um elemento no documento XML. Ficaria assim:

Sub Session_OnStart
 'Impedir que outros usuários acessem este código simultaneamente
 Application.Lock
 Dim objXMLDoc, objUsuario
 'Instanciar objeto XML. Verifique se o mesmo existe no seu servidor.
 Set objXMLDoc = Server.CreateObject("MSXML2.DOMDocument.3.0")
 'Carga síncrona. Não passe para a próxima instrução sem carregar o xml inteiro.
 objXMLDoc.async = false
 'Carregue a string XML, já tomando cuidado com caracteres acentuados.
 objXMLDoc.loadXML "<?xml version=""1.0"" encoding=""ISO-8859-1""?>" & _
  Application("UsuariosLogados")
 'Criar um novo elemento
 Set objUsuario = objXMLDoc.createElement("usuario")
 'Setar os atributos "id" e "nome"
 objUsuario.setAttribute "id", Session.SessionId
 objUsuario.setAttribute "nome", "Anônimo"
 'Adicionar o novo elemento ao documento já existente
 objXMLDoc.documentElement.appendChild objUsuario
 'Atualizar variável de aplicação
 Application("UsuariosLogados") = objXMLDoc.documentElement.xml
 'Liberar recursos alocados com o objeto
 Set objXMLDoc = Nothing
 'Liberar aos demais usuários (no bom sentido, é claro!)
 Application.Unlock
End Sub

O que é muito importante percebermos no código acima, é que o componente MSXML2.DOMDocument.3.0 precisa estar instalado no servidor. Caso o seu não o possua, o mesmo pode ser obtido gratuitamente no site da Microsoft.


Muito bem! Já possuímos a variável de aplicação com a lista de usuários. Mas, onde/quando removê-lo da lista ? Em outras palavras, não quero que um determinado usuário seja listado para sempre! Como proceder ?


Isso mesmo que você pensou! Vamos usar o evento Session_OnEnd para remover o usuário da lista! Mãos à obra:

Sub Session_OnEnd()
 Application.Lock
 Dim objXMLDoc, objUsuario
 Set objXMLDoc = Server.CreateObject("MSXML2.DOMDocument.3.0")
 objXMLDoc.async = false
 objXMLDoc.loadXML "<?xml version=""1.0"" encoding=""ISO-8859-1""?>" & _
  Application("UsuariosLogados")
 'Pesquisar no documento XML por um usuário com atributo id igual ao informado.
 Set objUsuario = objXMLDoc.selectSingleNode("//usuario[@id = " & Session.SessionId & "]")
 'Se encontrar, removê-lo
 If Not objUsuario Is Nothing Then objUsuario.parentNode.removeChild objUsuario
 Application("UsuariosLogados") = objXMLDoc.documentElement.xml
 Set objXMLDoc = Nothing
 Application.Unlock
End Sub

Parabéns, estamos quase lá! Note que adicionamos um pequeno trecho para verificar existe um usuário com o id informado no documento XML. A priori, sempre deveria existir, mas o seguro morreu de velho.


Maravilha, só precisamos agora atualizar os dados do mesmo, quando ele se logar no seu site. Adapte a mesma conforme sua necessidade.

<%
If Trim(Request.Form("txtUsuario")) <> "" And Trim(Request.Form("txtSenha")) <> "" Then
 'Abrir conexão com o banco de dados.
 'Pesquisar o registro na base de dados. Cuidado com as aspas simples nos campos postados!
 'Se encontrou então
  Application.Lock
  Dim objXMLDoc, objUsuario
  Set objXMLDoc = Server.CreateObject("MSXML2.DOMDocument.3.0")
  objXMLDoc.async = false
  objXMLDoc.loadXML "<?xml version=""1.0"" encoding=""ISO-8859-1""?>" & _
   Application("UsuariosLogados")
  'Pesquisar usuário
  Set objUsuario = objXMLDoc.selectSingleNode("//usuario[@id = " & Session.SessionId & "]")
  If Not objUsuario Is Nothing Then
   'Se encontrá-lo, alterar o nome pelo que
   ' (provavelmente) existe no banco de dados.
   objUsuario.setAttribute "nome", recordset("nome_usuario")
  End If
  Application("UsuariosLogados") = objXMLDoc.documentElement.xml
  Set objXMLDoc = Nothing
  Application.Unlock
 'Senão
  Response.Redirect "erro_login.asp"
 'Fim se
 '... restante da implementação ...'
End If
%>

Desta forma, podemos fazer com que os usuários marcados inicialmente como anônimos possam ser atualizados quando o detentor da sessão autenticar-se na aplicação.


Agora, basta listar os usuários. Acerte o design da forma que melhor lhe convier:

<%
Sub ListarUsuariosSite()
 Dim objXMLDoc, objUsuario, objUsuarios
 Set objXMLDoc = Server.CreateObject("MSXML2.DOMDocument.3.0")
 objXMLDoc.async = false
 objXMLDoc.loadXML "<?xml version=""1.0"" encoding=""ISO-8859-1""?>" & _
  Application("UsuariosLogados")
 'Coleção com todos os usuários na aplicação
 Set objUsuarios = objXMLDoc.selectNodes("//usuario")
 'Para cada usuário, ...
 For Each objUsuario In objUsuarios
  '... mostrar o nome do mesmo ...
  Response.Write "<b>" & objUsuario.getAttribute("nome") & "</b>"
  ' ... e seu respectivo id.
  Response.Write ", id " & objUsuario.getAttribute("id") & "<br>"
 Next
 'Mostrar a quantidade de usuários na aplicação
 Response.Write objUsuarios.length & " usuário(s) navegando no site, neste momento."
 Set objXMLDoc = Nothing
End Sub
%>

Resumindo: neste artigo implementamos uma lista dos usuários atualmente no site, vimos um exemplo de inclusão, alteração e exclusão de elementos e atributos em um documento XML via DOM e ainda, de quebra, ganhamos um contador de usuários online :)


Note que esta implementação é simples e flexível. Você pode colocar um campo com a data e hora de login, implementar uma rotina de comunicação como o "InterCOM" do ASP4Developers, ou mesmo possibilitar que um usuário convide outro para uma sessão de chat. Estamos limitados somente à nossa imaginação.



Espero que este artigo tenha sido útil para você.



Boa sorte e até a próxima.



Esta matéria foi postada originalmente no ASP4Developers por Rubens N. Farias (site), que na época era "pós-graduado em análise de sistemas orientados a objetos, MCP, MCSD, MCAD, MCSD.NET e consultor em TI, além de idealizador do projeto ASP4Developers. Desenvolve sistemas sob medida, focados na satisfação do usuário, com qualidade e custo realista.". Hoje, vai saber...

segunda-feira, 16 de junho de 2003

0

Tutorial: Validação de formato de horas usando expressões regulares

Há pouco tempo, tive um pequeno problema para resolver: verificar se horas digitadas pelos usuários, no formato HH:MM:SS, eram válidas. A princípio, não parece ser uma tarefa complexa, mas, dependendo da abordagem utilizada, podemos ter pouco ou muito trabalho.


Pare um momento e reflita: como fazer tal validação ? Usando JavaScript, poderíamos pensar em usar o método .split() para decompormos os elementos da string digitada e verificar se estas partes compõem um conjunto válido. Talvez o código acabasse, no final, parecido com o código abaixo:

<script>
function isHoraValidaSplit(strHora)
{
 // Concatenamos dois "dois pontos" para o caso da string
 // passada não contê-los, pois esperamos um array com,
 // no mínimo, 3 posições: horas, minutos e segundos.
 var arrElementos  = ( strHora + "::" ).split( ":" );
 var bolHorasOk    = consistirIntervalo( arrElementos[0], 0, 23 );
 var bolMinutosOk  = consistirIntervalo( arrElementos[1], 0, 59 );
 var bolSegundosOk = consistirIntervalo( arrElementos[2], 0, 59 );
 return( bolHorasOk && bolMinutosOk && bolSegundosOk );
 // Quando uma function aparece dentro de outra function,
 // tem sua visibilidade reduzida. Assim, consistirIntervalo()
 // só poderá ser acessada dentro de isHoraValidaSplit().
 function consistirIntervalo( strValor, intMenor, intMaior )
 {
  var bolRetorno = true;
  // Valor informado precisa ser numérico...
  if( isNaN( strValor ) || strValor == "" ){
   bolRetorno = false;
  }
  else
  {
   // ... e estar contido no intervalo
   var intValor = parseInt( strValor, 10 )
   if( intValor < intMenor || intValor > intMaior ){
    bolRetorno = false;
   }
  }
  return( bolRetorno );
 }
}
</script>

Para sabermos se o código acima funciona, utilizamos uma massa de dados de teste. Note que temos inconsistências em diversos pontos da hora, para podermos explorar cada ponto do algoritmo. Temos horas com apenas os minutos inválidos, apenas os segundos válidos, testamos os limites inferior e superior. Uma boa massa de testes pode ajudá-lo a identificar diversos problemas latentes do seu código, antes que o usuário final descubra esses erros para você :)

<script>
// Massa para testes da função isHoraValida()
var strMensagem = "Método Split:\n--------------------\n"
var arrTestes = new Array(
  "12:34:56", "65:43:21", "02:68:03", "21:43:65", "00:00:00", "23:59:59",
  "24:00:00", "teste123", "11:77:88", "55:66:11", "33:00:99", "99:99:99" )
for( var i=0; i < arrTestes.length; i++ ){
 strMensagem +=
  "\"" + arrTestes[i] + "\" = " +
  isHoraValidaSplit(arrTestes[i]) + "\n";
}
alert( strMensagem )
</script>

"Ok, a função funciona. Então, o que há de errado com ela ?"


Na verdade, não há nada de errado. Minha intenção é de apresentar outro forma de fazer a consistência de horas, usando expressões regulares, lembra ? Vamos começar analisado uma hora válida: "19:48:26". Mas o que torna "19:48:26" uma hora válida ?


Comecemos com simplicidades lógicas: uma hora válida possui dois números, um sinal de dois-pontos, mais dois números, outro sinal de dois-pontos e mais dois números. Apesar de um passo óbvio, já começamos a isolar um padrão, que é justamente do que trata as expressões regulares: a pesquisa de padrões em strings.


Podemos, então, começar a reescrever a função de validação, assim:

<script>
function isHoraValidaRegExp(strHora){
 var re = /^\d\d:\d\d:\d\d$/
 return re.test( strHora );
}
</script>

Como o leitor mais atento deve ter percebido, "\d" é a indicação de dígito numérico. A cada dois deles, temos o sinal de dois-pontos. O caracter "^" indica início da string a ser testada e o "$" indica seu término. Isso consiste a "máscara básica" de uma hora válida.


"Perae! Mas este código está chamando de 'válida' horas descaradamente inválidas!"


Calma, jovem Jedi. Acredite na Força.


Precisamos consistir agora o intervalo de horas, minutos e segundos. Como consistir segundos é a mesma coisa que consistir minutos, vamos continuar por aqui.


O que é um "minuto válido" ? São os minutos entre "00" e "59", inclusive. Então precisamos incrementar a expressão regular, pois não são quaisquer dois números válidos, tal como está codificado hoje:

<script>
function isHoraValidaRegExp(strHora){
 var re = /^\d\d:[0-5]\d:[0-5]\d$/
 return re.test( strHora );
}
</script>

É isso mesmo que você está pensando: os colchetes indicam um conjunto de valores possíveis, e o traço indica um ubtervalo, no nosso caso, os números compreendidos entre "0" e "5". O caracter seguinte permanece sendo o "\d", pois unidades de "0" a "9" são permitidas.


"Não olhe agora, mas ainda está consistindo errado!"


Sim, eu sei. Ainda precisamos consistir as horas. E, aproveitando o embalo, o que é uma "hora válida" ? São as horas compreendidas entre "00" e "23", inclusive. Assim, teremos que adaptar a linha de raciocínio que adotamos no passo anterior. Ficaria assim:

<script>
function isHoraValidaRegExp(strHora){
 var re = /^[01]\d:[0-5]\d:[0-5]\d$/
 return re.test( strHora );
}
</script>

Assim resolvemos o problema das horas compreendidas entre "00" e "19". Precisamos tratar a exceção. Como proceder ?


Pensando mais um pouco: as horas precisam estar contidas em "00" e "19" ou entre "20" e "23". Significa que há dois padrões que necessitamos avaliar. Note que eles são mutuamente exclusivos, ou seja, só pode ocorrer um de cada vez. O código ficaria assim:

<script>
function isHoraValidaRegExp(strHora){
 var re = /^(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$/
 return re.test( strHora );
}
</script>

Cuidado! Note bem que alteramos o código que vinha antes do primeiro "dois-pontos". Mantivemos a expressão anterior, que validava horas até as 19 horas, acrescentamos um pipe ("|") que representa o "OU" e acrescentamos a condição que faltava "2, seguido de um número entre 0 e 3". Colocamos tudo isso dentro de uma indicação de padrão não-capturável, representado por "(?:)". Os detalhes desta indicação fico devendo para outro artigo.


Para podermos comparar ambas implementações, preparei um teste de performance, que segue abaixo:

<script>
// Método original
function isHoraValidaSplit(strHora)
{
 // Concatenamos dois "dois pontos" para o caso da string
 // passada não contê-los, pois esperamos um array com,
 // no mínimo, 3 posições: horas, minutos e segundos.
 var arrElementos  = ( strHora + "::" ).split( ":" );
 var bolHorasOk    = consistirIntervalo( arrElementos[0], 0, 23 );
 var bolMinutosOk  = consistirIntervalo( arrElementos[1], 0, 59 );
 var bolSegundosOk = consistirIntervalo( arrElementos[2], 0, 59 );
 return( bolHorasOk && bolMinutosOk && bolSegundosOk );
 // Quando uma function aparece dentro de outra function,
 // tem sua visibilidade reduzida. Assim, consistirIntervalo()
 // só poderá ser acessada dentro de isHoraValidaSplit().
 function consistirIntervalo( strValor, intMenor, intMaior )
 {
  var bolRetorno = true;
  // Valor informado precisa ser numérico...
  if( isNaN( strValor ) || strValor == "" ){
   bolRetorno = false;
  }
  else
  {
   // ... e estar contido no intervalo
   var intValor = parseInt( strValor, 10 )
   if( intValor < intMenor || intValor > intMaior ){
    bolRetorno = false;
   }
  }
  return( bolRetorno );
 }
}
// Método sugerido
function isHoraValidaRegExp(strHora){
 var re = /^(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$/
 return re.test( strHora );
}
function testarSplit(intLoop){
 var arrTestes = new Array(
   "12:34:56", "65:43:21", "02:68:03", "21:43:65", "00:00:00", "23:59:59",
   "24:00:00", "teste123", "11:77:88", "55:66:11", "33:00:99", "99:99:99" )
 for( var n=0; n <= intLoop; n++ )
 {
  var strMensagem = "Método Split:\n--------------------\n"
  for( var i=0; i < arrTestes.length; i++ )
  {
   strMensagem +=
    "\"" + arrTestes[i] + "\" = " +
    isHoraValidaSplit(arrTestes[i]) + "\n";
  }
 }
 return strMensagem
}
function testarRegExp(intLoop){
 // Massa para testes da função isHoraValida()
 var arrTestes = new Array(
   "12:34:56", "65:43:21", "02:68:03", "21:43:65", "00:00:00", "23:59:59",
   "24:00:00", "teste123", "11:77:88", "55:66:11", "33:00:99", "99:99:99" )
 for( var n=0; n <= intLoop; n++ )
 {
  var strMensagem = "Método RegExp:\n--------------------\n"
  for( var i=0; i < arrTestes.length; i++ )
  {
   strMensagem +=
    "\"" + arrTestes[i] + "\" = " +
    isHoraValidaRegExp(arrTestes[i]) + "\n";
  }
 }
 return strMensagem
}
</script>
<script language="VBScript">
 Const intExecucoes = 5 'Tiramos a média de 5 execuções
 Const intLoop = 1000 'Cada execução avalia 12 horas, 1000 vezes.
 intAcumuladoSplit = 0
 strMensagemSplit  = ""
 For i = 1 to intExecucoes
  inicio = Timer
  strMensagemSplit  = testarSplit(intLoop)
  intAcumuladoSplit = intAcumuladoSplit + ( Timer - inicio )
 Next
 intAcumuladoRegExp = 0
 strMensagemRegExp  = ""
 For i = 1 to intExecucoes
  inicio = Timer
  strMensagemRegExp  = testarRegExp(intLoop)
  intAcumuladoRegExp = intAcumuladoRegExp + ( Timer - inicio )
 Next
 ' Computar o tempo médio dispendido na avaliação das 60.000 validações
 intMediaSplit  = intAcumuladoSplit  / intExecucoes
 intMediaRegExp = intAcumuladoRegExp / intExecucoes
 strMensagemSplit  = strMensagemSplit  & vbTab & vbLF & "=" & _
      formatNumber( intMediaSplit, 4 ) & " s"
 strMensagemRegExp = strMensagemRegExp & vbTab & vbLF & "=" & _
      formatNumber( intMediaRegExp,4 ) & " s"
 arrSplit  = split( strMensagemSplit , vbLF )
 arrRegExp = split( strMensagemRegExp, vbLF )
 strMensagem = ""
 For i = 0 To UBound( arrSplit )
  strMensagem = strMensagem & arrSplit(i) & vbTab & "|  " & arrRegExp(i) & vbCRLF
 Next
 MsgBox strMensagem & vbCRLF & vbTab & _
   " Diferença de " & FormatPercent( intMediaSplit / intMediaRegExp, 2 )
</script>

Pronto, pode rodar o teste e surpreenda-se (o teste completo levou quase 4 segundos num P3 650/512M RAM. Você verá que a implementação da validação com expressões regulares possui a mesma eficiência do algoritmo inicial, mas com 90% menos código e cerca de 307,5% mais rápido! Isso mesmo: trezentos e sete e meio por cento, ou um terço do tempo original. Se o salário mínimo aumentasse na mesma proporção, ia ter muita gente feliz, pois o mesmo passaria de R$ 240,00 para R$ 738,00. Um aumento pra lá de bem vindo.


Bom, fica a dica: expressões regulares, que num primeiro instante parecem complexas, podem resolver problemas de identificação de padrão com menos código e mais performance. Mas nunca esqueça de documentar bem suas expressões regulares. A vítima pode ser você.



Até a próxima!



Esta matéria foi postada originalmente no ASP4Developers por Rubens N. Farias (site), que na época era "pós-graduado em análise de sistemas orientados a objetos, MCP, MCSD, MCAD, MCSD.NET e consultor em TI, além de idealizador do projeto ASP4Developers. Desenvolve sistemas sob medida, focados na satisfação do usuário, com qualidade e custo realista.". Hoje, vai saber...

sexta-feira, 13 de junho de 2003

0

Verificador (Navegador/Origem de Acesso)

'Verifica navegador e origem de acesso
'Ex.: Call Verifica(TRUE, TRUE)
'Call Verifica(TRUE, FALSE)
'Call Verifica(FALSE, TRUE)
'Call Verifica(FALSE, FALSE)
'<HOST_ORIGEM> = www.asp4developers.com.br

Function Verifica(sNAV, sORIG)
 If sNAV then
  Dim IS_IE, IS_NN, USER_AGENT
  USER_AGENT = Request.ServerVariables("HTTP_USER_AGENT")


  IS_IE = InStr(USER_AGENT,"MSIE")
  IS_NN = InStr(USER_AGENT,"Nav")
  
  If NOT IS_IE then 
   Response.Status = "000 - Somente MSIE 5.x e 6.x"
   Response.Write(Response.Status())
   Response.End
  End If
 End If


 If sORIG then 
  Dim sOrigem
  sOrigem = Request.ServerVariables("HTTP_HOST")
  
  If sOrigem <> "<HOST_ORIGEM>" then
   Response.Status = "403 - Acesso Restrito"
   Response.Write(Response.Status())
   Response.End
  End If
 End If
End Function



Esta matéria foi postada originalmente no ASP4Developers por César M. Conceição (site), que na época era "Analista / Programador Pleno, mais de 4 anos de experiência no desenvolvimento de sistemas online.(HTML/XHTML/ASP/JAVASCRIPT/DHTML/MS SQL/FIREBIRD/INTERBASE/ACCESS)". Hoje, vai saber...

sexta-feira, 6 de junho de 2003

0

Integrando WORD e XML usando XMLHTTP

Sou professor na Universidade de Passo Fundo e, para evitar a “cola”, elaboro diversas provas, cada uma com as questões em uma ordem diferente.


Já a algum tempo eu queria automatizar o processo de geração das provas e como estava curioso sobre a integração entre WORD e XML desenvolvi esta pequena aplicação, simples mas muito didática.


A aplicação usa o componente XMLHTTP para integrar os dados, o XML como banco de dados, o XSLT para formatar os dados, ASP no processamento da base de dados e VBA como linguagem de macro que insere os dados no documento WORD.


Na verdade nem era necessário o uso de toda esta parafernália, mas resolvi juntar todas as tecnologias que estou estudando numa única aplicação.


 


Arquivos:


provas.xml – bd com as questões.


provas.xsl – arquivo com a formatação dos dados. Na verdade serve apenas para ordenar as questões usando o ID como chave.


xmlhttp.asp – script que responde às solicitações da macro do Word


provas.dot – arquivo de modelo do WORD com uma macro embutida que é acionada na criação de um novo documento.


 


Estude os fontes abaixo e bom trabalho.


Para baixar os arquivos acesse -> http://www.gdez.com.br/barbiero/provas.zip


 


provas.xml


Arquivo contendo as questões que serão reordenadas e inseridas no documento Word.


 


<?xml:stylesheet type="text/xsl"  ?>


<provas>


   <prova id="">


      <questao id="1">Diferencie as cebolas dos abacates.</questao>


      <questao id="2">defina o sabor do xuxu.</questao>


      <questao id="3">Diferencie redes para lambari de redes para tilápia</questao>


      <questao id="4">Para que serve o comando sbórnia?</questao>


      <questao id="5">Para que serve o comando tchê?</questao>


      <questao id="6">Para que serve o serviço de quarto?</questao>


      <questao id="7">O que é um calo?</questao>


      <questao id="8">Defina graxaim?</questao>


      <questao id="9">Descreva as características de Passo Fundo</questao>


      <questao id="10">Em quais camadas ficam os protocolos tartaruga e jacaré?</questao>


   </prova>


</provas>


 


provas.xsl


<?xml version="1.0"?>


<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">


<xsl:output method="xml"/>


 


<xsl:template match="/provas">


<provas>


            <prova>


                        <xsl:apply-templates select="/provas/prova"/>


            </prova>


</provas>


</xsl:template>  


 


<xsl:template match="/provas/prova">


   <xsl:for-each select="questao" >


     <xsl:sort select="@id"/>


             <questao>       


     <xsl:value-of select="."/>


     </questao>


   </xsl:for-each>


</xsl:template>  


 


</xsl:stylesheet>


 


 


xmlhttp.asp – este arquivo deve ser colocado em uma pasta com permissão de execução de scripts no IIS.


<%@ Language=VBScript %>


<%


            Response.CharSet="iso-8859-1"   'Define o conjunto de caracteres do português


 


            set docXML = Server.CreateObject("Microsoft.XMLDOM")


    docXML.async=false


    docXML.load(server.MapPath("provas.xml"))


   


            set docXSL = Server.CreateObject("Microsoft.XMLDOM")


    docXSL.async=false


    docXSL.load(server.MapPath("provas.xsl"))


 


    set nodelistQuestoes = docXML.documentElement.Childnodes(0).childnodes


    '


    '       Gera números aleatórios para alterar a ordem das questões


    '


    randomize            'inicializa o gerador de números aleatórios


    for i = 0 to nodelistQuestoes.length - 1


                nodelistQuestoes(i).setAttribute "id", int(rnd * 1000)


            next     


            '


            '            Aplica a formatação com o XSLT


            '


            set docTransformadoXML = Server.CreateObject("Microsoft.XMLDOM")


            docTransformadoXML.async = false


            docTransformadoXML.loadxml(docXML.transformNode(docXSL))


            '


            '            Envia as informações no formato exigido pelo Word, uma questão em cada linha.   


    '


    set nodelistQuestoes = docTransformadoXML.documentElement.Childnodes(0).childnodes


    for i = 0 to nodelistQuestoes.length - 1


                response.Write I + 1 & ") " & nodelistQuestoes(i).text & chr(13)


            next     


            '


            '            Destrói os objetos criados


            '


            set nodelistQuestoes = nothing


            set docXML = nothing


            set docXSL = nothing


            set docTransformadoXML = nothing


            %>


 


Macro do Word 2000 – Para integrar o WORD com o XML eu defini esta macro no evento “New” e salvei-a como modelo provas.dot. O usuário deve utilizar a opção “Arquivo” + “Novo” para poder escolher o modelo do documento.


Inicialmente a macro está apontando para um site na Internet: http://www.gdez.com.br mas você pode colocar os três arquivos acima em qualquer site e alterar o link.


 


Para inserir a macro entre no Word pressione ALT+F11, escolha o object “thisDocument”, cole a macro abaixo e salve o documento como um modelo do WORD:


 


Private Sub Document_New()


    Dim xmlhttp


    xmlhttp = Null


    Set xmlhttp = CreateObject("microsoft.XMLHTTP")


 


    ActiveDocument.Content = ""


    For i = 1 To 10


        Call xmlhttp.Open("POST", "http://www.gdez.com.br/barbiero/xmlhttp.asp", False)


        xmlhttp.Send


       


        ActiveDocument.Content = ActiveDocument.Content & xmlhttp.responseText


        ActiveDocument.Sections.Add


       


       


    Next


 


End Sub


 


 


 



Esta matéria foi postada originalmente no ASP4Developers por Marco Aurélio Barbiero (site), que na época era "Analista de Sistemas, trabalha na Receita Federal e desenvolve aplicativos em VB, ASP, Javascript, Notes e XML.
Colaborou algumas vezes com sites como o www.actionjackson.com". Hoje, vai saber...

quinta-feira, 5 de junho de 2003

2

Pega extensão do arquivo

Essa função pode ser muito útil para renomear um arquivo na hora do upload.


<%
'----------------------------------
' Função: Pega Extensão Do Arquivo
' Autor: Régis Soares
' E-mail: regis_soares@hotmail.com
' Data De Criação: 05/06/2003
' Última Atualização: 06/06/2003
'----------------------------------
Function Extensao(arquivo)
 x = InStrRev(arquivo, ".")
 If x = 0 Then
  Extensao = "Arquivo inválido"
 Else
  y = Mid(arquivo, x)
  If Len(y) < 3 Then
   Extensao = "Arquivo inválido"
  Else
   Extensao = y
  End If
 End If
End Function
%>
<%= Extensao("figura.jpg")%>



Esta matéria foi postada originalmente no ASP4Developers por Régis da Silva Soares, que na época era "Programador ASP e PHP". Hoje, vai saber...

sábado, 24 de maio de 2003

0

Abrir Nova Janela (centralizada)

<A HREF="javascript:void(0)" OnClick="janelacentralizada('pagina.htm','nome','500','300');return false;">
Abrir nova janela centralizada
</A>


<SCRIPT LANGUAGE=javascript>


function janelacentralizada(pagina, nomedajanela, w, h) {


 var winl = (screen.width - w) / 2;
 var wint = (screen.height - h) / 2;
 winprops = 'height='+h+',width='+w+',top='+wint+',left='+winl+',status=no,scrollbars=no,resizable=no,menubar=no'
 
 win = window.open(pagina, nomedajanela, winprops)
     
 if (parseInt(navigator.appVersion) >= 4) {
         win.window.focus();
     }


}


</SCRIPT>


 



Esta matéria foi postada originalmente no ASP4Developers por Daniel Passos (site), que na época era "Consultor de TI com fortes conhecimentos nas linguagens HTML, JavaScript, Perl, ASP e PHP. Conhecimentos básicos de Java (Swing, JSP & Servlets), orientação a objetos e UML, Banco de dados MySQL, SQL Server e Oracle.". Hoje, vai saber...

sexta-feira, 9 de maio de 2003

0

Tutoriais Online

Tutoriais online

Inclusive tutoriais relacionados à programação, banco de dados, engenharia, analise, modelagem.


www.tol.pro.br


Muito bom mesmo



Esta matéria foi postada originalmente no ASP4Developers por Thiago Machado Souza (site), que na época era "Programador Desbravador, buscando quebrar todas as fronteiras além do horizonte da arte de programar !
www.thiagomachado.com.br". Hoje, vai saber...

0

Paginar ARQUIVOS usando FSO

<%@LANGUAGE="VBSCRIPT"%>
<% Option Explicit


Response.Expires = 0 
Response.Buffer  = True


'PAGINAÇÃO DE ARQUIVOS USANDO ARRAY x FSO
Dim iLoop, limite, pagina, totalarq, i
Dim vlMaximo, vlMinimo, anterior
Dim ObjFso, ObjArq, ObjPasta, ObjSubPasta


Set ObjFso = Server.CreateObject("Scripting.FileSystemObject")
Set ObjPasta = ObjFso.GetFolder(server.MapPath("avatar"))


limite  = 10       ' limite de registros por página
totalarq = ObjPasta.files.count   ' total de arquivos encontrados


 ReDim arrAvatar((totalarq-1))
 Dim y
 y = 0


 ' guardamos cada arquivo dentro de um array
 For Each ObjArq in ObjPasta.Files  
  arrAvatar(y) = objArq.Name
  y = y + 1 
 Next
  
 Set ObjPasta = Nothing
 Set ObjArq = Nothing
 Set ObjFso = Nothing


 pagina = Request("pag")
 IF pagina = "" Then
  IF limite < UBound(arrAvatar) Then
   vlMinimo = 0
   vlMaximo = (limite-1)
  Else
   vlMinimo = LBound(arrAvatar)
   vlMaximo = UBound(arrAvatar)
  End IF
  pagina = 1
  anterior = ""
 Else
  vlMinimo = (pagina*(limite-1))+(pagina)
  vlMaximo = ((limite-1)*(pagina+1))+((pagina)*1)
  IF vlMaximo > UBound(arrAvatar) Then vlMaximo = UBound(arrAvatar)
  pagina = pagina + 1
  anterior = pagina - 2
  IF anterior = 0 Then anterior = ""
 End IF


 IF vlMinimo = 0 Then
  IF Not (vlMaximo >= (y-1)) Then
   response.write "<a href='paginarArq.asp?pag="& pagina &"'>próxima</a><br>"
  End IF
 Else
  IF Not (vlMaximo >= (y-1)) Then
   response.write "<a href='paginarArq.asp?pag="& pagina &"'>próxima</a><br>"
  End IF
  response.write "<a href='paginarArq.asp?pag="& anterior &"'>anterior</a>"
 End IF


 response.write "<br><br>"
 For i = vlMinimo to vlMaximo
  response.write (i+1) &") "
  response.write arrAvatar(i) &"<br>"
 Next
%>



Esta matéria foi postada originalmente no ASP4Developers por Marcio Lima (Guardião) (site), que na época era "Programador ASP e VBA, apaixonado por Design, futurismo e ficção.
". Hoje, vai saber...

quinta-feira, 8 de maio de 2003

0

Quebra texto após um determinado número de caracteres

<%
'--------------------------------------------------
' Função: Quebra texto após o limite de caracteres
' Autor: Régis Soares
' E-mail: regis_soares@hotmail.com
' Para Usar:
' texto = String
' limite = Num. de caracteres por linha
' Exemplo: QuebraTexto("Active Server Pages",5)
' Última Atualização: 19/07/2003
'--------------------------------------------------
Function QuebraTexto(texto,limite)
 aTexto = Split(texto, " ")
 For i = LBound(aTexto) To UBound(aTexto)
  If Len(aTexto(i)) > 0 Then nTexto = nTexto & " " & aTexto(i)
 Next
 texto = Trim(nTexto)
 pos = 1
 For I = pos To Len(texto) Step limite
  nTexto = Mid(texto,pos,limite) & "<br>" & vbcrlf
  QuebraTexto = QuebraTexto & nTexto
  pos = pos + limite
 Next
End Function
%>
<%= QuebraTexto("Active Server Pages",5)%>



Esta matéria foi postada originalmente no ASP4Developers por Régis da Silva Soares, que na época era "Programador ASP e PHP". Hoje, vai saber...

0

Paginação

<%
'----------------------------------
' Script: Paginação Simples
' Autor: Régis Soares
' E-mail: regis_soares@hotmail.com
' ICQ: 161916543
'----------------------------------


' Definindo o caminho do banco de dados
caminho = "paginacao.mdb"


' Fazendo a conexão com o banco de dados (paginacao.mdb)
set conn = Server.CreateObject("ADODB.Connection")
DSN = "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath(caminho)
conn.Open DSN


' String SQL para consulta
SQL = "SELECT * FROM nomes ORDER BY nome"


' Abrindo o registro
SET RS = Server.CreateObject("ADODB.Recordset")
RS.Open SQL,conn,3


' Se não encontrar nada escreve a mensagem
' Senão lista os registros
If RS.EOF Then
 Response.Write("Nenhum registro foi encontrado")
Else
 ' Definindo o número de registros por página
 RS.PageSize = 2
 
 ' Recupera o valor da variável pagina
 pagina = Request.QueryString("pagina")
 
 ' Se a variável pagina for vazio, indica que a página sera a primeira
 ' Senão a variável pagina recebe o valor da página corrente, definida acima
 If pagina = "" Then
  RS.AbsolutePage = 1
  pagina = 1
 Else
  RS.AbsolutePage = pagina
 End If
 
 ' Imprime o número de registros, o total de páginas e a página atual
 Response.Write("<p align='center'>Foram encontrados <b>" & RS.RecordCount & "</b> registros" & vbcrlf )
 Response.Write("<br>Mostrando página <b>" & pagina & "</b> de <b>" & RS.PageCount & "</b></p>" & vbcrlf )
 
 While Not RS.EOF AND cont < RS.PageSize
  Response.Write( rs("nome") & "<br>" & vbcrlf )
  cont = cont + 1
  RS.MoveNext
 Wend
 
 ' Criando a barra de navegação
 
 ' Se a variável pagina for maior que 1 então imprime o botão Anterior com link
 ' Senão imprime sem link
 If CInt(pagina) > 1 Then
  Response.Write("<p align='center'><a href='" & Request.ServerVariables("SCRIPT_NAME") & "?pagina=" & pagina-1 & "'>Anterior</a> ")
 Else
  Response.Write("<p align='center'>Anterior")
 End If
 
 ' Lista todas as páginas encontradas
 For i = 1 To rs.PageCount
  response.write("<a href='" & Request.ServerVariables("SCRIPT_NAME") & "?pagina=" & i & "'>" & i & "</a> ")
 Next
 
 ' Se a variável pagina for menor que o total de páginas então imprime o botão Próxima com link
 ' Senão imprime sem link
 If CInt(pagina) < rs.PageCount Then
  Response.Write("<a href='" & Request.ServerVariables("SCRIPT_NAME") & "?pagina=" & pagina+1 & "'>Próxima</a></p>")
 Else
  Response.Write("Próxima</p>")
 End If
End If


' Fecha e destroi os objetos RS e conn
RS.Close : conn.Close
Set RS = Nothing : Set conn = Nothing
%>



Esta matéria foi postada originalmente no ASP4Developers por Régis da Silva Soares, que na época era "Programador ASP e PHP". Hoje, vai saber...

0

Colocar X palavras do texto em negrito

<%
'----------------------------------
' Função: X Palavras Em Destaque
' Autor: Régis Soares
' E-mail: regis_soares@hotmail.com
' Para Usar:
' texto = String
' xPalavras = Num. de palavras
'   em destaque
' Exemplo:
' Destaca("Active Server Pages",1)
' Última Atualização: 19/07/2003
'----------------------------------
Function Destaca(texto,xPalavras)
 aTexto = Split(texto, " ")
 For i = LBound(aTexto) To UBound(aTexto)
  If Len(aTexto(i)) > 0 Then nTexto = nTexto & " " & aTexto(i)
 Next
 texto = Trim(nTexto)
 x = 1
 For i = 1 To xPalavras
  busca = InStr(x,Trim(texto)," ")
  If busca > 0 Then y = y + 1
  x = busca + 1
 Next
 If y < xPalavras Then
  Destaca = "<b>" & texto & "</b>"
 Else
  Destaca = "<b>" & Mid(texto,1,x-1) & "</b>" & Mid(texto, x)
 End If
End Function
%>
<%= Destaca("Active Server Pages",1)%>



Esta matéria foi postada originalmente no ASP4Developers por Régis da Silva Soares, que na época era "Programador ASP e PHP". Hoje, vai saber...

quinta-feira, 17 de abril de 2003

0

Automatizando fechamento de objetos ADO

Automatizando fechamento de objetos ADO


Essa sub fecha objetos automaticamente !


Apenas criar os objetos de forma padrão


(con --> ADODB.Connection)


(rs --> ADODB.Recordset)


'Fecha BD
Sub FechaDB
 if ISObject(con) then
  if con.State = adStateOpen then
   con.Close
  end if
  set con = nothing
 End If


 if IsObject(recset) then
  if recset.State = 1 then
   recset.Close
  end if
  set recset = nothing
 End If


End Sub



Esta matéria foi postada originalmente no ASP4Developers por César M. Conceição (site), que na época era "Analista / Programador Pleno, mais de 4 anos de experiência no desenvolvimento de sistemas online.(HTML/XHTML/ASP/JAVASCRIPT/DHTML/MS SQL/FIREBIRD/INTERBASE/ACCESS)". Hoje, vai saber...

domingo, 6 de abril de 2003

1

Nova funcionalidade

Está disponível uma nova funcionalidade aos visitantes e colaboradores do ASP4D, que os mesmos ajudaram a construir, mesmo que inconscientemente.


Há algum tempo, toda navegação que os usuários faziam dentro do site é registrada de forma anônima, permitindo identificar padrões de navegação e correlacionando os itens visitados.


Trocando em miúdos: se uma pessoa entra no site e faz uma pesquisa sobre cookies, é natural supor que ela visite outros links sobre este assunto. Também podemos supor que, ao ir de um link para outro, geralmente ambos os links possuem algo em comum.


Assim computamos o conteúdo do item "matérias relacionadas", disponível no final das páginas. Desta forma, montamos uma lista no estilo "quem compra este produto também compra...", tão comum nos sites de e-commerce.


Aproveitando que estávamos com a mão no código, removemos o contador do Stats4All, pois o serviço gratuito deixará de ser oferecido em breve. Passamos a fazer a contagem internamente, mesmo que sem grande riqueza de detalhes.


Por enquanto é só, pe-pessoal.



Esta matéria foi postada originalmente no ASP4Developers por Rubens N. Farias (site), que na época era "pós-graduado em análise de sistemas orientados a objetos, MCP, MCSD, MCAD, MCSD.NET e consultor em TI, além de idealizador do projeto ASP4Developers. Desenvolve sistemas sob medida, focados na satisfação do usuário, com qualidade e custo realista.". Hoje, vai saber...

terça-feira, 25 de março de 2003

1

Novidades

Amigos,


gostaria de pedir desculpas pelo grande tempo sem atualizações nesta página principal, bem como de contribuições de código. Estou atualmente com diversas atividades em curso, o que me mantém um tanto quanto distante da web.


Mas é muito importante frisar que o ASP4D não é mantindo apenas por mim, mas pode diversos desenvolvedores pelo Brasil, que oferecem seu conhecimento aos colegas desenvolvedores, sem cobrar nada em troca. E estes desenvolvedores continuam colocando suas dicas, que podem ser acessadas de forma rápida selecionando a aba "+ recentes" ao lado. Assim, como vocês podem ver, o site continua sendo atualizado.


Farei algumas mudanças neste site, mas a prioridade começa a tornar-se outra: desenvolver um site em .NET sobre .NET para os desenvolvedores .NET , que já começam a proliferar-se pela Web. Quem quiser participar da "gestação" inicial desta idéia, mande-me um email.


Por enquanto é isso. Até a próxima!



Esta matéria foi postada originalmente no ASP4Developers por Rubens N. Farias (site), que na época era "pós-graduado em análise de sistemas orientados a objetos, MCP, MCSD, MCAD, MCSD.NET e consultor em TI, além de idealizador do projeto ASP4Developers. Desenvolve sistemas sob medida, focados na satisfação do usuário, com qualidade e custo realista.". Hoje, vai saber...

segunda-feira, 24 de março de 2003

0

Constructor | Boxing | Unboxing

Interessante isso :


Se o Constructor inicializa a string com empty string : ""


Então ocorre um Box/Unboxing automático.
Pelo fato de uma string ser uma variável to tipo Object
(Reference Types) ao contrário das Value Types
(int, boolean, etc).


Então o valor da string é uma empty string, mas sua referência é NULL.


Correto?



Esta matéria foi postada originalmente no ASP4Developers por Ken Awamura (site), que na época era "Desenvolvedor de Aplicativos Desktop e Web.". Hoje, vai saber...

domingo, 16 de março de 2003

0

String de Conexão (FIREBIRD ou INTERBASE)

String de Conexão (FIREBIRD ou INTERBASE) utilizando IBOLEDB (FREEWARE) / EASYSOFT (SHAREWARE - EVAL)



  sConn = "Provider=IbOleDb;"&_
    "Location=<IP_do_servidor>;"&_
    "Data Source=<caminho_do_arquivo_GDB>;"&_
    "User ID=SYSDBA;"&_
    "Password=<senha>;"&_
    "Extended Properties=Character Set=ISO8859_1;SQL Dialect=3;User Role=;"


EASYSOFT IB6 ODBC:


(http://www.easysoft.com/products/9999/download.phtml?product=2201)


sConn = "DRIVER={Easysoft IB6 ODBC};" & _
  "SERVER=<nome_servidor>;" & _
  "DATABASE=<nome_servidor>:<caminho_base_GDB>";" & _
  "UID=SYSDBA;" & _
  "PWD=masterkey;"&_
  "DIALECT=3;"&_
  "CHARSET=ISO8859_1;"&_
  "ROLE="



Esta matéria foi postada originalmente no ASP4Developers por César M. Conceição (site), que na época era "Analista / Programador Pleno, mais de 4 anos de experiência no desenvolvimento de sistemas online.(HTML/XHTML/ASP/JAVASCRIPT/DHTML/MS SQL/FIREBIRD/INTERBASE/ACCESS)". Hoje, vai saber...

0

Função de um recordset desconectado

' Efetuar conexão e executar a query desejada com um recordset desconectado


Ex.: set oUser = GetRecordset("select * from usuarios")


Function GetRecordSet(byval strSQL)
 Set con = Server.CreateObject("ADODB.Connection")
 con.Open <string de conexão>


 Set recset = Server.CreateObject("ADODB.Recordset")
 recset.CursorLocation = 3
 recset.Open strSQL, con, 0, 4


 ' Disconecta recordset.
 Set recset.ActiveConnection = Nothing
 ' -- retorna recordset
 Set GetRecordSet = recset
End Function



Esta matéria foi postada originalmente no ASP4Developers por César M. Conceição (site), que na época era "Analista / Programador Pleno, mais de 4 anos de experiência no desenvolvimento de sistemas online.(HTML/XHTML/ASP/JAVASCRIPT/DHTML/MS SQL/FIREBIRD/INTERBASE/ACCESS)". Hoje, vai saber...

quarta-feira, 29 de janeiro de 2003

0

Alternar cores das linhas de uma tabela

 

Agora vou mostrar um comando que quase todo mundo quer mais não acha, tem que sair por ai procurando tutoriais que tenham para pegar emprestado :P. Bem, vamos ao que interessa.


Muitos programadores gostam de utilizar o FOR para alternar as cores das linhas de uma tabela, mais vou mostrar um modo de alternar as cores com o IF.


Não to afim de mostrar tudo que você deve fazer pois quero fazer um artigo breve e fácil de entender.


'sql para pegar dados do bd.
sql = "select * from tabela where id_tabela=" & dados
set dada = conexao.execute(sql)


'depois disto vem do modo que quiser while, do while eu utilizo muito o do while.


'aqui vem primeiro a tabela, você pode criar ela antes de tudo mais é bem melhor aqui, pelo menos eu aconselho.


response.write "<table width=""100%"" border=""0"">"


'cor atual sempre tem que ser colocada esta linha antes do 'while' ou do 'do while' você é quem sabe

coratual = "red"

do while not dada.EOF


response.write "<tr>"


'aqui vem as linhas, como todos sabem a cor vem sempre na linha. Estarei utilizando a variável "coratual" mais podem colocar o nome que quiser.


response.write "<td bgcolor=" coratual ">" & dada("campo")


'agora colocamos o movenext


dada.movenext


'antes de fechar com o loop temos que colocar o if que vai alternar as cores.


if coratual = "red" then
'se a cor atual for vermelho ele vai trocar ela para azul
coratual = "blue"
else

'caso ela não seja vermelha ele a coloca como vermelha
coratual = "red"
end if


loop



Esta matéria foi postada originalmente no ASP4Developers por Dieggo Phillippe (site), que na época era "Programador de ASP/HTML e visitem também
http://www.avanielmarinho.com.br, http://www.afolhanet.com.br/delivery, http://www.afolhanet.com.br e http://www.feiraodocarro.com.br". Hoje, vai saber...

sexta-feira, 24 de janeiro de 2003

0

XMLHTTP retorna caracteres estranhos: como resolver

Criei um script para atualizar a lista de usuários sem que a tela "piscasse" muito. A aplicação funcionou bem com um pequeno problema: Os nomes de usuários com acentuação ou Ç retornavam códigos estranhos:
















?/td>
?/td>
Aur?o
???
G?d>
Sans?/td>


Após alguns dias de busca consegui solucionar o problema inserindo a instrução  Response.CharSet="iso-8859-1" na fonte dos dados.


 



Esta matéria foi postada originalmente no ASP4Developers por Marco Aurélio Barbiero (site), que na época era "Analista de Sistemas, trabalha na Receita Federal e desenvolve aplicativos em VB, ASP, Javascript, Notes e XML.
Colaborou algumas vezes com sites como o www.actionjackson.com". Hoje, vai saber...