Bu Kodu İncelermisiniz Hata Nerde

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
macsonfor
Üye
Mesajlar: 118
Kayıt: 14 Haz 2004 04:59

Bu Kodu İncelermisiniz Hata Nerde

Mesaj gönderen macsonfor »

Kod: Tümünü seç

procedure TSIPARISIPTAL1.dxButton1Click(Sender: TObject);
var
a,b,c,d,e,f,g,h : Variant;
Exit : Word;
begin
if Para1.Text<>'' Then
IBTable1.Open;
IBTable1.First;
while not IBTable1.Eof do
if DBGrid1.Columns.Grid.Fields[4].AsString=DBEdit5.Field.AsString then
begin
IBTable1.Edit;
a:=StrToFloat(DBEdit2.Text);
b:=StrToFloat(DBEdit3.Text);
c:=(b/a);
Edit1.Text:=FloatToStr(Trunc(StrToFloat(c)));
e:=StrToFloat(Edit1.Text);
f:=(Para1.TextAsFloat*e);
Edit2.Text:=f;
g:=(DBEdit4.Field.AsFloat+f);
Edit3.Text:=FloatToStr(g);
IBTable1KALAN.AsFloat:=(g);
if DBGrid1.Columns.Grid.Fields[4].AsString<>DBEdit5.Field.AsString then
begin
end;
IBTable1.Next;
Exit:=Application.MessageBox('Fiyat Güncelleme İşlemi Başarı İle Sonuçlandı Değişiklikler Kaydedilsin mi ?','Dikkat',
MB_YESNO+MB_ICONQUESTION);
if Exit=IDYES Then
Begin
DATA1.STOK.Edit;
DATA1.STOKFIYATI.AsFloat:=(DBEdit1.Field.AsFloat+Para1.TextAsFloat);
DATA1.STOK.Post;
DATA1.STOK.Refresh;
IBTable1.Database.ApplyUpdates([IBTable1]);
IBTable1.Refresh;
end else 
begin
IBTable1.Cancel;
IBTable1.Refresh;
DATA1.STOK.Cancel;
DATA1.STOK.Refresh;
end;
end;
end;
end.
bu koddaki hata nedir valla ben çıkartamadım sorun şu ki application.messeagebox uyarısı iki defa ardarda geliyor ve sonra kitleniyor dolayısıyla fiyat 25.000.000 tl iken üstüne 1.000.000 tl ekleyeceğine iki defa veya daha fazla ekliyor sebebi ne ola...
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 »

Öncelikle böyle dümdüz kod yazarsan bir şey anlıyamazsın, eğer buraya eklerken böyle oldu diyorsan daha anlaşılır hale getir. yani begin end leri hizala, puzzle çözmek zorunda kalınmasın

Exit : Word;

Kod yazarken ilk dikkat edilecek kural. Kullanılan değişken Procedure yada function isimlerine dikkat edin. Reserved Word kullanmayın

IBTable1.Edit eğer Table ta hiç kayıt yoksa Insert işlemi yapar ve onnewrecord tetiklenir ve diğerleri.

editlerin yada başka bir class ın modifiEvent lerinde kod yazmış olabilirsin, bunları kotrol et.
Breakpoint koyup stepByStep çalıştırıp kodu kotrol et

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 öncelikle teşekkür ediyorum.
editlerin eventleri'ne kod yazmadım direk butona basılınca işlemler gerçekleşiyor.
Kolay gelsin...
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 »

ya abilerim ablalarım lütfen bir yardım eli uzatında şu işin üstesinden geleyim valla adamlar çok sıkıştırıyor...
Kolay gelsin
Bilgi Paylaşıldıkça Çoğalır
Misafir

Mesaj gönderen Misafir »

if Para1.Text<>'' Then

Kod: Tümünü seç

if Para1.Text<>'' Then  begin
belki yanlış anladım ama, para1.text boş değilse sadece IBTable1.open mı yoksa kodların hepsi mi çalışacak.
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Kod: Tümünü seç

if DBGrid1.Columns.Grid.Fields[4].AsString<>DBEdit5.Field.AsString then
begin
end;
IBTable1.Next;
Exit:=Application.MessageBox('Fiyat Güncelleme İşlemi Başarı İle Sonuçlandı Değişiklikler Kaydedilsin mi ?','Dikkat',
MB_YESNO+MB_ICONQUESTION); 
Begin End bloklarının arası boş ?

Kolay Gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

valla kod acaip okunaksız,
ilk neden kodların başında boşluk olmaması, neyse enazından bu sizde düzgün çıkar
ikincisi ise editlere ve a,b,c,.. diye giden değişkenlere düzgün isim vermemeniz. büyük ihtimali 6 ay sonra dönüm baktığınızda hiçbirşey anlamıcaksınız.

kişisel kanaatim bunları baştan bir düzeltmeniz.
.-.-.-.-.-.-.-. ^_^
Kullanıcı avatarı
macsonfor
Üye
Mesajlar: 118
Kayıt: 14 Haz 2004 04:59

Mesaj gönderen macsonfor »

valla abilerim hepinize teşekkür ediyorum aslında ben evden kopyalayıp getirdim işin aslında biraz aceleye getirdim herhalde kusuruma bakmayın.
husonet yazdı:

Kod: Tümünü seç

if DBGrid1.Columns.Grid.Fields[4].AsString<>DBEdit5.Field.AsString then
begin
end;
IBTable1.Next;
Exit:=Application.MessageBox('Fiyat Güncelleme İşlemi Başarı İle Sonuçlandı Değişiklikler Kaydedilsin mi ?','Dikkat',
MB_YESNO+MB_ICONQUESTION); 
Begin End bloklarının arası boş ?

Kolay Gelsin...
abi şimdi tablo detail tablo olduğu için içinde birden fazla tüp çeşidi olcak ben hangi tüp çeşidinin fiyatını arttırmak istiyorsam onu comboboxtan seçiyorum ve yeni fiyatı ekletiyorum.
şimdi niye boş onu anlatmaya çalışayım (belkide yanlışım) :
ben comboboxtan "12 kg ev gazı"nı seçtim diyelim ve fiyatı 25.000.000 tl iken ben para1'e 1.000.000 daha yazdım sonra butona bastığım zaman kod detail tablo içinde ne kadar "12 kg ev gazı" varsa fiyatını 1.000.000 arttıracak eğer cins olarak "12 kg ev gazı" yerine "2 kg piknik" varsa orda program kilitleniyor bunu engellemek için

Kod: Tümünü seç

if DBGrid1.Columns.Grid.Fields[4].AsString<>DBEdit5.Field.AsString then
begin
end;
dbedit5 ile combobox  datasource'un CINSI field'ne  bağlı
burayı kullandım eğer yanlış bir yol izliyorsam beni düzeltin.
Umarım yeterince açıklayıcı olabilmişimdir.
Kolay gelsin.
Bilgi Paylaşıldıkça Çoğalır
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Merhaba...

@mikrocu güzel ve önemli bir soru sormuş, bu soruyu cevaplandırmayı atlamışsınız...

Kod: Tümünü seç

begin
  if Para1.Text <> '' then
    IBTable1.Open;
  IBTable1.First;
  while not IBTable1.Eof do
- Yani Para1.Text boş iken bu butona basıldığında IBTable1 open yapılmadan IBTable1.First ile başlayarak işleme girişilecektir.

- Ayrıca procedure içerisinde Open yaptığınız gibi, bu procedure'den çıkmadan Close etmiş olduğunuzu görüyorum ki şans eseri bir dahaki sefer aynı butona basıldığında Table open edilmese bile önceki sezonda açık kalmış olan Table işleme girebiliyor.

- En önemlisi olarak nitelendirebilceğim, While bloğunu If bloğuna bağlamışsınız. Ama If bloğu işlem sona erdi mevzuunu da kapsıyor olması çok garip bir durum. :arrow: Tabii her kayıt için teker teker sorulmayacaksa :!: O zaman da IBTable1.Next; erken konmuş diyebilirim. eğer böyleyse record Next olmadan sorulmalıydı...

- Sizin ve kodu incelemek isteyebilecek diğer forum sakinleri için boşluklarını verdirip tekrar yazıyorum. Kod aynı koddur herhangi bir düzeltme yapılmadı. Sadece okunabilirliği arttırıldı.

Kod: Tümünü seç

procedure TSIPARISIPTAL1.dxButton1Click(Sender: TObject); 
var
  a, b, c, d, e, f, g, h: Variant;
  Exit: Word;
begin
  if Para1.Text <> '' then
    IBTable1.Open;
  IBTable1.First;
  while not IBTable1.Eof do
    if DBGrid1.Columns.Grid.Fields[4].AsString = DBEdit5.Field.AsString then
    begin
      IBTable1.Edit;
      a := StrToFloat(DBEdit2.Text);
      b := StrToFloat(DBEdit3.Text);
      c := (b / a);
      Edit1.Text := FloatToStr(Trunc(StrToFloat(c)));
      e := StrToFloat(Edit1.Text);
      f := (Para1.TextAsFloat * e);
      Edit2.Text := f;
      g := (DBEdit4.Field.AsFloat + f);
      Edit3.Text := FloatToStr(g);
      IBTable1KALAN.AsFloat := (g);
      if DBGrid1.Columns.Grid.Fields[4].AsString <> DBEdit5.Field.AsString then
      begin
      end;
      IBTable1.Next;
      Exit := Application.MessageBox('Fiyat Güncelleme İşlemi Başarı İle Sonuçlandı Değişiklikler Kaydedilsin mi ?', 'Dikkat',
        MB_YESNO + MB_ICONQUESTION);
      if Exit = IDYES then
      begin
        DATA1.STOK.Edit;
        DATA1.STOKFIYATI.AsFloat := (DBEdit1.Field.AsFloat + Para1.TextAsFloat);
        DATA1.STOK.Post;
        DATA1.STOK.Refresh;
        IBTable1.Database.ApplyUpdates([IBTable1]);
        IBTable1.Refresh;
      end else
      begin
        IBTable1.Cancel;
        IBTable1.Refresh;
        DATA1.STOK.Cancel;
        DATA1.STOK.Refresh;
      end;
    end;
end;

@husonet'in sorusuna verdiğiniz cevap tatmin edici değil. Oraya koyduğunuz IF sorgusu, olaya yöne katmadığı için etkisiz kalmıştır. Sadece IF True then begin end; yazmaktan farklı birşey yapmıyor. Sadece daha az ihtimalde sorgu true değeri alıyor :wink:
Resim
Resim ....Resim
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2381
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

kodun dan hiç birşey anlaşılmıyor. diğer cevap veren arkadaşlarda zaten hep varsayım üzerine cevap yazmışlar bende sana yöntem tavsiye edicek.
Öncelikle çok acil kelimelerini kullanma

Variant tip, tipi belli olmıyan değişkenler için kullanılır, yani atayacağın değer stringde olabilir integer da bunu bilmiyorsan ve kod yazıp if lerle ve bir sürü değişken yerine Tek bir isimli değişkende bunu yapabilmek için. Ama delphi bunu arka planda sen kullanmaya her kalktığında bunun tipini bilmek zorunda zararı şu, Marcu cantu kitabında geçiyordu, işlemi 12 kez yavaşlatıyor. diğer taraftanda eğer null olursada hata alırsın. Tipini biliyorsun o yüzden variant değil real double extended bunlardan birini kullan

Kod: Tümünü seç

if Para1.Text <> '' then...
//yerine 
if Trim(Para1.Text) <> '' then 
kullan nedeni space yani #32 leri de bertaraf etmiş olursun

Kod: Tümünü seç

if DBGrid1.Columns.Grid.Fields[4].AsString = DBEdit5.Field.AsString then 
Grid.Fields[4] ya bu değişirse ? yani kolonların yerleri değişirse ne olucak ? senin program çatladı

DBEdit5.Field.AsString bu arkadaş kim ???

DBgrid olsun DBedit olsun bu değerlere Table yada Query üzerinde erişin. "Table1.FieldByName('HEDEHODO').asInteger"
hem kim kimdir anlaşılır hemde hata riskini azaltırsın

Kod: Tümünü seç

//a := StrToFloat(DBEdit2.Text);
A := Table1.FieldByName('HEDEHODO').[b]asFloat[/b];
      b := StrToFloat(DBEdit3.Text);
    try
      c := (b / a);
    except
       C:= 0.0;
      showmessage('sıfıra bölüm hatası')
    end; 
reserved word kullanmayın demiştim zaten "Exit"

Kod: Tümünü seç

if Exit = IDYES then
      begin
        DATA1.STOK.Edit; // Bu data1 kimdir ??? direk edirt denmiş ? cursor un position ı doğru yerdemi ki ? yani doğru kayıttamı ? daha öncede yazmıştım eğer kayıt yoksa Edit, Insert ü tetikler
        DATA1.STOKFIYATI.AsFloat := (DBEdit1.Field.AsFloat + Para1.TextAsFloat);
        DATA1.STOK.Post;
        DATA1.STOK.Refresh;
        IBTable1.Database.ApplyUpdates([IBTable1]);// demek ki cachedupdates i kullanmışsın
        IBTable1.Refresh;
      end else
      begin
        IBTable1.Cancel;// cachedupdates i kullanmışsan  cancelupdates demen gerek
        IBTable1.Refresh;
        DATA1.STOK.Cancel;
        DATA1.STOK.Refresh;
      end; 
IBX kullanmışsın ama bu gönderdiğin kodlarda transaction la ilgili hiç bi şey yok

ayrıca hata yakalamanın en güzel yolu berakpoint koyup stepbystep çalıştırmak, nerde hata veriyor o anda hangi değişkende ne değer var hepsini adım adım inceleyebilirsin

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 »

İlginizden dolayı hepinize teşekkürlerimi iletiyorum ALLAH razı olsun.
Sorun halledildi Kolay gelsin...
Bilgi Paylaşıldıkça Çoğalır
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Amin.

Peki sorunu nasıl hallettiniz? Problem neden kaynaklanmış? bunları yazarsanız daha sonra bu problemle karşılaşan bir üye nin çok işine yarar. Bunu bir prensib haline getirelim.

Teşekkürler.

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

S.A.
Sanırım arkdaş mesajbox u döngü içinde göstermiş.
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 »

Sayın hocalarım aslında bu sorun tam olarak halledilmedi ama bir kısmı halledildi.
daha önceki cevabımda halledildi dememden kasıt sizlerin kafasını fazla karıştırmamak ve daha fazla yük olmamak içindi.
Şimdi gelelim hallolan kısma
Eski kodu yazıyorum

Kod: Tümünü seç

procedure TSIPARISIPTAL1.dxButton1Click(Sender: TObject); 
var 
  a, b, c, d, e, f, g, h: Variant; 
  Exit: Word; 
begin 
  if Para1.Text <> '' then 
    IBTable1.Open; 
  IBTable1.First; 
  while not IBTable1.Eof do 
    if DBGrid1.Columns.Grid.Fields[4].AsString = DBEdit5.Field.AsString then 
    begin 
      IBTable1.Edit; 
      a := StrToFloat(DBEdit2.Text); 
      b := StrToFloat(DBEdit3.Text); 
      c := (b / a); 
      Edit1.Text := FloatToStr(Trunc(StrToFloat(c))); 
      e := StrToFloat(Edit1.Text); 
      f := (Para1.TextAsFloat * e); 
      Edit2.Text := f; 
      g := (DBEdit4.Field.AsFloat + f); 
      Edit3.Text := FloatToStr(g); 
      IBTable1KALAN.AsFloat := (g); 
      if DBGrid1.Columns.Grid.Fields[4].AsString <> DBEdit5.Field.AsString then 
      begin 
      end; 
      IBTable1.Next; 
      Exit := Application.MessageBox('Fiyat Güncelleme İşlemi Başarı İle Sonuçlandı Değişiklikler Kaydedilsin mi ?', 'Dikkat', 
        MB_YESNO + MB_ICONQUESTION); 
      if Exit = IDYES then 
      begin 
        DATA1.STOK.Edit; 
        DATA1.STOKFIYATI.AsFloat := (DBEdit1.Field.AsFloat + Para1.TextAsFloat); 
        DATA1.STOK.Post; 
        DATA1.STOK.Refresh; 
        IBTable1.Database.ApplyUpdates([IBTable1]); 
        IBTable1.Refresh; 
      end else 
      begin 
        IBTable1.Cancel; 
        IBTable1.Refresh; 
        DATA1.STOK.Cancel; 
        DATA1.STOK.Refresh; 
      end; 
    end; 
end;
şurayı kaldırdım

Kod: Tümünü seç

      Exit := Application.MessageBox('Fiyat Güncelleme İşlemi Başarı İle Sonuçlandı Değişiklikler Kaydedilsin mi ?', 'Dikkat', 
        MB_YESNO + MB_ICONQUESTION); 
      if Exit = IDYES then 
      begin 
kodun şimdiki halini veriyorum :

Kod: Tümünü seç

procedure FIYATGUNCELLE1.dxButton1Click(Sender: TObject);
var
a,b,c,d,e,f,g,h : Variant;
begin
 if Trim(Para1.Text)<>'' Then
  begin
  IBTable1.Open;
  IBTable1.First;
   while not IBTable1.Eof do
    if DBGrid1.Columns.Grid.Fields[4].AsString=DBEdit5.Field.AsString then
     begin
      IBTable1.Edit;
      a:=StrToFloat(DBEdit2.Text);
      b:=StrToFloat(DBEdit4.Text);
      c:=(b/a);
      Edit1.Text:=FloatToStr(Trunc(StrToFloat(c)));
      e:=StrToFloat(Edit1.Text);
      f:=(Para1.TextAsFloat*e);
      Edit2.Text:=f;
      g:=(DBEdit4.Field.AsFloat+f);
      Edit3.Text:=FloatToStr(g);
      IBTable1KALAN.AsFloat:=(g);
      IBTable1.Next;
      if DBGrid1.Columns.Grid.Fields[4].AsString<>DBEdit5.Field.AsString then
        begin
       end;
     end;
      DATA1.STOK.Edit;
      DATA1.STOKFIYATI.AsFloat:=(DBEdit1.Field.AsFloat+Para1.TextAsFloat);
      DATA1.STOK.Post;
      DATA1.STOK.Refresh;
      IBTable1.Database.ApplyUpdates([IBTable1]);
      IBTable1.Refresh;
      ShowMessage('Fiyat Güncelleme İşlemi Başarılı');
      Para1.Clear;
  end;
end;
verdiğim yeni kod sadece sipariş tablosunda hepsi (12Kg Ev gazı) olmak şartı ile fiyatları güncelliyor, Eğer tabloda (2 kg Piknik veya 24 Kg Ticari veya başka) tüp varsa program kilitleniyor. Buna halledildi demek biraz abes kaçtı ama dedim ya sizleri daha fazla uğraştırmamak için öyle yazdım işte aslında Bunu halletseydik iyi olacaktı. Kusurumuz varsa af ola.
Kolay gelsin.
Bilgi Paylaşıldıkça Çoğalır
Cevapla