Bu Kodu İncelermisiniz Hata Nerde

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

S.A.
Arkadaşım sana şöyle bir yardımda bulunayım.
öncelikler değilkenlerin editlerin ve tabloların isimlerini değiştir. hangi alanda ne var hangi alanları kullanıyorsun anlaşılmıyor. buda bizi daha çok uğraştırıyor. dolayısıyla sen uğraşmış oluyorsun. Neyse
ilk önce değişkenler tanımlanıyor.
kalan hesapla diye ayrı bir function daha hazırla. tabloyu baştan sona kadar tara ve her kayıt için fiyat güncelle proceduresini çalıştır.

Kod: Tümünü seç

.........
   while not IBTable1.Eof do
    begin
      IBTable1.Edit; 
      IBTable1KALAN.AsFloat := KalanHesapla(eskifiyat,yenifiyat, tüpsayisi, vs)
      ibtable1.post;
      ibtable1.next;
    end;
.......
kalanı hesaplamak için hangi bilgileri kullandığını bilemiyorum. (malum değişken ve edit isimleri olayı) ona göre parametrelerini sen ayarlarsın.
functionun içine döngünün içindeki eski kodları uyarlıyacaksın.
ayrıca

Kod: Tümünü seç

      if DBGrid1.Columns.Grid.Fields[4].AsString<>DBEdit5.Field.AsString then
        begin
       end; 
satırlaına gerek yok. (daha sonra içini dolduracaksan bilmiyorum ama) begin end blokları arası boş kalacaksa bu satırlara hiç gerek yok.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
macsonfor
Üye
Mesajlar: 118
Kayıt: 14 Haz 2004 04:59

Mesaj gönderen macsonfor »

Hocam teşekkür ediyorum ama bu konun bu kadar uzamasına benim tecrübesizliğim sebep oldu biliyorum. Başa dönerek tekrar bi açıklama getirmeye çalışayım :

Datamodül kullanıyorum ve veritabanı Interbase 7
Bu işlem için kullandığım tablolar
-------------------------------------------------------------------------------

Kod: Tümünü seç

1-Sipariş
2-Stok
Not : Abone ve Sipariş Tabloları master/detail bağlantılı
============================================
1-Sipariş                                     2-Stok
===================       ======================
İşlemTarihi                                  TüpCinsi
AboneSıraNo                                TüpFiyatı             
AboneAdı                                     
AboneSoyadı  
TüpCinsi
TüpFiyatı
TüpAdedi
Toplam
Ödenen
Kalan
ÖdemeTarihi
=============================================
Tüp Cinsi olarak 4 tip tüp var : 12 Kg Ev Gazı, 2 Kg Piknik, 24 Kg Ticari, 45 Kg Sanayii.
Diyelimki 12 kg tüpün fiyatı 25.000.000 iken zam aldı 25.500.000 oldu ben hemen fiyat güncelleme formunda hangi tüp fiyatı değişecekse seçtiriyorum 12 kg'yi seçtim fiyatı 25.000.000 olarak görüyorum ne kadar zam gelmişti 500.000 zam miktarını para1 diye adlandırdığım floatedite giriyorum. Sonra her abone için eski tüp fiyatını kalan tutara böldürüyorum çıkan sonucu trunc fonksiyonu ile yuvarlatıp çıkan sonucu zam miktarıyla çarptırıp kalan tutara ekliyorum yapmak istediğim olay bu.

if DBGrid1.Columns.Grid.Fields[4].AsString<>DBEdit5.Field.AsString then
begin
end;
bu satırada herhalde gerk yokmuş :D .
Kolay gelsin
Bilgi Paylaşıldıkça Çoğalır
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2381
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

kendi adıma söylüyorum, okadar yazdım anlatmaya çalıştım ama görüyorumki amaç sadece sorunu çözmekmiş. buna üzüldüm açıkçası. Sorununu hallettiysen forum işe yaramış demek.

kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
macsonfor
Üye
Mesajlar: 118
Kayıt: 14 Haz 2004 04:59

Mesaj gönderen macsonfor »

Valla adminim bişey diyecem ama kızma ben sorunumu halledemedim açıkçası.
kendi adıma söylüyorum, okadar yazdım anlatmaya çalıştım ama görüyorumki amaç sadece sorunu çözmekmiş. buna üzüldüm açıkçası. Sorununu hallettiysen forum işe yaramış demek.
Birde bunu biraz daha açarsanız sevinecem nedemek isteğinizi tam olarak anlayamadım.

Yeni Kodu Veriyorum Hani şu halledilen sorun vardı ya :lol:

Kod: Tümünü seç

procedure TGUNCELLE1.dxButton1Click(Sender: TObject);
var
a, b, c, d, e, f, g, h : Real;
begin
IBTable1.Open;
IBTable1.First;
 while not IBTable1.Eof do
 begin
 if DATA1.STOKCINSI.AsString=DATA1.SIPARISCINSI.AsString then
   begin
   IBTable1.Edit;
   a := IBTable1FIYATI.AsFloat;
   b := IBTable1KALAN.Asfloat;
   c := (b / a);
   Edit1.Text := FloatToStr(Trunc (c) );
   e := StrToFloat(Edit1.Text);
   f := (Para1.TextAsFloat *e);
   Edit2.Text := FloatToStr (f);
   g := (IBTable1KALAN.AsFloat + f);
   Edit3.Text := FloatToStr (g);
   IBTable1KALAN.AsFloat := (g);
   IBTable1.Next;
   IBTable1.Database.ApplyUpdates( [IBTable1] );//Sipariş Tablosu
   IBTable1.Refresh;
  end;//Eğer bu end'i en alltaki end'in altına alırsam bu defada kısır döngüye gidiyor
 end;
DATA1.STOK.Edit;
DATA1.STOKFIYATI.Value:=(DATA1.STOKFIYATI.AsFloat+Para1.TextAsFloat );
DATA1.STOK.Post;
DATA1.STOK.Refresh;
end;
Bu defa da Invalid Floating Point Operation Hatası Veriyor
Bilgi Paylaşıldıkça Çoğalır
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2381
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

Kodun son hali bu demişsin sadece kodun bir kısmını silmişsin. Okadar bunları kullan dedikten sonra hiç dikkate alınmayınca insanın ağırına gidiyor. Anlat marko paşaya hesabı yani :)

Kod: Tümünü seç

..if DATA1.STOKCINSI.AsString=DATA1.SIPARISCINSI.AsString then...
değil 
DATA1.STOK.FieldByName('CINSI').AsString=DATA1..FieldByName('SIPARISCINSI').AsString
şeklinde kullanın. Çok fazla ve hızlı işlmlerde "STOKCINSI" değişkenine değer atanmayabiliyor. Aslında Atanmıyor denemez ama işlemlerin işlenmesi sırasında senkron bozukluğu olabiliyor. Sonuçta mikisoft bu.Edinilmiş tecrübedir bu.

Kod: Tümünü seç

while not IBTable1.Eof do
 begin 
...........................
IBTable1.Next;
   IBTable1.Database.ApplyUpdates( [IBTable1] );//Sipariş Tablosu
   IBTable1.Refresh; 
cahcedupdate kullanıyorsan applyupdates enson yapılması gereken işlem.yani bunu döngünün dışına koyman gerek.ve döngüyü try except içine alman gerek eğer hata olursa cancelupdate edebilmelisin.
Ayrıca IBTable1.Refresh; cursor ü herzaman başa döndürüyor olması lazım, bu yüzdende hiç bi zaman EOF (End Of File) olmaz ve kısır döngüye girer.

burasıda bana saçma geliyor

Kod: Tümünü seç

if DATA1.STOKCINSI.AsString=DATA1.SIPARISCINSI.AsString then
while not IBTable1.Eof do döngüsü içinde bunun bir anlamı yokki her seferinde IBTable1 döngü gereksiz yere çalışacak.

Daha önceki mesajımda dediğim gibi Transactionlar nerde ?
Yazım hatanların düzeliyor, ama mantığında gelişmeye ihtiyacın var. Benim hocamın söylediği şuydu. Programı yazdıktan sonra ilk önce siz çalıştırın derdi, yani bilgisayar yerine siz satır satır çalıştırın kodu, değişkeleri bir kağıda yazarak tek tek çalıştırın. Dümdüz kod yazarsanız ve Run dediğinizde bunun çalışıyor olması programın doğru çalıştığı anlamına gelmez. Yazdığınız program doğru ve hatasız çalışmalı, basit bir hesaplama hatası müşterinize milyarlarca liraya maal olabilir

kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
macsonfor
Üye
Mesajlar: 118
Kayıt: 14 Haz 2004 04:59

Mesaj gönderen macsonfor »

Hocam vallahi ben ne sana ne bir başkasına saygısızlık yapmak istemem
ha ben böyle yap dedim sen yapmamışsın diyeceksin doğrudur sebebine gelince siz 48 saat uyku hasretiyle yanıp tutuşan birine diyordunuz. :cry: onun için ne yaptığımı bende bilmiyorum bunun için sizlerden tekrar tekrar özür diliyorum bunuda tecrübesizliğime verin.
Projem bitmiş durumda bu mfiyat güncelleme modülü haricinde buda halledilirse teslim edecem.
isteyen varsa Fiyat güncellame modülünü mailinize atacam yeterki bu halledilsin...
Bilgi Paylaşıldıkça Çoğalır
Kullanıcı avatarı
macsonfor
Üye
Mesajlar: 118
Kayıt: 14 Haz 2004 04:59

Mesaj gönderen macsonfor »

Gecenin bu vaktinde de olsa sevincimi sizlerle paylaşmak istedim.
Bu defa Allah'ın izni ile başardım Nasıl mı ?
eskiden ibtable kullanıyordum şimdi ise ibdateset kullandım ve artık kullanmaya devam edecem. [ibtable ve ibquery benim için herhalde tarih olacak]

Kod: Tümünü seç

// İlk önce Cinsinse Göre Listeliyorum
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
IBDataSet1.Close;
IBDataSet1.SelectSQL.Clear;
IBDataSet1.SelectSQL.Add('SELECT * FROM SIPARIS WHERE CINSI='''+ComboBox1.Text+'''');
IBDataSet1.Open;
end;
Sonra

Kod: Tümünü seç

procedure TForm1.dxButton2Click(Sender: TObject);
var
Fiyat, Kalan, Tekabul, Eklenecek, Sonuc : Real;
begin
Button2.Enabled := False;
IBDataSet1.First;
 try
  while not IBDataSet1.Eof do
   begin
   IBDataSet1.Edit;
   Fiyat := IBDataSet1FIYATI.AsFloat;
   Kalan := IBDataSet1KALAN.AsFloat;
   Tekabul := Trunc(Kalan / Fiyat);
   Para3.TextAsFloat := Tekabul;
   Eklenecek := (Para2.TextAsFloat * Tekabul);
   Para4.TextAsFloat := Eklenecek;
   Para5.TextAsFloat := Sonuc;
   IBDataSet1KALAN.AsFloat := Para5.TextAsFloat;
   IBDataSet1.Next;
   end;
   except
   end;
  end;
 IBDataSet1.Database.ApplyUpdates([IBDataSet1]);
 Para1.Text:='';
 Para2.Text:='';
 ComboBox1.Text:='';
end;
Allah cümlenizden razı olsun bir iki ufak iş kaldı sonra teslim edecem projemi.
Kolay Gelsin
Bilgi Paylaşıldıkça Çoğalır
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2381
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

macsonfor yazdı:ha ben böyle yap dedim sen yapmamışsın
sakın ha. ben böyle birşey ne söyledim nede ima ettim. Aslada hiçkimseye yapmam. Söyelemek istediğim bugüne kadar edindiğim tecrübeleri aktarmaya çalışıyorum, hiçbiri dikkate alınmayınca doğal olarak anlat marko paşaya durumu olmuş gibi geldi bana.

yukarıda yazdığın kodda IBDataSet1 yerine Ibtable1 yazarsan gene çalışıcak. Projeni teslim ettikten sonra dene istersen.

SQL kullanıyorsan Query kullanmak en mantıklısı. Tavsiyem raporlamalarda eğer SQL yazmak gerekmiyorsa IBTable kullanmak performansı biraz arttırıyor

kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
macsonfor
Üye
Mesajlar: 118
Kayıt: 14 Haz 2004 04:59

Mesaj gönderen macsonfor »

tavsiyeleriniz için teşekkür ediyorum.
Kolay gelsin
Bilgi Paylaşıldıkça Çoğalır
Cevapla