sepet

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
zengin
Üye
Mesajlar: 233
Kayıt: 06 Ağu 2003 10:13

sepet

Mesaj gönderen zengin »

Merhaba,
bir sepet programımız var master detail günlük yapılan işleri müşterinin carisine yazıyoruz yazmada sıkıntı yok fakat kayıt sayısı yüzler binler artttıkca sistem kendisini kasıyor ve müşterinin carisine cari kodu nu yazmak dakikalar alıyor sizden ricam bunun daha hızlı olan bir cözüm yolu istiyorum kolay gelsin

Kod: Tümünü seç

var
 i : longint;
begin
Table2.DisableControls;
try
  Table2.First;
 for i:=1 to Table2.RecordCount do
  begin
    Table2.Edit;
    Table2KARTSIRANO_ID.Value:=Table17KARTSIRANO_ID.Value;
    Table2.Next;
  end;
finally
  Table2.EnableControls;
end;
 ShowMessage('İşlem Tamamlandı ?');
 end;
end;
Zengin
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: sepet

Mesaj gönderen ertank »

Merhaba,

Örnek verdiğiniz kod ile ilgili tek eksik gördüğüm döngüye başlamadan önce Table17 için DiableControls kullanmıyorsunuz. Onu da eklemenizde fayda var.
İkinci bir konu, I değişkenine yaptığınız işlemde ihtiyacınız yok. Kodu aşağıdaki şekilde ek değişken kullanmadan yazabilirsiniz.

Kod: Tümünü seç

  while not Table2.Eof do
  begin
    Table2.Edit;
    Table2KARTSIRANO_ID.Value:=Table17KARTSIRANO_ID.Value;
    Table2.Next;
  end;
Bunun dışında detaylı cevap verebilmek için yeterli bilgi yok.
Kullandığınız veritabanı nedir? Örn: paradox, dbase, firebird, mssql
Veritabanı erişimi için hangi kütüphaneyi kullanıyorsunuz? Örn: BDE, FireDAC, ADO, IBX, UniDAC

Eğer uygulama bu işlemi arka planda yapsa da olur ise işlemi thread içine alabilirsiniz. Kullanıcı ve uygulama çalışmaya devam ederken arka planda dakikalarca işlem devam eder. Tabi bunun için işlemin ve veritabanının thread erişimine uygun olması gerekir.
zengin
Üye
Mesajlar: 233
Kayıt: 06 Ağu 2003 10:13

Re: sepet

Mesaj gönderen zengin »

Merhaba,

Kod: Tümünü seç

while not Table2.Eof do
  begin
    Table2.Edit;
    Table2KARTSIRANO_ID.Value:=Table17KARTSIRANO_ID.Value;
    Table2.Next;
  end;
bu örnek kodu defalarca denedim bu sistem 100 kayıtta 50 kayıt atıyor sonra sistemden cıkıyor bu örnek cözüm olmuyor
veri tabanı firebird kullanıyorum sp veya triger yazılabilir fakat plaka veya tarih arası Süzdügüm zaman örnek 1000 kayıt icinden bazen 50/60 kayıt secmem gerekiyor tamda orası bana bir örnek lazım ?
Zengin
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: sepet

Mesaj gönderen ertank »

Örnek olarak gösterilen "while" döngüsü tablo sonu gelmeden durmaz. Eğer bu oluyor ise Table2 veya Table17 olaylarında (events) yapılan bir işlem kaynaklıdır ya da bize göstermediğiniz kodlarınız var ve orada yapılan bir işlem sebebiyle olabilir. Mesela çok gördüğüm Application.ProcessMessages kullanımı ekranda ilerleyen satırların kullanıcı tarafından en sonuna gidilmesine izin verebilir.

FirebirdSQL kullanıyorsanız kayıtları tek tek dolaşmadan tek bir SQL komutu ile güncelleme yapabiliyor olmalısınız. Örneğin bir Query nesnesine aşağıdaki benzeri bir SQL komutu ekleyip

Kod: Tümünü seç

update kart set sirano=:deger where carikod=:kod
parametrelerini aşağıdakine benzer şekilde düzenleyip çalıştırabilirsiniz.

Kod: Tümünü seç

Query1.ParamByName('deger').Value := Table17KARTSIRANO_ID.Value;
Query1.ParamByName('kod').Value := CariKodu;
Query1.ExecSQL;
Parametreler kullandığınız veritabanı bileşenlerine göre düzenlenmesi gerekecektir.
SQL içindeki "kart" güncelleme yaptığınız tablo adı, "carikod" ilgili tablo içinde bir kolondur. Sadece parametre olarak verilen belirli kayıtların cari kodların güncellenmesi için kullanılabilir. Sizin işleyişinize uygun şekilde güncellemeniz gerekir.

Komut çalıştıktan sonra Commit veya CommitRetaining kullanmalı ve Tablo nesnelerinin ekranda güncellenmesi gerekiyor ise kapat/aç veya yenile yapmalısınız.
zengin
Üye
Mesajlar: 233
Kayıt: 06 Ağu 2003 10:13

Re: sepet

Mesaj gönderen zengin »

Merhaba,

Kod: Tümünü seç

Query1.Close;
     Query1.SQL.Clear;
     Query1.SQL.Add('UPDATE kart SET KARTSIRANO_ID = '+Edit3.Text);
     Query1.SQL.Add('WHERE KARTSIRANO_ID = :KARTSIRANO_ID');
     Query1.ExecSQL;
üstadım teşekkür ederim kodlar dogru cözüm Yalnız Aşamadıgım Konu örnek kayıtlı olan 100 kayıt icinde plakasına göre süzdügüm 20 adet Kayıt numarasını
degiştirmek istiyorum
bu sistem sistemde 100 kayıt varsa hepsini degiştiriyor
bu konuda ne yapabilirim ben sadece süzmüş oldugum kadar KARTSIRANO_ID icinde sayı degiştirmek istiyorum ?
Zengin
ertank
Kıdemli Üye
Mesajlar: 1657
Kayıt: 12 Eyl 2015 12:45

Re: sepet

Mesaj gönderen ertank »

Merhaba,

İstediğinizi yapabilmek için "filtre" kısıtlarınızı biliyor olmalısınız. "Süzülmüş" dediğiniz filtre kolonunu ve değerini biliyorsanız eğer SQL içinde where koşuluna eklemelisiniz. Örneğin;

Kod: Tümünü seç

update kart set kartsirano_id = :yeniid where kartsirano_id=:eskiid and plaka=:plaka
Sonra sorgu ile aşağıdaki şekilde parametre değerlerini doldurup çalıştırabilirsiniz

Kod: Tümünü seç

Query1.ParamByName('yeniid').Value := Edit3.Text;
Query1.ParamByName('eskiid').Value := YeniCariKodu;
Query1.ParamByName('plaka').Value := Plaka;
Query1.ExecSQL();
Örnekleri özellikle parametre olarak veriyorum ki;
1- SQL injection denilen saldırılara karşı önlem oluyor
2- Tasarım zamanında nesne içine yazılan SQL çalışma zamanında hiç değiştirilmesi gerekmiyor.

Böylece sadece paramerte değerlerini değiştirerek işlem yapabilirsiniz. Yani Query nesnesini başka iş için kullanmayıp bu işe özel ayıracaksınız ve aşağıdaki satırları sileceksiniz

Kod: Tümünü seç

Query1.Close;
Query1.SQL.Clear;
Query1.SQL.Add('UPDATE kart SET KARTSIRANO_ID = '+Edit3.Text);
Query1.SQL.Add('WHERE KARTSIRANO_ID = :KARTSIRANO_ID');
Sadece parametre atamaları ve çalıştırmak yeterli olacak.
zengin
Üye
Mesajlar: 233
Kayıt: 06 Ağu 2003 10:13

Re: sepet

Mesaj gönderen zengin »

merhaba

üstadım
Önceki hatalı yer KARTSIRANO_ID düzenlenen dogru Alan PLAKA_NO = :PLAKA_NO alanı olunca işlem tamda istegim şekilde oluyor cok tekekkür ederim kolay gelsin

Kod: Tümünü seç

Query1.Close;
 Query1.SQL.Clear;
 Query1.SQL.Add('UPDATE kart SET KARTSIRANO_ID = '+Edit1.Text);
 Query1.SQL.Add('WHERE PLAKA_NO = :PLAKA_NO');
 Query1.SQL.Add('AND KARTSIRANO_ID = :KARTSIRANO_ID');
 Query1.ExecSQL;
Zengin
Cevapla