select first komutu?

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
BLuE_ALoNE
Üye
Mesajlar: 47
Kayıt: 26 Eki 2006 08:30

select first komutu?

Mesaj gönderen BLuE_ALoNE »

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...
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Re: select first komutu?

Mesaj gönderen rsimsek »

Aradan epey bir zaman geçti çözüm buldunuz mu bilmiyorum. Fakat şu yöntemle çözebilirsiniz;

Kod: Tümünü seç

select first 25 skip 25 * from tablo
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/
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
BLuE_ALoNE
Üye
Mesajlar: 47
Kayıt: 26 Eki 2006 08:30

Re: select first komutu?

Mesaj gönderen BLuE_ALoNE »

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.
Kullanıcı avatarı
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?

Mesaj gönderen sabanakman »

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. - .
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Re: select first komutu?

Mesaj gönderen Hakan Can »

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.
BLuE_ALoNE
Üye
Mesajlar: 47
Kayıt: 26 Eki 2006 08:30

Re: select first komutu?

Mesaj gönderen BLuE_ALoNE »

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ı
mehmetcan
Üye
Mesajlar: 63
Kayıt: 14 Tem 2008 05:19

Re: select first komutu?

Mesaj gönderen mehmetcan »

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.
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Re: select first komutu?

Mesaj gönderen rsimsek »

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.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Cevapla