• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

zephirus

Ler e escrever em access com relações

11 mensagens neste tópico

Olá,

Depois de dominar mais ou menos a leitura e escrita em bases de dados access, deparo-me com um novo problema. Criei uma nova base de dados com tabelas relacionadas e não sei como ler os valores neste caso.

A base de dados é a seguinte:

DesignView:

familydesign.jpg    xxdesign.jpg

Dados:

familyx.jpg    96804252.jpg

Relacões:

relationships.jpg

O que eu pretendo no meu programa é o seguinte:

PASSO 1 - Inicialmente leio todos os items da tabela Family e coloco-os numa combobox.

PASSO 2 - Depois, dependendo do item seleccionado nessa combobox, adiciono os items da tabela XX numa segunda combobox, mas apenas os que têm FamilyID igual ao item da primeira combobox (neste exemplo só tenho um item de Family portanto quero ter 2 items na segunda combobox).

Em relação ao código:

PASSO 1:

comboBox1.Items.Clear
Call FillfamilyListView()
   For i As Integer = 0 To familyListView.Items.Count - 1
      comboBox1.Items.Add(familyListView.Items.Item(i).SubItems.Item(1).Text)
   Next
If comboBox1.Items.Count > 0 Then comboBox1.SelectedIndex = 0

PASSO2:

comboBox2.Items.Clear
Call FillXXListView()
   For i As Integer = 0 To XXListView.Items.Count - 1
      comboBox2.Items.Add(XXListView.Items.Item(i).SubItems.Item(1).Text)
   Next
If comboBox2.Items.Count > 0 Then comboBox2.SelectedIndex = 0

Resto do código:

Private Sub FillfamilyListView()
With familyListView
   .Clear()

   .View = View.Details
   .FullRowSelect = True
   .GridLines = True
   .Columns.Add("FamilyID", 80)
   .Columns.Add("FamilyName", 80)

   FillListView(familyListView, GetData(sSqlFamily))

End With
End Sub	
    
Private Sub FillXXListView()
With XXListView
   .Clear()

   .View = View.Details
   .FullRowSelect = True
   .GridLines = True
   .Columns.Add("XXID", 80)
   .Columns.Add("XXLabel", 80)
   .Columns.Add("FamilyID", 80)
   .Columns.Add("Location", 80)

   FillListView(XXListView, GetData(sSqlXX))

End With
End Sub

Public Function GetData(ByVal sSQL As String)
   Dim cnData As OleDbConnection
   Dim sqlCmd As OleDbCommand = New OleDbCommand(sSQL)
   Dim myData As OleDbDataReader

   cnData = New OleDbConnection(cnString)

   Try
      cnData.Open()
      sqlCmd.Connection = cnData
      myData = sqlCmd.ExecuteReader
      Return myData
   Catch ex As Exception
      Return ex
   End Try
End Function

Public Sub FillListView(ByRef lvList As ListView, ByRef myData As OleDbDataReader)
   Dim itmListItem As ListViewItem
   Dim strValue As String
   Do While myData.Read
   Application.DoEvents()
   System.Windows.Forms.Application.Doevents()
   itmListItem = New ListViewItem()
   strValue = IIf(myData.IsDBNull(0), "", myData.GetValue(0))
   itmListItem.Text = strValue
   For shtCntr As Integer = 1 To myData.FieldCount() - 1
      If myData.IsDBNull(shtCntr) Then
         itmListItem.SubItems.Add("")
      Else
         itmListItem.SubItems.Add(myData.GetString(shtCntr))
      End If
   Next shtCntr
            
   lvList.Items.Add(itmListItem)

   Loop
        
End Sub

O que é que estou a fazer mal? Tenho de criar queries na base de dados?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Entretanto, apesar de persistirem muitas dúvidas, penso que estou a chegar a algum lado.

Pelo que percebi tenho duas hipóteses:

1 - Criar uma connection string com INNER JOIN para ir buscar os dados dependendo do valor da combobox1;

2 - Criar uma query na própria base de dados e chamar essa query no meu programa.

Estou a pensar bem?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a primeira..nao estou a ver mto bem.. se me disseres um inner join na instruçã de SQL... ok tudo bem......

De qualquer modo, mesmo que cries uma consulta na tua aplicação...vais sempre usar o inner join para ires buscar os dados que queres.

Bom trabalho

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a primeira..nao estou a ver mto bem.. se me disseres um inner join na instruçã de SQL... ok tudo bem......

De qualquer modo, mesmo que cries uma consulta na tua aplicação...vais sempre usar o inner join para ires buscar os dados que queres.

Bom trabalho

Não percebo então se é necessário (ou melhor) criar uma consulta na BD. Eu uso o inner join e basicamente obtenho a mesma tabela que crio na consulta da bd.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

nao e basicamente... tens que obter!!!

A grande questão é que é mais simples fazeres a consulta à parte, até porque pode ser uma consulta extremamente complexa, com campos calculados, ou concatenados..ou o que quer que seja.

De qualquer modo, quer de um modo, ou de outro, o motor da base de dados.. vais ter que a processar no momento, a não ser que user materialized views (isto no oracle, não sei se outros SGDB'S funcionam do mesmo modo).

Em suma... é um bocado indiferente.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

nao e basicamente... tens que obter!!!

A grande questão é que é mais simples fazeres a consulta à parte, até porque pode ser uma consulta extremamente complexa, com campos calculados, ou concatenados..ou o que quer que seja.

De qualquer modo, quer de um modo, ou de outro, o motor da base de dados.. vais ter que a processar no momento, a não ser que user materialized views (isto no oracle, não sei se outros SGDB'S funcionam do mesmo modo).

Em suma... é um bocado indiferente.

Ok. Só uma coisa. Se eu em vez de ter duas tabelas como no exemplo que dei, tiver N, posso criar uma connection string da junção de todas elas ou crio uma ligação para cada relação entre tabelas?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a conexao string... refere-se à base de dados... nao as tabelas individualmente...

Crias só uma ligação nas tabelas.

Exemplo pratico...e simples.....

TABELA_FILME

*FILME_ID -PK

FILME_NOME

FILME_DURACAO

FILME_GENERO

CATEGORIA_ID -FK

TABELA_CATEGORIA

*CATEGORIA_ID - PK

CATEGORIA_DESIGNACAO

A instrução de SQL para ires buscar os filmes com a designação das categorias seria qualquer coisa como

"select fil.filme_id, fil.filme_nome, cat.categoria_designacao.... from tabela_filme fil inner join tabela_categoria cat on fil.categoria_id = cat.categoria_id where bla bla

entendeste?

PS - tinha aqui um erro..ja corrigi

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a conexao string... refere-se à base de dados... nao as tabelas individualmente...

Crias só uma ligação nas tabelas.

Exemplo pratico...e simples.....

TABELA_FILME

*FILME_ID -PK

FILME_NOME

FILME_DURACAO

FILME_GENERO

CATEGORIA_ID -FK

TABELA_CATEGORIA

*CATEGORIA_ID - PK

CATEGORIA_DESIGNACAO

A instrução de SQL para ires buscar os filmes com a designação das categorias seria qualquer coisa como

"select fil.filme_id, fil.filme_nome, cat.categoria_designacao.... from tabela_filme fil inner join tabela_categoria cat on fil.cat_id = cat.cat_id where bla bla

entendeste?

Penso que sim. Esse where permite-me escolher os dados onde existe um determinado valor que eu quero, estou correcto?

Neste site, http://www.connectionstrings.com/, não encontro nenhum exemplo usando isso. É só acrescentar algo do género: WHERE FILME_NOME = textbox1.text? (por exemplo)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ta ai uma grande confusão....

Connection string é a "string" que te permite ligares à base de dados.....

Aquilo que tu queres escrever são instruções de SQL que te retornam leituras à base de dados..pegando no exemplo...

"select fil.filme_id, fil.filme_nome, cat.categoria_designacao.... from tabela_filme fil inner join tabela_categoria cat on fil.cat_id = cat.cat_id where filme_nome like '%as%longas%tran%careca%'"

a utilização do like implica que nao tenhas que escrever o texto todo (neste cas evitei caracteres acentuados, e substitui esses caracteres pelo wildcard % - que significa que nesse intervalo pode estar qualquer combinação de caracteres - é claro que depois a colocação destes wildcards deve ser tratada numa função à parte, que transforme os espaços vazios em wildcards)... se por exemplo te referisses ao id especifico de um filme.. a instrução ficava tipo

"select fil.filme_id, fil.filme_nome, cat.categoria_designacao.... from tabela_filme fil inner join tabela_categoria cat on fil.cat_id = cat.cat_id where filme_id = 1"

ou então se quisesses todos os filmes da categoria 2

"select fil.filme_id, fil.filme_nome, cat.categoria_designacao.... from tabela_filme fil inner join tabela_categoria cat on fil.cat_id = cat.cat_id where fil.cat_id= 2"

Espero que fiques mais esclarecido

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ta ai uma grande confusão....

Connection string é a "string" que te permite ligares à base de dados.....

Aquilo que tu queres escrever são instruções de SQL que te retornam leituras à base de dados..pegando no exemplo...

"select fil.filme_id, fil.filme_nome, cat.categoria_designacao.... from tabela_filme fil inner join tabela_categoria cat on fil.cat_id = cat.cat_id where filme_nome like '%as%longas%tran%careca%'"

a utilização do like implica que nao tenhas que escrever o texto todo (neste cas evitei caracteres acentuados, e substitui esses caracteres pelo wildcard % - que significa que nesse intervalo pode estar qualquer combinação de caracteres - é claro que depois a colocação destes wildcards deve ser tratada numa função à parte, que transforme os espaços vazios em wildcards)... se por exemplo te referisses ao id especifico de um filme.. a instrução ficava tipo

"select fil.filme_id, fil.filme_nome, cat.categoria_designacao.... from tabela_filme fil inner join tabela_categoria cat on fil.cat_id = cat.cat_id where filme_id = 1"

ou então se quisesses todos os filmes da categoria 2

"select fil.filme_id, fil.filme_nome, cat.categoria_designacao.... from tabela_filme fil inner join tabela_categoria cat on fil.cat_id = cat.cat_id where fil.cat_id= 2"

Espero que fiques mais esclarecido

Fiquei! Muito obrigado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

boa! nao te esqueças de marcar o topico como solved

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora