VB -  Gerando relatórios dinâmicos com DataReport sem usar DataEnvironment


Cá estou eu novamente falando sobre como gerar relatórios usando o DataReport. Não é a primeira vez , para saber mais leia os artigos já publicados nos links:

Veja também o artigo da Microsoft :

Pessoalmente eu não gosto de usar o DataReport ,  a não ser para relatórios bem simples e dependendo do ambiente e do tipo de aplicação com a qual estou trabalhando.

Este artigo além de mostrar como você pode gerar um relatório dinâmico usando o DataReport sem usar um DataEnvironment vai mostrar como você pode acessar uma base de dados Access via DAO e realizar visões de dados usando consultas SQL de seleção.

Eu criei um banco de dados para a aplicação exemplo e extrai a tabela Orders do banco de dados Northwind.mdb para ser usada no artigo , assim o exemplo fica com um tamanho adequado para ser distribuído.

Vamos acessar a tabela Orders e exibir todos os dados dos pedidos em um DataGrid dando ao usuário a opção de selecionar um determinado País de destino e exibir o resultado no DataGrid e no relatório gerado dinamicamente.

Inicie então um novo no Visual Studio e no formulário padrão altere o nome para - frmdynrelatorio. Inclua a seguir neste formulário os seguintes controles:

Inclua um modulo no seu projeto via menu principal do VB, menu Project | Add Module - modDeclare.bas.

Inclua também um designer para o DataReport - rptdinamico.Dsr. A seguir monte o relatório com os dados da tabela Orders conforme abaixo:

O seu projeto deverá apresentar a seguinte composição:

Agora vamos a código do projeto:

No módulo vamos apenas declarar as variáveis objeto para a conexão e para o recordset do tipo Dynaset que vamos usar:

Public conndyn As Connection
Public rsdyn As Recordset

O código do formulário - frmdynrelat - apresenta:

No evento Load :

a definição de uma nova conexão e a abertura da conexão usando o provedor OleDB 3.51 (o banco de dados é do tipo access 97) para acesso ao banco de dados Orders.mdb

Private Sub Form_Load()
      Set conndyn = New Connection
      conndyn.Open "Provider=Microsoft.Jet.OLEDB.3.51;Persist Security Info=False;User ID=Admin;Data Source=" & App.Path & "\orders.mdb;Mode=Share Deny None;Extended Properties=';COUNTRY=0;CP=1252;LANGID=0x0409';Jet OLEDB:System database='';Jet OLEDB:Registry Path='';Jet OLEDB:Database Password='';Jet OLEDB:Global Partial Bulk Ops=2"
End Sub

No evento Activate a chamada a rotina consulta passando a instrução SQL - select * from orders que seleciona todos os pedidos da tabela Orders

Private Sub Form_Activate()
      consulta ("select * from orders")
End Sub

A rotina consulta :

Recebe a instrução SQL e :

Private Sub consulta(sql1 As String)

Set rsdyn = New Recordset
rsdyn.CursorLocation = adUseClient
rsdyn.Open sql1, conndyn, adOpenForwardOnly, adLockReadOnly

Set dgDados.DataSource = rsdyn
dgDados.Refresh

lblmsg.Caption = "(" & rsdyn.RecordCount & ")" & " Item (s) " & " encontrados!"

End Sub

No evento Click do botão de comando cmdProcurar:

Private Sub cmdProcurar_Click()

On Error GoTo trataerro

If txtprocurar.Text <> "" Then
     consulta ("select * from orders where shipcountry='" & Trim(txtprocurar) & "'")
Else
    MsgBox "Informe a sigla do Pais de destino do pedido", vbInformation
    txtprocurar.SetFocus
End If
Exit Sub

trataerro:
    txtprocurar = ""
End Sub

No evento Click do botão para imprimir temos:

  1. definimos a fonte de dados do data report (Set .DataSource = rsdyn.DataSource)
  2. Na Section1 verificamos o tipo do controle  (With .Sections("Section1").Controls)
  3. Se for um RptTextbox atribui o valor da coluna  (  If TypeOf .Item(i) Is RptTextBox Then )
  4. Exibe o relatório (Show)
Private Sub cmdImprimir_Click()

With rptdinamico
     Set .DataSource = Nothing
     .DataMember = ""
     Set .DataSource = rsdyn.DataSource
     With .Sections("Section1").Controls
          For i = 1 To .Count
              If TypeOf .Item(i) Is RptTextBox Then
               'O datamember deverá sempre ser enquanto estiver criando relatorios dinamicos
               .Item(i).DataMember = ""
               .Item(i).DataField = rsdyn.Fields(i - 1).Name
            End If
       Next i
   End With
.Show
End With
End Sub

O código do botão exibir todos apenas refaz a exibição de todos os registros da tabela Orders.

Private Sub cmdTodos_Click()
    Form_Activate
End Sub

No evento Unload do formulário , fechamos a conexão e o recordset.

Private Sub Form_Unload(Cancel As Integer)
   rsdyn.Close
  conndyn.Close
End Sub

Executando a aplicação teremos a tela inicial:

A seguir a tela exibindo o resultado da exibição para o critério Poland como país informado:

A finalmente o relatório dos dados :

E ponto final.

Pegue o projeto completo aqui : drDinamico.zip

Eu sei é apenas VB , mas eu gosto...

Referências:


José Carlos Macoratti