Fórum Problema com banco de dados #372289

15/07/2009

0

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:

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

Mvjunior

Responder

Posts

15/07/2009

Facc

Vc tá usando o ComboBox? Pq não usa o DBLookUpComboBox (Acho que é esse o nome)

Opte pelo Firebird, é mais confiavel que o Access.


Responder

Gostei + 0

15/07/2009

.lg.

Não sei se o que eu entendi, é o que você quer.
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.


Responder

Gostei + 0

15/07/2009

Discorpio

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:

   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.


Responder

Gostei + 0

15/07/2009

Mvjunior

Ae galera, obrigadasssso!!!
Deu certo... Valeu pela ajuda e foi mal a falta de clareza!

abraço


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar