Apaixonado por tecnologia. Trabalho com tecnologia desde 2003.

Saiba mais sobre minha vida profissional aqui .

Fale comigo.
Siga-me no Twitter
Ultimos comentários
Calendário de Posts
<<  abril 2014  >>
stqqssd
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

Siga o @DicaDoNerd no Twitter e acompanhe as novidades


Minato , Criado em 05/06/2010, 08:57

Durante muito tempo fiz aquelas funções mirabolantes para validação, recuperar apenas números, apenas textos e etc. Com a compreensão do Regex, estas tarefas foram sendo facilitadas, vou iniciar uma série de informações sobre Regex (Regular-Expression). Vamos utilizar a biblioteca “Microsoft VBScript Regular Expression 5.5” que está em “c:\Windows\system32\vbscript.dll”.

Vamos iniciar selecionando a referência no projeto:

referencia_vbscript

Ao incluir a referência, conseguimos acessar as classes, RegExp, Match, MatchCollection e etc.

Agora vamos imagina que queremos, em uma expressão (String) recuperar somente os caracteres numéricos. Bastaria indicarmos que queremos apenas números para o pattern do Regex. Vamos ver na prática como funciona.

Option Compare Database
Option Explicit



Public Sub Testar()

MsgBox (SomenteNumeros("Alexandre Minato 123----++adasjdlak"))

End Sub



Public Function SomenteNumeros(Expressao As String) As Integer

Dim regex As RegExp
Dim encontrados As MatchCollection

Set regex = New RegExp
regex.Global = True 'Indico que as configurações servirão para todos os métodos da classe
regex.IgnoreCase = True 'Ignoro Case Sensitive
regex.Pattern = "[0-9]" 'Indico que quero apenas números de "0 até 9"

Set encontrados = regex.Execute(Expressao) 'seto a instancia da classe com a execução do Regex

Dim strRetorno As String
Dim encontrado As Match

For Each encontrado In encontrados

'Concateno a string com o resultado
strRetorno = strRetorno + encontrado.Value
Next

SomenteNumeros = CInt(strRetorno)

End Function

SomenteNumeros("Alexandre Minato 123----++adasjdlak"))

End Sub

Public Function SomenteNumeros(Expressao As String) As Integer

Dim regex As RegExp
Dim encontrados As MatchCollection

Set regex = New RegExp
regex.Global = True 'Indico que as configurações servirão para todos os métodos da classe
regex.IgnoreCase = True 'Ignoro Case Sensitive
regex.Pattern = "[0-9]" 'Indico que quero apenas números de "0 até 9"

Set encontrados = regex.Execute(Expressao) 'seto a instancia da classe com a execução do Regex

Dim strRetorno As String
Dim encontrado As Match

For Each encontrado In encontrados

'Concateno a string com o resultado
strRetorno = strRetorno + encontrado.Value
Next

SomenteNumeros = CInt(strRetorno)

End Function

Beleza, até agora apenas uma forma diferente de verificar números, porém, e se quisermos criar um método que retorne apenas String? Tradicionalmente faríamos uma lógica que faria um for, verificaria se é número e não concatenaria. Com regex bastaria alterarmos o Pattern, que ficaria assim:

regex.Pattern = “^[0-9]”

Pronto! Pois, o “^” indica negação, ou seja, tudo que não for digito (numero) de 0 à 9.

Agora vamos um pouco além. Imagine que você tem um gerador de relatório, com vários formatos. Imagine o trabalho para configurar cada relatório, com padrões totalmente diferente, completar com espaço, com zeros, com quaiquer caracteres. Imagine se você pudesse fazer algo assim:

Suponha que sua Tabela seja tbCliente e que tenha os campos IDCliente, NomeCliente, DataNascimento.

e que pudesse simplesmente definir o formato, como por exemplo:

Select: Select * from tbCliente

Formato: {IDCliente:0000}{NomeCliente:!@           }{DataNascimento:dd/mm/yyyy}

Como você faria isso?… no próximo artigo vou mostrar como podemos fazer isso de uma forma muito simples!

Até a próxima.

Uma grande dificuldade que desenvolvedores em Acces tem é quando é necessário trabalhar com busca em todos os campos, para facilitar o trabalho eu utilizo um modelo padrão para as aplicações que desenvolvo (ultimamente não desenvolvo mais em VBA, Access, VB), mas confesso que sempre adorei e acho uma das ferramentas mais produtivas e que conto nos dedos as pessoas que conhecem de verdade esta ótima ferramenta.

A vantagem de utilizar esta solução é que basta você incluir um campo vinculado no formulário e o método se localização faz o resto :-)

A idéia é bem simples, vou concatenando a string da busca e montando um like de acordo com os controles que existe na tela. Segue o exemplo:

   1: Private Sub LocalizarTodosCampos()
   2:     'O código abaixo, localiza o critério em qualquer campo do formulário
   3:     'Cortesia de Alexandre Minato
   4:     'Permitida a distribuição / utilização desde que mantido os créditos
   5:     
   6:     If Me.txtFiltro = "<Informe o Filtro>" Then Exit Sub
   7:  
   8:     Dim sql As String
   9:     sql = "SELECT * FROM tblCadastro "
  10:  
  11:  
  12:     Dim contador As Byte
  13:     contador = 0
  14:  
  15:     If Not IsNull(Me.txtFiltro) Then
  16:         sql = sql + " WHERE "
  17:         Dim ctl As Control
  18:         For Each ctl In Me.Controls
  19:             
  20:             If ctl.ControlType = acTextBox Then
  21:                 If Len(ctl.ControlSource) > 0 And ctl.Locked = False Then
  22:                     If contador > 0 Then sql = sql + " OR "
  23:                         sql = sql + "(" + ctl.ControlSource + " Like '*' & '" + Me.txtFiltro + "' & '*') "
  24:                         contador = contador + 1
  25:                 End If
  26:             End If
  27:         Next
  28:     
  29:     End If
  30:  
  31: Me.Form.RecordSource = sql
  32: Me.Recalc
  33: End Sub

 

