sábado, 23 de março de 2013

Erros Malucos...


Rebuild All é uma operação que muita gente por ai tenta até para remover erros de lógica da aplicação, ou seja, é a última esperança, até mesmo o suporte recomenda que se faça isso toda vez que surge algo estranho.  No meu caso me traz certos calafrios porque alguns erros malucos que não são apresentados frequentemente surgem do nada e me fazem perder o maior tempão.

Erro Maluco do Tipo 1

Esse erro ocorre nos Business Components existentes no sistema e como utilizo muito esse recurso, então temos aproximadamente uns 200 erros semelhantes.

type_SdtSIS_UsuarioUnidadeForm.cs(70,10): error CS0246: Nome de espa‡o para nome ou tipo 'SdtMessages_Message' nÆo p“de ser encontrado. Precisa de uma diretiva using ou de uma referˆncia de conjunto de m¢dulos (assembly)?

Esse você tem que dar um Rebuild All, mesmo se erro apareceu depois de realizar um antes. Por alguma razão as referências aos BC's não são definidas com sucesso na primeira vez. Creio que no segundo Rebuild All o problema irá persistir, então feche o GeneXus e ao reabri-lo rode com F5.  Funcionou aqui, sem precisar reiniciar a maquina, :)

Não me pergunte porque, vou descobrir e te falo.

Erro maluco do Tipo 2

Esse ocorreu  porque, por alguma razão do destino dos testes despretenciosos realizados, não muito bem sucedidos e esquecidos ao longo das nossas longas e isoladas horas de programação, deixamos a opção Full Text Search: Searchable = true, ligada e claro incompleta.  Mesmo que não utilizemos esse recurso tão legal em nossa aplicação.

Idem ao anterior, não me pergunte porque isso ocorre, também vou descobrir e te falar, mas a solução é mais inusitada que o erro, pois você deverá apagar o programa GxFullTextSearchReindexer.cs (ou .java) da pasta web da aplicação e desmarcar a opção Searchable deixando-a false.


Bom, de maluco todos temos um pouco não, o Gx também!


terça-feira, 12 de março de 2013

Genexus dos Sonhos - Parte II

Genexus não é uma ferramenta perfeita, há um esforço imenso para torná-la excelente, isso não podemos negar, pois a equipe Artech realiza um grande trabalho na sua construção e evolução, temos observado isso, mas ainda fica uma sensação que poderia ser melhor em alguns 'pequenos' detalhes.

O que podemos, como mero usuários que convivem diariamente com a ferramenta, é sugerir melhorias nos pontos em que consideramos não apenas relevantes, mas também que nos incomodam.  Assim como no post anterior (Genexus dos Sonhos), refletimos aqui aquilo que consideramos importante para serem implantados na Tilo, e novamente expressamos que esses pontos não são criticas mas contribuições para buscarmos uma maior excelência.

  1. Ponto-e-Virgula:
    Esse detalhe afeta os iniciantes e veteranos em GeneXus, pois não sabemos se devemos ou não colocar esse caracter no final dos comandos, acabamos decorando os locais onde ocorre ou nâo, mas creio que isso fere a filosofia da ferramenta simples.  Por exemplo, nas propriedades de Grid condition, order, precisa-se obrigatoriamente colocar, assim como nas Rules, por outro lado em Events se colocarmos ocorrem erros. Leva muito tempo até pegar o jeito, isso poderia ser simplificado, ponto-e-virgula em tudo é a melhor solução, ou em nenhum lugar.
     
  2. Replace All (All):
    Já que a grande meta que é a redução do trabalho dos desenvolvedores, que tal se tivessemos um Replace All que fosse aplicado não apenas ao objeto corrente mas a todos os objetos que tivessem um certo HTML ou linha de codigo que temos que modificar. Um Replace All in All Objects seria ótimo hein!  Qualquer ferramenta de 'programação' voltada para programadores inclui um recurso assim, ou muitas operações possiveis de Replace ou Find, GeneXus ta meio pobrinha nesse ponto.
     
  3. Full-Text-Search livre:
    Atualmente para incluirmos uma regra na ferramenta Full-Text-Search devemos selecionar em um ComboBox as properties dos objetos, que tal se fosse um texto livre, sem esse combo.  Tente achar ali a propriedade Class, não existe.  Justo esta que utilizamos com muita frequencia em nossos objetos.  Melhor seria deixar um campo texto de pesquisa (e outro de replace?)
     
  4. Data Provider:
    A programação não aceita comandos de controle na forma tradicional como for...to, do case, ..., ou mesmo operações aritméticas padrões como +=, *=, que tal se tivessemos uma aproximação maior com a forma de programação das procedures?
     
  5. Fórmulas Locais:
    Não podemos incluir uma fórmula local em qualquer lugar, mas apenas no inicio de blocos, era previsto que poderiamos escrever essas fórmulas em qualquer lugar, mas isso infelizmente não evoluiu.
     
  6. Objeto Módulo:Atualmente a Artech iniciou a montagem desse novo objeto para os projetos grandes em Genexus, o caminho está correto, apenas precisariamos lapidar alguns pontinhos:
    a) Não permitir que desenvolvedores abram módulos que não possua acesso, nem mesmo o visualize na árvore de objetos
    b) Export All limitado aos objetos que o mesmo tenha acesso
     
  7. Theme 1:
    Que tal se pudessemos exportar não apenas o objeto Theme, mas classes individuais nesse objeto para importarmos em outros Themes. Na EV1 não dá pra fazer nenhum tipo de importação, a inclusão tem que ser manual mesmo, fato que complica demais a nossa vida. Na EV2 até temos como importar classes, a partir de um arquivo externo, mas temos que manipular esse objeto externo.
     
  8. Theme 2 - Search & Replace:
    Que tal ter um Search para encontrar temas nesse objeto, ou propriedades definidas nos temas.  Se quisermos modificar algum tema temos que ficar abrindo todas as abas para encontrar onde a mesma está alocada.
      
  9. Controles Distintos: Esse é uma reprodução do nosso anseio no post anterior. A idéia é permitir que o Gx gere controles (Edit, Dynamic Combo, ...) distintos para um mesmo atributo, dependendo do local onde o mesmo é incluído: Isso de certa forma já acontece hoje, quando se define o tipo EDIT com Description na estrutura da transação (Ver POST Anterior), mas seria interessante expandir um pouco mais esse recurso, com novas propriedades na estrutura da transação para se definir o tipo de controle a ser gerado nas situações:
    • O atributo chave primária em sua transação original: EDIT
    • O mesmo atributo como chave estrangeira em outra transação: EDIT com Description, Dynamic List Box ou Dynamic Combo Box,...
    • O mesmo atributo como chave estrangeira em um GRID: EDIT com Description, Dynamic List Box ou Dynamic Combo Box,...
  10. Atualmente temos várias propriedades para designar tipos distintos de titulos (Title, Contextual Title, Column Title), que tal expandir esse mesmo mecanismo para se definir tipos de controles.
