segunda-feira, 31 de maio de 2010

Colecionando Figurinhas!

Interessante como temos mania de colecionar coisas, veja o momento, agora todo mundo está colecionando as figurinhas da copa do mundo, e tem até bandido roubando a carga das tais figurinhas, e vendendo por um precinho mais 'camarada' no mercado negro!. Coleções de selos, coleções de insetos, ..., e  ai vai.

Genexus também possui coleções, e o interessante desse recurso é que, assim como acontece no mundo real, as coleções normalmente se constituem de conjuntos de dados cuja dimensão não é conhecida. Diferentemente de seus primos próximos, e limitado, que são as matrizes e vetores.

Então para ficar bem claro, as coleções em Genexus são elementos criados a partir de variáveis, que são, portanto, armazenadas na memória do servidor web (claro, em sistemas web) e que permitem a realização de operações sobre conjuntos.

Para clarear ainda mais as idéias, vai ai um exemplo.  Um painel, com um grid obtém seus dados a partir da chamada a um procedimento que devolve a coleção a ser carregada. No Source do procedimento temos:

&item = "Itapecerica da Serra"
&lista.Add(&item)

&item = "Mombuca"
&lista.Add(&item)

&item = "Divinópolis"
&lista.Add(&item)

Sendo &item uma variável simples do tipo Character(20) e &lista uma variável do tipo Character(20) marcada como Collection. Na regra PARM deste procedimento temos:

parm(out:&lista);

A chamada ao procedimento ocorre no evento Start de um WebPanel, que possui um Grid com uma variável &cidade (Character 20), que é carregada com os dados da lista obtida.

Event Start

   &lista = Procedure1.Udp()
   for &item in &lista
      &cidade = &item
      load
   endfor
EndEvent

E claro que o resultado não podia ser outro.







E por falar em figurinha, tenho algumas repetidas aqui comigo e está faltando na minha coleção a do Luiz Fabiano, alguem tem ai?


  

sexta-feira, 7 de maio de 2010

Kung fu dos textos!

Você deve estar imaginando que raio de titulo é esse! Isso porque você não deve ter muita intimidade com o SplitRegEx, caso contrário o acharia até normal. Diante desse faixa preta, não existe oponente, ele quebra mesmo!

O SplitRegEx é uma função que opera sob a forma de expressão regular que tem por finalidade quebrar um texto do tipo CHARACTER, ele não aceita varchar ou longvarchar, em partes que  normalmente armazenadas em uma Collection. A regra para a quebra é definida por uma expressão que pode ser um ou mais caracteres que simbolizam a separação entre as partes de texto.

Por exemplo, arquivos CSV, separa as partes de um texto por meio de ponto-e-virgula ou qualquer outro caracter. Desta forma a frase a seguir tem um significado de um conjunto de informações separadas pelo mesmo texto.

10;Jose da Silva; Av.Central,10;Santana do Parnaiba;São Paulo

Desta forma essa função é muito útil na sua luta diária com Genexus. E para definir o tatame voce pode criar um WebPanel. E na área de Events programe:

Event Start
     &texto  = "10;Jose da Silva; Av.Central,10;Santana do Parnaiba;São Paulo"
     &itens   =  &teste.SplitRegEx(';')
     for &item in &itens   
             msg(&item)
     endfor
EndEvent

As variáveis podem ser definidas como:

&item  = Character(100)
&itens  = Character(100) - Collection
&texto = Character(200)

O resultado é a quebra do texto nas partes indicadas por ; e a apresentação de cada parte individualmente como uma mensagem.

Observe que em &itens voce terá uma série de informações, tais como o numero de itens, o item corrente navegado, entre outros.

Boa luta!

segunda-feira, 3 de maio de 2010

Para os fãs de csharp

