Criando Relatórios com o Word


Uma das grandes vantagens do Visual Basic , além da facilidade no aprendizado, é sua  integração com o suite Microsoft : Word, Excel , etc... . Você pode se aproveitar disto e fazer a integração do seu programa VB com o Word (Excel,PowerPoint,..) , aproveitando todos os seus recursos disponíveis. Como a grande maioria dos usuários possui o Word , o fato de você estar usando uma aplicação externa ao seu programa VB não chega ser um impecilho.

Neste artigo iremos mostrar como preencher um contrato com variáveis obtidas do seu banco de dados no Visual Basic. Além de ser um expediente comum no dia a dia , veremos que a tarefa não requer muito trabalho nem muito código. O enfoque será dado em como substituir as variáveis presente no contrato usando a automação OLE . Fica a seu cargo expandir as possibilidades do exemplo adaptando-a ás suas necessidades. Ao trabalho...

O problema

Você tem que preencher um contrato ( pode se qualquer tipo de contrato) de prestação de serviços educacionais com os dados de cada aluno . Os dados dos alunos estão presentes no seu banco de dados , e  você vai ter que , para cada aluno , imprimir o contrato personalizado.

Vamos usar o Microsoft Word para redigir o contrato e no local onde os dados do aluno devem ser preenchidos usaremos variáveis que serão substituídas via automação OLE pelo Visual Basic.

Abaixo temos uma parte do nosso contrato: (Você não ia querer que eu digitasse o contrato inteiro né !!!)

As variáveis usadas neste caso são:

Obs: Neste exemplo não iremos usar a variável @documento. 

Salvaremos nosso documento com o nome de contrato.doc 

A solução

Vamos agora criar um projeto no Visual Basic que nos permita imprimir os contratos com os dados de cada aluno. 

 

O formulário possui:

Como funciona ?

O controle Data1 faz a vinculação da sua base de dados com os controles Caixa  de texto (Aluno, responsável , endereço e cidade do formulário.  Para isto , primeiro você deve definir as propriedades DatabaseName ( o nome do banco de dados) e RecordSource (o nome da tabela).

A seguir basta vincular cada caixa de texto usando as propriedades: DataSource ( indique o nome do controle de dados ) e DataField ( o nome de cada campo da tabela que queremos vincular). ( Veja também : Objeto de Controle de dados )

No botão - Gerar Contrato - insira o seguinte código:

Private Sub cmdContrato_Click()
Dim temp As String

On Error GoTo trata_erro

Set ObjWord = New Word.Application
' Desabilita o botao de comando
cmdContrato.Enabled = False
' nome do relatorio pré montado
ObjWord.Documents.Open ("c:\teste\Contrato.doc")

' chama rotina para substituicao
Call Substitui_Var("@contratada", txtcontratada)
Call Substitui_Var("@sede", txtsede)
Call Substitui_Var("@cidade1", txtcidade)
Call Substitui_Var("@contratante", Data1.Recordset("nomeresp"))
Call Substitui_Var("@endereco2", Data1.Recordset("endereco"))
Call Substitui_Var("@documento", Data1.Recordset("cidade"))
Call Substitui_Var("@aluno", Data1.Recordset("nome"))


' Salva o documento com um novo nome
ObjWord.ActiveDocument.SaveAs (txtcontrato)
'Encerra o word
ObjWord.Quit
' informa ao usuario que o contrato foi gerado
MsgBox "Contrato gerado com sucesso! em : " & txtcontrato, vbInformation, " Contrato Gerado "
' libera memoria
Set ObjWord = Nothing
Exit Sub

trata_erro:
MsgBox "Ocorreu um erro durante o processamento " & " - Erro numero : " & Err.Number

End Sub

 E a função que irá fazer o serviço possui o seguinte código:

Private Sub Substitui_Var(Header As String, Data As String)
  With ObjWord.Selection.Find
     .ClearFormatting
     .Text = Header
     .Execute Forward:=True
  End With

  Clipboard.Clear
  Clipboard.SetText (Data)
  ObjWord.Selection.Paste
  Clipboard.Clear
End Sub

A chamada da função Substitui_Var é que faz a substituição das variáveis do texto:

Call RepPara("@contratada", txtcontratada)
Call RepPara("@sede", txtsede)
Call RepPara("@cidade1", txtcidade)
Call RepPara("@contratante", Data1.Recordset("nomeresp"))
Call RepPara("@endereco2", Data1.Recordset("endereco"))
Call RepPara("@documento", Data1.Recordset("cidade"))
Call RepPara("@aluno", Data1.Recordset("nome"))

A função possui dois parâmetros : a variável que queremos substituir e o valor que será inserido no local da variável. Para inserir um campo do banco de dados usamos a notação:

Data1.Recordset("nome do campo")

Tudo isto é possível graças a criação da variável objeto :

Set ObjWord = New Word.Application

Ao executar o projeto teremos em tela os dados que queremos inserir no contrato:

E clicar no botão - Gerar Contrato - teremos:

O resto agora é com você...  (Leia também o artigo : OLE - Conceitos Básicos )