sexta-feira, 14 de agosto de 2015

PESQUISA DE PALAVRAS EM ARQUIVOS PDF


Uma das atividades mais corriqueiras se você trabalha com a Nfe eletrônica é tentar encontrar itens vendidos para um fornecedor ou mesmo saber quantas vendas foram efetuadas a um fornecedor em determinado ano.

Isso pode se tornar bem simples se você mantêm de maneira organizada as pastas com as DANFE´s enviadas e os registros destas ditas DANFE´s em pdf. Basta criar um aplicativo simples em ASP.NET com alguns comboxes para cada ano, um textbox e um botão.

Aqui vai abaixo um código-fonte em ASP.NET VB.NET que realiza a busca de palavras em PDF´s organizados em pastas anuais. Trata-se de um utilitário que é uma mão na roda para quem necessita de informações rapidamente.

A rotina abaixo foi criada no Visual Studio 2012 Versão 11.0.5 com o Net Framework 4.5

'Aqui estão as referências necessários para o VB.NET ASP.NET
Imports System.Runtime
Imports System.IO

Protected Sub PesquisarPDF_Click(sender As Object, e As EventArgs) Handles Button2.Click

oFileInfoCollection = DirDiretorio.GetFiles("*.pdf")
'### Lista somente os PDFps

Stexto = ""

For i = 0 To oFileInfoCollection.Length() - 1
oFileInfo = oFileInfoCollection.GetValue(i)

'Abrir cada arquivo PDF e extrair o texto do mesmo
Stexto = PesquisanoPDF(oFileInfo.Name)
'Pesquisar a Palavra
Dim index As Integer = Stexto.IndexOf(TxtPesq.Text)
If index >= 0 Then
Dim getTexto As String = Stexto.Substring(index, Stexto.IndexOf(".", index + 85) - index - 5)
' String is in file, starting at character "index"
TxtResposta.Text = TxtResposta.Text + "Texto presente no arquivo: " + oFileInfo.Name + ". Extrato do texto: " + getTexto + "." + vbCrLf

End If
Next
TxtResposta.Enabled = True

TxtResposta.Focus()
End Sub


Public Function PesquisanoPDF(PdfFileName As String) As String
Dim sArquivo As String = ""
'Para tornar a consulta mais rápida, seperam-se os pdf em pastas de anos
If Chk2011.Checked = True Then
sArquivo = "\\172.16.0.25\Nfe\2011\" + PdfFileName
End If
If Chk2012.Checked = True Then
sArquivo = "\\172.16.0.25\Nfe\2012\" + PdfFileName
End If
If Chk2013.Checked = True Then
sArquivo = "\\172.16.0.25\Nfe\2013\" + PdfFileName
End If
If Chk2014.Checked = True Then
sArquivo = "\\172.16.0.25\Nfe\2014\" + PdfFileName
End If
If Chk2015.Checked = True Then
sArquivo = "\\172.16.0.25\Nfe\2015\" + PdfFileName
End If
Dim oReader As New iTextSharp.text.pdf.PdfReader(sArquivo)
Dim sOut = ""
For i = 1 To oReader.NumberOfPages
Dim its As New iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy
sOut &= iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(oReader, i, its)
Next
Return sOut

End Function


Sucesso a todos!
By
Leonardo Metelys

sexta-feira, 28 de fevereiro de 2014

GERAR O ARQUIVO XML PARA MATRIZ DE TRIBUTAÇÃO DO IMPORTADOR


  
Olá, Pessoal!

O código abaixo faz a geração de dados para a MATRIZ DE TRIBUTAÇÃO DO IMPORTADOR, novo serviço disponível no site da Sefaz de alguns estados brasileiros.

