Você está na página 1de 15

Bases de dados com ADO em VB6 Joo A. Ferreira joao.ferreira@progmat.

com
1
Bases de dados com ADO


Exerccio 1 Criar uma aplicao para adicionar, alterar e remover registos de uma tabela


Neste exerccio vamos criar um acesso simples base de dados Northwind.MDB do Office/VB. A
funcionalidade bsica do programa ser movimentar-se entre registos, adicionar registos, eliminar registos
e gravar alteraes a registos.

Este primeiro exerccio usar o componente ADO (ADODC).

1. Crie um novo projecto VB6
2. Adicione o componente ADODC fazendo Project | Components e procure por Microsoft ADO
Data Control 6.0 (OLEDB). Seleccione-o e faa OK.
3. Arraste-o para o formulrio e defina as suas propriedades da seguinte forma:

Propriedade Valor
Name BaseDados

4. Agora, na propriedade ConnectionString do controlo ADODC clique no boto para iniciar o
formulrio de configurao da base de dados.

5. Seleccione Use Connection String. Faa Build.

6. No Fornecedor seleccione Microsoft Jet 4.0 OLE DB Provider. Faa seguinte.

7. Depois, especifique a base de dados Northwind.mdb. Aqui deve especificar sempre a base de
dados que est a aceder.

Nota: C:\Programas\Microsoft Office\Office\1033

8. Faa Testar Ligao para verificar que a base de dados est correctamente ligada sua
aplicao. Faa OK e depois novamente OK.

9. Analise a ConnectionString que o VB criou para si:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Programas\Microsoft Office\Office\1033\FPNWIND.MDB;Persist Security Info=False

10. Agora, v at propriedade RecordSource. Aqui deve especificar as tabelas que deseja extrair da
base de dados para trabalhar no Visual Basic. Pode escrever uma sintaxe SQL ou um prprio
objecto do Access (Tabela, consulta, etc).

11. No nosso caso, vamos usar uma simples consulta SQL. Assim, seleccione adCmdText de
Command Type e escreva:

SELECT * FROM CUSTOMERS



Bases de dados com ADO em VB6 Joo A. Ferreira joao.ferreira@progmat.com
2

12. Agora, desenhe a seguinte interface no VB tendo em conta as propriedades definidas abaixo:



NOTA: pode desenhar as Labels alterando apenas a propriedade Caption.

1 Caixa de texto
Propriedade Valor
Name TxtID
Text (vazio)

2 Caixa de texto
Propriedade Valor
Name TxtCompanhia
Text (vazio)

3 Caixa de texto
Propriedade Valor
Name TxtEndereco
Text (vazio)

4 Caixa de texto
Propriedade Valor
Name TxtCidade
Text (vazio)

1 boto de comando
Propriedade Valor
Name cmdUltimo
Caption <<



Bases de dados com ADO em VB6 Joo A. Ferreira joao.ferreira@progmat.com
3

2 boto de comando
Propriedade Valor
Name CmdPrimeiro
Caption <<

3 boto de comando
Propriedade Valor
Name CmdAnterior
Caption <

4 boto de comando
Propriedade Valor
Name CmdSeguinte
Caption >

5 boto de comando
Propriedade Valor
Name CmdUltimo
Caption <<

6 boto de comando
Propriedade Valor
Name CmdAdicionar
Caption Adicionar

7 boto de comando
Propriedade Valor
Name CmdGravar
Caption Gravar

8 boto de comando
Propriedade Valor
Name CmdEliminar
Caption Eliminar

13. Neste momento, possui uma ligao e uma interface, mas necessita que os campos da interface
sejam preenchidos com os dados da base de dados. Para isso, em cada caixa de texto vamos fazer
com que surja um determinado campo da tabela Customers (especificada na propriedade
RecordSource).

14. Edite as propriedades DataSource e DataMember de cada caixa, ou seja, em DataSource
especifique o Controlo ADODC que est no formulrio, neste caso BaseDados. Em DataMember,
o campo da tabela que quer que a caixa de texto mostre.





Bases de dados com ADO em VB6 Joo A. Ferreira joao.ferreira@progmat.com
4
15. Vamos agora programar os controlos de navegao.

16. No evento Click de cmdPrimeiro escreva o seguinte cdigo:

'mover para o primeiro registos
BaseDados.Recordset.MoveFirst

17. No evento Click de cmdAnterior escreva o seguinte:

Private Sub cmdAnterior_Click()

'mover para o registo anterior
BaseDados.Recordset.MovePrevious

'se est no ltimo registo...
If BaseDados.Recordset.BOF = True Then
BaseDados.Recordset.MoveNext
MsgBox "Atingiu o ltimo registo..No h mais registos", vbCritical

End If

End Sub


18. No evento Click de cmdSeguinte:

Private Sub cmdSeguinte_Click()

'navegar par o registo seguinte
BaseDados.Recordset.MoveNext

'se atingiu o ltimo registo..
If BaseDados.Recordset.AbsolutePosition < 0 Then
BaseDados.Recordset.MovePrevious
MsgBox "Atingiu o ltimo registo..no h mais registos", vbCritical
End If

End Sub

19. No evento Click de cmdUltimo:

Private Sub cmdUltimo_Click()

BaseDados.Recordset.MoveLast

End Sub

20. Neste momento, o programa j navega pelos registos da tabela Customers da base de dados
Northwind. Faa F5 e experimente.

Bases de dados com ADO em VB6 Joo A. Ferreira joao.ferreira@progmat.com
5
21. Agora, vamos aprender a adicionar novos registos. No evento Click de cmdAdicionar escreva o
seguinte cdigo:

Private Sub cmdAdicionar_Click()

'adicionar novo registo
BaseDados.Recordset.AddNew

End Sub

22. Com esta instruo colocou o Recordset (conjunto de dados da tabela) em modo de Adio.
Automaticamente os campos ficaram vazios para que o utilizador possa inserir novos valores.
Aps preencher os campos de forma correcta, o utilizador ir fazer clique em Gravar o qual ir
gravar as alteraes efectuadas. Para isso, use o evento Click de cmdGravar:

Private Sub cmdGravar_Click()

'actualizar as alteraes
BaseDados.Recordset.Update

End Sub

NOTA: para alm de gravar o novo registo, a funo UPDATE possibilita gravar qualquer alterao feita
a um registo.

23. Finalmente, vamos aprender como eliminar registos. Para isso, programe o evento Click de
cmdEliminar:

Private Sub cmdEliminar_Click()

'perguntar
If MsgBox("Vai eliminar o actual registo. Tem a certeza?", vbQuestion
+ vbYesNo) = vbYes Then

'eliminar
BaseDados.Recordset.Delete
'mover para o anterior
BaseDados.Recordset.MovePrevious
End If

End Sub

24. Execute o projecto e adicione, altere e elimine registos ao seu gosto.






Bases de dados com ADO em VB6 Joo A. Ferreira joao.ferreira@progmat.com
6
Exerccio 2 Pesquisar por dados numa tabela usando ADODC.

Neste projecto vamos pesquisar dados usando o controlo ADO.

Abra o projecto do exerccio 3.2 e adicione um boto com a propriedade Name definida para
cmdPesquisar. No evento Click deste boto adicione o seguinte cdigo para pesquisar e localizar
cidades de acordo com o critrio especificado pelo utilizador:

Private Sub cmdPesquisar_Click()
Dim str As String

str = InputBox("Que cidade deseja procurar?")

BaseDados.Recordset.Find ("City = '" & str & "'")

If BaseDados.Recordset.EOF Then
BaseDados.Recordset.MoveFirst
MsgBox "No achou nenhuma cidade!"
End If

End Sub

No mtodo Find tem de especificar uma instruo SQL usando o campo que deseja pesquisar. Poder usar
operadores como AND, OR ou mesmo LIKE.



Exerccio 3 Ordenar os dados de uma tabela com ADODC.

1. Voltando ao projecto anterior, crie um novo boto chamado cmdOrdenar e com Caption
definido para Ordenar. No seu evento Click, adicione o seguinte cdigo para ordenar o campo
Cidade alfabeticamente de forma ascendente:

NOTA: para definir outros campos, teria que criar caixas de opo para o utilzador.

Private Sub cmdOrdenar_Click()

BaseDados.Recordset.Sort = "City ASC"
BaseDados.Recordset.MoveFirst

End Sub


2. Agora faa F5 para e clique sobre Ordenar para ver o efeito.

NOTA: Para ordenar de forma descendente use DESC. Tambm pode usar SORT.




Bases de dados com ADO em VB6 Joo A. Ferreira joao.ferreira@progmat.com
7
Exerccio 4 Filtrar dados usando o ADODC

1. Se ainda houver espao, adicione um boto para filtrar os dados da tabela. Queremos apenas
mostrar a cidade especifica pelo utilizador. Para isso, d o nome ao novo boto de cmdFiltrar e a
caption para Filtrar. No evento Click faa:

Private Sub cmdFiltrar_Click()
Dim str As String

str = InputBox("Que cidade deseja listar?")

