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:
- Os Data Providers podem ser utilizados junto com o Business Component apenas para operações de inserção;
- 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;
- O BC importa algumas regras e eventos definidos na sua respectiva transação:
- todas as regras são executadas, exceto aquelas que chamam outro objeto com interface, e regras como parm, prompt, noprompt;
- 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;
- Para capturarmos as mensagens de erro utilizamos a variável "messages", programando:
&messages = &VariavelBC.GetMessages()
for &message in &messages
endfor
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: |
//=====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;
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:
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:
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.//=====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
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):
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".//=====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
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