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:
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: