DBGrid deki Kayıtları silmek !!!

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
ozcank
Üye
Mesajlar: 925
Kayıt: 28 Nis 2005 05:29

DBGrid deki Kayıtları silmek !!!

Mesaj gönderen ozcank »

Merhaba;

Bu şekilde bir kodla sıfır bakiyeleri buluyorum ;

ESILRapor.close;

ESILRapor.sql.clear;

ESILRapor.sql.add('SELECT ESTOK_KODU,ESTOK_ADI,EOLCU_BR1,EFISNO,ECARI_ISIM,');

ESILRapor.sql.add('SUM(CASE WHEN EGCTIP='+#39+'G'+#39+' then ESTHAR_GCMIK else 0 end) [Giren Mik.],');

ESILRapor.sql.add('SUM(CASE WHEN EGCTIP='+#39+'C'+#39+' then ESTHAR_GCMIK else 0 end) [Çıkan Mik.],');

ESILRapor.sql.add('SUM((CASE WHEN EGCTIP='+#39+'G'+#39+ ' then ESTHAR_GCMIK else 0 end)-(CASE WHEN EGCTIP='+#39+'C'+#39+' then ESTHAR_GCMIK else 0 end)) [Kalan Mik.] ');

ESILRapor.sql.add('FROM TBLEMANET GROUP BY ESTOK_KODU,ESTOK_ADI,EOLCU_BR1,EFISNO,ECARI_ISIM');

ESILRapor.SQL.Add('HAVING SUM((CASE WHEN EGCTIP='+#39+'G'+#39+ ' then ESTHAR_GCMIK else 0 end)-(CASE WHEN EGCTIP='+#39+'C'+#39+' then ESTHAR_GCMIK else 0 end)) <= 0');

ESILRapor.open;

Stok da sıfır bakiyeleri DBGrid de 4 sütün da görüntülüyorum ve "Kalan Mik." sıfır ise kayıtları silecek.

tabi sıfır olmayan kayıtlar da var

burda silmeyi nasıl kullanabilirim?
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: DBGrid deki Kayıtları silmek !!!

Mesaj gönderen ertank »

Merhaba,

Öncelikle bazı noktalara dikkat çekmek istiyorum.

1- ESILRapor.SQL içine tasarım aşamasında aşağıdaki gibi bir ifade yazarsanız:

Kod: Tümünü seç

SELECT ESTOK_KODU,ESTOK_ADI,EOLCU_BR1,EFISNO,ECARI_ISIM,
  SUM(CASE WHEN EGCTIP='G' then ESTHAR_GCMIK else 0 end) [Giren Mik.],
  SUM(CASE WHEN EGCTIP='C' then ESTHAR_GCMIK else 0 end) [Çıkan Mik.],
  SUM((CASE WHEN EGCTIP='G' then ESTHAR_GCMIK else 0 end)-(CASE WHEN EGCTIP='C' then ESTHAR_GCMIK else 0 end)) [Kalan Mik.]
FROM TBLEMANET GROUP BY ESTOK_KODU,ESTOK_ADI,EOLCU_BR1,EFISNO,ECARI_ISIM
HAVING SUM((CASE WHEN EGCTIP='G' then ESTHAR_GCMIK else 0 end)-(CASE WHEN EGCTIP='C' then ESTHAR_GCMIK else 0 end)) <= 0
#39 gibi kodu okumayı zorlaştıran bir kullanımına gerek kalmamış olur ve daha sonra kullanımı aşağıdaki gibi olabilir.

Kod: Tümünü seç

ESILRapor.Close();
ESILRapor.Prepare();
ESILRapor.Open();
2- Sorunuzda sıfır olan kayıtları silmekten bahseder iken ne istediğiniz net anlaşılmıyor.
A- Bakiyesi sıfır olan tüm stok hareketlerini mi silmek istiyorsunuz?
B- Sorgu içinde bakiyesi sıfır olan kayıt görmek istemiyor musunuz?

Eğer esas soru A ise tablo yapınızı bilmediğimiz için hazır kullanabileceğiniz bir kod/sql yazmak mümkün değil.

Eğer esas soru B ise sorguda ufak bir değişiklik ile sıfır bakiyeli kayıtların listelenmemesini sağlayabilirsiniz. HAVING SUM ile başlayan satırın sonundaki "<= 0" yerine "< 0" yazabilirsiniz.
ozcank
Üye
Mesajlar: 925
Kayıt: 28 Nis 2005 05:29

Re: DBGrid deki Kayıtları silmek !!!

Mesaj gönderen ozcank »

Hayır Bakiyesi sıfır olan tüm kayıtları silmek istiyorum.
ozcank
Üye
Mesajlar: 925
Kayıt: 28 Nis 2005 05:29

Re: DBGrid deki Kayıtları silmek !!!

Mesaj gönderen ozcank »

Hayır Bakiyesi sıfır olan tüm kayıtları silmek istiyorum. Tablo 1 tane TBLEMANET hepsi bunun içerisinde. ve alanlar da ESTOK_KODU,ESTOK_ADI,EOLCU_BR1,EFISNO,ECARI_ISIM
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: DBGrid deki Kayıtları silmek !!!

Mesaj gönderen ertank »

İstediğiniz birkaç yöntem ile yapılabilir. Aklıma gelen ilk yöntem:

Formda iki tane Query nesnesi olsun. İlkinin adı belli ESILRapor. İkincisinin adı qryESIL2 olsun. İlk sorguyu aşağıdaki şekilde değiştirin

Kod: Tümünü seç

SELECT ESTOK_KODU,ESTOK_ADI,EOLCU_BR1,EFISNO,ECARI_ISIM,
FROM TBLEMANET GROUP BY ESTOK_KODU,ESTOK_ADI,EOLCU_BR1,EFISNO,ECARI_ISIM
HAVING SUM((CASE WHEN EGCTIP='G' then ESTHAR_GCMIK else 0 end)-(CASE WHEN EGCTIP='C' then ESTHAR_GCMIK else 0 end)) = 0
qryESIL2 sorgusunu çalışma zamanında aşağıdaki gibi tanımlayın

Kod: Tümünü seç

delete from TBLEMANET
where ESTOK_KODU = :KOD AND ESTOK_ADI = :AD AND EOLCU_BR1 = :BIRIM AND EFISNO = :FIS AND ECARI_ISIM = :ISIM
Kodunuzu aşağıdaki şekilde değiştirin.

Kod: Tümünü seç

ESILRapor.Close();
ESILRapor.Prepare();
ESILRapor.Open();

qryESIL2.Prepare();

ESILRapor.First();
while not ESILRapor.Eof do
begin
  qryESIL2.Params[0].AsString := ESILRapor.FieldByName('ESTOK_KODU').AsString;
  qryESIL2.Params[1].AsString := ESILRapor.FieldByName('ESTOK_ADI').AsString;
  qryESIL2.Params[2].AsString := ESILRapor.FieldByName('EOLCU_BR1').AsString;
  qryESIL2.Params[3].AsString := ESILRapor.FieldByName('EFISNO').AsString;
  qryESIL2.Params[4].AsString := ESILRapor.FieldByName('ECARI_ISIM').AsString;
  qryESIL2.ExecSQL();

  ESILRapor.Next();
end;
Bu kod sonrasında normal sorgunuzu çalıştırın.

NOT: Kullandığınız Query nesnesini bilinmiyor. Bu sebepten Params[0] noktasında derleme hatası alırsanız Parameters[0] şeklinde kodu değiştirmeniz gerekebilir.
ozcank
Üye
Mesajlar: 925
Kayıt: 28 Nis 2005 05:29

Re: DBGrid deki Kayıtları silmek !!!

Mesaj gönderen ozcank »

DBGrid de rapor olarak alıyorum dbgrid de listelenen kayıtları delete edebilir miyim?
veya
DBGrid deki kayıtları Mouse ile seçip sağ klik sil diyebilirmiyim?
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: DBGrid deki Kayıtları silmek !!!

Mesaj gönderen ertank »

Anladığım kadarıyla bu yeni bir soru. Kısa cevabı evet.

DBGrid zaten bir TDataSet içeriğini ekranda göstermeye yarar. Siz "dbgrid de listelenen kayıtları delete edebilir miyim?" dediğinizde esasen sorduğunuz soru TDataSet içinden ilgili kayıtları silmek oluyor. Bunu SQL kullanarak yapmanız mümkün.

Bir önceki cevabımda tarif etmeye çalıştığım qrySIL2 sorgusunu tasarım zamanında hazırlarsanız herhangi bir kayıt üzerinde sağ tuş ile tıklayıp sildirmeniz mümkün. Tıklama altına yazmanız gereken kod yine önceki cevabın bir parçası.

Kod: Tümünü seç

  qryESIL2.Params[0].AsString := DBGrid1.DataSource.DataSet.FieldByName('ESTOK_KODU').AsString;
  qryESIL2.Params[1].AsString := DBGrid1.DataSource.DataSet.FieldByName('ESTOK_ADI').AsString;
  qryESIL2.Params[2].AsString := DBGrid1.DataSource.DataSet.FieldByName('EOLCU_BR1').AsString;
  qryESIL2.Params[3].AsString := DBGrid1.DataSource.DataSet.FieldByName('EFISNO').AsString;
  qryESIL2.Params[4].AsString := DBGrid1.DataSource.DataSet.FieldByName('ECARI_ISIM').AsString;
  qryESIL2.ExecSQL();

  // Silinen kaydı ekrandan da kaldırmak için aşağıdaki kod gerekebilir
  DBGrid1.DataSource.DataSet.Close();
  DBGrid1.DataSource.DataSet.Open();
NOT: DBGrid adını kendinize göre uyarlamanız gerekir.
ozcank
Üye
Mesajlar: 925
Kayıt: 28 Nis 2005 05:29

Re: DBGrid deki Kayıtları silmek !!!

Mesaj gönderen ozcank »

Ben işin içinden çıkamadım, şöyle ki;

TBLEMANET Tablom var ve bu tablo şu şekilde ;
RESIM.JPG
RESIM.JPG (8.72 KiB) 2722 kere görüntülendi
Burda şunu yapamadım Müşteri emanete 1 stok için 30 adet ürün bırakıyor ve bu ürünü aralıklı zamanlarda 10 tane 5 er tane alarak ürünü bitiriyor.
ben bu ürünün DBGrid e raporunu alıyorum tabi tek kayıt olarak
RESIM1.JPG
RESIM1.JPG (8.64 KiB) 2722 kere görüntülendi

Tabloda bu ürüne ait çıkışı olan tüm kayıtları sildikten sonra da Cari ve ilk ürünün girişini silmek istiyorum.
Not : Tabi Müşteri birkaç ürün de bırakmış olabilir ve bu ürünlerden bir tanesini sıfırlamış da olabilir, diğer ürünlerin alımına devam edecek .

Bu şekilde bana yardımcı olabilir misiniz?

Ben DBGrid1 'e PopupMenu1 ekledim ve tüm kayıtları sil in içine de sql kodu yazdım

Kod: Tümünü seç

procedure TForm17.mKaytlarSil1Click(Sender: TObject);
var
ESTOK_KODU:string;
ESKOD:STring;
ESTOKSILCevap:Word;
  begin
//ESTOK_KODU:=trim(ESTOKSIL.fields[8].asstring);
Application.MessageBox('Seçtiğiniz Stok Emanet Kaydı Bitmiş!!! STOK SİLİNECEK !!!','Bilgilendirme Mesajı',MB_ICONINFORMATION);
ESTOKSIL.Close;
ESTOKSIL.SQL.Clear;
ESTOKSIL.SQL.add('DELETE FROM TBLEMANET WHERE ESTOK_KODU=:ESKOD');
ESTOKSIL.ExecSQL;
ESTOKSIL.Close;
ESTOKSILCevap:=Application.MessageBox('Silme İşlemi Yapıldı !!!  Devam Edecekmisiniz ? ','Silme İşlemi',MB_YESNO);
    if ESTOKSILCevap=mrYes Then
  begin
end
Else
DBGrid1.Visible:=False;
  end;//sil
Silmedi.
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: DBGrid deki Kayıtları silmek !!!

Mesaj gönderen ertank »

Kod genel olarak doğru. Sadece parametre ataması yapmamışsınız. Aşağıdaki şekilde çalışması gerekli.

Kod: Tümünü seç

procedure TForm17.mKaytlarSil1Click(Sender: TObject);
begin
  // Kullanıcı yanlışlıkla SİL tıklamış olabilir. Onay alalım
  if MessageDlg('Seçtiğiniz Stok Emanet Kaydı Bitmiş!!! STOK SİLİNECEK !!! Emin misiniz?', mtConfirmation, [mbYes, mbNo], 0) <> mrYes then Exit();

  ESTOKSIL.Close();
  ESTOKSIL.SQL.Clear();
  ESTOKSIL.SQL.Add('DELETE FROM TBLEMANET WHERE ESTOK_KODU=:ESKOD');
  ESTOKSIL.Params[0].AsString := DBGrid1.DataSource.DataSet.FieldByName('ESTOK_KODU').AsString;
  ESTOKSIL.ExecSQL();
  ESTOKSIL.Close();
  DBGrid1.Visible := MessageDlg('Silme İşlemi Yapıldı !!!  Devam edecek misiniz ? ', mtConfirmation, [mbYes, mbNo], 0) = mrYes;
end;//sil
Eğer derleme zamanında Params[0] için hata mesajı alırsanız Parameters[0] şeklinde değiştirmeyi deneyebilirsiniz. Kullandığınız database erişim bileşenine göre kodun bu kısımı değişiklik gösterir.
ozcank
Üye
Mesajlar: 925
Kayıt: 28 Nis 2005 05:29

Re: DBGrid deki Kayıtları silmek !!!

Mesaj gönderen ozcank »

Yardımların için size çok Teşekkür ederim.

Kod çalıştı ufak değişiklik yaptım şöyle ki;

bu şekildeydi.

Kod: Tümünü seç

 ESTOKSIL.Params[0].AsString := DBGrid1.DataSource.DataSet.FieldByName('ESTOK_KODU').AsString
değiştirdim.

Kod: Tümünü seç

 ESTOKSIL.Parameters[0].Value:= DBGrid1.DataSource.DataSet.FieldByName('ESTOK_KODU').Asstring;
ozcank
Üye
Mesajlar: 925
Kayıt: 28 Nis 2005 05:29

Re: DBGrid deki Kayıtları silmek !!!

Mesaj gönderen ozcank »

Bir şey daha sormak istiyorum; DBGrid1 de listelenen kayıtları bir Button1 yardımı ile tümünü seç diyebilir miyim? sonrada Button2 ile de Tümünü Sil diyebilir miyim? O zaman kod yapısı değişir mi ? mevcut kodları kullanabilir miyim ?
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: DBGrid deki Kayıtları silmek !!!

Mesaj gönderen ertank »

1- DBGrid içindeki kayıtlara "tümünü seç" diyemezsiniz.
2- DBGrid içindeki kayıtların tümünü silmek için ayrı bir kod yazıp bunu kullanabilirsiniz.

İkinci seçenek için mevcut kod içinde uyarlamalar gerekmektedir.
ozcank
Üye
Mesajlar: 925
Kayıt: 28 Nis 2005 05:29

Re: DBGrid deki Kayıtları silmek !!!

Mesaj gönderen ozcank »

Peki döngüye nasıl alırım ?

Bu Kodu kullanabilirmiyim?

Kod: Tümünü seç

  ESTOKSIL.Close();
  ESTOKSIL.SQL.Clear();
  ESTOKSIL.SQL.Add('DELETE FROM TBLEMANET WHERE ESTOK_KODU=:ESKOD');
  ESTOKSIL.Params[0].AsString := DBGrid1.DataSource.DataSet.FieldByName('ESTOK_KODU').AsString;
  ESTOKSIL.ExecSQL();
  ESTOKSIL.Close();
ertank
Kıdemli Üye
Mesajlar: 1650
Kayıt: 12 Eyl 2015 12:45

Re: DBGrid deki Kayıtları silmek !!!

Mesaj gönderen ertank »

Uygulamanın içeriğini tam bilmemek ile birlikte aşağıdaki gibi bir kod yazabilirsiniz diye düşünüyorum.

Kod: Tümünü seç

procedure DeleteAllZeroRecords(Data: TDataSet);
var
  Query: TADOQuery;
begin
  if not Assigned(Data) then Exit();

  Query := TADOQuery.Create(nil);
  try
    Query.Connection := TAdoQuery(Data).Connection;
    Query.SQL.Add('DELETE FROM TBLEMANET WHERE ESTOK_KODU=:ESKOD');

    Data.First();
    while not Data.Eof do
    begin
      // Kalan miktarı sıfır olan kayıtları silmek istiyoruz
      if Data.FieldByName('Kalan Mik.').AsFloat = 0 then
      begin
        Query.Parameters[0].Value := Data.FieldByName('ESTOK_KODU').AsString;
        Query.ExecSQL();
      end;

      Data.Next();
    end;
  finally
    Query.Free();
  end;
end;
Yukarıdaki prosedürü kullanmak için aşağıdaki gibi bir kod yazabilirsiniz.

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Silinecek kayıt içeren DataSet parametre olarak gönderilir. 
  DeleteAllZeroRecords(DBGrid1.DataSource.DataSet);

  // Kayıtların silindiği Query yeniden çalıştırılmadan anlaşılmaz.
  TAdoQuery(DBGrid1.DataSource.DataSet).Refresh();
end;
bestofhoke
Üye
Mesajlar: 30
Kayıt: 14 Mar 2017 04:01

Re: DBGrid deki Kayıtları silmek !!!

Mesaj gönderen bestofhoke »

Hocam benimde böyle bir sıkıntım nasıl yaparım kodu inceledim ancak biraz farklı benim istediğim burada arkadaş dbgrid de bakiyesi 0 olanları siliyor anlaşılan ancak ben dbgridde ki tüm kayıtları silmeyi istiyorum nasıl yapabilirim.
Ve programı yeniden başlatınca 1.kayıttan başlasın istiyorum ancak nasıl yapabilirim.yardımcı olur musunuz?
Paradox veritabanı datasource ve Query kullanıyorum.
Cevapla