Este código-fonte está em VISUAL STUDIO 2012 para VB.NET e já dá uma idéia de como gerar o XML para atender aos requesitos da Sefaz.



 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        Try

        Catch ex As Exception

        End Try
        Dim Ano As String = ""
        Dim Mes As String = ""
        Dim Dia As String = ""
        Dim sDataIni As String = Now
        Dim myConnectionMatrix As MySqlConnection
        Dim myCommand2IM As MySqlCommand
        Dim dsR As MySqlDataReader

        Ano = Trim(Replace(Mid(sDataIni, 7, 4), "/", ""))
        Mes = Trim(Replace(Mid(sDataIni, 4, 2), "/", ""))
        Dia = Trim(Replace(Mid(sDataIni, 1, 2), "/", ""))


        sInicio = Ano + "-" + Mes + "-" + Dia


        sTimes = CStr(Now)
        sHora = Mid(sTimes, 12, 8)

        Dim sDataGeracao As String = Ano + "-" + Mes + "-" + Dia + " " + sHora

        myConnectionMatrix = New MySqlConnection("server=192.168.40.65; user id=root; password=3007722108; database=orca; pooling=false;")
        myConnectionMatrix.Open()

        Dim myCommandsEQ As MySqlCommand
        Dim sSequencia As String = ""

        sSQL = "SELECT ifnull(count(sequencial),0) FROM GERARXML"
        myCommandsEQ = New MySqlCommand(sSQL, myConnectionMatrix)
        dsR = myCommandsEQ.ExecuteReader

        If dsR.Read() Then

            sSequencia = dsR(0)

        End If

        dsR.Close()

        sSequencia = sSequencia + 1

        'If Len(sSequencia) = 1 Then
        ' sNumeroMatrizDi = "0000000000000" + sSequencia
        ' ElseIf Len(sSequencia) = 2 Then
        'sNumeroMatrizDi = "000000000000" + sSequencia
        'ElseIf Len(sSequencia) = 3 Then
        'sNumeroMatrizDi = "00000000000" + sSequencia
        'ElseIf Len(sSequencia) = 4 Then
        'sNumeroMatrizDi = "0000000000" + sSequencia
        'End If

        'Gerar sequencial da XML
        sSQL = "INSERT INTO GERARXML VALUES(" & CInt(sSequencia) & ",'" & sDataGeracao & "','" & sNumeroMatrizDi & "')"
        'Pega os valores das data definidas dentro da tabela padrão
        myCommand2IM = New MySqlCommand(sSQL, myConnectionMatrix)
        dsR = myCommand2IM.ExecuteReader

        dsR.Close()


        'Ler os dados 
        sSQL = "SELECT * FROM matriztrib WHERE DATAREGISTRO  = '" & sInicio & "' ORDER BY CODPROD"

        'Pega os valores das data definidas dentro da tabela padrão
        myCommand2IM = New MySqlCommand(sSQL, myConnectionMatrix)
        dsR = myCommand2IM.ExecuteReader

        Dim sInicioBenf As String = ""
        Dim sFimBenef As String = ""
        Dim sImportador As String = ""
        'Gerar o XML de cada item
        'Abre o Arquivo para Criação do XML
        '----------------------------------
        'sNumeroMatrizDi = sNumeroMatrizDi + 1

        'Cabeçalho do Arquivo
        '--------------------
        Dim sData As String = CStr(Now)
        Ano = Trim(Replace(Mid(sData, 7, 4), "/", ""))
        Mes = Trim(Replace(Mid(sData, 4, 2), "/", ""))
        Dia = Trim(Replace(Mid(sData, 1, 2), "/", ""))
        sArquivo = "MatrizDI_" + sNumeroMatrizDi + "_" + DateTime.Now.ToString("ddMMyy") + "_" + DateTime.Now.ToString("hhmmss") + ".xml"
        Dim arq As New StreamWriter("C:\Temp\" + sArquivo, False)

        'arq.WriteLine("" & "<?xml version=" & Chr(34) & "1.0" & Chr(34) & " encoding=" & Chr(34) & "UTF-8" & Chr(34) & "??>")

        arq.WriteLine("<?xml version=" & Chr(34) & "1.0" & Chr(34) & " encoding=" & Chr(34) & "UTF-8" & Chr(34) & "??>")
        arq.WriteLine("<enviMatrizDIe xmlns=" & Chr(34) & "http://www.sefaz.am.gov.br/die" & Chr(34) & " xmlns:xsi=" & Chr(34) & "http://www.w3.org/2001/XMLSchema-instance" & Chr(34) & " versao=" & Chr(34) & "1.00" & Chr(34) & " xsi:schemaLocation=" & Chr(34) & "http://www.sefaz.am.gov.br/die enviGabaritoDIe_v1.00.xsd" & Chr(34) & "?>")

        arq.WriteLine("<MatrizDIe?>")
        arq.WriteLine("<InfMatrizDIe Id=" & Chr(34) & "MatrizDIe" & sNumeroMatrizDi & Chr(34) & " versao=" & Chr(34) & "1.00" & Chr(34) & "?>")
        arq.WriteLine("<Importador?>")



        If dsR.Read Then
            sImportador = dsR(0)
            sImportador = Replace(sImportador, ".", "")
            sImportador = Replace(sImportador, "-", "")
            arq.WriteLine("<tipoImportador?>" & dsR(1) & "</tipoImportador?>")
            arq.WriteLine("<cdImportador?>" & sImportador & "</cdImportador?>")
        End If

        dsR.Close()
        arq.WriteLine("</Importador?>")

        myCommand2IM = New MySqlCommand(sSQL, myConnectionMatrix)
        dsR = myCommand2IM.ExecuteReader



        While dsR.Read

            arq.WriteLine("<ItemMatriz?>")
            arq.WriteLine("<cdNcmProdFinal?>" & dsR(2) & "</cdNcmProdFinal?>")
            arq.WriteLine("<cdSuframa?>" & dsR(3) & "</cdSuframa?>")
            arq.WriteLine("<cdDestinacao?>" & dsR(4) & "</cdDestinacao?>")
            arq.WriteLine("<cdUtilizacao?>" & dsR(5) & "</cdUtilizacao?>")
            arq.WriteLine("<cdTributacao?>" & dsR(6) & "</cdTributacao?>")
            arq.WriteLine("<numDecreto?>" & Replace(dsR(7), "/", "") & "</numDecreto?>")
            arq.WriteLine("<tpDocumentoConcessivo?>" & "1" & "</tpDocumentoConcessivo?>")
            arq.WriteLine("<numDocumentoConcessivo?>" & Replace(dsR(8), "/", "") & "</numDocumentoConcessivo?>")

            sInicioBenf = dsR(9)
            Ano = Trim(Replace(Mid(sInicioBenf, 7, 4), "/", ""))
            Mes = Trim(Replace(Mid(sInicioBenf, 4, 2), "/", ""))
            Dia = Trim(Replace(Mid(sInicioBenf, 1, 2), "/", ""))
            sInicioBenf = Ano + Mes + Dia

            arq.WriteLine("<dtInicioBeneficio?>" & sInicioBenf & "</dtInicioBeneficio?>")

            sFimBenef = dsR(10)
            Ano = Trim(Replace(Mid(sFimBenef, 7, 4), "/", ""))
            Mes = Trim(Replace(Mid(sFimBenef, 4, 2), "/", ""))
            Dia = Trim(Replace(Mid(sFimBenef, 1, 2), "/", ""))
            sFimBenef = Ano + Mes + Dia

            arq.WriteLine("<dtFimBeneficio?>" & sFimBenef & "</dtFimBeneficio?>")
            arq.WriteLine("</ItemMatriz?>")

        End While

        arq.WriteLine("</InfMatrizDIe?>")
        arq.WriteLine("</MatrizDIe?>")
        arq.WriteLine("</enviMatrizDIe?>")

        dsR.Close()
        arq.Close()

        ' Create an XML document instance and load the XML data.
        Dim doc As XmlDocument = New XmlDocument()
        ' This code assumes that the XML file is in the same folder.
        doc.Load("C:\Temp\" + sArquivo)
        ' Save the XML to a file.
        doc.Save("C:\Temp\" + sArquivo)

        MsgBox("Arquivo XML criado com sucesso", MsgBoxStyle.Information, "Matriz Trubutação")


    End Sub


Pontosa observar:

1. A notação "?>" ou "??>"  no final de cada tag deve ser substituída por ">" ou "/>" conforme o caso. Trata-se do editor de textos do blog que infelizmente foge ao meu controle!

2. A notação "&" é o "é comercial" necessário para separar campos no VB.NET;

3. o campo Id (MatrizDIe) é a identificação da matriz, e o número que o segue deve, 
para facilitar, referir-se à inscrição da empresa no Cadastro de Contribuintes do Estado com 14 casas, ou seja, a informação é numérica e o comprimento da informação é 
de 14 dígitos. Alguns estão colocando aqui um contador, mas este não é o procedimento
correto. 


4. Aqui transformamos o arquivo-texto criado em um documento XML propriamente dito:



  ' Create an XML document instance and load the XML data.
  Dim doc As XmlDocument = New XmlDocument()
  ' This code assumes that the XML file is in the same folder.
  doc.Load("C:\Temp\" + sArquivo)

No momento em que doc.Load é realizado o arquivo XML é verificado em relação ao arquivo XSD   carregado inicialmente - linha que contêm o http://www.w3.org/2001/XMLSchema-instance. 

Você pode acrescentar aqui um comando Try para indicar os erros dos arquivos XML que está gerando.

  ' Save the XML to a file.
   doc.Save("C:\Temp\" + sArquivo)

Após o salvamento o arquivo XML está pronto para ser assinado. A assinatura pode ser realizada com um certificado digital do Serasa e vocês podem utilizar o mesmo código-fonte que postei aqui para realizar a assinatura deste documento.

Segue um bom site que fala um pouco sobre assinaturas digitais:

http://inginheiiro.wikidot.com/

Sucesso a todos em 2014!


quarta-feira, 29 de janeiro de 2014

TI: COMO SE TORNAR A CAIXA PRETA DA EMPRESA

Não há como negar que em matería de TI há inúmeros processos dentro de vários 
setores dentro de uma empresa que podem e devem ser controlados dia-à-dia a fim
de que em um período de tempo curto - seja ele semanal, quinzenal ou mensal -
dados possam ser analisados e tomadas de decisão possam ser criadas.

Todos os dias o TI de qualquer empresa trabalha a fim de que relatórios e dados
possam ser gerenciados tanto dentro do setor como em diversas áreas da 
empresa. O investimento de recursos na criação de ferramentas capazes de
gerir informações é massivo todos os anos em muitas empresas. A qualidade
do serviço prestado de àrea a àrea pode variar com o passar do tempo. 
No entanto, por diversos motivos, há algumas áreas da empresa que são
de difícil acesso ou que se tornam assim devido ao relacionamento e ao
modus operandi das mesmas com relação ao setor de TI. 

Algumas áreas podem necessitar de controles de informações que necessitam
do envolvimento de mais de uma área para o levantamento de dados e isso
dificulta o trabalho final na obtenção do resultado: pode ser que uma ponta
da informação em alguma outra área deixe de ser coletada e assim todo o
processo é comprometido. Há casos em que o escopo final é criado mas no
momento da implantação descobre-se que um detalhe deixou de ser levado
em conta e isso prejudica todo o projeto que por força maior é colocado de
lado.

E há aqueles casos em que o TI desenvolve mais de uma ferramenta para uma
mesma área e todas elas são sub-utilizadas ou nem sequer utilizadas. A síndrome
do "minha planilha é melhor do que seu sistema" é um problema em muitas
empresas. O TI por trabalhar com a qualidade de seus serviços acaba avaliando
aquele setor como de difícil acesso. Se muitas ferramentas são desenvolvidas para
um mesmo setor e nenhuma delas é utilizada haverá certa resistência por parte
do TI em tentar criar uma nova ferramenta para esta área. Se os projetos forem
concorrentes com os de outras áreas - materias e produção pedem dois sistemas
e todos os criados para a área estão sendo utilizados - por uma questão de 
bom uso e de promoção o TI dará prioridade a outras áreas: bons clientes
merecem consideração e respeito. Clientes que ainda se tentam conquistar
e sempre respondem de modo negativo a ferramentas novas criadas acabam
entrando no final da fila ou entregues a uma área em outra planta para 
análise e desenvolvimento.


Se tonar a caixa preta que nunca é capaz de corresponder a bons trabalhos 
que o TI desenvolve não é uma coisa boa para qualquer empresa. 

Quanto projetos foram criados em TI para sua área no ano que se 
passou? Quantos serão implementados este ano? Quantos foram implementados
e nunca utilizados?

Se estas perguntas forem respondidas por você de modo negativo  seria
boma avaliar uma mudança de direção neste ano. Afinal, ninguém quer ser
a piadinha da área de TI como o setor caixa preta que ninguém consegue
entrar.

Sucesso em 2014!

sábado, 21 de setembro de 2013

CÓDIGO DE BARRAS - IMPRESSÃO EM ZM400

Olá a todos!


Ao criar etiquetas códigos de barras, o ideal é utilizar o próprio software da impressora código de barras para isso.

Em se tratando de uma impressora da marca Zebra o aplicativo mais comum para uso é o Zebra Designer que vem junto no CD de drivers da própria impressora. A tarefa é bem simples: abrir o aplicativo e gerar uma etiqueta no tamanho desejado e com os parâmetros
necessários. Faz-se a impressão da mesma na impressora a fim de se atestar que está
correta e, em seguida, se gera a mesma para um arquivo-texto a fim de ser utilizado em 
sua aplicação.

O arquivo-texto gerado pela impressora é o mostrado abaixo:

^XA
^PW354
^BY2,3,44^FT40,55^BCN,,Y,N
^FD>:" & Mid(Codigo, 1, 2) & ">5" & Mid(Codigo, 3, 11) & "^FS
^PQ1,0,1,Y

^XZ

Onde Codigo é a codificação interna da etiqueta que você criou.

O que se deve fazer em seguida é abrir isso via software a fim de gerar uma impressão em sequência da chamada desse mesmo arquivo da contagem inicial até a final:

        sInicio = CDbl(TxtInicio.Text)
        sFim = CDbl(TxtFim.Text)


        'Quantas Etiquetas Imprimir 
        sDiferenca = sFim - sInicio

        If sInicio > sFim Then
            MsgBox("Valor Inicial maior que o Valor Final!!!", MsgBoxStyle.Information)
            TxtInicio.Focus()
            Exit Sub
        End If

        If sDiferenca = 0 Then
            sDiferenca = sConta
        End If

        'Loop de impressão

        While sInicio <= sFim


                LerEtiqueta(sInicio )

                GravarDados(sInicio)

                Dim Command As String
                Command = "type C:\TEMP\ETIQUETA.TXT>PRN"
                Shell("cmd /c" & Command, 1, True)
                
            'Incrementar o contador
            sInicio = sInicio + 1


        End While

A rotina LerETiqueta lê o arquivo-texto gerado na Zebra.

Então, você deve criar uma rotina que gere um arquivo-texto com os dados
acima:

  Private Sub  LerEtiqueta(ByVal sNumeroEtiqueta as string)

        Dim fluxoTexto As IO.StreamWriter

        Dim sNomeArquivo As String = "C:\Temp\ETIQUETA.TXT"

        If IO.File.Exists(sNomeArquivo) Then

            'ZM400 300 DPI
            fluxoTexto = New IO.StreamWriter(sNomeArquivo)

            fluxoTexto.Write("^XA")
            fluxoTexto.Write("^PW354")
            fluxoTexto.Write("^BY2,3,44^FT40,55^BCN,,Y,N")
            fluxoTexto.Write("^FD>:" & Mid(sNumeroEtiqueta, 1, 2) & ">5" & Mid(sNumeroEtiqueta, 3, 11) & "^FS")
            fluxoTexto.Write("^PQ1,0,1,Y")


            ''Finaliza la etiqueta
            fluxoTexto.Write("^XZ")

            fluxoTexto.Close()


          
        End If

        Dim docName As String = "ETIQUETA.TXT"
        Dim docPath As String = "c:\Temp\"
        'printDocument1.DocumentName = docName

        Dim stream As New FileStream("C:\Temp\ETIQUETA.TXT", FileMode.Open)
        Try
            Dim reader As New StreamReader(stream)
            Try
                stringToPrint = reader.ReadToEnd()
            Finally
                reader.Dispose()
            End Try
        Finally
            stream.Dispose()
        End Try


    End Sub


 A parte final realiza a impressão da etiqueta direto para a porta da impressora e incrementa para o próximo número a ser impresso:

                Dim Command As String
                Command = "type C:\TEMP\ETIQUETA.TXT>PRN"
                Shell("cmd /c" & Command, 1, True)

               'Incrementar o contador
               sInicio = sInicio + 1

A rotina é bem simples.  

Você ainda pode incrementar isso gravando os dados em uma tabela em sua base de dados a fim de controlar as etiquetas já impressas e fazer uma possível reimpressão, caso necessário, o que é realizado pela função GravarDados.

Espero que o exposto ajude aos necessitados por esta informação. 

Qualquer dúvida, podem postar comentários.

Sucesso a todos!!


By
Leonardo Metelys

quinta-feira, 6 de junho de 2013

DANFE EM VB.NET 2010 - AGORA ENVIANDO E-MAILS AUTOMATICAMENTE



Olá, pessoal!

A geração da DANFE agora traz novidades!!

Agora é possível informar um e-mail nos parâmetros de chamada do GerarDanfe para que o PDF gerado da DANFE possa ser enviado automaticamente:















Isso é possível porque o código-fonte agora incorpora uma função que permite o envio de 
e-mails. Neste exemplo, utilizamos o gmail para o envio:





Em seguida, podemos ver o resultado esperado que é o recebimento da DANFE em PDF gerada através  da aplicação:





Os fontes já se encontram disponíveis para aquisição a todos os que se mostrarem interessados.


Sucesso a todos!!




quinta-feira, 11 de abril de 2013

WINDOWS UPDATE - KB2823324 TRAVA O WINDOWS 7


Ontem a Microsoft liberou uma atualização que está fazendo a maioria dos computadores travarem na data de hoje. E se você deixou o 
Windows Update ligado, se deu mal.

Há dois modos de resolver o problema

1 - Reiniciar a máquina, pressionar o botão F8, escolher a opção de restaurar sistema e o ponto de restauração anterior a data de ontem. Se a restauração
não funcionar utilize o aplicativo Hiren boot para tentar retornar o ponto de restauração que deseja.

2 – Abrir o mini Windows XP e substituir o arquivo ntfs.sys que está em c:\windows\system32\drivers por um de uma máquina que está funcionando

Se o mini Windows XP impedir que você substitua o arquivo ntfs.sys, utilize um CD do Linux vá na pasta e substitua o ntfs.sys.

Nessas horas, o Linux ajuda a Microsoft...


Eis uma postagem sobre o problema:

http://www.tudoemtecnologia.com/2013/04/update-para-windows-7-faz-com-que-o-sistema-nao-inicie.html

A G1 está dizendo que você formatar a máquina, mas não é preciso:

http://g1.globo.com/tecnologia/noticia/2013/04/falha-em-atualizacao-do-windows-forca-usuarios-formatar-sistema.html


Sucesso a todos!!

sábado, 23 de março de 2013

ASP.NET - EVITANDO CONCORRÊNCIA NAS CONEXÕES


Usuários experientes geralmente reaproveitam muito código-fonte já
escrito anteriormente.

Isso ajuda a compor novos aplicativos e a criar mais rapidamente novas necessidades.

Quando falamos de ASP.NET, no entanto, há uma pequena regra a ser seguida e que
os usuários menos experientes podem acabar esbarrando pelo caminho.

Essa regra é: Em ASP.NET nunca crie o mesmo connection para outras aplicações ou dentro da mesma aplicação e sempre que abrir um connection trate de fechá-lo no final de sua utilização. 

Digamos que você crie uma pequena aplicação e faça o código abaixo:



Dim myCommand As MySqlCommand
Dim myConnection As MySqlConnection
myConnection = New MySqlConnection("server=252.168.70.99; user id=root; password=1007; database=alianca; pooling=false;")
myConnection.Open()

sSQL = "UPDATE registraprod SET CORRIGIDO = '" & sCorreto & "', HORACORRECAO = '" & sHora & "', DATA = '" & sInicio & "', POSICAO = '" & sPosicao & "', LOCALFALHA = '" & sLocalFalha & "', TIPOFALHA = '" & sTipoFalha & "', REPARADOR = '" & TxtReparador.Text & "' " & _
                " WHERE CODBARRAS = '" & TxtBarras.Text & "' AND PRODUTO = '" & sProd & "'"


myCommand = New MySqlCommand(sSQL, myConnection2IM)
dsY = myCommand.ExecuteReader


Em seguida, em outro form ou em um botão dentro do mesmo form, crie a mesma conexão para realizar uma consulta:


Dim myCommand As MySqlCommand
Dim myConnection As MySqlConnection
myConnection = New MySqlConnection("server=252.168.70.99; user id=root; password=1007; database=alianca; pooling=false;")
myConnection.Open()

sSQL = "Selct * from registraprod " & _
                " WHERE CODBARRAS = '" & TxtBarras.Text & "' AND PRODUTO = '" & sProd & "'"


myCommand = New MySqlCommand(sSQL, myConnection2IM)
dsY = myCommand.ExecuteReader


Em tempo de projeto - na sua máquina, não há problemas.  Mas este mesmo código-fonte em locais distintos publicado no servidor ASP.NET poderá gerar concorrência e haverá erros quando dois usuários acessarem o mesmo ponto de sua aplicação.

Veja que em nenhum momento há o fechamento da conexão e que as duas se encontram com o mesmo nome! 

Em uma base de dados MySQL isso causará erro de conexão abertas em demasia. 
Também com uma base de dados SQL Server esta não é uma boa prática de programação.

Para corrigir este problema, poderíamos fazer o seguinte:

'Alteração

Dim myCommandupdate As MySqlCommand
Dim myConnectionUpdate As MySqlConnection
myConnectionUpdate = New MySqlConnection("server=252.168.70.99; user id=root; password=1007; database=alianca; pooling=false;")
myConnection.Open()

sSQL = "UPDATE registraprod SET CORRIGIDO = '" & sCorreto & "', HORACORRECAO = '" & sHora & "', DATA = '" & sInicio & "', POSICAO = '" & sPosicao & "', LOCALFALHA = '" & sLocalFalha & "', TIPOFALHA = '" & sTipoFalha & "', REPARADOR = '" & TxtReparador.Text & "' " & _
                " WHERE CODBARRAS = '" & TxtBarras.Text & "' AND PRODUTO = '" & sProd & "'"


myCommandupdate = New MySqlCommand(sSQL, myConnectionUpdate )
dsY = myCommandupdate .ExecuteReader


myConnectionUpdate.Close()


'Seleção
Dim myCommandSelect As MySqlCommand

Dim myConnectionSelect As MySqlConnection
myConnectionSelect = New MySqlConnection("server=252.168.70.99; user id=root; password=1007; database=alianca; pooling=false;")
myConnection.Open()

sSQL = "Selct * from registraprod " & _
                " WHERE CODBARRAS = '" & TxtBarras.Text & "' AND PRODUTO = '" & sProd & "'"


myCommandSelect = New MySqlCommand(sSQL, myConnectionSelect )
dsY = myCommandSelect .ExecuteReader
myConnectionSelect .Close()


Identificamos assim as conexões de modo distinto e realizamos o fechamento das mesmas após a sua atualizaçao.

Essa boa prática evita a concorrência e faz com que você não tenha problemas em duas máquinas utilizando a sua aplicação e causando travamentos. 


Sucesso a todos!


By
Leonardo Metelys