A grande pergunta é como referenciar uma classe da biblioteca .NET C#, ou outra fornecida por terceiros, dentro de um código diretamente escrito com csharp, visto que não existe a opção de usar o import. Isso ocorre porque ao incluir csharp você está programando um método, não uma classe, e está no meio do programa fonte, e claro, a documentação sobre esse assunto é escasso em GeneXus, visto que esse conceito foge totalmente da filosofia GeneXus de gerar produtos em diversas linguagens a partir de uma única KB.

Mas na prática, de vez em quando, e em casos muito específicos, temos que recorrer a esse recurso, mas nunca é demais recomendar cautela ao usá-lo. Opte sempre em usar o External Object, se estiver no GeneXus X ou EV. Se você precisa utilizar muito esse recurso em programa GeneXus, com certeza não está no caminho correto.

Para os corajosos, então ai vai! primeiramente deve-se instalar a DLL na pasta BIN da aplicação, por exemplo, algo como a classe IBM.Data.DB2.iSeries.dll, para conexão no DB2.

Em seguida a opção para incluir a classe no projeto, para isso utilizar o recurso de inclusão via compilador C#. Para isso Nas preferências do projeto voce encontrará a opção Compiler Flags, que deverá conter /lib:bin  /r:IBM.Data.DB2.iSeries.dll.  Esse recurso indica a pasta lib e o nome da referência que será adicionada pelo compilador.

Agora fica fácil! brincadeirinha... É programar em csharp, referenciando as classes com o nome da DLL, como a seguir:


        csharp  using (IBM.Data.DB2.iSeries.DB2Connection myConnection = new IBM.Data.DB2.iSeries.DB2Connection(myConnString))
        csharp  {
        csharp      IBM.Data.DB2.iSeries.DB2Command myCommand = new IBM.Data.DB2.iSeries.DB2Command(mySelectQuery, myConnection);
        csharp         myConnection.Open();   
        csharp        IBM.Data.DB2.iSeries.DB2DataReader myReader = myCommand.ExecuteReader();
        csharp         while (myReader.Read())
        csharp        {
        csharp         ...
        csharp       }
        csharp       myReader.Close();
        csharp       myConnection.Close();
        csharp  }
Agora é só adaptar pra sua necessidade.

domingo, 2 de maio de 2010

Cosinhas legaizinhas no SQL Server

Descobri que mesmo para um desenvolvedor Genexus, Java, NET, ... é necessário conhecer macetes a respeito de todo ambiente onde sua aplicação está rodando, isso te ajudará a sair de certos incêndios.

Em ambientes corporativos as tarefas são normalmente designadas para pessoas diferentes, devendo ocorrer o contato/solicitação para que alguma situação em sua área seja resolvida por um gênio de outra área, levando a muita especialização em um único assunto.

Um bom desenvolvedor Genexus consegue conciliar o conhecimento profundo na ferramenta com o essencial para sobreviver no ambiente em que a aplicação está executando (compilador, linguagem, banco de dados,  servidor web, ....,  ), já um desenvolvedor Genexus eficiente e flexível busca conhecer muito sobre o entorno da aplicação, pois sabe que isso o levará a criação de sistemas muito mais eficientes, com utilização de todos os recursos que a tecnologia oferece.

Aviso! Não tenho tido muito tempo para me aprofundar no Microsoft SQL Sever, e se esse for seu caso, por favor não continue a ler este blog, pois me achará meio ignorante nisso, o que é pura verdade!.

Então, para os que estão começando a compreender o SQL Sever, como eu, vamos lá!

Como copiar todos os dados de uma tabela em outra, mas em bancos diferentes
Essa pode te salvar quando é necessário dar um Create Database no Genexus, e voce não pode perder dados que se encontram em uma determinada base de dados. Nesse caso voce pode criar uma nova database para a aplicação, mantendo a antiga intacta e em seguida realizar a operação de carga da antiga para a nova.

INSERT INTO tabela_destino     SELECT  * FROM  db_fonte..tabela_fonte

Nesse caso a estrutura (ordem e numero de atributos) da tabela_destino deve ser a mesma da tabela_fonte, e observe que a query está rodando a partir da database_destino.

Como copiar alguns atributos de uma tabela em outra, mas em bancos diferentes
Essa pode te salvar quando ocorreu mudança estrutural entre a tabela_destino e a  tabela_fonte, mas a fonte possui a maioria da informação que voce necessita para carregar 'inicialmente' a tabela_destino.

INSERT INTO tabela_destino  (atr1, atr2, atr3)   SELECT  atr1, atr2, atr3 FROM  db_fonte..tabela_fonte

Nesse caso a ordem dos atributos da tabela_destino deve ser a mesma da lista selecionada na tabela_fonte, e observe que também a query está rodando a partir da database_destino.

Como copiar desligando o identity
Quando ocorre mudança estrutural entre a tabela_destino e a  tabela_fonte, é possível copiar parte da informação, mas o problema é sincronizar os valores das chaves numéricas que foram definidas como Autonumber=yes, ou seja, com Identity=Yes.

SET IDENTITY_INSERT tabela_destino ON
INSERT INTO tabela_destino  (atr1, atr2, atr3)   SELECT  atr1, atr2, atr3 FROM  db_fonte..tabela_fonte
SET IDENTITY_INSERT tabela_destino OFF

Nesse caso a ordem dos atributos da tabela_destino deve ser a mesma da lista selecionada na tabela_fonte, e observe que também a query está rodando a partir da database_destino. O atributo atr1 é chave e é normalmente designado como IDENTITY=YES.


Alterar valor do contador IDENTITY
Para posicionar o contador do autonumber para um valor especifico execute:
DBCC CHECKIDENT('tabela_destino', RESEED,


Agradeça ao meu amigo Claudio Shinji, pela ajuda nesse blog, ok!



Genexus lento - Parte II

Parece meio estranho, mas muito dinamismo é ruim pra caramba, e isso é o que o AVAST tem dito pra todo desenvolvedor, ou seja, se você carregar seu programa com muita coisa, pode deixar que eu vasculho tudo a cada GET ou POST no servidor, mesmo aqueles arquivos que eu já testei (nessa sessão), e sabe o que mais, vou deixar seu programa tão lento de forma que voce terá que ler o blog para descobrir como me desligar.

É isso mesmo que o AVAST, na sua versão mais recente, está fazendo no seu inocente e puro sistema criado com Genexus, vasculhando tudo, sem dó, parece coisa de filme policial americano, ou mesmo do 'nosso' Capitão Nascimento tupiniquim.

E como desligar esse 'vilão' para que deixe nosso programinha em paz?

1. Abrir o Avast
2. Abrir Módulos Residentes
3. Pressionar configurações avançadas
4. Selecionar Exclusões
5. Pressionar Acrescentar

Inclua ai as regras para acesso ao seu sistema apenas, senão o antivirus irá desconsiderar toda navegação na web. Para isso é necessário voce colocar o nome do diretório virtual antes da regra.

Por exemplo:

*\vs1\*.aspx
*\vs1\*.css
*\vs1\*.jpg
*\vs1\*.png
*\vs1\*.js

E assim por diante, lembrando que antes do *\vs1\ voce tem a sua URL, que não precisa ser inserida na regra (opcional).

É isso! espero que o próximo não seja um triller de terror!

www.localhost.com

Tenho sido surpreendido pelo IIS estar direcionando as chamadas http://localhost para http://www.localhost.com, e isso permanece em qualquer browser, pois tenho todos instalados. Tenho também o Tomcat, e ambos rodavam bem, antes do causo, claro, desde que um não bata na porta do outro.

Pouca informação na web sobre isso, a maioria trata de problemas no ipv6, mas no meu ponto de vista é virus (ou coisas do genero), e dá um certo trabalho pois nenhum anti-virus consegue descobrir a coisa.

Passos:
1. Em C:\Windows\System32\drivers\etc tem um arquivo chamado Hosts.
2. Remova desse arquivo a linha ::1 ...
3. Reinicie a máquina

Aqui funcionou, espero que ai também.