Cada uma das funções abaixo deve ser guardada por você no seu 'cinto de utilidades', nem que seja num simples arquivo texto. Com isso você evitaria perder tempo sempre que tiver que criar essas funções e praticamente toda app sua elas.
A função abaixo foi feita para uma aplicação tipo Console que lê os dados de um arquivo texto e devolve um dado tipo string.
O nome do arquivo pode ter o path completo para leitura do arquivo mas sugiro que use o chdir antes para navegar até a pasta do arquivo (veja abaixo).
Public Function LeArqTexto(NomeArq As String) As String
Dim linha As String
Dim dado As String
Console.WriteLine("Lendo os dados do Arquivo : " + NomeArq)
dado = ""
Try
Dim sr As StreamReader = New StreamReader(NomeArq, System.Text.Encoding.Default)
Do
linha = sr.ReadLine()
dado += dado + vbCrLf
Loop Until linha Is Nothing
sr.Close()
Console.WriteLine("Leitura dos dados do arquivo " + NomeArq + " feita com Sucesso")
Catch e As Exception
Console.Write("Erro ao ler o arquivo: " + e.Message)
Console.WriteLine("Falha na leitura dos dados do arquivo " + NomeArq + ", Terminando o processo")
sair()
End Try
Return dado
End Function
A função abaixo foi feita em windows forms application e lê um arquivo texto:
Public Function LeArqTexto(arq As String) As String
Return (My.Computer.FileSystem.ReadAllText(arq))
End Function
Segue os mesmos princípios do LeArqTexto acima contudo os parâmetros são o nome do arquivo a ser gerado e os dados a serem gravados.
Public Sub GravarArqTexto(NomeArq As String, dado As String)
Dim a As String
Console.Write("Gravando os dados no arquivo: " + NomeArq)
Try
a = PegaPasta(NomeArq)
ChDir("C:\")
ChDir(Mid(a, 4))
Dim sw As StreamWriter = New StreamWriter(PegaNomeArq(NomeArq), True)
sw.WriteLine(dado)
sw.Close()
Console.Write("Gravação dos dados no arquivo: " + NomeArq + " terminada com sucesso")
Catch ex As Exception
Console.Write("Erro ao gravar o arquivo: " + ex.Message + ", terminando o Processo")
sair()
End Try
End Sub
Suponha que sua app tenha feito um monte de coisas e no console.writeline você tenha emitido um monte de mensagens.
Antes de terminar a aplicação você gostaria de dar um tempinho para o usuário ler as mensagens antes de fechar a aplicação.
A sugestão aqui é usar a instrução sleep e no exemplo abaixo 5000 é o tempo em milisegundos, ou seja, 5 segundos antes de fechar a aplicação.
Public Sub sair()
System.Threading.Thread.Sleep(5000) '5 segundos
End
End Sub
Public Sub dormir(tempo As Integer)
Dim a As Integer
a = tempo
While a > 0
System.Threading.Thread.Sleep(1000)
Application.DoEvents()
a -= 1
End While
End Sub
Suponha que você tem um string com a pasta e o nome do arquivo e você deseja pegar apenas a pasta do arquivo desse string. A função abaixo faz isso:
Public Function PegaPasta(NomeArq As String) As String
Dim a As String
a = NomeArq
a = Left(a, InStrRev(a, "\") - 1)
Return a
End Function
Executando a função acima a variável a viria com o valor "C:\pastax". Note que o -1 remove o \ final da pasta.
Suponha que você tem um string com a pasta e o nome do arquivo e você deseja pegar apenas o nome do arquivo desse string. A função abaixo faz isso:
Public Function PegaNomeArq(NomeArq As String) As String
Dim a As String
a = NomeArq
a = Mid(a, InStrRev(a, "\") + 1)
Return a
End Function
Executando a função acima a variável a viria com o valor "arquivoy".
Suponha que você tenha um arquivo de opções do programa que deseja salvar os parâmetros de funcionamento dele para que não precise mudar o programa cada vez que um desses parâmetros for mudado. No exemplo abaixo menciono como ler os parâmetros de conexão de um servidor MS SQL, o nome da proc (procedure) a ser executada e o nome do arquivo onde os dados da proc devem ser armazenados.
Exemplo:
MS_SQL_servidor = srv1
MS_SQL_bd = bd2
MS_SQL_Usuario = usu3
MS_SQL_Senha = senha4
MS_SQL_proc = procmssql5
nomearq = C:\pasta6\NomeArq7.txt
Parte 1 : Definição das variáveis de configuração do sistema
'servidor MS SQL
Public MS_SQL_servidor As String
Public MS_SQL_bd As String
Public MS_SQL_Usuario As String
Public MS_SQL_Senha As String
Public MS_SQL_proc As String
Public nomearq As String
Parte 2 : Mostro agora a rotina que vai separar o parâmetro de seu dado retornando apenas o dado, ou seja:
Info recebida aquivo texto = MS_SQL_servidor = srv1 seria desmembrado em:
Parâmetro = MS_SQL_servidor
Dado = srv1
Public Function PegaParametro(dado As String)
Dim a As String
a = dado
a = Mid(a, InStrRev(a, "=") + 1)
Return a
End Function
Parte 3 : Lê o arquivo texto de parâmetros e colocar nos strings de configuração do programa.
Public Sub DefineParametros()
Dim pasta As String
Dim sr As IO.StreamReader
Dim dado As String
Console.WriteLine("Lendo o arquivo de configuração: config.txt")
'pasta = Environment.SpecialFolder.DesktopDirectory
pasta = Environment.CurrentDirectory
If IO.File.Exists(pasta + "\config.txt") Then
Console.WriteLine("Arquivo de configuração encontrado...Lendo...")
sr = New IO.StreamReader(pasta + "\config.txt")
dado = sr.ReadLine
While dado <> Nothing
If InStr(dado, "MS_SQL_servidor") > 0 Then
MS_SQL_servidor = PegaParametro(dado)
End If
If InStr(dado, "MS_SQL_bd") > 0 Then
MS_SQL_bd = PegaParametro(dado)
End If
If InStr(dado, "MS_SQL_Usuario") > 0 Then
MS_SQL_Usuario = PegaParametro(dado)
End If
If InStr(dado, "MS_SQL_Senha") > 0 Then
MS_SQL_Senha = PegaParametro(dado)
End If
If InStr(dado, "MS_SQL_proc") > 0 Then
MS_SQL_proc = PegaParametro(dado)
End If
If InStr(dado, "nomearq") > 0 Then
nomearq = PegaParametro(dado)
End If
dado = sr.ReadLine
End While
Console.WriteLine("Leitura do arquivo de configuração terminada com Sucesso...")
sr.Close()
Else
Console.WriteLine("Arquivo de configuração config.txt não existe...criando um novo")
Dim sw As New IO.StreamWriter(pasta + "config.txt", True)
sw.WriteLine("MS_SQL_servidor = srv1")
sw.WriteLine("MS_SQL_bd = bd2")
sw.WriteLine("MS_SQL_Usuario = usu3")
sw.WriteLine("MS_SQL_Senha = senha4")
sw.WriteLine("MS_SQL_proc = senha5")
sw.WriteLine("nomearq = C:\pasta6\Arquivo7.txt")
sw.Close()
Console.WriteLine("Arquivo de configuração Criado com Sucesso...")
End If
End Sub
Suponha que você tenha um arquivo texto tipo 'config.txt' que tenha a configuração do seu sistema
''' <summary>
''' Esta sub Carrega as opçoes do programa do arquivo opcoes.txt
''' </summary>
Public Function CarregarOpcoes() As List(Of String)
Dim ArquivoTexto As IO.StreamReader
Dim DadoArqTexto As String
Dim pasta As String
Dim b As New List(Of String)
'Environment.SystemDirectory
'Environment.CurrentDirectory
'pasta = Environment.GetFolderPath(Environment.SpecialFolder.System)
pasta = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
If Right(pasta, 1) <> "\" Then
pasta = pasta + ""
End If
If IO.File.Exists(pasta + "opcoes.Text") Then
b.Clear()
ArquivoTexto = New IO.StreamReader(pasta + "opcoes.Text")
'primeira linha : Pasta de Arquivos de Origem
DadoArqTexto = ArquivoTexto.ReadLine
b.Add(DadoArqTexto) 'PastaOrigem
'segunda linha : Pasta de Arquivos de Destino
DadoArqTexto = ArquivoTexto.ReadLine
b.Add(DadoArqTexto) 'PastaDestino
'terceira linha : Número de horas para repetir processo
DadoArqTexto = ArquivoTexto.ReadLine
b.Add(DadoArqTexto) 'NumHoras
'quarta linha : Incluir subpastas
DadoArqTexto = ArquivoTexto.ReadLine
If DadoArqTexto = "SIM" Then
b.Add("True") 'IncluirSubPastas
Else
b.Add("False") 'IncluirSubPastas
End If
ArquivoTexto.Close()
Return b
Else
Return Nothing
End If
End Function
''' <summary>
''' Esta rotina salva as opções do usuário sobre o programa no arquivo opcoes.txt
''' </summary>
Public Sub SalvarOpcoes(a As List(Of String))
Dim ArquivoTexto As IO.StreamWriter
Dim pasta As String
pasta = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
If Right(pasta, 1) <> "\" Then
pasta = pasta + ""
End If
ArquivoTexto = New IO.StreamWriter(pasta + "opcoes")
'primeira linha : Pasta de Arquivos de Origem
ArquivoTexto.WriteLine(a(0))
'segunda linha : Pasta de Arquivos de Destino
ArquivoTexto.WriteLine(a(1))
'terceira linha : Número de horas para repetir processo
ArquivoTexto.WriteLine(a(2))
'quarta linha : Pasta de Arquivos de Destino
If a(3) = "True" Then
ArquivoTexto.WriteLine("SIM")
Else
ArquivoTexto.WriteLine("NAO")
End If
ArquivoTexto.Close()
End Sub
End Module
Função Limpa : Muitas vezes recebemos dados com informações inválidas como NULL, datas desformatadas onde o 0 do dia ou mês foram suprimidos e se a informação for utilizada com esse formato irá provocar um erro. Esta função limpa retorna ou o dado formatado ou um string vazio evitando erros.
Public Function limpa(ByVal dado As Object) As String
Dim dia, mes, ano As Integer
Dim data As DateTime
Dim saida As String
If IsDBNull(dado) Then
Return "'NULL'"
End If
If IsDate(dado) Then
data = CDate(dado)
dia = data.Day
mes = data.Month
ano = data.Year
If dia < 10 Then
saida = "0" + CStr(dia)
Else
saida = CStr(dia)
End If
saida = saida + "/"
If mes < 10 Then
saida = saida + "0" + CStr(mes)
Else
saida = saida + CStr(mes)
End If
saida = saida + "/" + CStr(ano)
Return saida
End If
If IsNumeric(dado) Then
saida = Trim(CStr(dado))
saida = Replace(saida, ",", ".")
Return saida
End If
saida = Trim(dado)
saida = Replace(saida, "'", "´")
Return saida
End Function
A função abaixo retorna true se o sring recebido é um CNPJ válido.
Public Function E_CNPJ(ByVal ID As String) As Boolean
' validando se CGC ou CNPJ
'o campo deve vir com 14 caracteres numéricos completados com zeros a esquerda
'a validação é feita com o formato xxx.xxx.xxx-xx
Dim a As Integer
Dim j As Integer
Dim d1 As Integer
Dim i As Integer
Dim d2 As Integer
Dim b As String
E_CNPJ = True
If ID = "" Then
E_CNPJ = False
Exit Function
End If
b = Limpa_CPF_CNPJ(ID)
While (Left(b, 1) = "0") And (Len(b) > 8)
b = Mid$(b, 2, 2000)
End While
If (Len(b) > 8) And (Len(b) < 14) Then
While Len(b) < 14
b = "0" + b
End While
End If
If Len(b) = 8 And Val(b) > 0 Then
a = 0
j = 0
d1 = 0
For i = 1 To 7
a = Val(Mid(b, i, 1))
If (i Mod 2) <> 0 Then
a = a * 2
End If
If a > 9 Then
j = j + Int(a / 10) + (a Mod 10)
Else
j = j + a
End If
Next i
d1 = IIf((j Mod 10) <> 0, 10 - (j Mod 10), 0)
If d1 = Val(Mid(b, 9, 1)) Then
E_CNPJ = True
Else
E_CNPJ = False
End If
Else
If Len(b) = 14 And Val(b) > 0 Then
a = 0
i = 0
d1 = 0
d2 = 0
j = 5
For i = 1 To 12 Step 1
a = a + (Val(Mid(b, i, 1)) * j)
j = IIf(j > 2, j - 1, 9)
Next i
a = a Mod 11
d1 = IIf(a > 1, 11 - a, 0)
a = 0
i = 0
j = 6
For i = 1 To 13 Step 1
a = a + (Val(Mid(b, i, 1)) * j)
j = IIf(j > 2, j - 1, 9)
Next i
a = a Mod 11
d2 = IIf(a > 1, 11 - a, 0)
If (d1 = Val(Mid(b, 13, 1)) And d2 = Val(Mid(b, 14, 1))) Then
E_CNPJ = True
Else
E_CNPJ = False
End If
Else
E_CNPJ = False
End If
End If
Return E_CNPJ
End Function
A função abaixo retorna true se o sring recebido é um CPF válido.
Public Function E_CPF(ByVal ID As String) As Boolean
' valida se cpf
Dim soma As Integer
Dim Resto As Integer
Dim i As Integer
Dim b As String
E_CPF = True
If ID = "" Then
E_CPF = False
Exit Function
End If
If Len(ID) < 5 Then
E_CPF = False
Exit Function
End If
b = Limpa_CPF_CNPJ(ID)
If Not IsNumeric(b) Then
E_CPF = False
Exit Function
End If
While (Strings.Left(b, 1) = "0") And (Len(b) > 11)
b = Mid$(b, 2, 2000)
End While
While Len(b) < 11
b = "0" + b
End While
'Valida argumento
If Len(b) <> 11 Then
E_CPF = False
Exit Function
End If
soma = 0
For i = 1 To 9
soma = soma + Val(Mid$(b, i, 1)) * (11 - i)
Next i
Resto = 11 - (soma - (Int(soma / 11) * 11))
If (Resto = 10) Or (Resto = 11) Then Resto = 0
If Resto <> Val(Mid$(b, 10, 1)) Then
E_CPF = False
Exit Function
End If
soma = 0
For i = 1 To 10
soma = soma + Val(Mid$(b, i, 1)) * (12 - i)
Next i
Resto = 11 - (soma - (Int(soma / 11) * 11))
If (Resto = 10) Or (Resto = 11) Then Resto = 0
If Resto <> Val(Mid$(b, 11, 1)) Then
E_CPF = False
Exit Function
End If
Return E_CPF
End Function
A função abaixo retorna true se o sring recebido é um CEI (veja IBGE) válido.
Public Function E_CEI(cei As String) As Boolean
'CEI = Código Específico do INSS
'O CEI são 11 digitos mais 1 digito verificador
Try
Dim numcei As String
Dim Pesos = New Integer() {7, 4, 1, 8, 5, 2, 1, 6, 3, 7, 4}
Dim soma As Integer = 0
Dim SOMA_CEI(11) As Integer
Dim dv As String = ""
Dim Total As Integer = 0
Dim CEI1(11) As Integer
Dim i As Integer
Dim j As Integer
'retirando os zeros não significativos a esquerda
numcei = cei
While (Left(numcei, 1) = "0") And (Len(numcei) > 12)
numcei = Mid(numcei, 2, 100)
End While
If (numcei.Length < 12) Then
Return False
End If
'Convertendo os caracteres do CEI para inteiro e criando um array
For i = 0 To Len(numcei) - 2
CEI1(i) = CInt(Mid(numcei, i + 1, 1))
SOMA_CEI(i) = CEI1(i) * Pesos(i)
Next
soma = 0
For j = 0 To 10
soma = soma + SOMA_CEI(j)
Next
j = Int(soma / 10)
j = soma Mod 10 + j
j = (Math.Abs(10 - j) Mod 10)
dv = CStr(j)
If (numcei.Substring(11, 1) = dv) Then
Return True
Else
Return False
End If
Catch ex As Exception
MsgBox("Ocorreu um Erro : " + Err.Description, vbCritical, "Function E_CEI")
Return False
End Try
End Function
A função abaixo retornira os caracteres acentuados e retorna em seu lugar o caractere sem acento. Muito util quando convertemos dos codepages 1252 e UTF-8.
Public Function RetiraAcentuacao(ByVal dado As String) As String
Dim a As String
a = dado
'substutuição de acentuação - minúsculas
a = Replace(a, "á", "a")
a = Replace(a, "à", "a")
a = Replace(a, "ã", "a")
a = Replace(a, "â", "a")
a = Replace(a, "ä", "a")
a = Replace(a, "é", "e")
a = Replace(a, "è", "e")
a = Replace(a, "ê", "e")
a = Replace(a, "ë", "e")
a = Replace(a, "í", "i")
a = Replace(a, "ì", "i")
a = Replace(a, "î", "i")
a = Replace(a, "ï", "i")
a = Replace(a, "ó", "o")
a = Replace(a, "ò", "o")
a = Replace(a, "õ", "o")
a = Replace(a, "ô", "o")
a = Replace(a, "ö", "o")
a = Replace(a, "ú", "u")
a = Replace(a, "ù", "u")
a = Replace(a, "û", "u")
a = Replace(a, "ü", "u")
a = Replace(a, "ç", "c")
'substutuição de acentuação - maiúsculas
a = Replace(a, "Á", "A")
a = Replace(a, "À", "A")
a = Replace(a, "Ã", "A")
a = Replace(a, "Â", "A")
a = Replace(a, "Ä", "A")
a = Replace(a, "É", "E")
a = Replace(a, "È", "E")
a = Replace(a, "Ê", "E")
a = Replace(a, "Ë", "E")
a = Replace(a, "Í", "I")
a = Replace(a, "Ì", "I")
a = Replace(a, "Î", "I")
a = Replace(a, "Ï", "I")
a = Replace(a, "Ó", "O")
a = Replace(a, "Ò", "O")
a = Replace(a, "Õ", "O")
a = Replace(a, "Ô", "O")
a = Replace(a, "Ö", "O")
a = Replace(a, "Ú", "U")
a = Replace(a, "Ù", "U")
a = Replace(a, "Û", "U")
a = Replace(a, "Ü", "U")
a = Replace(a, "Ç", "C")
Return a
End Function
End Module
Critica MS SQL 1 - Parâmetros versus dados.
Suponha que você seja um cara super organizado e que preze muito a identação e as boas práticas de programação.
Contudo algumas situações são cruéis até para os mais masoquistas. Veja o exemplo abaixo, tenho uma instrução insert do MS SQL.
Ao executar ela o programa exibe uma mensagem de erro...o número de parâmetros não bate com o número de dados.
Saberia me dizer aonde está o erro ?
txtQuery.Text = "insert into tbl_aux_turma (id_turma, id_curso, id_dependencia, emp_coordenador, re_coordenador, & _
id_superintendencia, id_competencia, id_classificacao, id_emp_instrutor, id_instrutor, & _
id_emp_instrutor_01, id_instrutor_01, id_emp_instrutor_02, id_instrutor_02, id_vendor, & _
max_vagas, min_vagas, custo, tipo_turma, carga_horaria, status, dt_criacao_turma, dt_inicio_inscricao, & _
dt_fim_inscricao, dt_inicio_treinamento, dt_fim_treinamento, hora_inicio_treinamento, & _
hora_fim_treinamento, hora_intervalo, dias_cancelamento, dias_semana, observacao, & _
hr_inicio_inscricao, hr_fim_inscricao, publico_alvo, id_produto, contrato, ordem_interna, & _
re_usuario, dt_ult_atu,tipo_competencia) & _
values ('0001;;T91000', 'T91000', 'M23', '0020', '0000000', 'H*HS', '7', '47', '0020', & _
'R26686388', '', '', '', '', '000222', 9, 1 , 22500 , '2', 1,8, '1', convert(datetime,'18/8/2004',103), & _
convert(datetime,'19/8/2004',103), convert(datetime,'19/8/2004',103), convert(datetime,'20/8/2004',103), & _
convert(datetime,'20/8/2004',103), '1/1/1900 14:00:00', '1/1/1900 16:00:00', '1/1/1900 00:12:00', '1', & _
'0000100', 'Turma cadastrada para testes no sistema.', '', '', '', '', '', '', '0000000', & _
convert(datetime,'19/8/2004',103), '3')"
Vou ajudar...Os parâmetros do insert são:
id_turma, id_curso, id_dependencia, emp_coordenador, re_coordenador, & _
id_superintendencia, id_competencia, id_classificacao, id_emp_instrutor, id_instrutor, & _
id_emp_instrutor_01, id_instrutor_01, id_emp_instrutor_02, id_instrutor_02, id_vendor, & _
max_vagas, min_vagas, custo, tipo_turma, carga_horaria, status, dt_criacao_turma, dt_inicio_inscricao, & _
dt_fim_inscricao, dt_inicio_treinamento, dt_fim_treinamento, hora_inicio_treinamento, & _
hora_fim_treinamento, hora_intervalo, dias_cancelamento, dias_semana, observacao, & _
hr_inicio_inscricao, hr_fim_inscricao, publico_alvo, id_produto, contrato, ordem_interna, & _
re_usuario, dt_ult_atu,tipo_competencia)
Mais uma ajudinha...Os dados são :
values ('0001;;T91000', 'T91000', 'M23', '0020', '0000000', 'H*HS', '7', '47', '0020', & _
'R26686388', '', '', '', '', '000222', 9, 1 , 22500 , '2', 1,8, '1', convert(datetime,'18/8/2004',103), & _
convert(datetime,'19/8/2004',103), convert(datetime,'19/8/2004',103), convert(datetime,'20/8/2004',103), & _
convert(datetime,'20/8/2004',103), '1/1/1900 14:00:00', '1/1/1900 16:00:00', '1/1/1900 00:12:00', '1', & _
'0000100', 'Turma cadastrada para testes no sistema.', '', '', '', '', '', '', '0000000', & _
convert(datetime,'19/8/2004',103), '3')"
Complicado né...e se você mexe muito com SQL pode deparar com erros semelhantes.
Private Sub btnProcessar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnProcessar.Click
Dim a As Integer 'varre caractere por caractere da querie
Dim b As String 'parte da query desmembrada
Dim campos(1000) As String 'campos do insert
Dim dados(1000) As String 'parametros recebidos
Dim pnt1 As Integer = 0 'aponta para campos() e dados()
Dim pnt2 As Integer = 0 'aponta para campos() e dados()
Dim flg_apostrofo As Boolean 'flag dentro de apóstrofo-desconsiderar vírgulas
Dim flg_abreparenteses As Boolean 'flag dentro de apóstrofo-desconsiderar vírgulas
Dim c As String 'caractere da querie
frmQuerieDecomposta.Visible = True
frmQuerieDecomposta.ListBox1.Items.Clear()
'separando a parte inicial - até o abre parenteses
a = 1
b = ""
c = Mid(txtQuery.Text, a, 1)
While c <> "("
b = b + c
a = a + 1
c = Mid(txtQuery.Text, a, 1)
End While
b = b + Mid(txtQuery.Text, a, 1)
frmQuerieDecomposta.txtOperacao.Text = b 'insert into tabela(
'separando os campos da tabela
a = a + 1
b = ""
pnt1 = 0
c = Mid(txtQuery.Text, a, 1)
While c <> ")"
b = b + c
If c = "," Then
b = Strings.Left(b, Len(b) - 1)
campos(pnt1) = limpa(b)
pnt1 = pnt1 + 1
b = ""
End If
a = a + 1
c = Mid(txtQuery.Text, a, 1)
End While
'separando a parte intermediaria - ) values ( - insert into tabela(campos) values (
b = ""
c = Mid(txtQuery.Text, a, 1)
While c <> "("
b = b + c
a = a + 1
c = Mid(txtQuery.Text, a, 1)
End While
b = b + c
a = a + 1
'frmQuerieDecomposta.ListBox1.Items.Add(b) ') values (
flg_apostrofo = False 'flag dentro de apóstrofo-desconsiderar vírgulas
flg_abreparenteses = False 'flag dentro de apóstrofo-desconsiderar vírgulas
'separando os parametros
b = ""
pnt2 = 0
c = Mid(txtQuery.Text, a, 1)
While c <> ")" Or (flg_apostrofo = True) Or (flg_abreparenteses = True)
b = b + c
'verificando as vírgulas - só contabilizar virgulas se estiver fora de 'Endereço x,x,x,' e convert(x,x,x)
If (flg_apostrofo = False) And (flg_abreparenteses = False) Then
If c = "," Then
b = Strings.Left(b, Len(b) - 1)
dados(pnt2) = Limpa(b)
pnt2 = pnt2 + 1
b = ""
End If
End If
'verificando abre parenteses
If c = "(" Then
flg_abreparenteses = True
End If
If Mid(txtQuery.Text, a, 1) = ")" Then
flg_abreparenteses = False
End If
'verificando apostrofe
If c = "'" Then
If flg_apostrofo Then
flg_apostrofo = False
Else
flg_apostrofo = True
End If
End If
a = a + 1
c = Mid(txtQuery.Text, a, 1)
End While
'verificando se o número de campos bate com o número de parametros
If pnt1 <> pnt2 Then
b = "Falha : Foram encontrados : " + CStr(pnt1) + " campos e " + CStr(pnt2) + " parâmetros"
txtMsg.Text = b
'frmQuerieDecomposta.ListBox1.Items.Add(b)
If pnt2 > pnt1 Then
pnt1 = pnt2
End If
End If
'exibindo o resultado
For a = 0 To pnt1 - 1
b = Strings.Right("0000" + CStr(a), 4) + " " + formata(campos(a), 30) + formata(dados(a), 3 0)
frmQuerieDecomposta.ListBox1.Items.Add(b)
Next
End Sub
Function Limpa(dado As String) As String
Dim a As String
a = dado
retorno:
If Strings.Left(a, 2) = vbCrLf Then
a = Mid(a, 3)
GoTo retorno
End If
If Strings.Left(a, 1) = vbTab Then
a = Mid(a, 2)
GoTo retorno
End If
If Strings.Left(a, 1) = " " Then
a = Mid(a, 2)
GoTo retorno
End If
If Strings.Left(a, 1) = "&" Then
a = Mid(a, 2)
GoTo retorno
End If
If Strings.Left(a, 1) = "_" Then
a = Mid(a, 2)
GoTo retorno
End If
'----------------------------------------------
If Strings.Right(a, 2) = vbCrLf Then
a = Mid(a, 1, Len(a) - 2)
GoTo retorno
End If
If Strings.Right(a, 1) = vbTab Then
a = Mid(a, 1, Len(a) - 1)
GoTo retorno
End If
If Strings.Right(a, 1) = " " Then
a = Mid(a, 1, Len(a) - 1)
GoTo retorno
End If
If Strings.Right(a, 1) = "&" Then
a = Mid(a, 1, Len(a) - 1)
GoTo retorno
End If
If Strings.Right(a, 1) = "_" Then
a = Mid(a, 1, Len(a) - 1)
GoTo retorno
End If
Return a
End Function
Public Function formata(dado As String, tam As Integer)
Dim a As String
a = dado
While Len(a) < tam
a += " "
End While
Return a
End Function
Rodando a pesquisa acima você irá descobrir que tem um dado a mais que parâmetro. O ruim é descobrir qual é mas o erro fica claro.
A sub abaixo abre o Acrobat PDF Reader instalado no sistema operacional para exibir um arquivo PDF numa pasta específica.
Private Sub btnDoc_Click(sender As Object, e As EventArgs) Handles btnDoc.Click
Dim a As String
Dim b As String
Dim c As String
b = Chr(34) + "C:\Program Files\Adobe\Acrobat DC\Acrobat\Acrobat.exe" + Chr(34)
a = System.Windows.Forms.Application.StartupPath
a += "Documentox.pdf"
'a = Chr(34) + a + Chr(34)
c = b + " " + Chr(34) + a + Chr(34)
If ArquivoExiste(a) Then
Process.Start(c)
End If
End Sub
Emitir mensagens e alertar os usuários sobre as tarefas do processo muitas vezes é fundamental mas algumas vezes precisamos de algo mais, de um complemento como a data e o horário que as mensagens foram emitidas para que fique documentado.
Sendo assim antes das mensagens nós gostaríamos de colocar a data e o horário que a mensagem foi exibida.
A função abaixo formata a data e horário num string trocando o / do dia/mes/ano por _, o : do horario por _ e o espaço por _.
Sendo assim a data ficaria como um string no formato : DD_MM_AAAA_HH_MM_SS
Public Function fncDataHorario() As String
Dim a As String
a = CStr(Now) '20/03/2023 13:33:02
a = Replace(a, "/", "_")
a = Replace(a, ":", "_")
a = Replace(a, " ", "_")
Return (a) '20_03_2023_13_34_08
End Function
Public Sub msg(mens As String)
Dim a As String
a = fncDataHorario() + "_" + mens
frmPrincipal.LstBox1.Items.Add(a)
frmPrincipal.LstBox1.SelectedIndex = frmPrincipal.LstBox1.Items.Count - 1
frmPrincipal.LstBox1.Refresh()
Application.DoEvents()
End Sub
A função abaixo retorna true se o arquivo for encontrado na pasta fornecida.
Public Function ArquivoExiste(arq As String) As Boolean
Return (My.Computer.FileSystem.FileExists(arq))
End Function
Suponha que num listbox você tenha colocado um monte de mensagens que deseja salvar num arquivo texto de log da aplicação
Public Sub GravarLog(dthr As String)
Dim a As Integer
Dim b As String
Dim file As System.IO.StreamWriter
b = "C:\Pastax\NomeArqy"
b = Left(b, InStrRev(b, "\"))
b = b + "LOGx_" + dthr + ".txt"
msg("Salvando o LOG do processo : " + b)
file = My.Computer.FileSystem.OpenTextFileWriter(b, True)
For a = 0 To frmPrincipal.LstBox1.Items.Count - 1
frmPrincipal.LstBox1.SelectedIndex = a
file.WriteLine(frmPrincipal.LstBox1.Text)
Next
file.Close()
End Sub