quarta-feira, 6 de julho de 2016

MathML

Precisa expressar alguma função matemática? Conhece o MathXML?

Pois é, acabei esbarrando por acaso nesta notação e gostei bastante do resultado. Como temos muitos professores que utilizam Genexus, vamos dar uma palhinha neste assunto.

O que é?

O MathML é uma linguagem de notação que resulta em uma imagem que normalmente é utilizada para produzir uma expressão matemática. De maneira geral,

A organização que está apoiando a iniciativa é o W3C, ISO, ou seja, é um assunto sério. Ver:


Esta linguagem é dependente dos navegadores que devem implementar a interpretação das definições da especificação.

Como usar em Genexus

Será necessário produzir um conteúdo HTML para apresentar a fórmula matemática, uma forma de fazer isso em Genexus é incluir no Caption de um Textblock.  Utilizamos uma variável &expressao do tipo Character(100) para criar a expressão.

Event Start
 &expressao   = '  <math xmlns="http://www.w3.org/1998/Math/MathML">'
 &expressao  += '    <mrow>'
 &expressao  += '      <mi>a</mi>'
 &expressao  += '     <mo>⁢</mo>'
 &expressao  += '      <msup>'
 &expressao  += '        <mi>x</mi>'
 &expressao  += '        <mn>2</mn>'
 &expressao  += '      </msup>'
 &expressao  += '      <mo>+</mo>'
 &expressao  += '      <mi>b</mi>'
 &expressao  += '      <mo>⁢ </mo>'
 &expressao  += '      <mi>x</mi>'
 &expressao  += '      <mo>+</mo>'
 &expressao  += '      <mi>c</mi>'
 &expressao  += '    </mrow>'
 &expressao  += '  </math>'
 textblock1.Caption = &expressao
Endevent


O resultado é interessante.



Atenção! nem todos os navegadores dão suporte ao recurso, o recém lançado Vivaldi, por exemplo, não consegue interpretar a coisa ainda.


Formatando com casas decimais

Resultado de imagem para Cultureinfo image
Um problema que enfrentamos no Genexus, na construção de relatórios impressos (PDF, por exemplo), é a impossibilidade de aplicarmos uma mascara que formate milhares e casas decimais a um certo número, isto para que saia dentro dos padrões dos diversos países.

Quando programamos WebPanels e outras interfaces temos alguns recursos que auxiliam na apresentação, como User Controls, Thousand Separator e Pictures, porém quando falamos em impressão PDF os recursos ficam escassos.

Um mesmo valor de 1000 apresentado no sistema Português-Brasil e Americano, deveria resultar em um número apresentado no seguinte formato:

    R$ 1.000,00
    U$ 1,000.00

Infelizmente não conseguimos fazer isso com muita facilidade.

Como Resolver?

Quando esgotamos as possibilidades poderemos então recorrer aos universitários, e existem algumas formas de fazer isso, optei por programar diretamente na linguagem C# que possui uma classe chamada CultureInfo que resolve bem esta parada. A solução final pode ser feita de duas maneiras, programando diretamente no código de nosso procedimento ou mesmo criando uma classe externa na linguagem nativa que importaremos com o External Object.  Ambos os recursos já exploramos aqui no Genexando.

Nosso exemplo seguirá a programação direta no código, porém já salientamos que esta prática não é boa, pois o objeto ficará refém da linguagem programada, e no caso de um novo environment que venha a ser criado posteriormente com outra linguagem de programação estaremos inviabilizando a operação. Cuidado com este tipo de solução porque uma das melhores características do Genexus é a independência tecnológica e este tipo de alternativa afeta de forma significativa a troca de gerador. Se ao invés de programar direto voce optar por uma classe externa com uma DLL que faça a operação, melhor.

Para utilizar a classe CultureInfo será necessário conhecer o código que representa o país e código da região, normalmente formado por duas letras seguida de um hífen e posteriormente o código da região, como por exemplo: pt-BR.

Apresentamos a seguir alguns desses códigos.

en-USEnglish (USA)
pt-BR Portuguese (Brasil)
es-ESSpanish (Spain)
ja-JPJapanese (Japan)
zh-TWChinese (Taiwan)
zh-CNChinese (PRC)
zh-HKChinese (Hong Kong SAR)
zh-SGChinese (Singapore)
zh-MOChinese (Macao SAR)

Programando a coisa

Para programar o formatador precisaremos de uma procedure, que chamaremos de FormatNumber, que definimos com o seguinte:

Rules:
parm(in:&valor, out:&final);