Observe que temos ai um monte de perfumarias, ou seja Genexus é muito bom, precisa apenas cheirar um poquinho melhor, hehehe....

quarta-feira, 6 de março de 2013

Interface com Abas

(revisado em 25/03/2013)
Existe algum controle que gera abas as quais possamos vincular componentes em uma mesma interface web, e que possa ser compatível com GeneXus? a resposta positiva não poderia ser melhor, pois tal recurso já se encontra nativo na própria ferramenta, tava meio oculto, mas agora, revelamos o 'mistério!!'

Existem vários User Controls que fazem isso, alguns muito bons, mas optamos aqui por apresentar o próprio pattern Work With, que quando aplicado em uma transação, gera esse recurso na interface chamada View. Não é tão automático quanto um user control, mas o resultado é muito favorável.

Aplique o Work With

Passo 1) Comece por ai, aplicando o pattern WorkWith em uma transação qualquer, para que o Genexus possa criar um web component chamado TabbedView, que é o 'cara' que mostra as abas.  Esse controle é o responsável por apresentar abas formatadas com bordas que podem ser substituídas.

Passo 2) Para utilizar esse recurso na sua própria interface, basta criar um WebPanel, por exemplo, e incluir um WebComponent que renomeei para chamar TabbedView.



Passo 3) Em seguida para incluir o controle de abas em sua interface programe no evento Refresh:

Event Refresh 
  &Tabs = Carga_DP()
   TabbedView.Object = TabbedView.Create(&Tabs,&TabCode)
EndEvent

Sendo que as variáveis envolvidas devem ser do tipo:

Data Provider


Passo 4) A carga das abas é simples, e para facilitar você pode criar um Data Provider que carrega os dados de forma fixa ou por meio de uma tabela.


TabOptions
{
TabOptionsItem
{
Code      = '1'
Description  = 'opcao 1'
WebComponent = opcao1.Link()
  Link      = Abas.Link('1')
}
TabOptionsItem
{
Code       = '2'
Description  = 'opcao 2'
WebComponent = opcao2.Link()
  Link       = Abas.Link('2')
}}


Passo 5) opcao1 e opcao2 são webcomponents que serão carregados pelo TabbedView quando o usuário pressionar a aba.


E Abas é o nome do primeiro WebPanel que criamos no passo 2.

é o controle que será apresentado quando a aba for clicada e WebPanel3 é a página em que foi incluído o componente TabbedView.


Configurações


Passo 6) Aqui a coisa pega um pouco, porque a configuração deve ser feita por meio de troca de imagens e ajustes nas classes Css. Para facilitar um pouco o pessoal da Artech nomeou as imagens com um prefixo Tab, que ao ser filtrado, mostra todas que podem ser ajustadas. Abaixo as mudanças que eu fiz.


Passo 7) Quanto às classes de estilo temos várias que podem ser manipuladas e ajustadas conforme nosso interesse:





Conclusão

Esse recurso possui a compatibilidade e a segurança de não ficaremos na mão, pois é nativo do próprio Genexus, mas claro não é um mar de rosas, precisamos intervir manualmente para ajustá-lo conforme nosso interesse, exigindo um pouco de esforço.

