databasedeki verileri Combobox da listeleme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

databasedeki verileri Combobox da listeleme

Mesaj gönderen brs »

Merhaba;

Form içinde arama yaparken Mrmarman hocamın databasedeki bir alanı combobox da listeleme kodunu buldum;

Bu kodu kısmen kendime göre uyarladım, fakat (AramaYap(TComboBox(Sender).Text, Ad);) bu alanda run aşamasında hata alıyorum "hata kodu yok"

Not: Mrmarman hocam ADOQuery1 kullanmış ben FDQuery1 olarak değiştirdim...

Kod: Tümünü seç

procedure TForm1.ComboBox2KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
var
  Ad: String;
begin
  with KayitlarListele do
  begin
    Close;
    SQL.Clear;
    SQL.Add('Select * From KAYITLAR');
    SQL.Add('Where PROGRAMADI Like ' + QuotedStr('%' + ComboBox2.Text + '%'));
    Prepared := True;
    Open;
    if Not IsEmpty then // Kayıt Varsa
    begin
      Ad := FieldByName('PROGRAMADI').AsString;
      with KayitlarListele do
      begin
        if Key <> vk_Return then
        begin
          AramaYap(TComboBox(Sender).Text, Ad);
          TComboBox(Sender).Items.Clear;
          TComboBox(Sender).AutoComplete := False;
          TComboBox(Sender).DroppedDown := True;
          while Not KayitlarListele.Eof do
          begin
            TComboBox(Sender).Items.Add(FieldByName('PROGRAMADI').AsString);
            Next;
          end;
          TComboBox(Sender).SelStart := length(TComboBox(Sender).Text);
          TComboBox(Sender).SetFocus;
        end
        else
        begin
          TComboBox(Sender).DroppedDown := False;
        end;
      end;
    end;
  end;
end;

Kod: Tümünü seç

procedure AramaYap(strAra: String; AdoQuery: TADOQuery);
begin
  With AdoQuery do
  begin
    Active := False;
    SQL.Clear;
    SQL.Add('SELECT PROGRAMADI From KAYITLAR');
    SQL.Add('WHERE 1=1');
    SQL.Add('AND ROGRAMADI like ' + QuotedStr(strAra + '%') + ' ORDER BY ROGRAMADI');
    Active := True;
  end;
end;
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
xxxjedixxx
Üye
Mesajlar: 216
Kayıt: 10 Ara 2013 03:50

Re: databasedeki verileri Combobox da listeleme

Mesaj gönderen xxxjedixxx »

Son SQL.Add satırında P harfini unutmuşsun.
"ROGRAMADI" -> "PROGRAMADI"
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: databasedeki verileri Combobox da listeleme

Mesaj gönderen brs »

xxxjedixxx yazdı:Son SQL.Add satırında P harfini unutmuşsun.
"ROGRAMADI" -> "PROGRAMADI"

Teşekkür ederim dikkatimden kaçmış ama sorun orası değil...
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: databasedeki verileri Combobox da listeleme

Mesaj gönderen Lord_Ares »

Hatanızı göremediğim için birşey diyemedim.Mrmarman hocamın kodunu inceleyeceğim, eminim oda çok güzel bir örnek vermiştir. Ben senin istediğini yapan şöyle bir procedure yazdım ve bunu heryer de kullanıyorum. Bu prosedure sayesinde tek bir table ve comboboxa bağlı kalmıyor. Şu tabledaki şu alanı , şu comboxa diyerek istediğini yapabiliyorsun. Belki faydası olur diyerek paylaşıyorum. Ekte aşağıdaki kodun yapılmış bir örneğini gönderiyorum. İnceleyin belki yardımı dokunur.

Kod: Tümünü seç


procedure COMBO_DOLDUR(DATA, ALAN, SECILEN_KAYIT:STRING; ISLEM_GOREN_COMBO:TObject);
VAR
X:INTEGER;
Sorgu:TQuery;
begin
  Sorgu:=TQuery.Create(Self);
Sorgu.DatabaseName:=Form1.EXEKLASOR+'DATA';
          WITH SORGU DO BEGIN
        SQL.Clear;
        SQL.Add('Select '+ALAN+' FROM '+DATA);
        SQL.Add('ORDER BY '+ALAN);
        OPEN;
        FieldDefs.Update;
                            END;
(ISLEM_GOREN_COMBO AS TComboBox).Items.Clear;
FOR X:=0 TO Sorgu.RecordCount-1 DO BEGIN
(ISLEM_GOREN_COMBO AS TComboBox).Items.Add(Sorgu.FieldByName(ALAN).AsString);
IF SECILEN_KAYIT=Sorgu.FieldByName(ALAN).AsString THEN (ISLEM_GOREN_COMBO AS TComboBox).ItemIndex:=X;
Sorgu.Next;
                                   END;
Sorgu.Close;
Sorgu.Free;
end;


Kullanımı basit şöyle. Formun create kısmına aşağıdakini ekliyorum böylece formum ekrana geldiğinde comboboxın içide dolmuş oluyor.

Kod: Tümünü seç

COMBO_DOLDUR('ornek','Ozelkod1','',Form1.ComboBox1);


Comboboxta arama yapmak içinde şöyle birşey kulllanıyorum. Aşağıdaki kod combox içinde yazmaya başladığında yazdığınla eşleşen kayıtları comboboxta gösterir.

Comboboxta Arama

Kod: Tümünü seç

procedure TForm1.COMBO_ARA(DATA, ALAN, ARANAN:STRING; BULUNACAK_ALANLAR :ARRAY OF STRING ; DOLDURULACAK_NESNELER :ARRAY OF TObject);
VAR
X:INTEGER;
Sorgu:TQuery;
SEL:STRING;
begin
IF LENGTH(BULUNACAK_ALANLAR)>0 THEN BEGIN
   Sorgu:=TQuery.Create(Self);
   Sorgu.DatabaseName:=EXEKLASOR+'DATA';
      WITH SORGU DO BEGIN //WHİTH
      SQL.Clear;
      SEL:='Select ';
         FOR X:=0 TO LENGTH(BULUNACAK_ALANLAR)-1 DO BEGIN
           SEL:=SEL + BULUNACAK_ALANLAR[X];
           IF X< LENGTH(BULUNACAK_ALANLAR)-1 THEN SEL :=SEL + ','; END;
           SQL.Add(SEL+' FROM '+DATA);
           SQL.Add('Where '+ALAN+' = '+QuotedStr(ARANAN));
           OPEN;
           FieldDefs.Update;
     END;//WHİTE ENDİ
     IF ARANAN = Table1Ozelkod1.AsString THEN BEGIN   /////BURADA EĞER DATADA ARANAN VARSA DOLDUR DİYORUM YOKSA KALDI YERDEN DEVAM
        FOR X:=0 TO LENGTH(BULUNACAK_ALANLAR)-1 DO BEGIN //İKİNCİ FOR
          IF DOLDURULACAK_NESNELER[X].ClassName='TComboBox' then begin ///IKINCI IF
            IF Sorgu.FieldByName(BULUNACAK_ALANLAR[x]).DataType=ftString then  (DOLDURULACAK_NESNELER[X] as TComboBox).Text:=Sorgu.FieldByName(BULUNACAK_ALANLAR[x]).AsString;
            IF Sorgu.FieldByName(BULUNACAK_ALANLAR[x]).DataType=ftInteger then (DOLDURULACAK_NESNELER[X] as TComboBox).ItemIndex:=Sorgu.FieldByName(BULUNACAK_ALANLAR[x]).AsInteger;
          end;
       END;
     END;
Sorgu.Close;
Sorgu.Free;
END;
end;

Kullanımı ise basit comboboxın onchance kısmına bunu yazarsan

Kod: Tümünü seç

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
COMBO_ARA('ornek','Ozelkod1',ComboBox1.Text,['Ozelkod1'],[ComboBox1]);
end;


Bu arada unutmadan şu fonksiyonuda vereyim exeklasör fonksiyonunu kullanırsan programı istediğin yere kopyalayabilirsin. Yeniden database namelere dataların yolunu vermene gerek kalmaz. kullanımı isteğe bağlıdır, kodlarda exeklasör gördüğün yerlere datanın bulunduğu adresi yazmalısın.

Kod: Tümünü seç

function EXEKLASOR: string;
begin
  Result := ExtractFilePath(Application.ExeName);
  if Result[Length(Result)] <> '\' then
   Result := Result + '\';
end;

Umarım faydası olur kolay gelsin.
Dosya ekleri
combobox ta ara.rar
(15.9 KiB) 141 kere indirildi
En son Lord_Ares tarafından 13 Haz 2015 12:06 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
brs
Üye
Mesajlar: 626
Kayıt: 04 Eki 2012 03:52

Re: databasedeki verileri Combobox da listeleme

Mesaj gönderen brs »

Teşekkür ederim...
İşi bilen yardım eder, az bilen akıl verir, bilmeyen eleştirir, yapamayan ise çamur atar...
Lord_Ares
Üye
Mesajlar: 1070
Kayıt: 15 Eki 2006 04:33
Konum: Çorlu

Re: databasedeki verileri Combobox da listeleme

Mesaj gönderen Lord_Ares »

Ben teşekkür ederim unutmadan üstteki gönderime birşey daha ekledim. Exe klasör diye ufak bir kod parçası. üstünde açıklaması var.
ozcank
Üye
Mesajlar: 925
Kayıt: 28 Nis 2005 05:29

Re: databasedeki verileri Combobox da listeleme

Mesaj gönderen ozcank »

Arkadaşlar Merhaba; Bende bu şekilde bir Kod arıyordum ve burda buldum ama sanırım biryerde hata yapıyorum ki ComboBox da her listeleme yaptığım da mükerer kayıtlar oluşuyor bana yardımcı olabilir misiniz?


Yapmak istediğim ;
ComboBox da ADOQuery deki bilgileri listeleyerek içerisinde geçen veriyi aratıp raporlamada kullanmak istiyorum.

Kod: Tümünü seç

Var
Depo:String;
begin
Depo:=ComboBox7.Text;
with StokDepoList do
begin
StokDepoList.Close;
StokDepoList.SQL.Clear;
StokDepoList.SQL.Text:='SELECT DISTINCT DEPO_KODU,DEPO_ISMI FROM TBLSTOKDP WHERE 1=1';
StokDepoList.Active:=True;
StokDepoList.First;
while not eof do
begin
ComboBox7.Items.Add(FieldByName('DEPO_ISMI').AsString);
StokDepoList.Next;
ComboBox7.Items.Add(Depo);
end;
End;
Cevapla