Döngü içinde birden çok kayıt yapamıyorum.

Diğer veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
hakansozgen
Üye
Mesajlar: 38
Kayıt: 16 Nis 2006 06:51
Konum: istanbul
İletişim:

Döngü içinde birden çok kayıt yapamıyorum.

Mesaj gönderen hakansozgen »

Merhaba arkadaşlar. Sorunum , bir döngünün içinde farklı tablodaki bir alandan ,başka tablodaki bir alana kayıt atamamam. Kodlarımı veriyorum:

Kod: Tümünü seç

for j:=0 to adotable4.RecordCount-1 do
              begin
                if adotable3['STOK_KODU']=adotable4['STOK_KODU'] then
                  begin
                    adotable4.Edit;
                    adotable4.FieldByName('STOK_MEVCUT_ADET').AsInteger:= adotable4.FieldByName('STOK_MEVCUT_ADET').AsInteger+strtoint(adotable3['CIKIS_ADET']);
                    adotable4.Post;

                  end;
                end;
Bu kod çalıştığında adotable3 teki bütün kayıtlar toplanıp,adotable4 teki ilk kayda yazılıyor. Benim istediğim ise, yazdığım if kodundaki gibi sadece "STOK_KODU" eşit olan kayıtlarda bir sonrakine geçerek yapsın. Ama malesef hepsi toplanıp adotable4 teki ilk satıra yazılıyor.

Yardımlarınız için şimdiden teşekkür ederim. Kolay gelsin.
mkysoft
Kıdemli Üye
Mesajlar: 3110
Kayıt: 26 Ağu 2003 12:35
Konum: Berlin
İletişim:

Mesaj gönderen mkysoft »

döngü yardımıyla doğru kaydı aramak yerine, locate komutunu kullanın. sizin yazdığınız kodlardaki eksiklik, adotable4 hep aynı kayıt üzerinde duruyor. for döngüsü içinde

Kod: Tümünü seç

adotable4.next
komutunun olması gerekirdi.
Kullanıcı avatarı
hakansozgen
Üye
Mesajlar: 38
Kayıt: 16 Nis 2006 06:51
Konum: istanbul
İletişim:

Mesaj gönderen hakansozgen »

mkysoft yazdı:döngü yardımıyla doğru kaydı aramak yerine, locate komutunu kullanın. sizin yazdığınız kodlardaki eksiklik, adotable4 hep aynı kayıt üzerinde duruyor. for döngüsü içinde

Kod: Tümünü seç

adotable4.next
komutunun olması gerekirdi.
Malesef adotable4.next komutu işlemiyor hep ilk kayıtta kalıyor. Locate komutunu denemedim ama döngü içinde devamlı locate komutu mu çalıştırcam? Yardımlarınız için teşekkürler.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

AdoTable4.Edit demişsin ama bundan önce hangi kayda konumlanacağı hakkında tek satır kod olmayınca tüm değerleri tek kayda toplaması normal.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
hakansozgen
Üye
Mesajlar: 38
Kayıt: 16 Nis 2006 06:51
Konum: istanbul
İletişim:

Mesaj gönderen hakansozgen »

sabanakman yazdı:AdoTable4.Edit demişsin ama bundan önce hangi kayda konumlanacağı hakkında tek satır kod olmayınca tüm değerleri tek kayda toplaması normal.
Arkadaşlar malesef bütün konumlannmaları yaptım ama hala adotable3 teki kayıtları adotable4 te konumlandığı ilk kayda yapıyor. Son olarak kodlarım şöyle:

Kod: Tümünü seç

if application.MessageBox('Bu fatura ve faturaya ait stoklar iptal edilecek  emin misiniz?','Uyarı!',mb_yesno+48)=mryes then
    adotable3.First;
    adotable4.First;
     for i:=0 to adotable3.RecordCount-1 do
      begin

        adotable4.Locate('STOK_KODU',adotable3['STOK_KODU'],[]);
        adotable4.Edit;
        adotable4.FieldByName('STOK_MEVCUT_ADET').AsInteger:= adotable4.FieldByName('STOK_MEVCUT_ADET').AsInteger+strtoint(adotable3['CIKIS_ADET']);
        adotable4.Post;
        adotable3.Delete;
        adotable3.next ;
        adotable4.Next;
      end;
Yardımlarınız için şimdiden teşekkür ederim.
Kullanıcı avatarı
sabanakman
Kıdemli Üye
Mesajlar: 3081
Kayıt: 17 Nis 2006 08:11
Konum: Ah bi Antalya olaydı keşke (Ankara)

Mesaj gönderen sabanakman »

Kodların mantıksal olarak doğru görünüyor. Eğer hala beklediğin gibi çalışmıyorsa o zaman o kodları satır satır kafanda sanki bilgisayar çalıştırıyormuş gibi takip ederek sorunu bulmalısın. Mesela Locate satırında stok kodları büyük küçük harf ayrımı yapıyor olabilirler ve bir tablodaki aa kaydını diğer tabloda AA olarak bulamayabilir. Toplama olarak sıfır değeri ekliyor da olabilir. Bunun gibi onlarca olasılık. Bunların hakkından artık tek başına gelmek zorundasın. Aksi halde programlama adına çok ilerleyemezsin. Hata ayıklama basamağı programlama işinin en can alıcı noktasıdır ki, run menüsü altında trace (program izleme) seçeneklerini çok sıkı bir şekilde kavraman şart. Bu konuyu kavramak için elindeki kaynakları seferber etmen gerektiğinin şart olduğunu bu basamaktan geçen herkes bilir. Kolay gelsin.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
Kullanıcı avatarı
hakansozgen
Üye
Mesajlar: 38
Kayıt: 16 Nis 2006 06:51
Konum: istanbul
İletişim:

Mesaj gönderen hakansozgen »

Dediğiniz gibi ben de şu an programı yaşıyorum ve kalem kağıt elimde mantığımı akış diyagramları kullanarak uyguluyorum. Şu an içiçe döngü kullanarak problemi çözmeye çalışıyorum. Bu arada önerilerinizin çoğunu uyguladım. Büyük küçük harf ayrımını sıfır sonucunu falan dikkate aldım.

İlginiz için teşekkürler.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

s.a.
genel olarak bir iki tavsiye vermek istiyorum....
- tablolaraa isimler ver. adotable3,adotable4 bizim için hiçbir şey ifade etmiyor. hangisi stok hangisi master vs. tablolara isimler verirsen daha anlaşılır olur.
- birde döngü meselesi var... eğer bir tabloyu baştan aşağı tarıyacaksan while döngüsü for döngüsüne göre daha uygun bir döngü olur.
-döngü içinde hem tabloyu delete etmişsin hemde next demişsin. bu yanlış. delete komutu zaten bir sonraki kaydı seçiyor. o yüzden tekrar next demenize gerek yok.
-locate yaptığınız zaman kaydı bulamazsa ne yapacak?

bu bilgiler ışığında kodları şöyle bi düzenliyelim.

Kod: Tümünü seç

if application.MessageBox('Bu fatura ve faturaya ait stoklar iptal edilecek  emin misiniz?','Uyarı!',mb_yesno+48)=mryes then
begin
    adotable3.First;
    adotable4.First;
    while not adotable3.eof do
     //for i:=0 to adotable3.RecordCount-1 do
      begin
        if adotable4.Locate('STOK_KODU',adotable3['STOK_KODU'],[]) then
        begin
          adotable4.Edit;
          adotable4.FieldByName('STOK_MEVCUT_ADET').AsInteger:= adotable4.FieldByName('STOK_MEVCUT_ADET').AsInteger+strtoint(adotable3['CIKIS_ADET']);
          adotable4.Post;
        end;//locate
        adotable3.Delete;
      end;//while
    end; 
böyle bişeyler olması lazım.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
hakansozgen
Üye
Mesajlar: 38
Kayıt: 16 Nis 2006 06:51
Konum: istanbul
İletişim:

Mesaj gönderen hakansozgen »

aslangeri yazdı:s.a.
genel olarak bir iki tavsiye vermek istiyorum....
- tablolaraa isimler ver. adotable3,adotable4 bizim için hiçbir şey ifade etmiyor. hangisi stok hangisi master vs. tablolara isimler verirsen daha anlaşılır olur.
- birde döngü meselesi var... eğer bir tabloyu baştan aşağı tarıyacaksan while döngüsü for döngüsüne göre daha uygun bir döngü olur.
-döngü içinde hem tabloyu delete etmişsin hemde next demişsin. bu yanlış. delete komutu zaten bir sonraki kaydı seçiyor. o yüzden tekrar next demenize gerek yok.
-locate yaptığınız zaman kaydı bulamazsa ne yapacak?
a.s
Adotable3,Adotable4 derken ayrıntıya girmeden sadece aktif bir tablodaki kaydın,başka tablodaki eşdeğer kayda ilgili değerini atmasını anlatmak istedim. Bu ikisi arasında master detay ilişkisi yok. Döngüyü başta while döngüsü olarak kullandım ama sonra içiçe döngüye ihtiyacım olur diye for döngüsü kaldı en son. Tabloyu delete ettikten sonra next komutuna gerek olmadığını biliyorum ama tablo sonraki kayda geçmeyince koymak geldi içimden. :roll: . Locate i şart içine koymak konusunda sana katılıyorum. Şimdi sonuç:
Gönderdiğin kodları uyguladım. Fakat bu seferde adotable3 teki ilk kayıt,adotablede bulduğu ilk kayda değeri attı sonrası yok. Yani önceden adotable3 te topladığı değerleri, adotable4 teki ilk kayda atıyodu. Yani bu sefer toplamadan attı.Döngü işlemedi sanki. Yardımlarınız için teşekkürler. Kolay gelsin.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

eğer döngü işlemese idi sonsuz döngüye girer program kilitlenirdi.
döngü çalımış ancak atatable3 deki kaydın adotable4 de karşılığı bulunamamış. ondan dolayı işlem yapılmamıştır. adatable4 ü locate etmeden önce first edip bide öyle deneyin.
gene olmazsa kayıtların doğruluğunu test edin.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Cevapla