Exemplo


Para facilitar a vida, e atendendo a pedido, inclui um exemplo prático contendo o que foi apresentado, que pode ser baixado em:


Atenção! não inclua o exemplo na sua kb de desenvolvimento, crie uma própria para testes, pois o XPZ inclui algumas mudanças no theme GeneXusX que podem afetar o visual do seu sistema. (não me culpe depois por isso, eu avisei, rs)

O exemplo necessita de alguns ajustes nas classes CSS que não foram realizados, pois o visual depende da sua própria aplicação. Abaixo o resultado.


Maiores informações:

sábado, 2 de março de 2013

CSS

CSS é um tema antigo, muito explorado, bastante esclarecido para todos nós, mas nem por isso perdeu sua importância. Talvez você nem se dê conta, mas convive com ele diariamente, basta abrir o browser. 

Lembro-me das primeiras navegações na internet com o browser Netscape, e naquela época como as coisas eram absurdamente simples, para não dizer extremamente pobres, somente textos, hyperlinks (o que era isso?), imagens (GIF Animados para dar um ar de importância), e claro tabelas!. Quando abri uma página, logo quis conhecer seu conteúdo e ai nasceu o interesse pelo HTML, Javascript, e somente após algum tempo o tal CSS, que claro, persiste até hoje.

Os padrões evoluíram e atualmente temos no CSS um aliado poderoso para transmitirmos nossa informação para o usuário. Para os menos esclarecidos no assunto, trata-se do estilo com que os elementos são apresentados na interface, tipo a fonte, dimensões, posicionamentos, cores, e por ai vai.

Esse post não busca explorar a fundo os conceitos desse recurso, apenas dar uma luz sobre o CSS e o Genexus, ou seja, algumas pequenas dicas.

CSS E Genexus

O Genexus possui uma galeria de estilos aplicada às interfaces (transações, webpanels, components, master pages) nos objetos Theme.  Nesse local você poderá incluir novos estilos ou modificar os existentes.

Nos controles o que temos é uma associação ao estilo definido no Theme, através da propriedade class, que confunde a cabeça um pouco dos aficionados por programação orientada a objetos.

Dois em Um
A primeira dica: você sabia que pode associar mais que uma classe a um elemento? Isso porque o próprio nome do recurso é folha de estilo em cascata, ou seja, um estilo pode estar vinculado a outro, e a outro. E melhor dá pra fazer isso fácil no Genexus.

Receitinha básica:
  1. Crie um novo estilo do tipo HTML NODE no objeto Theme (Add Class), chamando-o por exemplo de borda.
  2. Defina as propriedades border nesse estilo, como por exemplo, essa ai ao lado.
  3. Insira um controle textblock na interface e na propriedade Class desse controle inclua a classe borda, recém criada.  O detalhe aqui é que você não precisa substituir a class corrente do controle (Textblock), apenas inclua a classe na sequencia, conforme apresentado na imagem a seguir.

O resultado será a soma das propriedades de estilo da classe Textblock já designada com a classe borda que você criou.  Abaixo o resultado com e sem a borda.


Não Achei
O Genexus mostra no seu editor Theme as classes CSS mais conhecidas, mas temos muito mais. Como fazemos então para acrescentar classes que não estão na lista? Simples: Custom CSS Properties, que aparece em qualquer classe de estilo.

Inclua ai o texto completo do estilo que queira vincular.


Incluindo Externos
Tenho meu arquivo de estilos gravado em disco, como faço para incluir no objeto Genexus? Simples também, utilize o comando Form.HeaderRawHTML no evento Start.

Nesse comando inclua o texto que inclui um CSS em uma pagina HML

Event Start
form.HeaderRawHTML = <link rel="stylesheet" type="text/css" href="meuestilo.css">
 
EndEvent


Alguns Estilos Legais

Alguns estilos me chamam a atenção, devido a sua simplicidade e recursos, muitos já são bem antiguinhos, mas continuam legais. Dai conforme as dicas anteriores, você poderá incluí-los facilmente em seus objetos.

Scroll-Bar:
Caso você utilize um controle tipo DIV em sua interface, poderá apresentar uma dimensão fixa para o mesmo e rolar o conteúdo horizontal e verticalmente com o overflow.

.rolamento{
  overflow-x: scroll;
}


Text-Wrapping:
Para quebrar texto dentro de um bloco DIV.

.quebratexto{
   word-wrap: break-word;
   width: 400px;
   display: inline-block;
   white-space: pre-wrap; /* css3 */
   white-space: -moz-pre-wrap; /* firefox */
   white-space: -pre-wrap; /* opera */
   white-space: -o-pre-wrap; /* opera */
}



Chega por hoje!

Pois é, esse assunto vai longe, e esse post ta ficando muito grande, e olha que nem entrei no CSS3. Prometo que algum dia volto a esse assunto.

O que recomendo a você:, atualize seu Windows 3.1 ou 95, remova o Netscape da sua máquina, e pare de utilizar o Altavista. (brincadeira hein!)

Ah, tava me esquecendo, atualize o Genexus 1.0 também.