Delphi SQL de İç içe For Döngüsü Hakkında

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
zeynel63
Üye
Mesajlar: 14
Kayıt: 15 Oca 2014 03:41

Delphi SQL de İç içe For Döngüsü Hakkında

Mesaj gönderen zeynel63 »

Merhaba arkadaşlar. Üzerinde çalıştığım veritabanlı programda iç içe for döngüsü kullanmak istiyorum ama beceremedim. Yardımlarınıza ihtiyaç duydum. Yardımcı olursanız çok sevinirim.
4 ADET TABLOM VAR. HER TABLODA KAYITLAR VAR. BEN BU 3 TABLODAKİ KAYITLARDA "ORAN" ALANLARINI ÇARPMAK VE TABLO 4 E Kaydetmek istiyorum.
ÖRNEK VERECEK OLURSAM:
TABLO1: 1 VE 2 SAYILARI VAR
TABLO2: 3 VE 4 SAYILARI VAR
TABLO3: 5 VE 6 ALTI SAYILARI VAR.

TABLO4 E ŞU ŞEKİLDE KAYITLAR OLACAK
1*3*5=15
1*3*6=18
1*4*5=20
1*4*6=24
2*3*5=30
2*3*6=36
2*4*5=40
2*4*6=48
Dikkat ederseniz tüm olasılıkları çarptı. ASLINDA BU OLASILIKLARI BULUP KAYDETME İŞLEMİ.Kayıt işleminde sıkıntı yok ama iç içe döngüyü yazamıyorum.

var
M1:Integer;
begin
ADO_DURUM1.Close;
ADO_DURUM1.SQL.Clear;
ADO_DURUM1.sql.Add('SELECT * FROM TBL_DURUM_1');
ADO_DURUM1.open;
////////////// DÖGÜYE BAŞLA
for M1:=0 to ADO_DURUM.recordcount-1 do begin
BTN_KAYIT_EKLE.Click; // DB EDİTTEKİ VERİLERİ ÇARPIP TABLO 4 E KAYDEDİYOR.
ADO_MAC1.next;
end;
end;

TÜM OLASILIKLARI ÇARPMAK VE VERİTABANINA KAYIT İÇİN BU KODLARIN DEVAMINDA NASIL BİR DÖNGÜ OLACAK?
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7588
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Re: Delphi SQL de İç içe For Döngüsü Hakkında

Mesaj gönderen mussimsek »

Merhaba,

Bu tarz işlemleri Stored Procedure ile veritabanı tarafında daha kolay ve hızlı yapabilirsiniz.

Bir tablonun tüm kayıtlarını dolaşmak için :

Kod: Tümünü seç

...
AdoDurum1.First;
while not AdoDurum1.Eof do
begin
  //yapacağınız işlemleri yapın

  AdoDurum1.Next;
end
şeklinde yapabilirsiniz.

Kolay gelsin.
zeynel63
Üye
Mesajlar: 14
Kayıt: 15 Oca 2014 03:41

Re: Delphi SQL de İç içe For Döngüsü Hakkında

Mesaj gönderen zeynel63 »

mussimsek yazdı: 07 Kas 2023 02:33 Merhaba,

Bu tarz işlemleri Stored Procedure ile veritabanı tarafında daha kolay ve hızlı yapabilirsiniz.

Bir tablonun tüm kayıtlarını dolaşmak için :

Kod: Tümünü seç

...
AdoDurum1.First;
while not AdoDurum1.Eof do
begin
  //yapacağınız işlemleri yapın

  AdoDurum1.Next;
end
şeklinde yapabilirsiniz.

Kolay gelsin.

Öncelikle teşekkür ederim. Buraya kadar bende de çalışıyor. ilk 2 olasığı (1*3*5 ve 2*3*5) veriyor. Sonraki 6 durumu nasıl yapacağım? Benim sorunum da zaten kalan 6 durumu bulamamak. Yeni Bir döngü kurup geriye kalan 6 durumu da bulmam gerekece.
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: Delphi SQL de İç içe For Döngüsü Hakkında

Mesaj gönderen ertank »

