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

domingo, 17 de fevereiro de 2013

GERANDO CÓDIGO DE BARRAS E DIMINUINDO O SEU TAMANHO


Eis uma pequena aplicação usando a biblioteca barcodelib.dll desenvolvida por Brad Barnhill e postada no The code Project (http://www.codeproject.com/Articles/20823/Barcode-Image-Generation-Library).

A idéia aqui é gerar a imagem de um código de barras e diminuir seu tamanho para impressão do código de barras e de sua numeração com o Print Document que você deve também adicionar ao projeto:


O botão Generate contêm o seguinte código-fonte:



Private Sub BtnGenerate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnGenerate.Click

    If TxtBarcode.Text <> "" Then

      Dim Barcode As New BarcodeLib.Barcode(TxtBarcode.Text, BarcodeLib.TYPE.CODE128)
     PicCodebar.Image = Barcode.Encode(BarcodeLib.TYPE.CODE128, TxtBarcode.Text, 200, 100)
            Barcode.SaveImage("C:\Temp\BARRAS.JPG", BarcodeLib.SaveTypes.JPG)

            Dim fs As New FileStream("C:\Temp\BARRAS.JPG", FileMode.Open)
            Dim br As New BinaryReader(fs)

            br.Close()
            fs.Close()

            br = Nothing
            fs = Nothing


        End If

    End Sub



Note que o tamanho da imagem está definido com 200 e 100.

O botão Print deverá conter o seguinte código:


Private Sub BtnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnPrint.Click

        PrintDocument1.Print()

    End Sub


Dê dois cliques sobre o componente PrintDocument1 adicionado ao projeto e acrescente este código:


 Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage

        Dim logo As Image = Image.FromFile("C:\Temp\barras.jpg")
        Dim fnt As Font

        'Font definition
        fnt = New Font("Arial Narrow", 8)

        'Redimensionar o Código de Barras
        e.Graphics.DrawImage(logo, 10, 10, 130, 15)
        e.Graphics.DrawString(TxtBarcode.Text, fnt, System.Drawing.Brushes.Black, 39, 39)
        logo.Dispose()

    End Sub 

Esse pequeno projeto pode criar códigos de barra em vários formatos. A bibliote barcodelib pode ser obtida do link informado. Basta adicioná-la nas Referências de seu projeto através do menu Project -> Nomedoprojeto Properties. 

Sucesso a todos!

sábado, 9 de fevereiro de 2013

VB.NET - CRIANDO APLICATIVOS PARA O WINDOWS 7 64 BITS


Olá, pessoal!

Dentre as muitas surpresas que podem ocorrer na criação de aplicativos a maior delas pode acontecer com relação a versão do sistema operacional. 

Um aplicativo desenvolvido em Vb.NET para uma base de dados em MySQL em uma máquina com o Windows 7 de 32 bits terá problemas para funcionar adequadamente em uma máquina de usuário com o Windows 7 com a versão de 64 bits. Quem é desenvolvedor sempre esbarra nessas situações.

Agora... Como resolver o problema na sua aplicação?

É bem verdade que há boas explicações da microsoft sobre este problema. Você pode começar vendo o link abaixo:

http://support.microsoft.com/kb/942976/pt-br

Em uma máquina Windows 7 em 64 bits há duas versãos de ODBC. A que faz referência a 64 bits fica localizado na pasta \Windows\SysWoW64.

O que é necessário inicialmente é instalar a versão correta do conector odbc para o MYSQL, no caso que estou abordando aqui. Neste caso seria a mysql-connector-odbc-3.51.30-winx64.exe que você pode baixar da página do mySQL:

http://dev.mysql.com/downloads/connector/odbc/3.51.html

Após instalar o conector, você deverá ir até a pasta SysWoW64 e executar o ODBC e verificar se o conector realmente foi instalado com sucesso.

Feito isso, devemos voltar à sua aplicação.

Veja o texto abaixo:




Se suas conexões forem escritas desse modo elas funcionarão tanto para um computador de 32 bits quanto para um computador de 64 bits. 

No caso de uma máquina de 64 bits você não poderá usar um odbDataReader propriamente, ou mesmo um OdbcCommand porque as mesmas retornarão erro de conexão porque sua aplicação estará esbarrando na limitação apresentada no artigo KB942976 (do primeiro link aqui do post): uma máquina com Windows 7 em 64 bits sempre enxergará dois ODBC´s e poderá dar preferência ao de 32 bits em alguns casos. 

Ao utilizar o MysqlCommand, o MysqlConnection e o MysqlDatareader internamente na sua aplicação você força a mesma a evitar o problema de 32 ou 64 bits.

E assim se elimina o nó górdio das aplicações para 64 bits com uma base de dados MySQL.

Sucesso a todos!!!

UM APLICATIVO PARA LEITURA DEVOCIONAL ANUAL DA BIBLIA EM ANDROID

Olá, pessoal!  Este novo projeto foi criado em Visual Studio 2019 em C#.Net com o Xamarin. Já está disponível no Google Play para vocês baix...