quinta-feira, 29 de novembro de 2012

Genexus Business Component - Parte I

Ao desenvolver aplicativos através do Genexus, podemos determinar diferentes formas de atualizar a nossa base de dados, seja através de transações, procedimentos ou até web panels. Cada uma destas opções possui os seus prós e contras de utilização.

O grande diferencial das transações, é a sua facilidade de criação, já que o analista não necessita programar as rotinas de inserção, alteração e exclusão dos dados informados pelo usuário.

Já os procedimentos são utilizados quando há a necessidade de realizar inserções/alterações/exclusões com muitos dados de forma automatizada e até por rotinas batch. Sua principal característica é sua alta performance, principalmente quando utilizamos a função "Blocking" para estas grandes atualizações.

Porém e quando necessitamos trabalhar com uma web panel, quem sabe um grid de clientes que informe entre outros dados, a coluna ativo/inativo. E, através de um clique sobre esta coluna, este status é alterado, sem a necessidade de entrar no modo alteração da transação, alterar o valor do atributo e clicar em confirmar. São em situações como esta que a utilização de Business Component (BC) é a mais recomendada.

Lembre-se

Antes de visualizarmos alguns exemplos do Business Component em ação, precisamos lembrar que:
  1. Os Data Providers podem ser utilizados junto com o Business Component apenas para operações de inserção;
  2. O Business Component omite o valor da propriedade "commit on exit" dos objetos. Isto é, ao utilizarmos o BC precisamos utilizar o comando "commit" para finalizar a UTL;
  3. O BC importa algumas regras e eventos definidos na sua respectiva transação:
    1. todas as regras são executadas, exceto aquelas que chamam outro objeto com interface, e regras como parm, prompt, noprompt;
    2. todos os eventos são ignorados, exceto os eventos START e AFTER TRN. Comandos que chamam outro objeto com interface (WebPanel.Call()) são ignorados sempre;
  4. Para capturarmos as mensagens de erro utilizamos a variável "messages", programando:
&messages = &VariavelBC.GetMessages()
for &message in &messages
endfor

Inserindo valores através de Business Component

Para exemplificar o método de inserção utilizando BC, considere uma aplicação Genexus para uma livraria. Neste livraria os livros são catalogados por Assunto, Editora e edição correspondente. A partir do seu Assunto cada livro recebe um código único. Neste código, os três primeiros dígitos é o código de seu assunto e os três últimos são sequenciais. Então, os livros do assunto "Negócios" (código 100), terão códigos de 100001 a 100999.

De acordo com esta definição, o desenho de nossa transação Livro e suas regras definidas serão:
Livros

Genexus Transação
//=====Define a Data de inserção como Data de Cadastro=====
Default(LivroDataCadastro,&Today);

//=====Serializa o Código do Livro, de acordo com seu Assunto=====
LivroCodigo = SerializaLivroCodigo.Udp(AssuntoCod) 
on beforeinsert;

Antes de tudo, para utilizarmos o BC precisamos definir qual a transação que iremos trabalhar. Definida esta transação, em suas propriedades, precisamos definir o item "Business Component" como True, conforme figura abaixo:

Business Component


Para facilitarmos a inserção de novos livros, é criado uma Web Panel contendo um grid, com todos os livros registrados. Na última coluna da direita deste grid, inserimos uma imagem e criamos um evento associado a esta, com a opção de clonar este livro. Isto é, inserir um novo livro a partir dos dados do livro selecionado. Logo em nossa form teríamos:

Genexus Grid

Obs.: Este grid contém todos os atributos da transação Livro, aqueles que não nos interessa mostrar para o usuário estar marcados como invisíveis. Mais adiante será explicado o porque.

Adicionamos a variável "Livro" que terá como Tipo de Dado o Business Component Livro. Agora, na aba de eventos desta Web Panel, iremos programar o evento associado ao clique da imagem "Clonar":
Event 'ClonarLivro'
//=====Referencia um novo registro=====
&Livro = new()

//=====Iguala Atributos do BC ao da linha selecionada=====
&Livro.LivroNome = LivroNome
&Livro.LivroSinopse = LivroSinopse
&Livro.LivroAtivo = LivroAtivo
&Livro.LivroDataLancamento = LivroDataLancamento
&Livro.LivroCapa = LivroCapa
&Livro.LivroEdicao = LivroEdicao
&Livro.LivroPaginas = LivroPaginas
&Livro.LivroValor = LivroValor
&Livro.AssuntoCod = AssuntoCod
&Livro.EditoraId = EditoraId

//=====Salva os Dados=====
&Livro.Save()

//=====Finaliza a UTL=====
commit

//=====Atualiza a página para aparecer o novo registro no grid=====
Refresh
EndEvent
Note que, todos os atributos referenciados estão presentes no grid, alguns visíveis outros não. Isto é necessário para que ele carregue corretamente o valor de cada atributo.

Quando este Business Component for executado, as regras correspondentes a sua transação são carregadas automaticamente. Nestas regras, o atributo LivroDataCadastro recebe o valor default do dia e, o atributo LivroCodigo recebe um valor definido através de um procedimento. Por isso, estes dois atributos não são assinalados no evento "ClonarLivro".

Inserindo valores em transações com níveis

Agora a situação é um pouco diferente, após algum tempo foi verificado a necessidade de adicionar o(s) autor(es) de cada livro. Considere que um livro pode ter mais de um autor e um autor pode ter mais de um livro, logo o desenho da transação ficará (AutorCodigo é chave estrangeira):

Genexus Transação

Após isto será necessário alterar o evento "ClonarLivro" da nossa Web Panel, a variável "LivroAutores" é do tipo de dado - Business Component: Livro.Autores:

Event 'ClonarLivro'
//=====Referencia um novo registro=====
&Livro = new()

//=====Iguala Atributos do BC ao da linha selecionada=====
&Livro.LivroNome = LivroNome
&Livro.LivroSinopse = LivroSinopse
&Livro.LivroAtivo = LivroAtivo
&Livro.LivroDataLancamento = LivroDataLancamento
&Livro.LivroCapa = LivroCapa
&Livro.LivroEdicao = LivroEdicao
&Livro.LivroPaginas = LivroPaginas
&Livro.LivroValor = LivroValor
&Livro.AssuntoCod = AssuntoCod
&Livro.EditoraId = EditoraId

//=====Referencia novo registro de Autor A===== &LivroAutores = new() &LivroAutores.AutorCodigo = 1 //=====Adiciona referencia ao primeiro nível===== &Livro.Autores.Add(&LivroAutores) //=====Referencia novo registro de Autor B===== &LivroAutores = new() &LivroAutores.AutorCodigo = 2 //=====Adiciona referencia ao primeiro nível===== &Livro.Autores.Add(&LivroAutores)

//=====Salva os Dados=====
&Livro.Save()

//=====Finaliza a UTL=====
commit

//=====Atualiza a página para aparecer o novo registro no grid=====
Refresh
EndEvent
Note que a forma de trabalho do Business Component é muito semelhante ao trabalho com SDTs, possuem os mesmo comandos "new" e "add".

Na próxima parte vamos ver como inserir dados a partir de um Data Provider (ai o bicho pega) e as operações de Alteração e Exclusão de dados.

Era isso gurizada, qualquer dúvida ou sugestão enviem através dos comentários ou então pelo email genexus@outlook.com. Abraço

Nenhum comentário:

Postar um comentário