Source:
csharp decimal number = [!&valor!];
csharp [!&final!] = number.ToString("N",new System.Globalization.CultureInfo("en-US"));

Variables:
&valor   Numeric(12.2) // por exemplo!
&final   Character(20)

Utilizando

Para utilizar o conversor será simples, bastando chamar a procedure passando o numero a ser formatado, e recebendo uma string com o valor

&Resultado= FormatNumber(&ValorAFormatar)

O resultado será uma string que poderá ser incorporada ao PDF com o formato da moeda que se deseja apresentar.


segunda-feira, 9 de maio de 2016

Revoluções silenciosas...

Certas funcionalidades do Genexus mudaram silenciosamente na Ev3, nenhum alarde foi feito, talvez devido a operação lava jato, no Brasil, estejamos nos acostumando com noticias explosivas e ruidosas, e quando a coisa é mais discreta não damos a devida atenção. Desta vez acredito que Genexus nos entregou um modelo um pouco mais flexível, portanto, melhor.

Estou falando sobre a determinação da tabela base e estendida, tema fundamental para quem desenvolve sistemas no Genexus, e que já tivemos a oportunidade de apresentar aqui no Genexando em dois artigos.


O fato é que Genexus define a tabela resultante (tabela base) que será utilizada para recuperar registros quando programamos um for each, e também as tabelas que irão complementar a informação que desejamos, definindo um conjunto chamado tabela estendida, que é a soma da tabela base e das demais complementares.


O que devemos fazer em um comando for each é dizer quais atributos desejamos, a ferramenta faz o resto.
 
Tomemos como exemplo o modelo apresentado acima. Se programarmos um for each, como o apresentado a seguir, com os atributos ClienteNome, CidadeNome e PaisNome, teremos como tabela base a Cliente e a estendida Cliente-Cidade-Pais.




Não será necessário fazer nada, para que tenhamos uma pesquisa completa na tabela Cliente com o nome da cidade e país incluída na apresentação, este modelo é natural no Genexus, e muita gente utiliza isto sem perceber o recurso.


A revolução ocorreu no seguinte sentido, uma nova cláusula no for each foi entregue, a base transaction, ou seja, podemos informar a transação que originará a tabela base do modelo. Desta forma poderíamos programar de forma explicita a transação Cliente no for each. Para transações com dois níveis teríamos que colocar o nome da transação e o nome do segundo nível, por exemplo, NotaFiscal.Produto. Algo como:



O fato é que podemos alterar a base transaction do for each para apontar para outra tabela qualquer, e aqui apresentamos o efeito da revolução. Se por exemplo, dissermos que a base transaction do exemplo seja a Cidade, nos Genexus anteriores teríamos um erro no for each, pois o Genexus não alcançaria o ClienteNome, e como resultado, um ruidoso erro indicando um não relacionamento entre os atributos.

Na versão EV3 do Genexus, o erro de não relacionamento não ocorrerá e em seu lugar teremos um aviso que o ClienteNome não poderá ser alcançado. Observe que a tabela base do exemplo passa a ser Cidade, como determinamos no for each Cidade, e Cliente passa a não fazer parte da solução.


Podemos levar este cenário ao extremo, ao apontarmos como tabela base uma que não poderá ser resolvida por meio do conceito da tabela estendida, façamos uma pequena modificação no modelo, acrescentando um conceito de Empresa que possui Clientes.



Se pegarmos o mesmo for each anterior e apontarmos para Empresa, nenhum atributo poderá ser alcançado pelo conceito da tabela estendida, e o Genexus será compreensivo e não apresentará nenhuma mensagem de erro, apenas avisos.



Portanto, muita atenção na leitura do Navigation View para não deixar as mensagens de warning passarem desapercebidas. Acredito que este novo modelo ficou melhor, porém exigirá mais atenção do desenvolvedor.

Apoiemos as revoluções silenciosas, e também as ruidosas, desde que sejam importantes.


domingo, 17 de abril de 2016

OWASP em Brasilia!


A nova liderança do capítulo da OWASP em Brasília convida para o primeiro evento de 2016 GRATUITO, de interesse de desenvolvedores, profissionais de segurança da informação, estudantes das áreas de computação e Tecnologia da Informação e demais interessados no assunto.

O 1° Encontro OWASP 2016 será um evento de Segurança da Informação, mais especificamente Segurança em Aplicações, que acontecerá no dia 04 de Junho de 2016
 em Brasília, DF. O evento contará com profissionais da área de Segurança da Informação de diversos Estados, como também diversos membros da OWASP.