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!!!

domingo, 2 de setembro de 2012

MUDE PARA O WINDOWS 8



O novo sistema operacional da Microsoft é tudo e mais um pouco!




Após ler durante duas semanas sobre o uso da aplicação por outros blogs de tecnologia confesso que fiquei tentado a realizar o upgrade para o novo sistema operacional.

A Microsoft deu um passo importante para isso: disponibilizou uma versão do Windows 8 que funciona por 90 dias gratuitamente:
http://msdn.microsoft.com/en-us/evalcenter/jj554510.aspx

Após instalar em meu notebook Toshiba com um processador Intel Duo Core posso afirmar que o sistema operacional é significativamente uma grande mudança em relação ao Windows 7.

Meu notebook desliga e inicia agora em 3 segundos!

É surpreendente a velocidade com que o Windows 8 trabalha na inicialização e no encerramento. 

Li muitos artigos sobre o grande debate do sumiço do menu Iniciar. Acreditem! Ele não faz falta! É muito simples apertar a tecla Windows + R ou Windows + W ou Windows + Q para executar um comando, abrir Configurações ou ver uma pesquisa e os aplicativos, respectivamente. 

De todos os artigos, recomendo que você leia este:

http://www.hanselman.com/blog/Windows8ProductivityWhoMovedMyCheeseOhThereItIs.aspx

Há muitas explicações sobre os botões e modo de uso do Windows 8. Este artigo fala adequadamente para aqueles que pretendem usar à sério o Windows 8 sem cair em alardes e saudosismos sobre o menu Iniciar e outros quitutes.

Instalei aplicativos no Windows 7 como o Starcraft Anthology. Tudo o que foi necessário fazer foi ir até a pasta do Windows.old e copiar a pasta do jogo para o Program Files (x86) e a aplicação funcionou adequadamente.

A rapidez de execução dos aplicativos é surpreendente!

O que me deixou um pouco frustrado foi identificar que o Kaspersky Internet Security 2012 ainda não é compatível e adquiri três licenças do software recentemente.  Terei que fazer a instalação da versão 2013 do Kaspersky que será compatível com o Windows 8. Para quem fez a aquisição de licenças recentes de alguns softwares talvez isto seja um problema. A Kaspersky ainda não me sinalizou se poderei utilizar uma de minhas licenças na versão 2013, mas provavelmente terei que adquirir uma nova.

Aproveitando a pegada fiz a instalação do Visual Studio Ultimate 2012 que funciona somente no Windows 7 e no Windows 8. 

Mais uma vez a rapidez é extraordinária e a aplicação surpreende.

Recomendo que você pense seriamente em realizar a mudança de seu sistema operacional para o Windows 8.

Até o momento, tenho que dizer que está sendo extraordinário!

Sucesso a todos!!








domingo, 12 de agosto de 2012

DTS COM O VISUAL STUDIO 2010 - SQLBULKCOPY



O Visual Studio 2010 incorporou diversas ferramentas práticas para que um desenvolvedor realize trabalhos variados sem muito esforço com várias ferramentas da Microsoft. A melhor delas talvez esteja relacionada com a utilização do SQL Server e a facilidade de se criar packages e DTS para se integralizar dados com o Bussines Intelligence (lembra do Visual Studio 2008?)

O SqlBulkcopy é uma ferramenta tipada que possibilita aos desenvolvedores criarem um tipo de DTS incorporado ao código-fonte de suas aplicações. Não é necessário ir até o SQL Server para que o DTS seja executado. Você pode abrir uma base de dados, zerá-la e copiar dados diretamente para outra base de dados sem problemas.

Um DTS trabalha internamente dentro do próprio SQL Server para copiar dados entre tabelas ou executar funcionalidades específicas como atualizar automaticamente dados seguindo determinados critérios estabelecidos. Geralmente utilizamos um DTS para copiar bases de dados de produção para uma base de testes ou para migrar informações necessárias em outros sistemas com outras bases de dados.



Para obter informações sobre a classe:


 http://msdn.microsoft.com/pt-br/library/system.data.sqlclient.sqlbulkcopy.aspx

Abaixo, o módulo-exemplo em VB.NET:

Module Module1
    Sub Main()
       Dim connectionString As String = GetConnectionString()

        ' Open a connection to the AdventureWorks database.
        Using sourceConnection As SqlConnection = _
           New SqlConnection(connectionString)
            sourceConnection.Open()

            ' Perform an initial count on the destination table.
            Dim commandRowCount As New SqlCommand( _
            "SELECT COUNT(*) FROM dbo.BulkCopyDemoMatchingColumns;", _
                sourceConnection)
            Dim countStart As Long = _
               System.Convert.ToInt32(commandRowCount.ExecuteScalar())
            Console.WriteLine("Starting row count = {0}", countStart)

            ' Get data from the source table as a SqlDataReader.
            Dim commandSourceData As SqlCommand = New SqlCommand( _
               "SELECT ProductID, Name, ProductNumber " & _
               "FROM Production.Product;", sourceConnection)
            Dim reader As SqlDataReader = commandSourceData.ExecuteReader

            ' Open the destination connection. In the real world you would
            ' not use SqlBulkCopy to move data from one table to the other  
            ' in the same database. This is for demonstration purposes only.
            Using destinationConnection As SqlConnection = _
                New SqlConnection(connectionString)
                destinationConnection.Open()

                ' Set up the bulk copy object.
                ' The column positions in the source data reader
                ' match the column positions in the destination table,
                ' so there is no need to map columns.
                Using bulkCopy As SqlBulkCopy = _
                  New SqlBulkCopy(destinationConnection)
                    bulkCopy.DestinationTableName = _
                    "dbo.BulkCopyDemoMatchingColumns"

                    Try
                        ' Write from the source to the destination.
                        bulkCopy.WriteToServer(reader)

                    Catch ex As Exception
                        Console.WriteLine(ex.Message)

                    Finally
                        ' Close the SqlDataReader. The SqlBulkCopy
                        ' object is automatically closed at the end
                        ' of the Using block.
                        reader.Close()
                    End Try
                End Using

                ' Perform a final count on the destination table
                ' to see how many rows were added.
                Dim countEnd As Long = _
                    System.Convert.ToInt32(commandRowCount.ExecuteScalar())
                Console.WriteLine("Ending row count = {0}", countEnd)
                Console.WriteLine("{0} rows were added.", countEnd - countStart)

                Console.WriteLine("Press Enter to finish.")
                Console.ReadLine()
            End Using
        End Using
    End Sub

    Private Function GetConnectionString() As String
        ' To avoid storing the sourceConnection string in your code,
        ' you can retrieve it from a configuration file.
        Return "Data Source=(local);" & _
            "Integrated Security=true;" & _
            "Initial Catalog=AdventureWorks;"
    End Function
End Module

Veja que a função trabalha com duas conexões realizando a transferência de uma base de dados para outra. 

A facilidade apresentada pode ser realizada sem a criação de qualquer DTS nas base de dados de origem ou destino, simplesmente utilizando o Visual Studio 2010 para realizar este trabalho.

Reúna a coragem que lhe resta e atreva-se a fazer um DTS através de um código-fonte!


Sucesso a todos!

domingo, 5 de agosto de 2012

O FUTURO COM O KINECT - GUITAR HERO SEM AS MÃOS

A Microsoft recentemente requisitou vários pedidos de patentes para dispositivos que manipulam hardware com as mãos somente.



Um deles chega a ser promissor: trata-se de um bracelete que lê os impulsos elétricos enviados pelo cérebro até suas mãos e os traduz em comandos a serem enviados ao computador. Há inclusive um post no Youtube apresentando a tecnologia. O bracelete é colocando na altura de seu antebraços e os sinais são enviados ao dispositivo eletrônico que realiza a leitura de que dedos das mãos foram ativados.

Todas as patentes parecem tratar do mesmo assunto: precisão.

Pode-se esperar que os futuros dispositivos a evoluírem do Kinect seja promissores. 

O que mais poderá ser integrado à plataforma do novo sistema operacional da Microsoft a ser lançado em dois meses? O que poderemos ver dentro do Windows 8?

 É esperar para ver.

Veja este artigo:

http://www.extremetech.com/extreme/133732-microsoft-demos-muscle-computer-interface-air-guitar-hero-now-a-reality 

terça-feira, 31 de julho de 2012

VB.NET - OBTER USUÁRIOS DO ACTIVE DIRECTORY

Uma dessas funções que você precisa vez ou outra para obter os usuários de uma rede e salvá-los em uma tabela qualquer, seja no SQL Server, seja no MYSQL ou mesmo no Microsoft Access.

Leve-se em conta o comando dsquery: O dsquery por default não se encontra disponível dentro do Windos XP porque se trata de uma aplicação para o Windows 2000.

Para utilizar o dsquery na sua estação, basta instalar o adminpak com o qual você poderá realizar as consultas.


Vamos ver uma simples função que criei com esta finalidade.

A função em si executa um arquivo bath que simplesmente contêm o comando que faz a geração do dsquery para um arquivo-texto qualquer usado o comando dsget:


Comando no arquivo-bath:

dsquery user -limit 2500 "OU=MAO,OU=Regio1,DC=CPP,DC=CPP,DC=gov"  |dsget user -display -samid -email -office   > C:\Temp\users.txt


A função primeiramente deleta o arquivo-texto caso ele exista. Em seguida, gera um novo arquivo-texto com os dados dos usuários usando o arquivo cmd criado e que simplesmente contêm o comando informado acima. O detalhe é o tempo de espera para a execução do arquivo bath:

listFiles.WaitForExit(90000)

Esta linha aguarda cerca de um minuto e meio até que a execução do arquivo bath seja finalizada e o arquivo-texto seja totalmente gerado. Isso é necessário para que a aplicação espere a finalização da geração do arquivo-texto. Você pode alterar esse tempo para que atenda às suas necessidades. No meu caso, verifiquei que o tempo de espera ideal girava em torno de um minuto e meio.

Continuando, a função abre este arquivo-texto gerado e faz sua leitura inserindo em uma tabela todos aqueles que não existirem dentro da mesma.

 Private Sub AtualizarUsuarios()

        Dim sPercentual As Double = 0

        Application.DoEvents()

        'Deletar o arquivo existente anteriormente
        If IO.File.Exists("c:\Intel\users3.txt") Then
            File.Delete("C:\Intel\users3.txt")
        End If


        Dim psi As New  _
            System.Diagnostics.ProcessStartInfo("C:\Intel\Gera_user.cmd")
        psi.RedirectStandardOutput = True
        psi.WindowStyle = ProcessWindowStyle.Hidden
        psi.UseShellExecute = False
        Dim listFiles As System.Diagnostics.Process
        listFiles = System.Diagnostics.Process.Start(psi)
        Dim myOutput As System.IO.StreamReader _
            = listFiles.StandardOutput
        listFiles.WaitForExit(90000)

        If listFiles.HasExited Then


            'abrir o arquivo-texto gerado na pasta c:\Intel
            Dim oLeitura As System.IO.StreamReader

            oLeitura = File.OpenText("c:\Intel\users3.txt")

            Dim fluxoTexto As IO.StreamReader
            Dim linhaTexto As String
            Dim sContaLinhas As Integer = 0

            If IO.File.Exists("c:\Intel\users3.txt") Then

                fluxoTexto = New IO.StreamReader("c:\Intel\users3.txt")

                linhaTexto = fluxoTexto.ReadLine
                sContaLinhas = sContaLinhas + 1
                While linhaTexto <> Nothing
                    linhaTexto = fluxoTexto.ReadLine
                    sContaLinhas = sContaLinhas + 1
                End While

                fluxoTexto.Close()

                Dim sTotal As Integer = sContaLinhas

                ProgressBar1.Maximum = sContaLinhas
                ProgressBar1.Value = 0
                ProgressBar1.Visible = True
                LbPercent.Visible = True

                sContaLinhas = 1
                fluxoTexto = New IO.StreamReader("c:\Intel\users.txt")
                linhaTexto = fluxoTexto.ReadLine

                While linhaTexto <> Nothing

                    If sContaLinhas > 1 Then

                        Dim sUsuario As String = Trim(Mid(linhaTexto, 1, 15))
                        Dim sNome As String = Trim(Mid(linhaTexto, 15, 40))
                        Dim eEmail As String = Trim(Mid(linhaTexto, 124, 40))
                        ' Comparar com o que está na tabela
                        If sUsuario <> "" Then

                            Dim sPesq As String = "Jabil\" + sUsuario
                            sSQL = "SELECT * FROM ADUsers WHERE Usu_Login = '" & sPesq & "'"

                            Dim myConnection2 As OleDbConnection
                            Dim myCommand2 As OleDbCommand
                            Dim ds As OleDbDataReader

                            myConnection2 = New OleDbConnection(connString)
                            myConnection2.Open()
                            myCommand2 = New OleDbCommand(sSQL, myConnection2)
                            ds = myCommand2.ExecuteReader()

                            If ds.Read = False Then

                                'Inserir o usuário na tabela

                                'INSERIR NA GRID
                                sSQL = "INSERT INTO ADUsers (Usu_Login,Usu_Nome,Usu_Email) VALUES ('" & sPesq & "', '" & sNome & "','" & eEmail & "')"
                                myCommand2 = New OleDbCommand(sSQL, myConnection2)
                                Ra = myCommand2.ExecuteNonQuery()

                            End If

                            ds.Close()


                        End If
                        'se não existir a linha na tabela, insere


                    End If

                    'ler o conteúdo do arquivo-texto
                    linhaTexto = fluxoTexto.ReadLine
                    sContaLinhas = sContaLinhas + 1

                    ProgressBar1.Value = sContaLinhas
                    sPercentual = 100 * sContaLinhas / sTotal

                    LbPercent.Text = CStr(FormatNumber(sPercentual, 2)) + " %"
                    LbMessagem.Text = "Linhas processadas: " + CStr(sContaLinhas)

                    Application.DoEvents()

                    If sContaLinhas = (sTotal - 1) Then

                        GoTo sSaida

                    End If



                End While

sSaida:
                fluxoTexto.Close()

            Else

                LbMessagem.Text = "Arquivo não existe"
                'MessageBox.Show("Arquivo não existe")

            End If

            'Fechar o arquivo-texto
            oLeitura.Close()

            Application.DoEvents()

            LbMessagem.Text = "Atualização efetuada com sucesso!!! Linhas Processadas no Total: " + CStr(sContaLinhas)

            PreencherGrid("select * from ADUsers")

        End If

        listFiles.Close()


    End Sub

Sucesso a todos e aproveitem o quitute!!

By
Leonardo Metelys

segunda-feira, 16 de julho de 2012

COPIANDO DADOS DO MYSQL 3.5 PARA O MYSQL 5.5


Dentre as muitas necessidades que eventualmente poderemos encontrar com relação a inovações uma delas diz respeito a atualizações de bancos de dados. 

Há grandes diferenças entre as versões do MySQL inferiores a 4.0. Mostrarei aqui um dos caminhos para que se possa utilizar dados de uma versão antiga do MYSQL com a nova versão do MYSQL 5.5 a fim de que uma nova aplicação possa ser criada com o Visual Studio 2010.

No servidor antigo é preciso conseguir uma cópia da base de dados de modo a ser instalada na nova versão. O caminho mais comum para isto é utilizar o comando mysqldump:

mysqldump -u root -p NOME_DA_BASE > arquivo.sql
 

o arquivo .sql precisa ser ainda preparado para que possa ser lançado na nova base de dados. Deve-se ter em mente que o padrão latin não é o mesmo no MySQL 5.5 que trabalha com o padrão uft8.

Esta discrepância causará o problema com os acentos que deverá ser tratado na nova base de dados. Todos os acentos deverão ser corrigidos para a nova base de dados se a transferência for efetuada sem se levar em conta o padrão diferente entre o latin e o uft8.


A maioria dos desenvolvedores pode resolver o problema de acentos realizando updates na base de dados ou criando um pequeno aplicativo que possa corrigir todos os acentos via software. Isso pode ficar a critério de cada desenvolvedor.



Continuando, o nosso arquivo .sql precisará ser editado a fim de que possamos ver algumas de suas peculiaridades.  Veja:



-- MySQL dump 8.22
--
-- Host: localhost    Database: pagelog
---------------------------------------------------------
-- Server version    3.23.52-nt

--
-- Table structure for table '
pagsegurodesc '
--

CREATE TABLE pagsegurodesc (
  wemp int(11) NOT NULL default '0',
  ano int(11) NOT NULL default '0',
  cod varchar(10) NOT NULL default '',
  codes int(11) NOT NULL default '0',
  pedes double default NULL,
  mes1 int(11) default NULL,
  mes2 int(11) default NULL,
  PRIMARY KEY  (wemp,anolet,codalu,coddes)
) TYPE=MyISAM;

--
-- Dumping data for table 'alunodesc'
--


Todas as linhas com "--" devem ser removidas e o TYPE = MyISAM precisa ser retirado do arquivo .sql a fim de que possa ser utilizado na nova versão em MySQL 5.5.  Retirados esses dados a base de dados pode então ser transferida, desde que você não se esqueça de se corrigir os problemas com os acentos na base de dados.

O MYSQL Query Browser  pode ser utilizado tanto para se lançar os dados do script dentro da nova base de dados quanto para se testar se os dados estão acessíveis e corretamente catalogados. Recomenda-se que primeiro sejam criadas as tabelas na base de dados e em seguida seus dados sejam lançados em cada uma delas. 

Para realizar este trabalho, você pode copiar a estrutura apresentada acima para o MySQL Browser e executá-la. Em seguida, deve copiar os dados abaixo da estrutura ou salvá-los em um arquivo .sql à parte e abri-los no próprio MySQL Browser selecionando a opção Arquivo -> Abrir Query. Quando os dados forem apresentando no MySQL Broser clique em Execute e os dados começarão a ser transferidos.
 



Após a transferência de dados, você pode testar a base de dados em MySQL 5.5 criando uma pequena aplicação para saber se a mesma esta acessível e correta.


Este trabalho será árduo e um pouco demorado, mas garantirá com certeza que todas as informações serão transferidas de modo correto para a nova versão do banco de dados MYSQL. Com paciência e perseverança você será capaz de transferir todas as informações de seu banco de dados mais antigo para a nova engine do MYSQL e se aproveitar do uso da mesma em novas tecnologias como o Visual Studio 2010.


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...