DegisimADOQuery.Close;
DegisimADOQuery.SQL.Clear;
DegisimADOQuery.SQL.Add('Select * from Degisim');
DegisimADOQuery.SQL.Add('where Teknisyen like ''%'+DBLookupComboBox1.Text+'%'' and (Degisim_Tarihi BETWEEN :Tar1 and :Tar2)');
DegisimADOQuery.Parameters.ParamByName('Tar1').Value :=DateToStr (DateTimePicker1.Date);
DegisimADOQuery.Parameters.ParamByName('Tar2').Value := DateToStr(DateTimePicker2.Date);
DegisimADOQuery.Open;
bu şart teknisyen alanını boş geçtiğimde sadece tarihler arası kayıt geliyor ve sonra benim istediğim seçtiğim tarihler arası kayıtlar hangi teknisyen adı kaç kere geçiyor onu hesaplamaya çalıştım ama count komutu verin tabanındaki bütün teknisyenlerin isim kaç kere geçtiğini hesaplıyor.Benim istediğim sadece dbgrid üzerine gelen kayıtlardaki teknisyen adı sayısını vermesin için aşağıdaki sql komutunda neresinde düzeltme yapabilirim.
DegisimADOQuery.Close;
DegisimADOQuery.SQL.Clear;
DegisimADOQuery.SQL.Add('SELECT Teknisyen, COUNT(*) AS Aylik FROM Degisim GROUP BY Teknisyen ORDER BY Teknisyen');
DegisimADOQuery.Open;
frxReport2.ShowReport();
- DBLookupComboBox1.Text boş olduğu zaman sadece tarih aralığındaki teknisyenler listelenir.
- Eğer Teknisyen bazında kısıtlama yapmak istemiyorsan 4ncü satırdaki "Teknisyen in (Select Teknisyen from Degisim where Teknisyen like ''%'+DBLookupComboBox1.Text+'%'' and " kısmını ve en sondaki parantez kapatma karakterini SQL içinden kaldırabilirsin.
- Son olarak eğer yoksa Teknisyen, Tar1, Tar2 kolonlarına database tablosuda indeks tanımlamanı öneririm.
DegisimADOQuery.Close;
DegisimADOQuery.SQL.Clear;
DegisimADOQuery.SQL.Add('SELECT Teknisyen, COUNT(*) AS Aylik FROM Degisim');
DegisimADOQuery.SQL.Add('Where Teknisyen in (Select Teknisyen from Degisim where Teknisyen like ''%'+DBLookupComboBox1.Text+'%'' and (Degisim_Tarihi BETWEEN :Tar1 and :Tar2))');
DegisimADOQuery.SQL.Add('GROUP BY Teknisyen ORDER BY Teknisyen');
DegisimADOQuery.Parameters.ParamByName('Tar1').Value := DateToStr(DateTimePicker1.Date);
DegisimADOQuery.Parameters.ParamByName('Tar2').Value := DateToStr(DateTimePicker2.Date);
DegisimADOQuery.Prepare;
DegisimADOQuery.Open;
- DBLookupComboBox1.Text boş olduğu zaman sadece tarih aralığındaki teknisyenler listelenir.
- Eğer Teknisyen bazında kısıtlama yapmak istemiyorsan 4ncü satırdaki "Teknisyen in (Select Teknisyen from Degisim where Teknisyen like ''%'+DBLookupComboBox1.Text+'%'' and " kısmını ve en sondaki parantez kapatma karakterini SQL içinden kaldırabilirsin.
- Son olarak eğer yoksa Teknisyen, Tar1, Tar2 kolonlarına database tablosuda indeks tanımlamanı öneririm.
DegisimADOQuery.Close;
DegisimADOQuery.SQL.Clear;
DegisimADOQuery.SQL.Add('SELECT Teknisyen, COUNT(*) AS Aylik FROM Degisim');
DegisimADOQuery.SQL.Add('Where Teknisyen in (Select Teknisyen from Degisim where Teknisyen like ''%'+DBLookupComboBox1.Text+'%'' and (Degisim_Tarihi BETWEEN :Tar1 and :Tar2))');
DegisimADOQuery.SQL.Add('GROUP BY Teknisyen ORDER BY Teknisyen');
DegisimADOQuery.Parameters.ParamByName('Tar1').Value := DateToStr(DateTimePicker1.Date);
DegisimADOQuery.Parameters.ParamByName('Tar2').Value := DateToStr(DateTimePicker2.Date);
DegisimADOQuery.Prepare;
DegisimADOQuery.Open;
Öncelikle uğraştığın için teşekkür kodun çalışıyor ama benim isteğim tam olarak tarihler arasındaki gelen kayıtlarda o teknisyenlerin hesaplamak burada veritabanındaki bütün kayıtların teknisyen isimleri hesaplıyor.İlgilenğiniz için teşekkürler.
Tarih aralığı kıstası çalışmaz ise eğer tablodaki tüm teknisyenler gösterilir. Ben senin ilk kodunu görünce o şekilde çalışıyor diye düşünmüştüm. Muhtemelen tarih parametresinde sorun vardır. İlgili satırları aşağıdaki gibi değiştirerek tekrar dener misin?
Ayrıca BETWEEN yerine ">=" ve "<=" kullanmanı öneririm. Yanlış biliyorsam beni düzeltin. BETWEEN tam olarak arasında demek. Verdiğin tarihler bunun dışında kalır. Bir yerde ">" ve "<" gibi çalışır.
ertank yazdı:Tarih aralığı kıstası çalışmaz ise eğer tablodaki tüm teknisyenler gösterilir. Ben senin ilk kodunu görünce o şekilde çalışıyor diye düşünmüştüm. Muhtemelen tarih parametresinde sorun vardır. İlgili satırları aşağıdaki gibi değiştirerek tekrar dener misin?
Ayrıca BETWEEN yerine ">=" ve "<=" kullanmanı öneririm. Yanlış biliyorsam beni düzeltin. BETWEEN tam olarak arasında demek. Verdiğin tarihler bunun dışında kalır. Bir yerde ">" ve "<" gibi çalışır.
Tarihler arası sorguda problem yok teknisyen isim boş geçilse bile o tarihler arasında kayıtlar geliyor ama hesaplarken veritabanındaki bütün teknisyenlere göre hesap yapıyor.
Memo1.Clear;
SERVIS_KABUL_DB.Close;
SERVIS_KABUL_DB.SQL.Clear;
SERVIS_KABUL_DB.SQL.Add(' SELECT Cari_ID, Genel_Cari_Unvan,TOPLAM.SAYI, TOPLAM.TOTAL');
SERVIS_KABUL_DB.SQL.Add(' FROM dbo.CARI_KART_LISTE PER,');
SERVIS_KABUL_DB.SQL.Add(' (SELECT TAMIR_EDEN,COUNT(SERVIS_ID) SAYI,SUM(SATIR_TOPLAMI) TOTAL');
SERVIS_KABUL_DB.SQL.Add(' FROM dbo.SERVIS_KAYIT');
SERVIS_KABUL_DB.SQL.Add(' WHERE (ISLEM_TARIHI BETWEEN :Tar1 and :Tar2)');
SERVIS_KABUL_DB.Parameters.ParamByName('Tar1').Value :=dtp1.Date; // FormatDateTime('DD/MM/YYYY',dtp1.date);
SERVIS_KABUL_DB.Parameters.ParamByName('Tar2').Value :=dtp2.Date; // FormatDateTime('DD/MM/YYYY',dtp2.date+1);
SERVIS_KABUL_DB.SQL.Add(' and CALISILAN_FIRMA='+QuotedStr(Ana_Pencere.DBEdit6.Text)+'');
if ComboBox1.Text<>'Tüm Kayıtlar' then
SERVIS_KABUL_DB.SQL.Add(' and MARKA_ADI='+QuotedStr(ComboBox1.Text)+'');
if ComboBox2.Text<>'' then
SERVIS_KABUL_DB.SQL.Add(' and MODEL_ADI='+QuotedStr(ComboBox2.Text)+'');
if ComboBox3.Text<>'Tüm Kayıtlar' then
SERVIS_KABUL_DB.SQL.Add(' and GARANTI='+QuotedStr(ComboBox3.Text)+'');
if ComboBox4.Text<>'Tüm Kayıtlar' then
SERVIS_KABUL_DB.SQL.Add(' and GUNCEL_DURUMU='+QuotedStr(ComboBox4.Text)+'');
SERVIS_KABUL_DB.SQL.Add('GROUP BY TAMIR_EDEN) TOPLAM');
SERVIS_KABUL_DB.SQL.Add('WHERE PER.Cari_ID=TOPLAM.TAMIR_EDEN');
SERVIS_KABUL_DB.SQL.Add('AND PER.CARI_TIP = '+QuotedStr('Personel')+'');
Memo1.Lines.add(SERVIS_KABUL_DB.SQL.Text);
SERVIS_KABUL_DB.Open;
sado.320 yazdı:
Tarihler arası sorguda problem yok teknisyen isim boş geçilse bile o tarihler arasında kayıtlar geliyor ama hesaplarken veritabanındaki bütün teknisyenlere göre hesap yapıyor.
İlgili tüm kodu paylaşabilir misin? Hesaplama yapmana gerek yok normalde bu SQL ile. SQL sonucu senin istediğin oluyor çünkü. Sanki hesabı sen kendin kod ile yapıyormuşsun gibi geldi bana yazdığından. Anlamadım.
sado.320 yazdı:
Tarihler arası sorguda problem yok teknisyen isim boş geçilse bile o tarihler arasında kayıtlar geliyor ama hesaplarken veritabanındaki bütün teknisyenlere göre hesap yapıyor.
İlgili tüm kodu paylaşabilir misin? Hesaplama yapmana gerek yok normalde bu SQL ile. SQL sonucu senin istediğin oluyor çünkü. Sanki hesabı sen kendin kod ile yapıyormuşsun gibi geldi bana yazdığından. Anlamadım.
hocam benim yapmak istediğim arttığım tarihler arasında hangi teknisyenin toplam ne kadar araca baktım bulmak istiyorum. Veritabanım daki alanlar
arama ekranım
kodum ise budur. Bu koda toplam işlemeni neresin eklemem lazım
DegisimADOQuery.Close;
DegisimADOQuery.SQL.Clear;
DegisimADOQuery.SQL.Add('Select * from Degisim');
DegisimADOQuery.SQL.Add('where Teknisyen like ''%'+DBLookupComboBox1.Text+'%'' and (Degisim_Tarihi BETWEEN :Tar1 and :Tar2)');
DegisimADOQuery.Parameters.ParamByName('Tar1').Value :=DateToStr (DateTimePicker1.Date);
DegisimADOQuery.Parameters.ParamByName('Tar2').Value := DateToStr(DateTimePicker2.Date);
DegisimADOQuery.Open;
Selam,
Sizin verdiğiniz tablo üzerinde hangi teknisyen hangi tarihte hangi plakaya (müşteriye) bakım yapmış onu görüyorsunuz, Hangi teknisyen kaç kez bakım yapmış şeklinde görmek isteseniz mecburen ayrı bir grid de göstermeniz gerekir, verdiğiniz tablo üzerinde gösteremezsiniz, yada gösterirsiniz ama biraz karmaşık bir sql yazmanız gerekir ki oda görüntü olarak hoş durmaz zaten, bunun için count(*) kullanmalısınız, ayrı bir query de ;
DegisimADOQuery.Close;
DegisimADOQuery.SQL.Clear;
DegisimADOQuery.SQL.Add('SELECT Teknisyen, COUNT(*) AS Aylik FROM Degisim GROUP BY Teknisyen where tarih>=T1 AND tarih<=:T2');
DegisimADOQuery.Open;
şeklinde (sizinde en başta yazdığınız) basit bir sorgu işinizi görecektir. Sadece tarih aralığı vermeniz yeterli olacaktır yani.
Select count(teknisyen) as bakimmiktari, teknisyen from....
Where....
Group by teknisyen
Select * fromdan sonra group by bircok field farkli degerler dondurecegi icin toplami alamaz.
Bunu asmak icin soyle yapilabilir. Deneme imkanim yok ama.
Select *, (Select count(teknisyen) from degisim where teknisyenadi like...) as degisimmiktari from degisim where
m_yaprakci yazdı:Select count(teknisyen) as bakimmiktari, teknisyen from....
Where....
Group by teknisyen
Select * fromdan sonra group by bircok field farkli degerler dondurecegi icin toplami alamaz.
Bunu asmak icin soyle yapilabilir. Deneme imkanim yok ama.
Select *, (Select count(teknisyen) from degisim where teknisyenadi like...) as degisimmiktari from degisim where
uğraştığın için teşekkür ederim. Sorunu çözdüm kod bu şekilde ;
DegisimADOQuery.Close;
DegisimADOQuery.SQL.Clear;
DegisimADOQuery.SQL.Add('SELECT Teknisyen, COUNT(*) AS Aylik FROM Degisim where (Degisim_tarihi between :tar1 and :tar2)GROUP BY Teknisyen ORDER BY Teknisyen');
DegisimADOQuery.Parameters.ParamByName('Tar1').Value :=DateToStr (DateTimePicker1.Date);
DegisimADOQuery.Parameters.ParamByName('Tar2').Value := DateToStr(DateTimePicker2.Date);
DegisimADOQuery.Open;
frxReport2.ShowReport();