Merhaba,

Aşağıdaki gibi iç içe döngü kullanabilirsiniz. Ancak uzun vadede yavaş çalışmaya başlayacaktır.

Kod: Tümünü seç

  ADOTable1.Open();
  ADOTable2.Open();
  ADOTable3.Open();

  ADOTable1.First();
  while not ADOTable1.Eof do
  begin
    ADOTable2.First();
    while not ADOTable2.Eof do
    begin
      ADOTable3.First();
      while not ADOTable3.Eof do
      begin
        // Hesaplamalar burada.
        // Deger := ADOTable1.FieldByName('a').AsInteger * ADOTable2.FieldByName('b').AsInteger * ADOTable3.FieldByName('c').AsInteger;
        // 4ncü tabloya kayıt burada.
        // ADOTable4.Append();
        // ADOTable4.FieldByName('d').AsInteger := Deger;
        // ADOTable4.Post();
        ADOTable3.Next();
      end;
      ADOTable2.Next();
    end;
    ADOTable1.Next();
  end;
muratturan
Üye
Mesajlar: 16
Kayıt: 22 May 2009 01:53

Re: Delphi SQL de İç içe For Döngüsü Hakkında

Mesaj gönderen muratturan »

Slm, eğer ado üzerinden aç kapa ilerle gibi yaparsanız hem veri tabanında kayıt hataları alırsınız, hemde işlem gerçekten uzun sürer. bu sebeple eğer mysql veri tabanı kullaniyorsan senin örneğindeki gibi 4 adet tablo açtım ve herbirinde "sayi" alani var. tablolara ise senin gibi veri girişi yaptım.
4 ADET TABLOM VAR. HER TABLODA KAYITLAR VAR. BEN BU 3 TABLODAKİ KAYITLARDA "ORAN" ALANLARINI ÇARPMAK VE TABLO 4 E Kaydetmek istiyorum.
ÖRNEK VERECEK OLURSAM:
TABLO1: 1 VE 2 SAYILARI VAR
TABLO2: 3 VE 4 SAYILARI VAR
TABLO3: 5 VE 6 ALTI SAYILARI VAR.
select tb1.sayi, tb2.sayi, tb3.sayi from tb3
inner join tb2
inner join tb1

bu kodu ado.query1.sql altına yazıp çalıştırdığında, sana

Kod: Tümünü seç

1 -  3 - 5 
1 -  3 - 6
1 - 4 - 5 
1 - 4 - 6
2 - 3 - 5 
2 - 4 - 6 
2 - 4 - 5 
2 - 4 - 6
şeklinde bir liste verir.
bu şekilde tek bir tablo üzerinden işlem yapabilirsin. aslında mysql ile çarpma yapıp direk tablo 4 de de kaydebilirsin. çok hızlı çalışır. ama şimdi çıkmam gerek belki öğlendensonra yazarım.
En son muratturan tarafından 16 Kas 2023 04:28 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
muratturan
Üye
Mesajlar: 16
Kayıt: 22 May 2009 01:53

Re: Delphi SQL de İç içe For Döngüsü Hakkında

Mesaj gönderen muratturan »

Kod: Tümünü seç

INSERT INTO tb4 (sayi)
(
select (tb1.sayi * tb2.sayi  *tb3.sayi) as sonuc  from tb3
inner join tb2
inner join tb1
);
Merhaba, öğleden sonra bakabildim. biraz uğraştırdı, denemeden yazmak istemedim. normalde insert into da values kullanılır o yüzden biraz uğraştırdı. ama bir sonuç tablosunu başka bir tabloya eklerken values kullanmıyormuşuz. Bende yeni öğrendim. Delphide ado.query ile çalıştırabilirsin. tüm işlem mysql sunucuda gerçekleşeceği için hızlı bir sonuç olacaktır. yaptığı işlem, 3 tabloyuda tüm alt gruplarında listeliyor. listedeki her bir sayıyı çarparak tablo4 'e kaydediyor.

tablo4 'ün görüntüsü
15
18
20
24
.... şeklinde gidiyor.
Cevapla