Arka planda kitlenmeden çalışacak uygulama

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Kullanıcı avatarı
pasa_yasar
Üye
Mesajlar: 570
Kayıt: 07 Haz 2004 12:35

Re: Arka planda kitlenmeden çalışacak uygulama

Mesaj gönderen pasa_yasar »

o zaman ağırlaşmaz mı çok fazla kod kullanmış olmaz mıyım acaba. Her işlemde ekrana bilgi vermek için durdurmak çok 3 - 4 kat geç işlemi bitirir gibi geliyor bana. deneyiyem yine de
tayipk
Üye
Mesajlar: 284
Kayıt: 27 Kas 2013 11:32

Re: Arka planda kitlenmeden çalışacak uygulama

Mesaj gönderen tayipk »

pek ihtimal vermiyorum açıkçası tabi bilgisayarın performansıda önemli bu işlemde
Soru Sorarken yazmaya Üşenmeyen Parmaklar Sorunun Çözüldükten Sonra Teşekkür etmeye de Üşenmesin.
thelvaci
Kıdemli Üye
Mesajlar: 770
Kayıt: 11 Tem 2010 07:17
Konum: Istanbul
İletişim:

Re: Arka planda kitlenmeden çalışacak uygulama

Mesaj gönderen thelvaci »

Size thread önerecektim ama yazdığınız kodu görünce bu önerimden tamamen vazgeçtim. Önce onları düzeltmeli ve belirli bir disipline alışmalısınız ondan sonra sorunlarınız zaten otomatikman azalacaktır.

