quinta-feira, 14 de julho de 2011

Excel em 64Bits

O que fazer quando a tecnologia avança e ficamos enroscados em sistemas já considerados mais obsoletos? Esse é o problema do desenvolvimento de aplicações, cuja solução e principal bandeira é o Genexus, não? que evolui conforme a tecnologia.

Jakarta POI ou ExcelLite

Faz certo tempo que deixei de utilizar o Windows XP e passei para um modelo mais 'evoluido' de sistema operacional com 64 bits, com desempenho melhor, melhor interface, e muitos outros melhores. O comportamento do Genexus foi exemplar, nenhum problema, mas .... Tinha um tal de Jakarta POI no meio do caminho, e vinculado a esse um J#, que combinados geravam uma bela tela amarela meio explosiva ao se tentar gerar ou ler uma planilha XLS.  

Claro que nesses momentos de grande aflição devemos agradecer às almas generosas espalhadas no mundo afora que dedicam grande esforço para disponibilizar gratuitamente soluções muito boas, e o JakartaPOI era uma dessas, que podia ser baixada e utilizada livremente no sourceforge (http://sourceforge.net/projects/jbyjsharp/files/Jakarta%20POI/).

Então, seguindo as recomendações do SAC Artech (http://www2.gxtechnical.com/main21/hscver01d.aspx?E%3B15%3B4%3B61%3B2%3B1%3BO%3B,2,19780) que já registra essa situação, chegamos ao Excel Lite (http://www.gemboxsoftware.com/spreadsheet/free-version.), e para nossa grande surpresa, ao instalar e copiar a DLL correta na pasta BIN da aplicação solucionou nossa situação ‘emergencial’.  Esse programa tem o requinte de incluir a DLL´s para todas as versões do .Net Framework.

Lendo Arquivos XLS

Então, só para não perder o costume, nos resta programarmos alguma coisa para acompanhar o tema básico que foi resolver o problema com a tal DLL.  Desta forma, programamos a leitura de um arquivo XLS, usando o tipo Genexus ExcelDocument.

A lógica muito simples consistia em ler as linhas de uma planilha até que se encontre uma linha vazia, nesse momento o processo de leitura se encerra.  Para cada linha lida na planilha realizamos o load em um Grid.

Event Start
     &Arquivo = 'planilha.xls'
EndEvent
Event 'Leitura'
     &Planilha.UseAutomation = 0
     &Planilha.Open(&Arquivo)
     if &Planilha.ErrCode <> 0
          msg(&Planilha.ErrDescription)
     else
          &linha = 2  // inicio dos dados
          do while true
              &CidadeId   = &Planilha.Cells(&linha,1).Text.ToNumeric()
              if &CidadeId.IsEmpty()
                   exit
              endif
              &CidadeNome = &Planilha.Cells(&linha,2).Text
              load
              &linha += 1
          enddo
     endif
EndEvent

Quanto a interface e as variáveis temos.

E as variáveis.


Não costumo encerrar o post com nenhuma mensagem negativa, mas desta vez não tem jeito, porque a rotina funciona que é uma maravilha caso seu ambiente seja o Windows, mas temos um pequeno problema pra resolver.  Se o sistema é Web, como o meu, a planilha deve estar fisicamente no servidor para ser lida, então, o problema não termina aqui, devemos realizar um upload da dita cuja antes de testar o processo, mas esse assunto podemos deixar pra depois né.


domingo, 3 de julho de 2011

Open Command Here

Permitam-me hoje fugir um pouco do Genexus e me aventurar em outras praias, mais especificamente o sistema operacional. Nesse ponto o pessoal do Linux leva grande vantagem sobre a turminha do Windows, mesmo porque o tempo todo, a idéia é configurar o sistema operacional de acordo com necessidade do desenvolvedor. 

E tirando a briga filosófica das escolas Linuxdiana s e Windoxidiana, e partindo pra pratica para resolver uma questão pura e simples de perda de tempo, resolvi gastar um pouco de energia para descobrir como fazer um recurso que utilizada no bom e sadio Windows XP, isso após a instalação de um tal PowerToys, e que era a abertura de uma janela de command (cmd.exe) a partir de uma posição selecionada no Explorer. Em outras palavras, abrir o Explorer, escolher uma pasta qualquer, e uma opção selecionada após o botão direito do mouse, permitir a abertura do cmd.exe naquela pasta.

Para fazer isso, não sei se existe outra forma, recorri a uma entrada no RegEdit, que apresente a opção no Explorer, simples e fácil. No meu caso, fui um pouquinho além e gerei um arquivo configura.reg, para configurar a coisa, e cujo conteúdo é o seguinte (copiar tudo isso ai no arquivo configura.reg):


Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\Command Prompt]
""="Command Prompt Here"
[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell\Command Prompt\Command]
""="cmd.exe /k pushd %L"

Isso criará uma key chamada Command Prompt no local HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\shell, que ao ser selecionado no explorer abrirá o command.


Talvez você não enxergue ainda muita utilidade disso tudo, mas no dia em que estudar a respeito do MSBuild então acho que se lembrará dessas humildes linhas.






sábado, 2 de julho de 2011

An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)

Coisa doida hein, pois é a vida de programador não é fácil, principalmente quando recebemos alguns palavrões esquisitos para interpretar.  Esse ai surgiu miraculosamente ao criar uma kb nova, e em seguida ao trocar o database padrão MS Sql Server para Mysql.  Na primeira execução do programa surgiu a coisa.

An attempt was made to load a program with an incorrect format. (Exception from HRESULT: 0x8007000B)

A principio pensei que era relacionado com o próprio banco de dados, mas que nada, a fórmula mágica era formada por um Windows 7 64 bits + Genexus Ev1 + .Net Framework, ..., + algumas dlls, e não esqueçamos do IIS.   A solução, por mais incrivel que pareça era apenas dizer para o IIS para aceitar a execução de DLL´s de 32 bits.  E como fazer isso? Simples, basta no IIS e no Application Pool, que se encontra definido para nossa aplicação, que deve provavelmente ser o  DefaultAppPool, ligar a opção Enable 32-bit Applications=true.  Melhor ainda se criar um pool próprio para a aplicação em questão para não interferir nas demais instaladas.  Essa propriedade é apresentada na opção Advanced Settings.

Pensando bem, qual seria a emoção de nossas vidas se de vez em quando não tivéssemos esses espinhos.

Leitura Complementar: