Páginas

quarta-feira, 2 de fevereiro de 2011

Criando um formulário a partir de um XML

Imagine o seguinte cenário, você possui uma aplicação que deve consumir um WebService, porém você não sabe qual será a quantidade de dados que serão retornados por este WebService.

image
Pensando nesta situação desenvolvi uma rotina que recebe um arquivo XML do WebService e cria em tempo de execução um formulário de acordo com as informações recebidas do mesmo.

Este algoritmo é apenas uma idéia de como pode ser realizada tal tarefa, vocês perceberão que nela não estão contempladas nenhuma informação de validação de tipo de dados e nem de valores mas isto pode ser facilmente implementado utilizando a mesma regra.

Para mudar um pouco a estrutura de programação, neste post estou utilizando o modelo de objetos do Word, para quem quiser usar outras Ferramentas altere ActiveDocument.Path por ThisWorkbook.Path ou ActiveWorkbook.Path (Excel) ou ActivePresentation.Path (PowerPoint)

O Primeiro passo é a criação do arquivo XML para leitura de nossa rotina (que será o retorno do WebService), para teste usei este arquivo.

<?xml version='1.0' ?>
<form>
<control type='Forms.Label.1' caption='Grupo' left='5' top='5' width='100'/>
<control type='Forms.ComboBox.1' left='60' top='5' width='100'>
<item text='Ativo'/>
<item text='Passivo'/>
<item text='Estrutura'/>
<item text='Indicadores'/>
<item text='Resultado'/>
</control>
<control type='Forms.Label.1' caption='Descricao' left='5' top='30' width='100'/>
<control type='Forms.TextBox.1'  left='60' top='30' width='150'/>
<control type='Forms.Label.1' caption='TAG' left='5' top='55' width='100'/>
<control type='Forms.TextBox.1'  left='60' top='55' width='150' text='<#descricao#>'/>
<control type='Forms.Label.1' caption='VALOR' left='5' top='80' width='100'/>
<control type='Forms.TextBox.1'  left='60' top='80' width='150'/>
</form>

Para gerar este arquivo utilize a seguinte Rotina
Sub CriaXML()
'Desenvolvido por Bruno.Leite
'bruno_silva_leite@yahoo.com.br

Dim StrXml As String

'Criando arquivo XML

StrXml = StrXml & "<?xml version='1.0' ?>" & vbNewLine
StrXml = StrXml & "<form>" & vbNewLine

StrXml = StrXml & "<control type='Forms.Label.1' caption='Grupo' left='5' top='5' width='100'/>" & vbNewLine
StrXml = StrXml & "<control type='Forms.ComboBox.1' left='60' top='5' width='100'>" & vbNewLine
      StrXml = StrXml & "<item text='Ativo'/>" & vbNewLine
      StrXml = StrXml & "<item text='Passivo'/>" & vbNewLine
      StrXml = StrXml & "<item text='Estrutura'/>" & vbNewLine
      StrXml = StrXml & "<item text='Indicadores'/>" & vbNewLine
      StrXml = StrXml & "<item text='Resultado'/>" & vbNewLine
StrXml = StrXml & "</control>" & vbNewLine

StrXml = StrXml & "<control type='Forms.Label.1' caption='Descricao' left='5' top='30' width='100'/>" & vbNewLine
StrXml = StrXml & "<control type='Forms.TextBox.1'  left='60' top='30' width='150'/>" & vbNewLine

StrXml = StrXml & "<control type='Forms.Label.1' caption='TAG' left='5' top='55' width='100'/>" & vbNewLine
StrXml = StrXml & "<control type='Forms.TextBox.1'  left='60' top='55' width='150'/>" & vbNewLine

StrXml = StrXml & "<control type='Forms.Label.1' caption='VALOR' left='5' top='80' width='100'/>" & vbNewLine
StrXml = StrXml & "<control type='Forms.TextBox.1'  left='60' top='80' width='150'/>" & vbNewLine

StrXml = StrXml & "</form>" & vbNewLine

'Apagando o Arquivo se existir
If Dir(ActiveDocument.Path & "\TempForm.xml") <> vbNullString Then
      Kill ActiveDocument.Path & "\TempForm.xml"
End If

'Criando o Arquivo com o nome de TempForm.xml na pasta do Documento
Open ActiveDocument.Path & "\TempForm.xml" For Output As #1
      Print #1, StrXml
Close #1

End Sub

Após gerar o arquivo (ele será gerado na mesma pasta do documento com o nome de TempForm..xml) utilizaremos o arquivo XML recebido e criaremos o formulário através das informações recebidas.
 
Antes, porém de criar a rotina, crie dois formulários no Projeto, deixe com os nomes padrões UserForm1 e UserForm2.

No UserForm1 crie um botão e adicione o seguinte código.

Private Sub CommandButton1_Click()
'Chama a rotina para criação do Formulário, passando o arquivo XMl e o Segundo UserForm Criado 
LeXML ActiveDocument.Path &"\TempForm.xml", UserForm2
End Sub

Agora num Módulo qualquer, coloque a seguinte rotina.

Sub LeXML(ArqXml As String, Frm As UserForm2)
'Desenvolvido Por Bruno Leite
'bruno_silva_leite@yahoo.com.br

Dim Doc As Object, ctl As Control
Dim nd As Object, nd1 As Object, Dados As Object

'Criando o ObjetoXML e lendo o Arquivo
Set Doc = CreateObject("MSXML.DOMDocument")
Doc.Load ArqXml

'Buscando os nós
For Each nd In Doc.SelectNodes("//control")

      'Buscando os Atributos do nó selecionado
      For Each Dados In nd.Attributes
      
          'Verificando as opções
          Select Case Dados.Name
          
          Case "type"
          'Caso seja a definição de Tipo do Controle
               Set ctl = Frm.Controls.Add(Dados.Value)
               'E Seja um ComboBox
               If Dados.Value = "Forms.ComboBox.1" Then
                  'Busque os Items e adicione
                  Set nd1 = nd.SelectNodes("//item")
                      For i = 0 To nd1.Length - 1
                              ctl.AddItem nd1(i).Attributes(0).Text
                      Next i
               End If
               
          Case "caption"
          'definindo o texto do controle
               ctl.Caption = Dados.Value
               
          Case "left"
          'definindo o posicionamento
               ctl.Left = Dados.Value
               
          Case "top"
          'definindo o posicionamento
               ctl.Top = Dados.Value
               
          Case "width"
          'definindo o tamanho
               ctl.Width = Dados.Value
               
          End Select
          
      Next Dados

Next nd

Frm.Show

End Sub


Clicando no botão criado no UserForm1 será apresentado o UserForm2.
clip_image002
Agora temos um formulário criado em tempo de execução construído a partir de um arquivo XML.

Isto abre diversas possibilidades de implementações. Crie a sua, mas mantenha os créditos!

Até a próxima

0 comentários:

Postar um comentário

Related Posts Plugin for WordPress, Blogger...