quinta-feira, 27 de setembro de 2012

Processamento Background com Genexus

Processe grandes volumes de dados em background.

Do que se trata o post: 
Utilização de um gerador Win em um projeto Web, para a criação de uma procedure em background capaz de realizar uma tarefa em um determinado horário especificado.

As aplicações batch podem ser consideradas como programas ou rotinas executadas em segundo plano que possuem um fluxo a percorrer e sem a intervenção direta do usuário.
Genexus X

Para que servem:
Estas aplicações (background) podem realizar um processamento de dados bem superior aquelas executadas através da Web. São muito úteis para a criação de relatórios mensais, anuais com grande quantidade de dados, ou então para a geração de xml de gráficos, entre outros usos.

Conhecendo:
Primeiramente precisamos adicionar um Gerador Win ao nosso projeto, para isto, no Genexus, clique na aba Preferences (canto inferior esquerdo), após, clique com o botão direito sobre a opção GENERATORS, e selecione NEW GENERATOR.

Agora, nosso projeto terá dois geradores. Clique sobre o gerador recentemente criado e em suas Propriedades determine o modo User Interface com a opção Windows conforme figura abaixo:

Genexus Batch

Pronto nosso gerador está configurado. Agora precisamos configurar a nossa Procedure que será executada em background, determine o modo Main program com a opção True e na propriedade Generator selecione o gerador Win anteriormente criado, conforme abaixo:


Como esta procedure será Main é preciso atenção para compila-la após cada alteração. 

Executanto o processamento:
Para este nosso exemplo, programei a procedure para criar um relatório em excel contendo o nome e a cidade de dois clientes, conforme o código abaixo:

//=====Abre/Cria a planilha=====
&ExcelDocument.Open('C:\Temp\CustomerReport.xls')

//=====Limpa a planilha caso já exista=====
&ExcelDocument.Clear()

&ExcelDocument.Cells(1,1).Text = 'Clientes'
&ExcelDocument.Cells(1,2).Text = 'Cidade'

&ExcelDocument.Cells(2,1).Text = 'Fulano de Tal'
&ExcelDocument.Cells(2,2).Text = 'São Paulo'

&ExcelDocument.Cells(3,1).Text = 'Cicrano de Tal'
&ExcelDocument.Cells(3,2).Text = 'Rio de Janeiro'

//=====Salva as inserções realizadas=====
&ExcelDocument.Save()

//=====Fecha a planilha trabalhada=====
&ExcelDocument.Close()

Por fim, a execução desta procedure background poderá ser feita de duas maneiras:

1. Chamada através de uma Web Panel, por meio da função Shell:

&retorno = Shell('C:\KBs\TestesGerais\CSharpModel\bin\aprocessamentobatch.exe',0)

2. Chamada através de um programa de agendamento de execuções, recomendo o JIT Scheduler disponível aqui. Este programa é de simples configuração, podemos determinar dias, horários e intervalos de execução.

Genexus Batch

Por enquanto é só pessoal, qualquer dúvida, sugestão ou correção aguardo nos cometários. Grande Abraço.

sexta-feira, 21 de setembro de 2012

Certificação Genexus - Simulado Parte III

Bom pessoal após a Parte I e Parte II, daremos continuidade ao nosso assunto sobre certificação Genexus, hoje iremos realizar mais 3 questões do nosso simulado.

5. Considere uma aplicação Genexus para uma montadora de automóveis. Dados o seguinte desenho das transações, determine a tabela estendida da Tabela Remessa.

Genexus Simulado
Resposta: C - dada uma tabela base, a tabela estendida é o conjunto de atributos que pertencem à tabela base mais os atributos que tenham uma relação N-1 com a tabela estendida determinada até o momento. Ou seja, a partir da tabela Remessa, temos as informações da tabela Locomotiva. Logo, a tabela estendida é: a própria tabela Remessa + a tabela Locomotiva.

6. Considere uma aplicação Genexus para uma montadora de automóveis. Dado o seguinte diagrama de Bachman, determine a tabela estendida de RemessaCarro.

Genexus Simulado
Resposta: D - dada uma tabela base, a tabela estendida é o conjunto de atributos que pertencem à tabela base mais os atributos que tenham uma relação N-1 com a tabela estendida determinada até o momento. Ou seja, a partir da tabela RemessaCarro temos as informações da tabela Carro, Remessa e Locomotiva (a partir da tabela Remessa). Logo, a tabela estendida é: a própria tabela RemessaCarro, a tabela Locomotiva, Remessa e Carro.
7. Considere uma aplicação Genexus para uma montadora de automóveis. A mesma, conta com uma Transação Carro pra registrar os carros que são montados. Nesta transação, é necessário registrar o país de origem do construtor e o país de origem das peças de reposição. Determine o desenho das transações que considera correto para esta realidade.


Genexus Simulado
Resposta: B - os subtipos são atributos similares que cumprem funções diferentes. Devem seguir a lógica das transações, portanto, devem ser criados a sua semelhança
 ----------------------------------------------------------------------------------------------------------

Siga o restante do simulado através dos links:

Deixe um comentário com o seu email e posso repassar o documento pdf que contém esta e mais 16 questões!

Busca de CEP por Webservice

Olá pessoal, nesse post iremos utilizar dos nossos conhecimentos sobre web service, jquery e genexus é claro, para criarmos uma função em javascript (sem refresh de página) para buscar um endereço completo a partir de um CEP.

Esse assunto é muito interessante pois na grande maioria das vezes quando desejamos criar um cadastro de usuários para a nossa aplicação, obrigamos os usuários a informar um endereço completo. A partir de uma tabela de CEP vendida pelo próprio correio podemos importa-la para o nosso projeto e realizar uma busca através de um for each. Porém neste caso, a aplicação iria demorar um certo tempo para retornar os dados, e é claro, realizar um Refresh na nossa página.

Iremos utilizar como base, um post sobre o assunto desenvolvido com Javascript, que faz referência a um webservice grátis disponível na web, o republicavirtual.

OK vamos lá, primeiramente recomendo uma rápida leitura do nosso post sobre Jquery e como utilizá-lo no Genexus, disponível através deste link. Após...precisarei dos seguintes arquivos:
  1. biblioteca jquery, disponível aqui;
  2. plugin Masked Input, disponível aqui;
  3. uma imagem de busca;
  4. uma imagem de loading.
Primeiro, iremos criar 7 variáveis com as definições abaixo (você poderá colocar o nome que desejar mas lembre-se que este nome será necessário para definirmos o Id do objeto input):
Busca CEP
Segundo,  no evento Start da nossa Web Panel iremos adicionar os seguintes códigos:
//=====Adiciona referências da biblioteca e plugin Mask=====
&Header = '<script src="http://code.jquery.com/jquery-1.8.2.min.js" type="text/javascript"></script>'
&Header += '<script src="http://www.eliezer.com.br/demo/cep-javascript/jquery.maskedinput-1.3.min.js" type="text/javascript"></script>'

//=====Cria Função de busca de CEP=====
&Header += '<script type="text/javascript">'
&Header += 'function findCEP() {'

//=====Se valor da variável CEP for diferente de vazio=====
&Header += 'if($.trim($("#vCEP").val()) != ""){'

//=====Mostra a nossa imagem "loading" enquanto procura CEP=====
&Header += '$("#ajax-loading").css("display","inline");'

//=====Busca através de web service=====
&Header += '$.getScript("http://cep.republicavirtual.com.br/web_cep.php?formato=javascript&cep="+$("#vCEP").val().replace("-", ""), function(){'

//=====Captura resultados se houver=====
&Header += 'if(resultadoCEP["resultado"] == 1){'
&Header += '$("#vENDERECO").val(unescape(resultadoCEP["tipo_logradouro"])+" "+unescape(resultadoCEP["logradouro"]));'
&Header += '$("#vBAIRRO").val(unescape(resultadoCEP["bairro"]));'
&Header += '$("#vCIDADE").val(unescape(resultadoCEP["cidade"]));'
&Header += '$("#vUF").val(unescape(resultadoCEP["uf"]));'
&Header += '$("#vNUMERO").focus();'

//=====Caso não houver resultado mostra mensagem=====
&Header += '}else{'
&Header += 'alert("Endereço não encontrado para o cep ");'
&Header += '}'

//=====Esconde a nossa imagem loading=====
&Header += '$("#ajax-loading").hide();'
&Header += '});}}'
&Header += '$(document).ready(function(){'

//=====Adiciona mascara à variável CEP=====
&Header += '$("#vCEP").mask("99999-999")'
&Header += '});'
&Header += '</script>'

Form.HeaderRawHTML = &Header

Note que os nomes das variáveis definidas constam no nosso código javascript, por exemplo quando é mencionado #vENDERECO. Este é o id da variável Endereco que irá aparecer em nossa tela. Um detalhe importante, o código javascript é case sensitive, ou seja, existem diferenças entre letras maiúsculas e minúsculas, logo #vEndereco <> #vENDERECO.

Terceiro, em nossa WebForm iremos adicionar um TextBlock e configurá-lo como ReadOnly = True e Format = HTML, conforme a figura abaixo:

Busca CEP

Este TextBlock irá ser as nossas imagens de Busca e Loading, e ao clicar irá chamar a nossa função Javascript anteriormente escrita (findCEP()).

Portanto ainda no evento Start é necessário adicionar o seguinte código:
//=====Adiciona imagens através de HTML ao nosso TextBlock=====
TBJavaScript.Caption = '<div style="display:inline;"><a href="javascript:findCEP()">'
TBJavaScript.Caption += '<img src="CEP/search-icon.gif" alt="Pesquisar" border="0">'
TBJavaScript.Caption += '</a></div><div id="ajax-loading" style="display: none;">'
TBJavaScript.Caption += '<img src="CEP/loading.gif"></div>'

O resultado será uma rápida busca de CEP, sem a necessidade de dar um Load em nossa página.
Busca CEP


terça-feira, 11 de setembro de 2012

Certificação Genexus - Simulado Parte II

Bom pessoal após a Parte I, daremos continuidade ao nosso assunto sobre certificação Genexus, hoje iremos realizar mais 3 questões do nosso simulado. A partir destas questões podemos nos habituar ao tipo de prova que a Artech estrutura e dessa forma nos prepararmos melhor.

2. Considere uma aplicação Genexus para uma montadora de automóveis. Um carro é composto por vários tipos de peças (PecaTipo). Um tipo de peça pode fazer parte de muitos carros. Determine o desenho das transações que considera correto para representar esta realidade.

Genexus Blog

Resposta: B - conforme o enunciado, um carro contém VÁRIOS (N) tipos de peças, e UM tipo de peça faz parte de MUITOS (N) carros. A alternativa que contém o relacionamento de N-N entre carro e tipo de peça é a B.

3. Considere uma aplicação Genexus para uma montadora de automóveis. Um carro é composto por varias peças (Peca). Estas peças são utilizadas unicamente para estes carros, por conseqüência não pode haver peça que não esteja associada a um carro. Determine o desenho das transações que considera correto para representar esta realidade.

Genexus Blog

Resposta: C - esta questão é um pouco confusa, precisamos analisar com atenção. O enunciado nos diz que NÃO podem haver peças sem carros, logo não irá existir uma transação única para peças, ela é na verdade, um nível da transação carros. Dessa forma, nunca irá existir uma peça órfã.

4. Considere uma aplicação Genexus para uma montadora de automóveis. A partir do desenho das transações, determine a estrutura física das tabelas que o Genexus criará.

Genexus Blog

Resposta: B - ao analisarmos as transações percebemos a existência de 4 tabelas. Na transação Remessa verificamos a existência de uma chave estrangeira (LocomotivaId) e de uma função (RemessaTotal), logo o atributo LocomotivaNome é inferido, depende de sua chave LocomotivaId. Portanto, assim como o atributo função, não irá existir fisicamente na tabela de Remessa.
-----------------------------------------------------------------------------------------------------------

Siga o restante do simulado através dos links:

Deixe um comentário com o seu email e posso repassar o documento pdf que contém esta e mais 16 questões!

sexta-feira, 7 de setembro de 2012

Certificação Genexus

Neste post vamos entender um pouco sobre como funciona as Certificações para Analista Genexus, onde fazer, quanto custa e a estrutura das provas. Além disso, a partir de hoje irei postar questões semelhantes às questões que são aplicadas nas provas de certificação, e um breve comentário sobre a resposta correta.

Então.., como estas provas são aplicadas?

Todas as provas para Analista são objetivas e existe uma prova específica para cada nível. O percentual mínimo de aprovação é de 70% para qualquer nível e o tempo para a realização da prova é de cerca de 180 minutos. O blog possui um tópico específico sobre a experiência de um profissional na realização destas provas de certificação. Para acessá-lo clique aqui.

Qual destas certificações é a ideal para mim?

Atualmente existem 5 certificações disponíveis, são elas:
  1. ANALISTA GENEXUS JUNIOR
    1. descrição: certificação inicial, menor nível de exigência;
    2. exame: online com perguntas do tipo múltipla escolha e certo/errado. Poderá ser feito no lugar físico que o postulante desejar;
    3. custo: R$ 180,00;
    4. inscrição: poderá ser realizada através deste link 
  2. ANALISTA GENEXUS PLENO
    1. descrição: certificação intermediária, requer bons níveis de conhecimento;
    2. exame: online com perguntas do tipo múltipla escolha e certo/errado. Será realizado nos centros de distribuição ou centros de capacitação que a Artech determinar;
    3. custo: R$ 470,00;
    4. inscrição: é necessário enviar email para apieroni@genexus.com ou training@genexus.com, com nome, cidade, nome da empresa e certificação desejada.
  3. ANALISTA GENEXUS SÊNIOR
    1. descrição: certificação avançada, recomendada para aqueles analistas que possuem ótimos níveis de conhecimento;
    2. exame: online com perguntas do tipo múltipla escolha e certo/errado. Será realizado nos centros de distribuição ou centros de capacitação que a Artech determinar;
    3. custo: R$ 700,00
    4. inscrição: é necessário enviar email para apieroni@genexus.com ou training@genexus.com, com nome, cidade, nome da empresa e certificação desejada.
  4. INSTRUTOR GENEXUS 
    1. pré-requisito: certificação Analista Genexus Sênior;
    2. descrição: certificação avançada, recomendada para aqueles que possuem ótimos níveis de conhecimento com perfil de docente. Além de possuir uma teoria clara é necessário saber transmiti-la aos alunos de forma coesa. Aqueles que possuem esta certificação podem ministrar cursos em qualquer centro de capacitação da Artech;
    3. exame: avaliação oral e presencial de aproximadamente 1 hora de duração;
    4. custo: R$ a verificar
    5. inscrição: é necessário enviar email para apieroni@genexus.com ou training@genexus.com, com nome, cidade, nome da empresa e certificação desejada.
  5. DOCENTE GENEXUS 
    1. descrição: certificação para docentes de universidades que são parceiras da Artech e habilitadas a ministrar cursos Genexus dentro da universidade;
    2. exame: online com perguntas do tipo múltipla escolha e certo/errado. Será realizado nos centros de distribuição ou centros de capacitação que a Artech determinar;
    3. custo: R$ a verificar
    4. inscrição: é necessário enviar email para apieroni@genexus.com ou training@genexus.com, com nome, cidade, nome da empresa e certificação desejada.
Obs.: Os valores das certificações foram orçados junto a Artech na data de 11/09/2012.

EXEMPLO DE QUESTÃO
1. Considere uma aplicação Genexus para uma montadora de automóveis. São efetuadas montagens de distintas marcas de carros. Um carro possui uma marca, porém pode haver diversos carros com a mesma marca. Determine o desenho das transações que considera correto para representar esta realidade.

Curso Genexus

Resposta: B - única alternativa que contém  relacionamento de N-1 entre carro e marca.
----------------------------------------------------------------------------------------------------------

Siga o restante do simulado através dos links:
      1. Certificação Genexus - Simulado Parte II
      2. Certificação Genexus - Simulado Parte III
      3. Certificação Genexus - Simulado Parte IV
      4. Certificação Genexus - Simulado Parte V

Deixe um comentário com o seu email e posso repassar o documento pdf que contém esta e mais 16 questões!


domingo, 2 de setembro de 2012

Genexus SDT - Criação de Log da Aplicação

Genexus Curso
Bem-vindos a mais um tutorial sobre SDTs no Genexus Developers Blog! Neste tutorial iremos começar a criar um Log para as nossas aplicações a partir de objetos SDTs e Data Providers. Neste Log iremos gravar a inserção/alteração/exclusão realizada na sua respectiva Data/Hora e por qual Usuário e IP.

A Parte I - criação deste tipo de dado, e a Parte II - inserção de valores nos darão a base para esta continuidade.

Antes de começarmos precisamos entender o que é e para que serve este objeto Data Provider. Este objeto não é capaz de realizar modificações na nossa base de dados, ele serve resumidamente para processar dados de forma estruturada (SDT), ou seja, povoar a nossa variável SDT sem precisarmos de todas aqueles comandos (for each, Add, new()).

Neste tutorial irei realizar o seguinte:
  1. Explicar a criação do Objeto Data Provider com case em um SDT;
  2. Explicar os atributos necessários para gravar um histórico;
  3. Explicar a criação da árvore de eventos necessário para a gravação dos logs. 
Através destes conhecimentos, será possível realizar Logs de históricos de dados para as suas aplicações de maneira bem simples.

OK vamos ao trabalho..

Primeiro Passo - Criação das Transações (Cliente, Log)

Para a gravação dos Logs irei utilizar a seguinte estrutura:
Genexus Transação

Onde:
  • Id = Numeric(4)  - AutoIncrement;
  • IP = Character(15);
  • Atividade = Character(1) - Enum Values: C (Cliente);
  • Operação = Character(3) - Enum Values: INS (Inserção); UPD (Alteração); DLT (Exclusão);
  • Historico = LongVarChar;
  • UsuarioLogin = Usuário que realizou a operação.

Já a transação de exemplo terá a seguinte estrutura:
Genexus Curso

Segundo Passo - Criação do SDT e Data Provider (Cliente, Log)

Para cada transação onde será aplicado o o log será necessário criar 1 objeto SDT e 1 objeto Data Provider.

Logo para a Transação Cliente, criamos o objeto SDT_Cliente e arrastamos a transação para dentro, entaão este objeto terá a seguinte estrutura:
Genexus Curso

Após, criamos o objeto DP_Cliente (Data Provider), e arrastamos para dentro de Source o SDT que criamos (SDT_Cliente). Após será necessário incluir a condição where, onde as chaves primárias da transação serão iguais as suas variáveis recebidas como parâmetro:

parm(in:&ClienteCod);
SourceRules

Terceiro Passo - Criação da Procedure de Gravação do Log

Assim que os passos anteriores forem efetuados, podemos criar a nossa Procedure que irá realizar a gravação dos logs. Esta procedure irá receber os parâmetros:
parm(inout:&Atividade, in:&Operacao, in:&LogHistorico, in:&LogAtividadeId);

E o seguinte código (source):

//=====Captura o Usuário que efetuou a operação=====
&UsuarioLogin.FromString(&WebSession.Get('UsuarioLogin'))

//=====Captura o IP=====
&LogIP = RemoteAddr()

//=====Insere novo Log=====
new
 LogDataHora = ServerNow()
 LogHistorico = &LogHistorico 
 LogAtividade = &Atividade
 LogOperacao = &Operacao
 UsuarioLogin = &UsuarioLogin
 LogIp = &LogIP
 LogAtividadeId = &LogAtividadeId
endnew

Quarto Passo - Inserção na Transação das Regras de Inserção

Na transação Cliente, deve adicionar o seguinte código em "Rules":
//=====Adiciona o Tipo de Atividade=====
&Atividade = Atividade.Cliente;

/*
Gravação dos dados no SDT
Se inserção: grava os campos antes do COMMIT
Se alteração ou exclusão: grava os campos antes de se realizar alguma alteração
*/
&SDT_Cliente = DP_Cliente.Udp(ClienteCod) 
 if insert on beforecomplete;
&SDT_Cliente = DP_Cliente.Udp(ClienteCod) 
 if delete or update;
 
/*
Chamar a Procedure de inserção do Log
A Procedure é chamada assim que se realizar o COMMIT
Se alteração: só irá chamar se ocorrer alguma modificação
*/
&LogAtividadeId = ClienteCod.ToString.Trim();

InserirLog.Call(&Atividade, &Mode, &SDT_Cliente.ToXml(), &LogAtividadeId) 
 if insert or delete on aftercomplete;
InserirLog.Call(&Atividade, &Mode, &SDT_Cliente.ToXml(), &LogAtividadeId) 
 if update and Modified() on aftercomplete;

Agora é só homologarmos! Para testar podemos inserir, alterar ou excluir registros através da transação Cliente, teremos um resultado semelhante a este:
Genexus Curso