Nedir kodunuzda gözlemlediğim sorunlar, onları da paylaşayım:
  • 1- İsimlendirme kurallarına uymuyorsunuz. Örneğin; AdoQuery1, UniQuery2, UniQuery8, UniQuery700 gibi. Bu tarz isimlendirilen nesneler ile çalışırken, çok kısa bir zaman içinde yolunuzu kaybeder, bir çok hata yapmaya elverişli ortamı hazırlarsınız.
    2- Veritabanınızdaki herhangi bir tabloya kayıt ekleyebilmek adına çok ilginç bir yol seçmişsiniz kendinize. Örneğin;

    Kod: Tümünü seç

    UniQuery700.sql.add('select * from proautoid');
    
    yazmışsınız. Ardından da Append ile bu tabloya kayıt ekliyorsunuz. Madem ilgili tabloya kayıt ekleme amacındasınız, neden tablonun tüm kayıtlarını çekiyorsunuz ? En azından şöyle yapabilirdiniz;

    Kod: Tümünü seç

    UniQuery700.sql.add('select * from proautoid where 1 = 2');
    Gerçi bunu da asla tavsiye etmem. Rica ederim, hangi veritabanını kullanıyorsanız o veritabanı içinde Stored Procedure nasıl yazılırı araştırın.
    3-

    Kod: Tümünü seç

                      UniQuery700.close;
                      UniQuery700.sql.clear;
                      UniQuery700.sql.add('select * from proautoid');
                      UniQuery700.open;
    
                      UniQuery700.Append;
                      UniQuery700.Post;
    
    Tabloyu açtıktan sonra Append metodunu çağırıp hemen ardından Post etmenizin mantığını anlamadım.!
    4-

    Kod: Tümünü seç

    Trim(cxComboBox1.Text)<>'Seçim Yok'
    Hiç şık bir çözüm değil.
    5-

    Kod: Tümünü seç

    AdoQuery1.FieldByName(cxComboBox1.Text).AsString
    cxComboBox1 nesnenize kullanıcı yazma imkanına sahip ise; çok büyük ihtimalle hatalara açık bir kod. Aynı zamanda şık da değil. Onun yerine belki de;

    Kod: Tümünü seç

    var
      Field : TField;
    begin
    ...
    ...
    Field := AdoQuery1.FindField(cxComboBox1.Text);
    if Field <> nil then
    begin
    ...
    end;
    ..
    ..
    end;
    gibi bir kod kullanabilirsiniz.
    6-

    Kod: Tümünü seç

    AdoQuery1.FieldByName(cxComboBox15.Text).AsString)='Ürün'
    Bir field'ın değerinin bu şekilde kullanılması pek çok hataya açık bir duruma sokabilir sizi. Veritabanındaki ilgili kaydın, Ürün yerine Urün olarak değiştirilmesi dahi kodunuzu çalışmaz kılabilir. Bunun yerine eğer bu alan bir yada birden fazla sabit değer içerek ise, ilgili alanı string olarak değil belki de sayısal olarak tanımlamalı ve tabloya da bir check constraint yazmalısınız. Bu sayede daha güvenli kodlarınız olur.
    7- Code indent'e dikkat etmiyorsunuz.
    8-

    Kod: Tümünü seç

                                    UniQuery7.close;
                                    UniQuery7.sql.clear;
                                    UniQuery7.sql.add('select birimcode from birim');
                                    UniQuery7.sql.add('where birimcode<>''''');
                                    UniQuery7.sql.add('order by birimcode ASC');
                                    UniQuery7.open;
    
                                    UniQuery7.last;
    
                                    UniQuery6.Append;
    
                                    if UniQuery7.recordcount=0 then
                                    begin
                                      UniQuery6.FieldByName('birimcode').AsString:='000001';
                                    end
                                    else
                                    begin
                                      UniQuery6.FieldByName('birimcode').AsString:=numarator(UniQuery7.fieldbyname('birimcode').asstring);
                                    end;
    
    Yukarıdaki kodunuzda yanlış anlamadı isem; birim tablosundaki en son kullanılan birim kodunu almaya çalışıyorsunuz. Bu durumda, neden SELECT TOP 1 ... FROM Birim ORDER BY BirimCode DESC gibi bir SQL yazmıyorsunuz onu da anlamadım. Tüm birim kayıtlarını getirmenin bir anlamı yok ki.
    9- Hepsi bir yana ilk söylemem gerekeni şimdi söyleyeyim. Asla Delphi içinde SQL sorguları yazmayın. Tecrübelerime ve bildiklerime istinaden söylüyorum. Bunun aksinin mantıklı olduğunu iddia eden birileri olursa eğer, http://delphiforumu.com/questions/297/d ... page=1#338 linkinde paylaştıklarımı okuduktan sonra, buradan tartışmaya devam edebiliriz.
Umarım bu eleştirilerimi kırıcı bulmamışsınızdır, maksadım gönüller kırmak değil; doğru yola teşviktir.

Kolay gelsin.
Kullanıcı avatarı
pasa_yasar
Üye
Mesajlar: 570
Kayıt: 07 Haz 2004 12:35

Re: Arka planda kitlenmeden çalışacak uygulama

Mesaj gönderen pasa_yasar »

:) :) valla muhteşemdi. Kırılmak ne kelime yanlışları gördüğüm için çok mutlu oldum. Çoğunlukla tembellikten bu şekilde yazdım.

Kod: Tümünü seç

UniQuery700.sql.add('select * from proautoid');
1-2-3. UniQuery de son eklenen kaydın ID sını almayı beceremediğimden yazdım. Tablodan ID oluşturuyorum.Server veritabanı kullanmadığımdan stored procedure kullanmıyorum. Server olsada o konuda pek bilgim yok.
4-5-6. Bu alan stoklardaki alanları eşleştiriyor. Excelden çektiği başlığıa göre eşleştirme yapıyor. Exceldeki başlık farklı olabilir. A sütunu Stok kodu gibi
7. Code indente artık dikkat etmeye başladım. Düzeltiyorum.
8. evet birim tablosundaki son kodu alıyorum. Onu hemen düzeltiyorum.
Kullanıcı avatarı
pasa_yasar
Üye
Mesajlar: 570
Kayıt: 07 Haz 2004 12:35

Re: Arka planda kitlenmeden çalışacak uygulama

Mesaj gönderen pasa_yasar »

Delphi ustalarından bir süre eğitim almak lazım. Çok eksiğim var. Gün gibi ortaya çıkyor. Forumdaki ustalar ortaklaşa bir kitap veya pdf hazırlasalar çok iyi olur.
Cevapla