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

quarta-feira, 2 de maio de 2012

GLPI - CONFIGURANDO NOVOS TIPOS DE TICKET



O GLPI é um dos muitos tipos de aplicativos helpdesk free existentes na internet. O fórum do mesmo pode ser encontrado neste link:


Recentemente tive a necessidade de acrescentar mais opções aos tipos de chamado do mesmo para um cliente. O que consegui descobrir pesquisando no fórum é que isso só seria possível mexendo no núcleo do PHP da aplicação. Apesar de não entender muito de PHP consegui encontrar os pontos onde as mudanças eram necessárias.

Vamos a elas!

Primeiro, precisamos alterar o ticket.class.php (pasta inc da aplicação) e acrescentar mais constantes de tipo de ticket. No meu caso, coloquei mais oito tipos:

  // Request type
   const INCIDENT_TYPE = 1;
   // Demand type
   const DEMAND_TYPE   = 2;
   // defeitos - Normal
   const TEST_TYPE = 3;
   // defeitos - Defeitos - Urgente
   const DEF_URGENTE = 4;
   // Dem. Op - Normal
   const DEM_OP = 5;
   // Dem. Op - Urgente
   CONST DEM_URG = 6;
   // Melhorias - Normal
   CONST MELHORIA_NORMAL = 7;
   // Melhorias - Urgente
   CONST MELHORIA_URG = 8;

Depois disso, é preciso alterar a função GetTypes () localizada neste mesmo arquivo:

static function getTypes() {
      global $LANG;

      $options[self::INCIDENT_TYPE]     = $LANG['job'][1];
      $options[self::DEMAND_TYPE]       = $LANG['job'][2];
      $options[self::TEST_TYPE]         = $LANG['job'][57];
      $options[self::DEF_URGENTE]       = $LANG['job'][58];
      $options[self::DEM_OP]            = $LANG['job'][59];
      $options[self::DEM_URG]           = $LANG['job'][60];
      $options[self::MELHORIA_NORMAL]   = $LANG['job'][61];
      $options[self::MELHORIA_URG]       = $LANG['job'][62];

      return $options;
   }

Veja que acrescentamos mais tipos $LANG.

O $LANG tem a ver com a linguagem utilizada pelo GLPI. No meu caso é português. Assim sendo é preciso acrescentar esses novos tipos de $LANG definidos acima no arquivo pt-BR.php.

Vá até a pasta locales e abra o arquivo pt-BR.PHP. Localize neste arquivo o ['job'] associado acima e acrescentes os novos tipos que definiu:


$LANG['job'][57]="Defeitos - Normal";
$LANG['job'][58]="Defeitos - Urgente";
$LANG['job'][59]="Dem. Op - Normal";
$LANG['job'][60]="Dem. Op - Urgente";
$LANG['job'][61]="Melhorias - Normal";
$LANG['job'][62]="Melhorias - Urgente";

Feito isso, os novos tipos de ticket estarão definidos para o GLPI. Para ver os mesmos, abra um novo chamado e clique no combo Tipo.


Para alterar os arquivos PHP utilizei o aplicativo Textpad que é free e você baixa em qualquer site de downloads da internet.








Sucesso a todos!



 

domingo, 29 de abril de 2012

ASP.NET - PRINT SCREEN DE UMA PÁGINA ASP.NET


Recentemente, deparei-me com a necessidade de retirar print screen de uma página em ASP.NET em um dado momento via código sem a interação do usuário.

Quem trabalha com o ASP.NET deve saber que todas as páginas visualizadas em um browser na verdade estão sendo executadas dentro do servidor.  Então retirar um print screen via código é uma tarefa mais complicada porque a execução do código irá em busca de uma página que está em execução no servidor ASP.NET onde a página se encontra e não realmente no browser ativo no momento.


Minha saída para este problema:  


