Utilizando o ComBox do .NET em aplicações RIA e preenchendo com XML gerado pelo Magic xpa

Nesta dica, irei utilizar este controle para ter a opção de fazer a pesquisa no ComboBox conforme a imagem abaixo:

 

A idéia é ter uma tela como acima. Então, é um cadastro de produto vinculado a uma categoria.

 

Preparando as origens de dados

Crie um novo projeto e inclua os seguintes “data source” no repositório de Data:

Produto

Código (Numérico 3)
Descrição (Alpha 30)
Categoria (Numérico 3)

Categoria

Código (Numérico 3)
Descrição (Alpha 30)

Crie também os data source que irão gerar o XML. Para criar este item, apresentarei o passo a passo, mas caso tenha alguma dúvida consulte no documento “Mastering Magic xpa (uniPaaS)”, capítulo 14. Este documento está na parte “Documentation” do Magic xpa.

Vá na linha do repositório de Data, ou seja, antes da linha 1 e vá no menu Options/Get Definition. Irá abrir uma tela conforme abaixo:

 

Vá na aba XML, selecione o Database “Default XML Database”. Em Schema URL você precisa apontar o Schema do XML que será lido ou gravado. Utilize o seguinte schema: <?xml version=”1.0″ encoding=”UTF-8″?> <xs:schema xmlns:xs=”http://www.w3.org/2001/XMLSchema”>

<xs:element name=”categorias”>

<xs:complexType>

<xs:sequence>

<xs:element name=”categoria”>

<xs:complexType>

<xs:sequence>

<xs:element name=”codigo”

type=”xs:int” />

<xs:element name=”descricao”

type=”xs:string” />

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:sequence>

</xs:complexType>

</xs:element>

</xs:schema>

 

OBS: O conteúdo acima deve ser gravado em um arquivo *.xsd, por exemplo categoria.xsd. Deve ser apontado na propriedade Schema URL o caminho deste arquivo.

Na Propriedade template programs selecione None e click OK.

Na linha do repositório Data foi criada uma linha com o nome “categoria.categorias”. Nesta linha, verifique o campo descrição que aparece com Alpha de 15, mude para 30.

Esta linha que foi criada é para gerar XML a partir do root. Verifique que o sinal de “correto” começa em categorias conforme a imagem abaixo:

 

 

Duplique esta linha e renomeie esta linha para “categoria root”.

Na linha duplicada “categoria.categorias”, clique com o botão direito em “categorias” e clique em “Exclude from View”. As colunas código e descrição irão sumir.

Agora clique com o botão direito em “categoria” e “Include in View”. As colunas código e descrição voltarão a aparecer. Na coluna descrição, mude de Alpha 15 para 30.

Pronto! Nossas Origens de Dados estão OK. As duas primeiras são do sistema (produto e categoria) e as duas últimas duas são para gerar o XML, o ROOT quando o XML não existir, e o sem ROOT quando XML já tiver conteúdo.

 

Criando o programa RIA

Crie um programa Rich Client que cadastra produto, com os campos código e descrição disponíveis na tela, e o campo categoria somente estará no Data View.

 

Criando o programa que gerará o XML

Crie um programa batch que lê todas as categorias do banco de dados.

Neste programa inclua um parâmetro chamado “XML Categoria” do tipo Blob que conterá o XML gerado por este Batch.

Crie 2 SubTask’s fazendo Link Write na tabela de XML Categoria. Uma SubTask estará fazendo Link Write no Data Source com ROOT e outra no que está como sem ROOT.

No locate utilize o código da Task Pai e init os dados da Task Pai.

Existe somente um detalhe na propriedade da linha do Link Write. Selecione o parâmetro “XML Categoria”, conforme imagem abaixo:

 

Esta opção faz gerar XML em variável. Se esta opção não for informada será gerado um arquivo no caminho descrito em Data Source Name desta propriedade ou o que estiver definido no repositório de Data.

Agora na Task Pai, faça a chamada no Record Sufix das duas Tasks. A SubTask com Root somente chamará a 1ª vez “Counter(0)=1” e a sem ROOT quando não for a 1ª vez “Counter(0)>1”.

Pronto! O batch que gera o arquivo XML está pronto.

 

Alterando o programa Rich Client com ComboBox.NET

Vá no repositório de CRR e inclua uma linha. Na coluna type selecione .NET e na coluna name dê ZOOM e  e selecione da lista que aparecerá o namespace do .NET chamado System.

Repita o passo anterior selecionando os seguintes namespaces “System.Windows.Forms”, “System.Data” e “System.Xml”.

Volte no programa Rich Client criado anteriormente e inclua uma variável do tipo .NET. Na propriedade “Object Type” inclua “System.Windows.Forms.ComboBox”. Inclua essa variável no Form deste programa.

Execute e teste que o combobox irá aparecer. Falta preencher com os itens. OK, este é o próximo passo.

 

Preenchendo o ComboBox com o XML gerado pelo Batch.

Crie uma variável do tipo Blob que conterá o XML de Categoria no programa Rich Client.

No Task Prefix Chame o batch que gera o XML passando a variável criada no passo anterior.

No Record Prefix Inclua um blob IF e na condição deste bloco coloque a função IsFirstRecordCycle(0), que significa que vai ser executado somente quando for a 1ª vez que passar no Record Prefix.

Inclua a operação Invoke .Net, tecle tab e dê um ZOOM. Irá aparecer uma tela abaixo:

 

Em Method Name coloque “preencheCombo”.

Em Arguments dê ZOOM, crie uma linha e selecione a variável  do tipo .NET que é o combo, na coluna “.NET Variable” coloque “combo”.

Crie outra linha e selecione a variável blob que tem o XML. Na coluna “.NET Variable”, coloque “xml”. Mude o texto do .NET Code para que fique da seguinte forma:

using System;
using System.Xml;
using System.IO;
using System.Data;
using System.Text;

public static class Snippet
{

public static void preencheCombo(System.Windows.Forms.ComboBox combo, System.String xml)

{

MemoryStream mem = new

MemoryStream(Encoding.Default.GetBytes(xml));

DataSet ds = new DataSet();

ds.ReadXml(mem);

if(ds.Tables.Count > 0)

{

combo.DataSource = ds.Tables[0];

combo.DisplayMember = “descricao”;

combo.ValueMember = “codigo”;

}

}

Com isso, estamos passando para o “.NET Code” as variáveis combo e xml do Magic xpa. No código, estamos carregando o XML para Stream de Memória e colocando o XML em Dataset, que é uma estrutura de dados dinâmica e será montada sua estrutura baseada no XML. Estamos incluindo no datasource do combobox a primeira estrutura do XML “categoria” e indicando que no combobox deverá aparecer a coluna descrição, e na parte de valor ficará o código. Execute  e observe que o combobox está carregado.

 

Selecionando o combox.net conforme a coluna da categoria da tabela produtos

No Record Prefix, após fechar o bloco, inclua uma operação Invoke .NET, como feito anteriormente.

Na tela que abre para incluir o “.NET Code” em Method Name, coloque “SelecionaCombo” .

Em arguments, inclua uma linha e selecione a variável do combo.net; no name coloque “combo”. Inclua outra linha e selecione a coluna categoria da tabela produtos. Na coluna “.NET Type” mude para “System.Int32” e no name coloque “cat”.

Mude o texto do .NET Code para que fique da seguinte forma:

 

using System;

public static class Snippet

{

public static void SelecionaCombo(System.Windows.Forms.ComboBox combo, System.Int32 cat)

{

combo.SelectedValue = cat;

}

}

 

Estamos selecionando corretamente o código do combo. Execute e verifique que o combox já está sendo selecionado corretamente.

 

Atualizando o valor da tabela quando o usuário modifica a opção do combo.

Inclua um evento do tipo .NET e selecione a variável do combo.net. Em event selecione o evento “SelectedIndexChange”. Se perguntar sobre os parâmetros, clique em sim.

Inclua um Update da coluna categoria de produtos com “Val(Trim([Var .NET Combo].SelectedValue),’N18′)”, em “[Var .NET Combo]” substitua pela variável do combo.net.

Na condição do UPDATE coloque “Val(Trim([Var .NET Combo].SelectedValue),’N18′)<> [Coluna Categoria de Produtos]”. Em [Var .NET Combo] substitua pela variável do combo.net e em [Coluna Categoria de Produtos] substitua pela coluna categoria da tabela de produtos.

Na propriedade da linha do UPDATE, mude a opção Force Update para Yes, para que não seja necessário alterar outras informações, para que a categoria se atualize. Execute e verifique. A atualização já está OK.

 

Habilitando a opção para poder escrever no combo para localização

Vá no form, na propriedade do combo.net, e mude a propriedade Enable pela expressão “[Var .NET Combo].Items.Count>0”, para que só esteja habilitado quando estiver carregado os itens do combobox.

Ainda na propriedade do combo.net em “Object Properties” dê um ZOOM e mude a propriedade “AutoCompleteMode” para Suggest, e AutoCompleteSource para ListItems. Com isso, será poossível escrever e a sugestão do autocomplete será a própria lista do combo.

Esta tela aberta por último que veio pelo ZOOM de “Object Properties” é uma tela de propriedade de acordo com o objeto .NET escolhido na variável.

Execute e teste e verifique que contém a função apresentada na 1ª imagem.

 

CONCLUSÃO

1) Para maiores informações sobre como utilizar .NET em Magic xpa, verifique o documento desta url http://kb.magicsoftware.com/utility/downloadArticle.aspx?aid=2073

2)      No catálogo de cursos, está disponível um curso sobre este assunto: “.NET Programming with Magic xpa”. Para mais informações, contate: comercial@magicsoftware.com.br

3)      Para maiores informações sobre as propriedades/métodos/eventos do controle combo.net verifique em http://msdn.microsoft.com/en-us/library/system.windows.forms.combobox_members%28VS.71%29.aspx

4)      Esta forma de preencher controle combobox pelo XML do Magic xpa facilita bastante no código em .NET. Desta mesma forma, é possível preencher outros controles que têm a propriedade “DataSource”, como DataGrid, ListBox, etc.

 

Jeronimo Alberto da Costa - Consultor Técnico Magic
Jeronimo Alberto da Costa – Consultor Técnico Magic

 

2 comentários

  1. Consegui reproduzir o mesmo efeito apenas utilizando Magic XPA para uma aplicação mobile funcionar Android e iOs

    Inserindo um evento de Time 00:00:01

    Utilizando um EditGet() e uma variável Edit
    Em um bloco se EditGet() Edit
    Update variable Edit com EditGet()
    Refresh / Begin Table

    Outro Bloco se Edit=Descr_Compl (Tabela) AND Edit””
    Executa ou chama uma Subtask ao encontrar (clicar) no valor desejado

    Utilizando-se uma Table dentro de um Group que fica Not Visible quando a variável a ser digitada a busca é preenchida (Ex: Pesquisa “”)

    Na Main Table, utilizar Locate DE e Range DE inicializadas com a variável Pesquisa

    Funcionou perfeitamente

    Segue o export do programa
    http://www.twainformatica.com.br/util/Programs_ComboXPA.zip

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *