Problema com banco de dados
Estou criando uma aplicação que usa db em Access, para controlar cifras. Criei duas tabelas:
[b:df282f5b4f]TABELA 1[/b:df282f5b4f]
IDCantor
Música
CifraMusica
[b:df282f5b4f]TABELA 2[/b:df282f5b4f]
Id
NomeCantor
A tabela 2 serve para listar os cantores existentes, e a tabela 1 está ligada através do IDCantor para listar as músicas disponíveis para aquele cantor. Não tenho certeza se esse foi o melhor jeito para o que eu quero ( Aceito outras sugestões ). Agora, dentro do delphi, estou com o seguinte problema:
Selecionado um item de um combobox1 ( que é designado como o nome do cantor ), eu percorro o db para armazenar o valor da id daquele cantor, e dada aquela id do cantor, eu queria encontrar na outra tabela, as músicas disponíveis para ele. Eu não consigo fazer essa transição, o estou com o seguinte código:
Alguém ajuda ae?!
[b:df282f5b4f]TABELA 1[/b:df282f5b4f]
IDCantor
Música
CifraMusica
[b:df282f5b4f]TABELA 2[/b:df282f5b4f]
Id
NomeCantor
A tabela 2 serve para listar os cantores existentes, e a tabela 1 está ligada através do IDCantor para listar as músicas disponíveis para aquele cantor. Não tenho certeza se esse foi o melhor jeito para o que eu quero ( Aceito outras sugestões ). Agora, dentro do delphi, estou com o seguinte problema:
Selecionado um item de um combobox1 ( que é designado como o nome do cantor ), eu percorro o db para armazenar o valor da id daquele cantor, e dada aquela id do cantor, eu queria encontrar na outra tabela, as músicas disponíveis para ele. Eu não consigo fazer essa transição, o estou com o seguinte código:
procedure TfrmPrincipal.cmbBoxInterpreteSelect(Sender: TObject); var artista:string; id:Integer; begin DMPrincipal.adoTBCantor.Open; artista:= cmbBoxInterprete.SelText; while not DMPrincipal.adoTBCantor.Eof do begin if ( DMPrincipal.adoTBCantor.FieldByName(´NomeCantor´).Value = artista ) then begin id:= DMPrincipal.adoTBCantor.FieldByName(´Id´).Value; break; end; DMPrincipal.adoTBCantor.Next; end; DMPrincipal.adoTBCantor.Close; DMPrincipal.adoTBMusica.Open; While not DMPrincipal.adoTBMusica.eof do begin if ( DMPrincipal.adoTBMusica.FieldbyName(´Música´).value <> ´´ ) then begin cmbBoxMusica.Text:= ´Vazio´; break; end else begin cmbBoxMusica.Items.Add(DMPrincipal.adoTBMusica.FieldbyName(´Música´).value); end; DMPrincipal.adoTBMusica.Next; end; end;
Alguém ajuda ae?!
Mvjunior
Curtidas 0
Respostas
Facc
15/07/2009
Vc tá usando o ComboBox? Pq não usa o DBLookUpComboBox (Acho que é esse o nome)
Opte pelo Firebird, é mais confiavel que o Access.
Opte pelo Firebird, é mais confiavel que o Access.
GOSTEI 0
.lg.
15/07/2009
Não sei se o que eu entendi, é o que você quer.
Pego 2 ADOQuery (minha preferencia):
No cantor:
Na música:
Nos [b:fcac412862]Fields[/b:fcac412862] do adqMusica adiciono um novo field do tipo [color=brown:fcac412862]Lookup[/color:fcac412862], onde:
Usaria um DBGrid ligado no adqMusica, puxando apenas os campos [color=blue:fcac412862]Lookup[/color:fcac412862], [color=blue:fcac412862]Música[/color:fcac412862] e [color=blue:fcac412862]CifraMusica[/color:fcac412862].
O campo lookup vai aparecer o nome do cantor em vez do codigo. quando for um registro novo... o campo de lookup irá fazer com que apareça um combobox dentro do dbgrid.
Não sei se isso é realmente o que você queria, pois não entendi muito bem, mas se for tai uma solução. Existe outras de acordo com o que eu entendi. Se puder explicar um pouco mais sobre o que vc quer... eu agradeceria e me ajudaria a te ajudar. :roll:
.LG.
Pego 2 ADOQuery (minha preferencia):
adqCantor: TADOQuery; adqMusica: TADOQuery;
No cantor:
SELECT * FROM TABELA2
Na música:
SELECT * FROM TABELA1
Nos [b:fcac412862]Fields[/b:fcac412862] do adqMusica adiciono um novo field do tipo [color=brown:fcac412862]Lookup[/color:fcac412862], onde:
Name = "LKCANTOR" Type = String Size deixe em branco, vai auto-completar quando confirmar KeyField = IDCantor DataSet = adqCantor LookUp Key = Id Result Fields = NomeCantor
Usaria um DBGrid ligado no adqMusica, puxando apenas os campos [color=blue:fcac412862]Lookup[/color:fcac412862], [color=blue:fcac412862]Música[/color:fcac412862] e [color=blue:fcac412862]CifraMusica[/color:fcac412862].
O campo lookup vai aparecer o nome do cantor em vez do codigo. quando for um registro novo... o campo de lookup irá fazer com que apareça um combobox dentro do dbgrid.
Não sei se isso é realmente o que você queria, pois não entendi muito bem, mas se for tai uma solução. Existe outras de acordo com o que eu entendi. Se puder explicar um pouco mais sobre o que vc quer... eu agradeceria e me ajudaria a te ajudar. :roll:
.LG.
GOSTEI 0
Discorpio
15/07/2009
Bom dia MVJunior.
Quanto as tabelas, voce fez certinho.
Para fazer o que voce pretende, o ideal é voce usar instrução SQL que é bem mais rápida do que voce ficar fazendo varredura em duas Tabelas (Cantor e música). Muita embora voce tenha que escrever código, por incrível que pareça, voce deverá também utilizar combobox que não seja ligado a dados, e o código que voce vai escrever são dois código bem simples, assim:
Primeiro coloque dois componentes TComboBox da palheta Standard no Form, e no primeiro onde voce vai preencher com a lista de cantores lá no evento OnShow do form assim:
Agora voce vai utilizar um outro código para preencher a lista das músicas referente ao cantor, e voce vai fazer isto no Evento OnCloseUp da combo cantor, assim:
Valendo lembrar que para utilização de SQL, voce tem que utilizar os componentes TADOQuery.
Quanto as tabelas, voce fez certinho.
Para fazer o que voce pretende, o ideal é voce usar instrução SQL que é bem mais rápida do que voce ficar fazendo varredura em duas Tabelas (Cantor e música). Muita embora voce tenha que escrever código, por incrível que pareça, voce deverá também utilizar combobox que não seja ligado a dados, e o código que voce vai escrever são dois código bem simples, assim:
Primeiro coloque dois componentes TComboBox da palheta Standard no Form, e no primeiro onde voce vai preencher com a lista de cantores lá no evento OnShow do form assim:
procedure TForm1.FormShow(Sender: TObject); begin cmbCantor.Items.Clear; with DMPrincipal.adoTBCantor do begin Open while not Eof do begin cmbCantor.Items.Add(FieldByName(´NomeCantor´).Value); Next; end; Close; end; end;
Agora voce vai utilizar um outro código para preencher a lista das músicas referente ao cantor, e voce vai fazer isto no Evento OnCloseUp da combo cantor, assim:
procedure TForm1.cmbCantorCloseUp(Sender: TObject); var idArtista: Integer; begin cmbMusica.Items.Clear; with DMPrincipal.adoTBCantor do begin Close; SQL.Clear; SQL.Add(´Select * From Cantor Where NomeCantor = :Cantor´); Parameters.ParamByName(´Cantor´).Value := cmbCantor.Text; Open; if not Eof then idArtista := FieldByName(´id´).asInteger; end; with DMPrincipal.adoTBMusica do begin Close; SQL.Clear; SQL.Add(´Select * From TBMusica Where IDCantor = :IDC´); Parameters.ParamByName(´IDC´).Value := idArtista; Open while not Eof do begin cmbMusica.Items.Add(FieldByName(´Musica´).asString); Next; end; end; end;
Valendo lembrar que para utilização de SQL, voce tem que utilizar os componentes TADOQuery.
GOSTEI 0
Mvjunior
15/07/2009
Ae galera, obrigadasssso!!!
Deu certo... Valeu pela ajuda e foi mal a falta de clareza!
abraço
Deu certo... Valeu pela ajuda e foi mal a falta de clareza!
abraço
GOSTEI 0