Um aplicativo em separado estaria em execução na máquina cliente onde o browser está em execução.
Esse aplicativo se encarregaria de fazer um print screen da tela ativa salvando na página c:\temp, Em seguida, obteria esta imagem do diretório c:\temp e a salvaria em um arquivo pdf na própria pasta c:\temp. 
Quando houvesse a necessidade de realizar um print screen esse pequeno aplicativo seria acionado - executarservico seria setado em 1, fazendo o print screen da tela e gerando a imagem requisitada e salvando-a em arquivo pdf. Este pequeno aplicativo teria um timer que de 15 em 15 segundos verificaria
se o ExecutarServico na tabela está setado em 1 ou não. No momento em que o Executarservico estiver setado em 1 a imagem seria gerada e o arquivo pdf criado.

Utilizei o ASP.NET com o VB.Net para gerar o código.

Os imports associados a isso estão listados abaixo:

Imports System.IO
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Windows.Forms

Para gerar o print screen via código:

'Ler se ExecutarServico está setado em 1

 myCommand = New OleDbCommand("select ExecutarServico,linha from Parametros", myConnection)
ds = myCommand.ExecuteReader()

While ds.Read()

            sValor = ds.Item("ExecutarServico")
            sLinha = ds.Item("Linha")
         

End While

 'Se o valor padrão foi 1, dispara a cópia da imagem
 If sValor = "1" Then

            'Grava o nome do arquivo com a linha associada ao mesmo
            Dim sNomeArquivo = sLinha + "_" + DateTime.Now.ToString("yyMMddhhmmss") + ".jpg"
            arquivoWS.WriteLine("Captura de Tela iniciada... " & DateTime.Now)
            arquivoWS.Flush()

            Try


                Dim image As New Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb)
                Dim g As Graphics = Graphics.FromImage(image)
                g.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy)
                image.Save("c:\temp\" + sNomeArquivo, ImageFormat.Jpeg)


            Catch ex As Exception
                arquivoWS.WriteLine("Erro na Captura de Tela efetuada... " & DateTime.Now)
                arquivoWS.Flush()
            End Try
End If

Caso um erro ocorra na geração da imagem, o mesmo será gerado no arquivo de log criado.
      
A geração do arquivo pdf com a imagem criada é mostrado abaixo:


 'Recuperar o nome do arquivo de imagem na base de dados
        sSQL = "select ExecutarServico,nomearquivo,diretorio from Parametros where linha = '" & sLinhaSelecionada & "' and ROTA =  '" & sRotaSelecionada & "' and computador = '" & shostname & "'"
        myCommand = New OleDbCommand(sSQL, myConnection)
        ds = myCommand.ExecuteReader()

        'Recuperar nome e caminho do arquivo na base de dadps
        While ds.Read()

            sLimpaArquivoJPG = ds.Item("nomearquivo")
            sDiretorioArquivo = ds.Item("diretorio")

        End While

        ds.Close()


'Gerar arquivo PDF com a imagem criada
        ''Gravar a imagem dentro do arquivo PDF
        ''baseado em : http://www.dotnetspark.com/kb/1364-add-image-to-pdf-document-using-itextsharp.aspx
        Dim imageFilePath As String = sDiretorioArquivo + sLimpaArquivoJPG
        Dim test As iTextSharp.text.Image = iTextSharp.text.Image.GetInstance(imageFilePath)


        'Resize image depend upon your need
        'logo.ScaleToFit(280.0F, 260.0F)
        test.ScaleToFit(600.0F, 600.0F)

        'Give space before image
        test.SpacingBefore = 30.0F

        'Give some space after the image
        test.SpacingAfter = 1.0F
        test.Alignment = Element.ALIGN_CENTER

        Dim hoje As DateTime = DateTime.Now
        Dim arquivoPDF = sLinhaSelecionada & "_" & sRotaSelecionada & "_" & DateTime.Now.ToString("yyMMddhhmmss") & ".pdf"


        'Grava o arquivo PDF no modo retrato
        Dim doc As New Document(iTextSharp.text.PageSize.A4_LANDSCAPE, 2, 2, 42, 42)
        PdfWriter.GetInstance(doc, New FileStream(sDiretorioArquivo + "\" & arquivoPDF, FileMode.Create))
        doc.Open()
        doc.Add(test)
        doc.Close()


Desse modo, teremos um arquivo pdf com a imagem da tela desejada em seu interior.


Sucesso a todos!

quinta-feira, 26 de abril de 2012

CONFIGURANDO IIS PARA O WINDOWS 7

Recentemente, ao trabalhar com o Windows 7 deparei com o problema relativo a se fazer o registro do IIS para o ASP gerando o seguinte erro:

An error has occurred: 0x8007b799
You must have administrative rights on this machine in order to run this tool.


O que ocorre: É necessário um novo tipo de configuração para o Windows 7. Para corrigir esse tipo de erro imediatamente, você precisa desativar o seu nível de UAC :

Start > Control Panel > System and Security > Action Center > Choose Your UAC Level - Set this to Never Notify;

Após alterar o nível, você deve reiniciar o computador e adentrar novamente com usuário e senha.

Após isso, ao tentar novamente registrar o IIS na máquina você terá sucesso:
 



Além disso, ao tentar se publicar uma página que tenha sido criada no Visual Studio 2010 com o ASP.NET em uma máquina com o Windows 7 será necessário antes de tentar publicar e após registrar o IIS com sucesso instalar o IIS 6 Metabase. 


O IIS 6 Metabase pode ser obtido na página da Microsoft.


DANFE EM VISUAL STUDIO 2010 E CRYSTAL REPORTS 2010



Olá, pessoal!


Venho através desta informar que a DANFE desenvolvida em VB.NET está agora atualizada para a versão mais nova do Visual Studio, o Visual Studio 2010.

Os relatórios da DANFE também foram atualizados para a nova versão do Crystal Reports.

A partir da versão 2010 do Visual Studio o Crystal Reports deixou de ser incluído com a aplicação. Para instalar o Crystal Reports você deve ir até a páginada SAP Bussines e baixar a versão disponível para integração com o Visual Studio 2010:

http://www.businessobjects.com/jump/xi/crvs2010/us2_default.asp

A opção a ser selecionada é a primeira da lista desta página e mostrada abaixo:

SAP Crystal Reports, version for Visual Studio 2010 - Standard
Standard EXE installation package which installs the software into the Visual Studio IDE.

O arquivo possui 295MB de tamanho e deve ser instalado a fim de que você possa criar relatório com o Crystal Reports no Visual Studio 2010.

O site oficial do Visual Studio 2010 é apresentado abaixo:

http://www.microsoft.com/visualstudio/pt-br/home-produtos



A DANFE possui a partir de agora uma função a mais que permite selecionar o modo de impressão da mesma, retrato ou paisagem. As versões antigas somente realizam a impressão em modo retrato e precisavam ter o relatório em Crystal Reports configurado a fim de que a impressão em paisagem pudesse ser possível. Com a nova funcionalidade um relatório no modo paisagem em Crystal Reports foi incluso ao código-fonte a fim de permitir que o mesmo seja impresso em modo paisagem.

Código que faz com que o relatório seja impresso em modo paisagem:


        'DESCOMENTAR AQUI PARA VER A DANFE INICIAL 07/11/2010 23:05
        'DANFE INICIAL
        Dim myRelatorio As New Danfe_paisagem()
        'Mudar formato para Paisagem
        myRelatorio.PrintOptions.PaperOrientation = PaperOrientation.Landscape
        myRelatorio.SetDataSource(myDs1)
        Me.CrvXml.ReportSource = myRelatorio
        Me.CrvXml.Visible = True

Danfe_paisagem(0 é o nome do novo relatório em Crystal Reports para impressão da DANFE em modo de paisagem.

Lembro a todos que o código-fonte desta DANFE continua a ser comercializado para os que necessitarem disto para o desenvolvimento da nota fiscal eletrônica.

Também vale ressaltar que a parte de leitura do XML deste aplicativo pode ser utilizado para se obter os dados de qualquer XML de nota fiscal eletrônica a fim de que os mesmos possam ser acrescentados em uma tabela de qualquer base de dados - SQL SERVER, MUSQL, ORACLE, INFORMIX, etc.

Sucesso a todos!!

By
Leonardo Metelys
Desenvolvedor ASP.NET / VB.NET / C#.NET / Delphi

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