Adoquery kayıt sayısını öğrenmek

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
CinAnka
Üye
Mesajlar: 84
Kayıt: 03 Nis 2006 11:27
Konum: İstanbul

Adoquery kayıt sayısını öğrenmek

Mesaj gönderen CinAnka »

Çok basit ve saçma bir soru olacak ama idare edin, bugün ya bendeki delphi sorunlu ya da ben...

adoquery deki kayıt sayısı şu şekilde öğrenilmez mi arkadaşlar:

for x:=0 to adoquery2.DataSource.DataSet.RecordCount-1 do


Benim 2 tane tablom war. 1. tablodaki bütün kayıtları bir checklistbox a aktarıyorum. checklistbox ımdaki verilerden query sonucundakine eşit olan warsa, form create edildiğinde işaretli olmalılar. aşağıdaki kodu yazdım ama bana şu hatayı veriyor:

"list index out of bounds 1"

Kod: Tümünü seç


procedure TForm1.FormActivate(Sender: TObject);
var
row:integer;
col:integer;
x,y,a:integer;
sline,b,c:string;
begin
adoquery1.CLOSE;
adoquery1.SQL.Clear;
adoquery1.SQL.text:='SELECT * FROM KISILER';
adoquery1.OPEN;

for row := 0 to Datamodule2.DataSource2.DataSet.RecordCount-1 do
  begin
    sline := '';
    for col :=1 to 1 do
      sline := sline + Datamodule2.Adotable2.Fields[col].AsString;
      checklistbox1.Items.Add(sline);
      DataModule2.DataSource2.DataSet.Next;
  end;
adoquery2.CLOSE;
adoquery2.SQL.Clear;
adoquery2.SQL.text:='SELECT A.ADI FROM GRUPLAR A, KISIGRUP B, KISILER C WHERE C.ID=21 AND B.KISILER_ID=C.ID AND A.ID=B.GRUPLAR_ID';
//adoquery2.Parameters.ParamByName('PARAMETRE_DEGERI').VALUE:=a;
adoquery2.OPEN;
Adoquery2.First;

for x:=0 to adoquery2.DataSource.DataSet.RecordCount-1 do
 begin
 edit4.Text:=adoquery2.Fields[0].Value;
 b:=adoquery2.Fields[x].Value;
        FOR y:=0 to checklistbox1.Items.Count-1 do
        begin
                edit5.Text:=checklistbox1.items.Strings[0];
                c:=checklistbox1.items.Strings[y];
                if b=c then
                begin
                checklistbox1.Checked[y]:=true;
                end;
        end;
 Adoquery2.DataSource.DataSet.Next;

 end;



end;
Herkese teşekkür ediyorum burdan...
Kolay gelsin
Güçlü olan haklı değil, haklı olan güçlüdür!
Kullanıcı avatarı
CinAnka
Üye
Mesajlar: 84
Kayıt: 03 Nis 2006 11:27
Konum: İstanbul

Mesaj gönderen CinAnka »

Merhaba;

Gerçi cvp gelmemiş ama sonradan bakan arkadaşlara referans olması için kendim cevap vereyim; olayı çözdüm de;)

List index out of bounds hatası array tipi belirttiğim verilerde, fazladan kayıt göstermeye çalışıldığı için geliyor. benim komutum

Kod: Tümünü seç

for x:=0 to adoquery1.datasource.dataset.recordcount-1 
begin

------

adoquery1.datasource.dataset.next;
aynı satırda bulunan bir sonraki sütuna işaret ediyormuş, oysaki benim amacım bir sonraki satıra inmekti...

kodu şu şekilde düzeltince oldu:

Kod: Tümünü seç


procedure TForm1.FormActivate(Sender: TObject);
var
row:integer;
col:integer;
x,y,a:integer;
sline,b,c:string;
begin
adoquery1.CLOSE;
adoquery1.SQL.Clear;
adoquery1.SQL.text:='SELECT * FROM KISILER';
adoquery1.OPEN;

for row := 0 to Datamodule2.DataSource2.DataSet.RecordCount-1 do
  begin
    sline := '';
    for col :=1 to 1 do
      sline := sline + Datamodule2.Adotable2.Fields[col].AsString;
      checklistbox1.Items.Add(sline);
      DataModule2.DataSource2.DataSet.Next;
  end;
adoquery2.CLOSE;
adoquery2.SQL.Clear;
adoquery2.SQL.text:='SELECT A.ADI FROM GRUPLAR A, KISIGRUP B, KISILER C WHERE C.ID=21 AND B.KISILER_ID=C.ID AND A.ID=B.GRUPLAR_ID';
//adoquery2.Parameters.ParamByName('PARAMETRE_DEGERI').VALUE:=a;
adoquery2.OPEN;
Adoquery2.First;

 while not adoquery2.Eof do
 begin
 edit4.Text:=adoquery2.Fields[0].Value;
 b:=adoquery2.Fields[x].Value;
        FOR y:=0 to checklistbox1.Items.Count-1 do
        begin
                edit5.Text:=checklistbox1.items.Strings[0];
                c:=checklistbox1.items.Strings[y];
                if b=c then
                begin
                checklistbox1.Checked[y]:=true;
                end;
        end;
 Adoquery2.Next;

 end;



end;

Güçlü olan haklı değil, haklı olan güçlüdür!
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Next kullandığınız halde neden for döngüsü kullandığınızı anlayamadım, while döngüsü işinizi görecektir

Kod: Tümünü seç

while not(DataModule2.DataSource2.DataSet.Eof) do
şeklinde

Birde recordcount a pek itibar etmemenizde fayda var, başınızı ağrıtabilir..
Kullanıcı avatarı
CinAnka
Üye
Mesajlar: 84
Kayıt: 03 Nis 2006 11:27
Konum: İstanbul

Mesaj gönderen CinAnka »

recordcount yerine ne kullanmamı tavsiye edersiniz??

next while döngüsüne ait, for ise while içerisinde başka bir dögü. ikisi farklı şeyler yapıyor;)
Güçlü olan haklı değil, haklı olan güçlüdür!
Kullanıcı avatarı
naile
Admin
Mesajlar: 1873
Kayıt: 11 Haz 2003 10:11

Mesaj gönderen naile »

Eğer illa recordcount kullanmanız gerekiyorsa sorgu ile cont(*) almanız en sağlıklı yol. Kodunuz biraz karışık ama gördüğüm kadarı ile Datamodule2.DataSource2.DataSet için hem for döngüsü kurmuşsunuz hemde bu dataseti next yapmışsınız. Kastım o idi yoksa diğer while döngünüz değil :)
Cevapla