select first komutu?
-
- Üye
- Mesajlar: 47
- Kayıt: 26 Eki 2006 08:30
select first komutu?
merhaba arkadaşlar
ben yazdığım programda stok seçimini ve cari seçimini yaptığım bir formum var burada stok seçiminde
stok adı, stok kodu ve miktar sütunu var
kullanıcının 2200 adet stoğu olduğundan fatura ve benzeri işlemlerde stoğu seçmek istediğinde yazdığım Query tüm kayıtları getirdiği için program bu işlemde 5-10 saniye bekliyor (Queryinin tamamlanması için)
select first 100 komutu kullandım bu seferde sadece ilk 100 kayıt geliyor kullanıcının seçmek istediği stok bu 100 kayıtın arasında olmaya biliyor kullanıcı listede aşağıya doğru gittikce diğer kayıtları görmesini nasıl sağlayabilirim.
Mesela Mikro V11 ve V12 de Select top 100 komutu ile yapmış bu işlemi ancak listede aşağıya indikce diğer kayıtlarında olduğunu görebiliyoruz.
yardımlarınızı bekliyorum şimdiden teşekkürler...
ben yazdığım programda stok seçimini ve cari seçimini yaptığım bir formum var burada stok seçiminde
stok adı, stok kodu ve miktar sütunu var
kullanıcının 2200 adet stoğu olduğundan fatura ve benzeri işlemlerde stoğu seçmek istediğinde yazdığım Query tüm kayıtları getirdiği için program bu işlemde 5-10 saniye bekliyor (Queryinin tamamlanması için)
select first 100 komutu kullandım bu seferde sadece ilk 100 kayıt geliyor kullanıcının seçmek istediği stok bu 100 kayıtın arasında olmaya biliyor kullanıcı listede aşağıya doğru gittikce diğer kayıtları görmesini nasıl sağlayabilirim.
Mesela Mikro V11 ve V12 de Select top 100 komutu ile yapmış bu işlemi ancak listede aşağıya indikce diğer kayıtlarında olduğunu görebiliyoruz.
yardımlarınızı bekliyorum şimdiden teşekkürler...
Re: select first komutu?
Aradan epey bir zaman geçti çözüm buldunuz mu bilmiyorum. Fakat şu yöntemle çözebilirsiniz; Bu iş için öncelikle tüm sorgu için kayıt sayısını alıp 25 değerlerini her ihtiyaç olduğunda hesaplayıp sorguyu oluşturmanız gerekiyor.
Benzer bir konu: viewtopic.php?f=18&t=11111
Burada da anlatılmış: http://scott.yang.id.au/2004/01/limit-i ... -firebird/
Kod: Tümünü seç
select first 25 skip 25 * from tablo
Benzer bir konu: viewtopic.php?f=18&t=11111
Burada da anlatılmış: http://scott.yang.id.au/2004/01/limit-i ... -firebird/
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
-
- Üye
- Mesajlar: 47
- Kayıt: 26 Eki 2006 08:30
Re: select first komutu?
soruna henüz cevap bulamadım hocam. kayıtları listelediğim bileşen cxgrid ve insearch özelliğini kullanıcıya kolaylık olması için true yapıyorum. ilk 25 yada 100 kayıtı gösterince ilgili sütun üzerinden arama yapınca bulmuyor. ayrıca aşağıya doğru inip 25. kayıta geldiğinde query yeniden oluşturup close open yapınca sağlıklı olacak mı onu da bilmiyorum.
bunun yerine veritabanına bir table daha koyup epeyce de kod yazıp haraketleri giren cikan kalan şeklinde bu table de stok bazında saklamak ve bu yeni table de sorgunun hesap yapması 4000 kayıt içinde hesap yapmasına göre çok hızlı olacağını düşünüyorum. ancak dediğim gibi fatura, stok fişlerine, irsaliyeye bu işi hesaplayacak epeyce kod yazmam gerekecek. ilginizden dolayı teşekkür ederim.
bunun yerine veritabanına bir table daha koyup epeyce de kod yazıp haraketleri giren cikan kalan şeklinde bu table de stok bazında saklamak ve bu yeni table de sorgunun hesap yapması 4000 kayıt içinde hesap yapmasına göre çok hızlı olacağını düşünüyorum. ancak dediğim gibi fatura, stok fişlerine, irsaliyeye bu işi hesaplayacak epeyce kod yazmam gerekecek. ilginizden dolayı teşekkür ederim.
- sabanakman
- Kıdemli Üye
- Mesajlar: 3081
- Kayıt: 17 Nis 2006 08:11
- Konum: Ah bi Antalya olaydı keşke (Ankara)
Re: select first komutu?
FireBird bileşenlerine hakim değilim ama bir Provider üzerinden ClientDataSet ile bağlandığın herhangi bir dataset bileşeninden kısım kısım kayıt çekmek mümkün. Bunu da ClientDataSet bileşeninde bulunan PacketRecord özelliğine bir değer vererek yapabilirsin. Burada -1 varsa tüm kayıtlar anında çekilir ama 25 gibi bir değer verilirse ihtiyaç duyulan kayıtlar 25'er 25'er çekilecektir.
Şaban Şahin AKMAN
_________________
Derin olan kuyu değil kısa olan iptir. - .
_________________
Derin olan kuyu değil kısa olan iptir. - .
Re: select first komutu?
Sorunun yazılımsal büyük bir ihtimalle. Daha doğrusu cxGrid değil 4000 kayıt falan, 50 bin kayıtta sorun çıkartmaması gerekiyor. Yani 1-2 saniyeyi geçmemesi gerekiyor beklemelerin.
Kullandığın bileşen vs. dahil çok daha detaylı bilgi verirsen sorununun çözümünde yardımcı olunabilinir.
Benim şahsen cxGrid ile ilgili bildiğim bir problem tablolarda lookup alan kullanmakla ilgili. Lookup alan mümkünse kullanmamak gerekiyor. Kullanırsan da LookupCache := TRUE yapman gerekiyor. Eğer lookup alan varsa çıkartıp denersen farkı rahatlıkla görebilirsin.
Diğer şekilde kayıtları parça parça getirmek, yazılım tekniği açısından hiç de uygun gözükmüyor ki devasa külfet getirir sana. Onun yerine master-detail yapıyı gerekirse 3-4 aşamalı yapmak daha uygun olacaktır.
İyi çalışmalar.
Kullandığın bileşen vs. dahil çok daha detaylı bilgi verirsen sorununun çözümünde yardımcı olunabilinir.
Benim şahsen cxGrid ile ilgili bildiğim bir problem tablolarda lookup alan kullanmakla ilgili. Lookup alan mümkünse kullanmamak gerekiyor. Kullanırsan da LookupCache := TRUE yapman gerekiyor. Eğer lookup alan varsa çıkartıp denersen farkı rahatlıkla görebilirsin.
Diğer şekilde kayıtları parça parça getirmek, yazılım tekniği açısından hiç de uygun gözükmüyor ki devasa külfet getirir sana. Onun yerine master-detail yapıyı gerekirse 3-4 aşamalı yapmak daha uygun olacaktır.
İyi çalışmalar.
-
- Üye
- Mesajlar: 47
- Kayıt: 26 Eki 2006 08:30
Re: select first komutu?
seçim formumda stok kodu stok adı stok miktarı gözüküyor stok miktarını ise girilen haraketleri hesaplayarak buluyorum. bunun için veritabanında bir stored procedurem ve bir viewim var program içerisinden bu viewi çağırıyorum
CREATE PROCEDURE PR_GERCEKSTOK(
STOK_ID INTEGER)
RETURNS(
GERCEKSTOK FLOAT)
AS
BEGIN
SELECT
SUM(CASE WHEN (STH_TIP=0) then
STH_MIKTAR WHEN (STH_TIP=1) then
-1*STH_MIKTAR ELSE 0 END)
from stok_hareketleri
where (sth_stok_recno=:stok_id)
INTO :GERCEKSTOK;
/* Procedure body */
SUSPEND;
END
//-------------
CREATE VIEW STOK_CHOOSE_1 (
STO_RECNO,
STO_KOD,
STO_ISIM,
GERCEKSTOK)
AS
SELECT S.STO_RECNO,S.STO_KOD,S.STO_ISIM,
(SELECT GERCEKSTOK FROM PR_GERCEKSTOK(S.STO_RECNO)) AS GERCEKSTOK
FROM STOK S
program içerisinden ise querye select * from STOK_CHOOSE_1 yazmam yeterli oluyor ama işte program tüm stoklar için kalan miktarı yani gerçek stoğu stok_hareketleri tablosundan hesaplayıp bulduğu için formun açılması uzun sürüyor
ama yukarıda da yazdığım gibi sanırım bir yeni table ekleyip stok hareketlerini toplayıp giren cikan kalan şeklinde saklamak ve seçim ekranını inner join gibi bir kodla getirmek
kolay gelsin herkese teşekkür ederim ilgilerinizden dolayı
CREATE PROCEDURE PR_GERCEKSTOK(
STOK_ID INTEGER)
RETURNS(
GERCEKSTOK FLOAT)
AS
BEGIN
SELECT
SUM(CASE WHEN (STH_TIP=0) then
STH_MIKTAR WHEN (STH_TIP=1) then
-1*STH_MIKTAR ELSE 0 END)
from stok_hareketleri
where (sth_stok_recno=:stok_id)
INTO :GERCEKSTOK;
/* Procedure body */
SUSPEND;
END
//-------------
CREATE VIEW STOK_CHOOSE_1 (
STO_RECNO,
STO_KOD,
STO_ISIM,
GERCEKSTOK)
AS
SELECT S.STO_RECNO,S.STO_KOD,S.STO_ISIM,
(SELECT GERCEKSTOK FROM PR_GERCEKSTOK(S.STO_RECNO)) AS GERCEKSTOK
FROM STOK S
program içerisinden ise querye select * from STOK_CHOOSE_1 yazmam yeterli oluyor ama işte program tüm stoklar için kalan miktarı yani gerçek stoğu stok_hareketleri tablosundan hesaplayıp bulduğu için formun açılması uzun sürüyor
ama yukarıda da yazdığım gibi sanırım bir yeni table ekleyip stok hareketlerini toplayıp giren cikan kalan şeklinde saklamak ve seçim ekranını inner join gibi bir kodla getirmek
kolay gelsin herkese teşekkür ederim ilgilerinizden dolayı
Re: select first komutu?
Stok hareketlerine trigger ekleyebilirsin.
Silme durumunda old.miktari stok kartindaki toplammiktar gibi bir alandan cikaracak, degisiklik olunca ise old.miktari çıkarıp, new.miktari ekleyecek. Yeni kayıt ekleme durumunda ise dogrudan new.miktari toplatırsın. Stok hareketlerinde herhangi bir degişiklik oldugu zaman trigger stok kartının durumunu güncelleyecektir. Triggerlari yazmak ilk basta biraz ugrastirsa da, performans olarak ugrastigina deger.
Bir sorun olursa veya yedeklemeler sonucu bu toplammiktar dogru bilgi göstermezse, ekstra bir hareket_duzenle stored procedure ile hareket toplamları sonucunu stok kartlarına aktarabilirsin.
Silme durumunda old.miktari stok kartindaki toplammiktar gibi bir alandan cikaracak, degisiklik olunca ise old.miktari çıkarıp, new.miktari ekleyecek. Yeni kayıt ekleme durumunda ise dogrudan new.miktari toplatırsın. Stok hareketlerinde herhangi bir degişiklik oldugu zaman trigger stok kartının durumunu güncelleyecektir. Triggerlari yazmak ilk basta biraz ugrastirsa da, performans olarak ugrastigina deger.
Bir sorun olursa veya yedeklemeler sonucu bu toplammiktar dogru bilgi göstermezse, ekstra bir hareket_duzenle stored procedure ile hareket toplamları sonucunu stok kartlarına aktarabilirsin.
Re: select first komutu?
Diğer arkadaşların da dediği gibi son stok miktarını trigger lerleekletip eksilterek stok kartındaki bi alanda tuttabilirsin. Fakat ara stok durumları için yaptığın söntem veye benzeri sorgu ile çekilmek zorunda.
Sorunun başına dönersek yavaş olmasından şikayetiniz vardı. 2200 kalem stok kartının tüm alanlarını çekmeye gerek yok tabi. Sadece kodu, adı, ve miktarı gibi alanlar haricindekileri özellikle select * .. şeklinde kullanmadan deneyebilirsiniz. Bu da yeterli olmazsa DataModule formunda ya da ortak kullandığınız form hangisi ise orada bir adet MemTable koyup program açılırken bu mevzu bahsı alanları o tabloya doldurabilirsiniz. Daha sonra da lookup larda bu tabloyu atayacağınız DataSource u kullanabilirsiniz. Tabi burada her yeni stok kartı eklemede ve silmede bu MemTable tablosu yenilenmeli!! Bu da makul kayıt sayısında kullanılabilecek bir yöntem.
Sorunun başına dönersek yavaş olmasından şikayetiniz vardı. 2200 kalem stok kartının tüm alanlarını çekmeye gerek yok tabi. Sadece kodu, adı, ve miktarı gibi alanlar haricindekileri özellikle select * .. şeklinde kullanmadan deneyebilirsiniz. Bu da yeterli olmazsa DataModule formunda ya da ortak kullandığınız form hangisi ise orada bir adet MemTable koyup program açılırken bu mevzu bahsı alanları o tabloya doldurabilirsiniz. Daha sonra da lookup larda bu tabloyu atayacağınız DataSource u kullanabilirsiniz. Tabi burada her yeni stok kartı eklemede ve silmede bu MemTable tablosu yenilenmeli!! Bu da makul kayıt sayısında kullanılabilecek bir yöntem.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!