O resultado da pesquisa pode ser visto abaixo:

Sem título

Bom, podemos ver um Toolip personalizado também que encontrei  neste site.

 

Até a próxima

Minato 8-)

Baixe e Exemplo

     No Microsoft word, existe um problema quando você insere as legendas, marcadores e índices no documento, sempre que você coloca um novo ítem, é necessário selecionar os itens e clicar com botão direito e atualizar campo.

     Há uma forma mais simples de realizar esta operação atualizando os Range via VBA.

     Segue o exemplo:

   1: Sub AtualizarRanges() 
   2:      
   3:     Dim Ranges
   4:      
   5:     Set Ranges = Selection.Range 
   6:      
   7:     Selection.WholeStory 
   8:     Selection.Fields.Update 
   9:      
  10:     Ranges.Select 
  11:      
  12: End Sub

      Simples assim.

 

      Minato 8-)

Quanta vezes precisamos baixar um arquivo via download via código. A idéia aqui é bem simples, basta passar a url do arquivo que deseja baixar e o destino.

   1: Public Sub DownloadFile(Url As String, DestFileName As String)    
   2:     Dim http As WinHttpRequest    
   3:     Set http = New WinHttpRequest        
   4:     http.Open "GET", Url, False    
   5:     http.Send        
   6:     Dim hFile As Integer    
   7:     hFile = FreeFile        
   8:  
   9:     Open DestFileName For Output As #hFile    
  10:         Print #hFile, StrConv(http.ResponseBody, vbUnicode)    
  11:     Close #hFile
  12:  
  13:     End Sub

Ë necessário criar uma referência na sua aplicação para utilizar o WinHttpRequest.

 

Minato 8-)

Minato , Criado em 20/02/2010, 06:56

Uma grande trabalho que existe em aplicativos criados com Access é a validação de preenchimento dos campos. Criei um exemplo que trata as validações de forma genérica.

Existe uma propriedade pouco utilizada no Access (Tag ou Marca para quem tem o Office em Português). A idéia é bem simples, passamos por todos os controles do formulário e verificar se esta propriedade está preenchida, se a propriedade estiver preenchida, isso indica que o controle deve ser preenchido. Utilizo o valor desta propriedade para exibir a mensagem.

 

senha1
Figura 1 - Propriedade TAG

 

senha

Figura 2 – Tela em Execução

 

Método que verifica o preenchimento.

   1: Private Function ValidaPreenchimento() As Boolean
   2:  
   3:     Dim ctl As Control
   4:  
   5:     On Error GoTo ValidaPreenchimento_Error
   6:  
   7:     For Each ctl In Me.Controls    'Passo por todos controles do formulario
   8:  
   9:         If ctl.ControlType = acTextBox Then    ' Verifico se é uma caixa de texto
  10:             If IsNull(ctl.Value) Then    'Verifico se o campo foi preenchido
  11:                 AplicaExibicaoErro "O Campo '" + ctl.Tag + "' não pode ficar em branco", ctl    'Coloco a mensagem e movo a imagem para frente do controle com erro
  12:                 ctl.SetFocus    'Coloco foco no controle, para agilizar procedimento de correção do usuário
  13:                 Exit Function
  14:             End If
  15:         End If
  16:     Next
  17:  
  18:     If Me.txtSenhaNova <> Me.txtSenhaNova_Confirma Then    'Verifico se a confirmação da nova senha
  19:         AplicaExibicaoErro "A nova senha não confere", Me.txtSenhaNova_Confirma    'coloca a mensagem de erro e movo a imagem
  20:         Me.txtSenhaNova.SetFocus
  21:         Exit Function
  22:     End If
  23:  
  24:     Const TAMANHO_MINIMO_SENHA As Byte = 6    'Parametrizo o tamanho do campo (Boas práticas de programação) basta alterarmos aqui para fazer todas as modificações
  25:     If Len(Me.txtSenhaNova) < TAMANHO_MINIMO_SENHA Then    'Verifico se o tamanho mínimo foi preenchido
  26:         AplicaExibicaoErro "A nova senha deve conter no mínimo " & TAMANHO_MINIMO_SENHA & " caracteres", Me.txtSenhaNova_Confirma    'Coloco mensangem e movo imagem
  27:         Me.txtSenhaNova.SetFocus    'dou foco ao controle
  28:         Exit Function
  29:     End If
  30:  
  31:     ValidaPreenchimento = True
  32:     Me.txtLogin.SetFocus
  33:  
  34: ValidaPreenchimento_Exit:
  35:     Exit Function
  36:  
  37: ValidaPreenchimento_Error:
  38:     MsgBox Err.Description, vbCritical, " Erro imprevisto"
  39:     Resume ValidaPreenchimento_Exit
  40:  
  41: End Function

 

Baixe a solução

 

Até a próxima

Minato 8-)

 
teste