BaseDados.Recordset.Filter = "City = '" & str & "'"
BaseDados.Recordset.MoveFirst

End Sub


2. Faa F5. Escreva London, por exemplo. Ir verificar que apenas iro estar presentes os clientes de
Londres.

Exerccio 5 Imprimir um relatrio com o Data Report e um RecordSet

1. Abra o projecto que temos vindo a desenvolver e, se ainda houver espao, desenhe um boto de
comando chamado cmdImprimir e com Caption definida para Imprimir.

2. Agora, faa Project | Add Data Report para adicionar um relatrio ao seu projecto

3. Modifique a propriedade Name do relatrio para rptClientes



4. Agora, arraste duas rptTextBox (textbox dos relatrios) para a seco Detail. Defina a propriedade
DataField da primeira caixa de texto para CompanyName e a segunda caixa para City.

5. Arraste duas rptLabel (label dos relatrios) para a seco Page Header. Defina a propriedade
Caption da primeira como Nome e a segunda como Cidade.

6. Neste momento tem criado um pequeno relatrio que ir listar todas as empresas (nome) e as
respectivas cidades. Antes disso, necessita de indicar ao relatrio quais os dados a serem listados.
Para isso, adicione o seguinte cdigo ao evento Click de cmdImprimir:

Private Sub cmdImprimir_Click()


'criar uma nova instncia do relatrio
Dim relatorio As New rptClientes

'definir a fonte de dados como a nossa base de dados
Set relatorio.DataSource = BaseDados.Recordset

Bases de dados com ADO em VB6 Joo A. Ferreira joao.ferreira@progmat.com
8
BaseDados.Refresh 'actualizar

relatorio.Show 'mostrar o relatrio

End Sub

7. Faa F5 e depois clique em Imprimir. Dever surgir o relatrio onde depois poder fazer Zoom,
exportar e mesmo imprimir o prprio relatrio especificando uma dada impressora.

NOTA: Faa Filtrar por London e depois clique em Imprimir. Ir verificar que o relatrio apenas
imprimir as companhias de Londres.


Exerccio 6 Usar a biblioteca ADODC para estabelecer ligao a base de dados

CursorType:
Constante Valor Descrio
adOpenUnspecified -1 No especifica o tipo de cursor
adOpenForwardOnly 0 Predefinido. O cursor s navega para a frente. igual ao Static, mas
s pode mover para a frente (Seguinte / MoveNext ou MoveLast)
Deve ser usado quando queremos apenas listar dados, pois aumenta
a performance da aplicao.
AdOpenKeyset 1 semelhante ao Dynamic, mas no pode ver os registos adicionados
pelo utilizador e os registos eliminados As modificaes esto, no
entanto, visveis.
adOpenDynamic 2 Todas as operaes so suportadas bem como as alteraes
efectuadas por outros utilizadores iro reflectir-se no RecordSet.
AdOpenStatic 3 Esttico, isto , apenas para procurer dados ou gerar relatrios.
Qualquer alterao feita por outros utilizadores no visvel.


Constantes de segurana:
Constante Valor Descrio
adLockUnspecified -1 No especificar o tipo de dado. Automaticamente herdar o tipo de lock
especificado no recordset.
adLockReadOnly 1 Apenas pode ler os registos
adLockPessimistic 2 Pessimista, isto , o fornecedor de dados fecha os registos aps
edio.
adLockOptimistic 3 Optimista, isto , o fornecedor apenas fecha o registo depois de ter
chamado Update.
adLockBatchOptimistic 4 O mesmo que o Optmistic, mas para Batch, sequncia de comandos.

1. Crie um novo projecto no VB

2. Adicione um mdulo em Project | Add Module e defina a sua propriedade Name para
modBaseDados.


3. Agora, faa Project | Add References e escolha Microsoft ActiveX Data Objects 2.x da lista de
livrarias para ter acesso livraria do ADO.
Bases de dados com ADO em VB6 Joo A. Ferreira joao.ferreira@progmat.com
9

4. No mdulo vamos declarar as variveis/objectos fundamentais para o acesso base de dados: a
ligao, o recordset e um comando;:

Public ligacao As New Connection
Public rs As New Recordset

5. Agora, desenhe no formulrio uma ListBox e d-lhe o nome de Lista. A finalidade ser encher a
ListBox com os nomes dos clientes da base de dados Northwind.

6. No evento Load, adicione o seguinte cdigo:

Private Sub Form_Load()

'definir a ligao base de dados
ligacao.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\Programas\Microsoft Office\Office\1033\FPNWIND.MDB;Persist
Security Info=False"

'abrir a ligao
ligacao.Open

'encher o recordset com a tabela CUSTOMERS
rs.Open "SELECT * FROM CUSTOMERS", ligacao, adOpenDynamic,
adLockOptimistic




(continua)

(continuao)

'percorrer todos os dados do recordset
Do While Not rs.EOF

'encher a lista com o campo ContactName
Lista.AddItem rs("CompanyName")

rs.MoveNext 'prximo
Loop

End Sub

7. Execute o projecto e ver que a lista encheu-se com os vrios nomes das companhias.




Bases de dados com ADO em VB6 Joo A. Ferreira joao.ferreira@progmat.com
10
Exerccio 7 Usar DataList e DataCombo para ligao de tabelas relacionadas.

O objectivo deste projecto criar uma relao entre Fornecedores e Produtos da base de dados do
Northwind.

1. Crie um novo projecto

2. Agora, crie um novo mdulo chamado modBaseDados.bas fazendo Project | Add Module.
Adicione o seguinte cdigo:

Public ligacao As New Connection 'a ligao
Public rsFornecedores As New Recordset 'para os fornecedores

3. Agora, adicione uma referncia livraria ADO usando Project | References.

4. Em seguida, vamos adicionar os controlos DataList em Project | Componentes (com interface) que
nos iro dar acesso ao DataList e ao DataCombo.

5. Depois, desenhe uma interface semelhante ao da figura (vide as propriedades abaixo)


1 DataCombo
Propriedade Valor
Name CmbFornecedores
Style 2 - dropdownList

1 DataList

Propriedade Valor
Name lstProdutos
Style 2 - dbcDropDownList


6. Agora, no evento Load vamos encher a DataCombo com as vrias empresas fornecedoras:

Private Sub Form_Load()

Bases de dados com ADO em VB6 Joo A. Ferreira joao.ferreira@progmat.com
11
'definir a ligao base de dados
ligacao.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\Programas\Microsoft Office\Office\1033\FPNWIND.MDB;Persist
Security Info=False"

'abrir a ligao
ligacao.Open

'encher o recordset com os fornecedores (esttico)
rsFornecedores.Open "SELECT * FROM SUPPLIERS", ligacao, adOpenStatic,
adLockOptimistic

cmbFornecedores.DataField = "SupplierID" 'o campo chave
cmbFornecedores.ListField = "CompanyName" 'o campo a mostrar
cmbFornecedores.BoundColumn = "SupplierID" 'o campo chave de relao

'definir a fonte de dados
Set cmbFornecedores.DataSource = rsFornecedores
Set cmbFornecedores.RowSource = rsFornecedores

End Sub


7. Agora, precisamos de programar um sub-procedimento que ir actualizar a lista com os produtos
do fornecedor. Assim, este sub-procedimento tem como argumento o ID (chave) do fornecedor e
preenche a lista com os produtos criando um novo Recordset:








Private Sub ActualizarLista(fornecedor As Integer)

'criar novo recordset
Dim rsProdutos As New Recordset

'encher com os produtos de acordo com o fornecedor
rsProdutos.Open "SELECT * FROM PRODUCTS WHERE SupplierID = " &
fornecedor, ligacao, adOpenStatic, adLockBatchOptimistic


lstProdutos.DataField = "ProductID" 'o campo chave
lstProdutos.ListField = "ProductName" 'o campo a mostrar
lstProdutos.BoundColumn = "ProductID" 'o campo chave

'definir a fonte de dados
Set lstProdutos.DataSource = rsProdutos
Bases de dados com ADO em VB6 Joo A. Ferreira joao.ferreira@progmat.com
12
Set lstProdutos.RowSource = rsProdutos

Set rsProdutos = Nothing 'destruir o objecto

End Sub

8. Agora, no evento click da DataCombo, vamos chamar o procedimento criado anteriormente para
actualizar a lista de acordo com o fornecedor que o utilizador seleccionou:

Private Sub cmbFornecedores_Click(Area As Integer)

'a propriedade BoundText da combo permite saber o item seleccionado
ActualizarLista cmbFornecedores.BoundText

End Sub

9. Corra o projecto e seleccione diferentes fornecedores para saber que produtos eles enviam.


















Exerccio 8 Usar a DataGrid com binding directo de dados.

1. Crie um novo projecto
2. Adicione uma DataGrid escolhendo-a do Project | Components.
3. Desenhe-a no formulrio e defina as suas propriedades para permitir o utilizador de adicionar
novos valores bem como elimin-los.
1 DataGrid
Propriedade Valor
Name Grelha
AllowAddNew True
AllowDelete True

4. Para encher a grelha com uma tabela de uma base de dados temos que crier um recordset e lig-
lo grelha. Qualquer alterao na grelha ir afectar directamente o Recordset que por sua vez
afectar a base de dados.
Bases de dados com ADO em VB6 Joo A. Ferreira joao.ferreira@progmat.com
13

5. Para isso, adicione o seguinte cdigo ao evento Load:

Private Sub Form_Load()
'criar o recordset
Dim rs As New Recordset

'criar a ligao
Dim mLigacao As New Connection

'definir a ligao
mLigacao.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\Programas\Microsoft Office\Office\1033\FPNWIND.MDB;Persist
Security Info=False"

mLigacao.Open 'abrir

rs.CursorLocation = adUseClient 'usar o cursor do lado do cliente

'encher o recordset
rs.Open "SELECT * FROM CUSTOMERS", mLigacao, adOpenDynamic,
adLockOptimistic

'definir os dados da grelha
Set Grelha.DataSource = rs

End Sub


6. Execute o projecto e adicione, altere e elimine registos da tabela.




Exerccio 9 Usar a TreeView com RecordSet

1. Inicie o VB6 e crie mais um projecto...
2. Adicione uma TreeView em Project | Components.
3. Referencia a livraria do ADO no seu projecto.
4. Desenhe a TreeView no formulrio e defina a propriedade Name para Arvore
5. Escreva o seguinte algoritmo para ter encher a TreeView com os fornecedores e, em cada
fornecedor, os respectivos produtos:

Private Sub Form_Load()
'a ligao
Dim ligacao As New Connection

ligacao.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\Programas\Microsoft Office\Office\1033\FPNWIND.MDB;Persist
Security Info=False"
Bases de dados com ADO em VB6 Joo A. Ferreira joao.ferreira@progmat.com
14

ligacao.Open

'criar dois recordset - 1 para os fornecedores, outro para os produtos
Dim rsFornecedores As New Recordset
Dim rsProdutos As New Recordset

'encher com as tabelas
rsFornecedores.Open "SELECT * FROM SUPPLIERS", ligacao, adOpenDynamic,
adLockOptimistic
rsProdutos.Open "SELECT * FROM PRODUCTS", ligacao, adOpenDynamic,
adLockOptimistic


'adicionar o n de raiz
Arvore.Nodes.Add , , "Raiz", "Fornecedores"


Dim sFornecedor As String 'o fornecedor actual
Dim iCodigo As Integer 'o codigo do fornecedor actual actual

'percorrer os forneceodres
Do While Not rsFornecedores.EOF

'adicionar fornecedor (relao RAIZ)
Arvore.Nodes.Add "Raiz", tvwChild, rsFornecedores("CompanyName"),
rsFornecedores("CompanyName")

'percorrer os produtos...
Do While Not rsProdutos.EOF

'obter o nome do fornecedor actual e o ID
sFornecedor = rsFornecedores("CompanyName")
iCodigo = rsFornecedores("SupplierID")

(continua)


'se o ID do produto for igual ao ID do fornecedor
'adicionar produto da empresa
If rsProdutos("SupplierID") = iCodigo Then

Arvore.Nodes.Add sFornecedor, tvwChild, , rsProdutos("ProductName")

End If

rsProdutos.MoveNext 'avanar

Loop
rsFornecedores.MoveNext 'avanar
rsProdutos.MoveFirst 'voltar ao primeiro para o loop ter efeito
Bases de dados com ADO em VB6 Joo A. Ferreira joao.ferreira@progmat.com
15
Loop

End Sub

6. Execute o projecto com F5


Exerccio 10 Usar a FlexGrid no VB6

1. Crie mais um projecto...
2. Agora, adicione o controlo FlexGrid em Project | Components e d-lhe o nome de Grelha

Microsoft Hierarchical Flexgrid Control 6.0


3. Desenhe o controlo no formulrio e estude as suas propriedades.

4. Adicione um ADODC em Project | Components

5. Depois ligue o controlo base de dados Northwind

6. Defina o RecordSource do ADODC como SELECT * FROM CUSTOMERS

7. Defina a propriedade DataSource do FlexGrid como ADODC1.

8. Faa F5

9. Agora adicione um novo boto chamado cmdMudar com a definio para Mudar Clula.






10. Agora vamos modificar o aspecto da clula seleccionada. Para isso use o evento Click de
cmdMudar:

Private Sub cmdMudar_Click()

Me.Grelha.CellFontItalic = True
Me.Grelha.CellBackColor = vbYellow

End Sub