Firebird 1.5.1 de SP lerin ilk kullanımındaki Yavaşlık
- coskundeniz
- Üye
- Mesajlar: 22
- Kayıt: 20 Ara 2003 11:36
Firebird 1.5.1 de SP lerin ilk kullanımındaki Yavaşlık
Yazdığımız bir projede, SP ilk kez kullanıldığında bazen işini yapması 10-15 saniyeyi geçiyor, Bu SP'de select işlemleri yapılıyor ve bu select'ler de erişilen tablolara hep "primary key" üzerinden ulaşılıyor, Tabloda kayıt sayıcı çok ama kullanılan kriter olarak 5-10 kayıt dönen işlemler. SP birinci kullanımdan sonra ms düzeyinde işlerini bitirebiliyor. VT'de SP sayısı arttıkça ve SP ün kodu büyüdükçe süre daha da uzayabiliyor. Bu örnekte ki SP ün Text meta sı 25 KB civarında.
Bu site dahil olmak üzere, bir çok sitede bu sorunun kaynağını bulmak üzere arama yaptım, fakat henüz sebebini tespit etmeye yarayacak bir döküman bulamadım.
Tablo Sayısı : 385
SP Sayısı : 655
Trigger Sayısı : 600 civarı
View Sayısı : 66
VT : 1.2 GB Civarı
FB Version : 1.5.1
İlgilenecek arakadaşlara şimdiden teşekkürler
Bu site dahil olmak üzere, bir çok sitede bu sorunun kaynağını bulmak üzere arama yaptım, fakat henüz sebebini tespit etmeye yarayacak bir döküman bulamadım.
Tablo Sayısı : 385
SP Sayısı : 655
Trigger Sayısı : 600 civarı
View Sayısı : 66
VT : 1.2 GB Civarı
FB Version : 1.5.1
İlgilenecek arakadaşlara şimdiden teşekkürler
- Terminator
- Üye
- Mesajlar: 313
- Kayıt: 13 Ara 2005 01:45
- Konum: İzmir, ama Aydın Efesi!
Öncelikle, ücretsiz ve çok hızlı upgrade edilebilen bir RDBMS in niye eski versiyonunu kullandığını anlayamadım.
Bir SP nin kendisi yavaş çalışmaz. yavaş çalışan içindeki IO yapan SQL komutlarıdır. Yani bir SP 60 KB bile olsa CPU hızında çalışır eğer bir query kullanmıyorsa.
Senin SP ilk çalıştırıldığında yavaş çalışır çünkü, henüz tüm bilgiler disktedir ve tek tek(sayfa sayfa) okunması gerekir. daha sonraki çalıştırmalarda sayfaların bir kısmı db cache bufferdan ve windows disk cache bufferindan alınacağı için mekanik IO sayısı azalacak ve hızlanacaktır.
Neler yapabilrsin:
Sorgularını optimize edip IO işlemini azaltabilirsin.
dbcachebufferini artırabilirsin.
windowsun daha fazla disk alanını cachelemesine imkan verebilirsin. vs..
Diğer veritabanları daha fazla sistem kaynağını gaspettiği için bazı
durumlarda hızlı görünmesi normaldir.
Bir SP nin kendisi yavaş çalışmaz. yavaş çalışan içindeki IO yapan SQL komutlarıdır. Yani bir SP 60 KB bile olsa CPU hızında çalışır eğer bir query kullanmıyorsa.
Senin SP ilk çalıştırıldığında yavaş çalışır çünkü, henüz tüm bilgiler disktedir ve tek tek(sayfa sayfa) okunması gerekir. daha sonraki çalıştırmalarda sayfaların bir kısmı db cache bufferdan ve windows disk cache bufferindan alınacağı için mekanik IO sayısı azalacak ve hızlanacaktır.
Neler yapabilrsin:
Sorgularını optimize edip IO işlemini azaltabilirsin.
dbcachebufferini artırabilirsin.
windowsun daha fazla disk alanını cachelemesine imkan verebilirsin. vs..
Diğer veritabanları daha fazla sistem kaynağını gaspettiği için bazı
durumlarda hızlı görünmesi normaldir.
Firebird Foundation Member #208
http://www.firebirdsql.org
http://www.firebirdsql.org
Sorgunun çalıştırılması esnasında VT den okunan bilginin işletim sistemi tarafından tamponlanması hızı artırabilir. Fakat tamponlanan veri bellek/ram da değil de disk cache belleğinde /sanal bellek ise yine mekanik disk okuması gerekecektir. Mekanizmayı tam bilmemekle beraber veritabanı da bir önceki sorguyu ve sonucunu tamponlayıp sonucu sorgu değişmemişse sorguyu işletmeden/execute etmeden hızlı getiriyor olabilir. Böyle bir şey duymuştum. Hangi VT için hatırlamıyorum
Büyük ihtimalle öyledir. Yoksa 1.2 GB. veriyi dediğiniz sürede taraması imkansız gibi bir şeydir. Merak ettiğim sorgu kriterini uzun süren kriterden tamamen farklı bir kriter ile çalıştırdığınızda da aynı hızla geliyor mu




Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
- coskundeniz
- Üye
- Mesajlar: 22
- Kayıt: 20 Ara 2003 11:36
Öncelikle önerileriniz ve ilginiz için Teşekkürler,
Terminator arkadaşımızın önerdiği yöntemleri, bu yazıyı yazmadan önce denemiştim. Bugün, Sorunun kaynağını daha iyi tespit edebilmek için yeni bazı testler yaptım.
ilk olarak bu yavaşlığın SP ilk yüklenmesindenmi yoksa içindeki kodun çallıştırılmasından mı olduğunu anlamak için SP ün ilk satırına suspend ve exit satırı ekledim, böylece SP içinde 2 satır dışında bir kod çalıştırılmamış oldu, sonuçta süre gene 10-15 sn civarında çıktı. Sonra SP içinde exit bloğunun dışında kalan ve çalışmayan kodu SP içinden çıkarttım ve Süre ms mertebesine düştü. Benim bundan çıkarttığım sonuç SP ün kodu büyüdükçe diskten ilk yüklenmesi bayağı bir zaman alıyor oldu.
Son olarak benzer bir testi, içinde 1-2 tablo ve SP olan bir VT de yaptığımda SP kodu büyük bile olsa ilk yüklemenin 10-100 ms gibi olduğunu gördüm.
Bu test sonuçlarına göre yeni önerilerinizi yazarsanız sevinirim.
Terminator arkadaşımızın önerdiği yöntemleri, bu yazıyı yazmadan önce denemiştim. Bugün, Sorunun kaynağını daha iyi tespit edebilmek için yeni bazı testler yaptım.
ilk olarak bu yavaşlığın SP ilk yüklenmesindenmi yoksa içindeki kodun çallıştırılmasından mı olduğunu anlamak için SP ün ilk satırına suspend ve exit satırı ekledim, böylece SP içinde 2 satır dışında bir kod çalıştırılmamış oldu, sonuçta süre gene 10-15 sn civarında çıktı. Sonra SP içinde exit bloğunun dışında kalan ve çalışmayan kodu SP içinden çıkarttım ve Süre ms mertebesine düştü. Benim bundan çıkarttığım sonuç SP ün kodu büyüdükçe diskten ilk yüklenmesi bayağı bir zaman alıyor oldu.
Son olarak benzer bir testi, içinde 1-2 tablo ve SP olan bir VT de yaptığımda SP kodu büyük bile olsa ilk yüklemenin 10-100 ms gibi olduğunu gördüm.
Bu test sonuçlarına göre yeni önerilerinizi yazarsanız sevinirim.
- Terminator
- Üye
- Mesajlar: 313
- Kayıt: 13 Ara 2005 01:45
- Konum: İzmir, ama Aydın Efesi!
Coşkun,
sana durumu açıkca yazdım ve detaylarını verdim.
Ortada ne senin procedureun sourceu var, ne de
elindeki sistemin teknik detayları.
Havanda su dövmeyelim. farazi tartışmalara zaman ayıramam.
Bu forumda defalarca yazdım bir diskin ortalama erişim süresinin
10 ms civarında olduğunu. Fragmante olmuş bir diskte bu değer daha da fazla olur belli bir dosyanın sürekli okunmasında.
Tanesi 10 ms olan 1000 tane db sayfası(data+index) okuduğunda bunun
bekleme süresi ortalama 10 saniyedir.
Senin SP kaç sayfa okuyor yazıyor
bunu hem task manager kullanarak hemde gstat ile öğrenebilirsin.
Oturduğumuz yerden, yine de ben merak ediyorum demek iş değil.
SP lerin içinde neler yapmaya çalıştığını query planlarını record boylarını ve sayılarını, kriterlerini, FB ayarlarını ve sistemini bile bilmiyoruz.
FBü mıncıklayarak, deneme yanılmayla bişeyler öğrenmek istiyorsan buna ömrün yetmez.
Arkadaşlar,
umrunuzda olur mu olmaz mı bilmiyorum ama, bundan sonra
soruluş tarzı düzgün, unsurları ortaya konmuş olmayana sorulara cevap yazmıycam. yazdığınız SP veya tasarladığını tablodan utanıyorsanız ya da
gizli tutmak istiyorsanız, sorunlarınızı kendiniz de çözebilecek kadar kendinize güveniyorsunuz demektir. ben işinize karışmak istemem.
Remzi bey,
dediğiniz şey query cache dir, yani aynı sorgunun tekrar tekrar interpret edilmeden çalıştırılmasıdır. yoksa sonuçlar saklanamaz, takdir edersiniz ki bu ACID olayına tamamen ters bir durumdur.
saniyede yüzlerce query gelen bir sistemde bunların yorumlanmış kodunu
cachelemek büyük avantajdır, önümüzdeki versiyonlarda FB de bu da var. büyük avantaj dediğim şey dediğim gibi aynı anda yüzlerce query olayı.. yoksa SP yi 10 kat hızlandırma falan değil SP ve triggerlar zaten makina kodu olarak saklanıp çalıştırılıyor FB de.
sana durumu açıkca yazdım ve detaylarını verdim.
Ortada ne senin procedureun sourceu var, ne de
elindeki sistemin teknik detayları.
Havanda su dövmeyelim. farazi tartışmalara zaman ayıramam.
Bu forumda defalarca yazdım bir diskin ortalama erişim süresinin
10 ms civarında olduğunu. Fragmante olmuş bir diskte bu değer daha da fazla olur belli bir dosyanın sürekli okunmasında.
Tanesi 10 ms olan 1000 tane db sayfası(data+index) okuduğunda bunun
bekleme süresi ortalama 10 saniyedir.
Senin SP kaç sayfa okuyor yazıyor
bunu hem task manager kullanarak hemde gstat ile öğrenebilirsin.
Oturduğumuz yerden, yine de ben merak ediyorum demek iş değil.
SP lerin içinde neler yapmaya çalıştığını query planlarını record boylarını ve sayılarını, kriterlerini, FB ayarlarını ve sistemini bile bilmiyoruz.
FBü mıncıklayarak, deneme yanılmayla bişeyler öğrenmek istiyorsan buna ömrün yetmez.
Arkadaşlar,
umrunuzda olur mu olmaz mı bilmiyorum ama, bundan sonra
soruluş tarzı düzgün, unsurları ortaya konmuş olmayana sorulara cevap yazmıycam. yazdığınız SP veya tasarladığını tablodan utanıyorsanız ya da
gizli tutmak istiyorsanız, sorunlarınızı kendiniz de çözebilecek kadar kendinize güveniyorsunuz demektir. ben işinize karışmak istemem.
Remzi bey,
dediğiniz şey query cache dir, yani aynı sorgunun tekrar tekrar interpret edilmeden çalıştırılmasıdır. yoksa sonuçlar saklanamaz, takdir edersiniz ki bu ACID olayına tamamen ters bir durumdur.
saniyede yüzlerce query gelen bir sistemde bunların yorumlanmış kodunu
cachelemek büyük avantajdır, önümüzdeki versiyonlarda FB de bu da var. büyük avantaj dediğim şey dediğim gibi aynı anda yüzlerce query olayı.. yoksa SP yi 10 kat hızlandırma falan değil SP ve triggerlar zaten makina kodu olarak saklanıp çalıştırılıyor FB de.
Firebird Foundation Member #208
http://www.firebirdsql.org
http://www.firebirdsql.org
Bu konuyu hem Forum Kurallarına Mesaj atarken dikkat edilmesi gereken hususlar başlığında hem de aşağıdaki kaynak verilerek daha önce bir kaç kez dile getirildi. Nedense yurdum insanı okumaktan çok yazmayı seviyorTerminator yazdı: Arkadaşlar,
umrunuzda olur mu olmaz mı bilmiyorum ama, bundan sonra
soruluş tarzı düzgün, unsurları ortaya konmuş olmayana sorulara cevap yazmıycam. yazdığınız SP veya tasarladığını tablodan utanıyorsanız ya da
gizli tutmak istiyorsanız, sorunlarınızı kendiniz de çözebilecek kadar kendinize güveniyorsunuz demektir. ben işinize karışmak istemem.

http://belgeler.org/howto/smart-questions.html
Ali bey adım Recep aslında sonu b ile bitiyor, nüfus memurunun acizliğine uğramışımTerminator yazdı: Remzi bey,
dediğiniz şey query cache dir, yani aynı sorgunun tekrar tekrar interpret edilmeden çalıştırılmasıdır. yoksa sonuçlar saklanamaz, takdir edersiniz ki bu ACID olayına tamamen ters bir durumdur.
saniyede yüzlerce query gelen bir sistemde bunların yorumlanmış kodunu
cachelemek büyük avantajdır, önümüzdeki versiyonlarda FB de bu da var. büyük avantaj dediğim şey dediğim gibi aynı anda yüzlerce query olayı.. yoksa SP yi 10 kat hızlandırma falan değil SP ve triggerlar zaten makina kodu olarak saklanıp çalıştırılıyor FB de.

ACID olayını düşününce dediğiniz doğru. Fakat aynı Transaction içinde olunca tutarlı olmuş olmaz mı? Yani Transaction açılınca VT nin durumu (o anki snapshot u gibi düşünülebilir) ne ise Transaction kapanana kadar VT yi aynı şekilde görecektir. Tabi bunu yukarıda dediğim gibi where/kriter kısmını değiştirip denemenin yanında bir de aynı sorguyu Transaction u kapatıp açarak denemekte fayda var. Şu an test verisi oluşturup deneme şansım ve zamanım yok. Fakat Transaction açısından bakınca bellek/tampon boyutu nispetinde yukarıdaki tespitimin doğruluk yada gerçekleşme payı olabilir. Yoksa derlenip işletilen/execute bir sorgunun değişmediğinden dolayı sadece derlenmemesi/derlenmiş kodun çalıştırılması/koşturulması sorgu süresini 15-20 kat (yada 15 sn.) uzatması pek akla uygun düşmüyor

Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
- Terminator
- Üye
- Mesajlar: 313
- Kayıt: 13 Ara 2005 01:45
- Konum: İzmir, ama Aydın Efesi!
Kusura bakmayın, siz de bilirsiniz, yıllar geçtikçe tanıdığınız isimler, insanlar çoğalıyor ve karışmaya başlıyor, hele bir de her gün bir tonTerminator yazdı:
Ali bey adım Recep aslında sonu b ile bitiyor, nüfus memurunun acizliğine uğramışım![]()
ACID olayını düşününce dediğiniz doğru. Fakat aynı Transaction içinde olunca tutarlı olmuş olmaz mı? Yani Transaction açılınca VT nin durumu (o anki snapshot u gibi düşünülebilir) ne ise Transaction kapanana kadar VT yi aynı şekilde görecektir. Tabi bunu yukarıda dediğim gibi where/kriter kısmını değiştirip denemenin yanında bir de aynı sorguyu Transaction u kapatıp açarak denemekte fayda var. Şu an test verisi oluşturup deneme şansım ve zamanım yok. Fakat Transaction açısından bakınca bellek/tampon boyutu nispetinde yukarıdaki tespitimin doğruluk yada gerçekleşme payı olabilir. Yoksa derlenip işletilen/execute bir sorgunun değişmediğinden dolayı sadece derlenmemesi/derlenmiş kodun çalıştırılması/koşturulması sorgu süresini 15-20 kat (yada 15 sn.) uzatması pek akla uygun düşmüyor
datayla değişkenle boğuşuyorsanız...
B-P,
M-N,
J-C-Ç,
Z-S-Ş,
D-T,
F-V-Ğ,
Ğ-G-K,
U-Ü,
gibi komşu sesli harfler arasındaki geçiş ve karışıklıklar çok yaygın.
özellikle yabancı kökenli kelimeler için. geçen gün ilgimi çekti inceledim
egzostun 8 çeşit yazılışı olduğunu saydım mesela. receb de arapça kökenli sanırım. hatta aylardan birinin adıydı sanırım...
%99 oranlı bir okuma yazma bilmeyen bir toplumdan geldiğimizi düşününce işler daha vahim. Devlet memurlarının durumu içler acısı. Uzun yıllardır onlara okuma yazma öğretiyorum, kodlama mantığını zaten zor anlıyorlar.
kitap okumak, kendilerini yetiştirmek yerine tek yaptıkları 5-6 ay sonra bi otomobil satınalıp şişmanlamaya başlamak ve maaşlarından şikayet etmek. çok becerikliysen istifa et özel sektörde çok kazan kardeşim! ona da yanaşmıyor zaten memur olmak için çırpınmış. yine de devlet lise mezunu bir memuruna bile benim durumumdan daha iyi bir imkan sunuyor. Benim SSK ya verdiğim bir evrak birkaç dairede dönüp dolaşıp bana bilgi mektubu geldiğinde soyadımın aldığı şekilleri bir görseniz...

Söylediğiniz query cache olayı, prepare-parse olayından hız kazanmak için. querylerin aynı mı oldugunu bakmak kolay string compare yeter.
parametreler ayrıca belli bir formatta gönderiliyor zaten. parametre
değişkenler ? olarak gidiyor. alınan record sonuçları saklanmaz. ama o sonucu oluşturan db sayfaları cachelendiği için tekrar çalıştırıldığında disk IO azalacağı için hız artar, zaten cache de bu demektir.
başka db sistemleri, senin dediğin tarzda sonucu depolar mı bilemem..
yaparlar mı yaparlar sakat mimarilerini hızlandırabilmek için..
ama ACIDin olmadığı bir RDBMS ciddiye alınmaz. Mysql in isam yapısına döner. hızlı evet çok hızlı transaction yok, karmaşa yok, kotrol trgigger, SP yok.. çok hızlı, ama benim için önemli olan bilginin doğruluğudur.
yanlış bir bilgi ışık hızında da gelse beni ilgilendirmez. tutarsızlık, istikrarsızlık, dengesizlik kadar sinir bozucu ve yıpratıcı bişey yoktur...
Firebird Foundation Member #208
http://www.firebirdsql.org
http://www.firebirdsql.org
Dediğiniz gibi bazı tespitler olması gereken temenniler gibi oluyor. Ya gerçekten VT motorunun çalışma mantığını şematize edip önümüze sermeliyiz, yada test etmekten başka çare kalmıyor. Çünkü gb. mertebesindeki bir VT nin tamponlanması da kolay bir şey değil. Bunu da sunucu/server bilgisayarın belleğinin test amaçlı 1 gb.den mesela 512 mb. veya 256 mb.ye indirilip denenmesi ile öğrenebiliriz 

Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
- Terminator
- Üye
- Mesajlar: 313
- Kayıt: 13 Ara 2005 01:45
- Konum: İzmir, ama Aydın Efesi!
Bütün VT cachelenemez zaten. öyle bir iddia yok. bütün servetinizi nakit olarak cebinizde gezdirir misiniz? hayır. cache de bu demek. gezdirilebilecek kadarını yani nakit akışınıza uygun olanı kadadarını gezdirirsiniz. fazlasına ihtiyaç duyduğunuzda bankaya gidip çekmeniz gerekir ve işleminiz gecikmiş olur. cache de böyle çalışır.rsimsek yazdı:Dediğiniz gibi bazı tespitler olması gereken temenniler gibi oluyor. Ya gerçekten VT motorunun çalışma mantığını şematize edip önümüze sermeliyiz, yada test etmekten başka çare kalmıyor. Çünkü gb. mertebesindeki bir VT nin tamponlanması da kolay bir şey değil. Bunu da sunucu/server bilgisayarın belleğinin test amaçlı 1 gb.den mesela 512 mb. veya 256 mb.ye indirilip denenmesi ile öğrenebiliriz
CPU ların cachleri de aynı şekilde SRAM dır ve DRAM belleği cachler.
SDRAMınız birkaç GB bile olsa CPU level cacheleriniz en fazla birkaç MB dır. istenen adres cachede değilse DRAMa düşer sistem ve yavaşlar.
aynı şekilde DRAM da, binlerce kat yavaş olan mekanik DISCleri cacheler.
tamamını cacheleyebilecek olsa zaten diske gerek kalmazdı. sorun maliyet.
DB sisteminize delidana gibi bütün DB yi tarayan queryler gönderirseniz cache beyhude kalacaktır. cache, sık kulanılan bölgelerin mirrorudur.
Bütün db yi RAM le cachlemek istiyorsanız koyarsınız 16 GB ramli bir AMD64 makina ve 64 bitlik windows, zaten 3-4 GB olan veritabanınızın RAMde bir cache kopyası oluşur ve okumak için DISKE gidilmez.
ama yazmak için gidilir. Forced write yapmak gerekir. yazma işlemi okuma işleminden daha yavaştır.
Firebird Foundation Member #208
http://www.firebirdsql.org
http://www.firebirdsql.org
- coskundeniz
- Üye
- Mesajlar: 22
- Kayıt: 20 Ara 2003 11:36
Terminator arakadas her ne kadar uslubunuzu onaylamasamda yazınız için teşekkürler.
Görünüyor ki yazdığım yazıyı dikkatli okumamışsın
ben yazımda
Ama genede durumu net göstermebilmek için SP veriyorum. (çünkü devlet sırrı değil, Her faninin yazabileceği şeyler bunlar)
Gözden kaçabilir diye procedure ün ilk satırlarını tekrar yazıyorum
SP bu şekilde çağrılıyor
son parametre Null yollandığı için VT den herhangi bir veri çekilmeden SP terk edilmiş oluyor.
Eğer bir yorumunuz var ise buna göre yapın lütfen
Görünüyor ki yazdığım yazıyı dikkatli okumamışsın
demişsinTanesi 10 ms olan 1000 tane db sayfası(data+index) okuduğunda bunun
bekleme süresi ortalama 10 saniyedir.
Senin SP kaç sayfa okuyor yazıyor
ben yazımda
Bundanda anlaşılacağı gibi SP ilk satıırında exıt yapıldığı için VT den çelilen herhangi bir veri yokSP ün ilk satırına suspend ve exit satırı ekledim, böylece SP içinde 2 satır dışında bir kod çalıştırılmamış oldu, sonuçta süre gene 10-15 sn civarında çıktı
Ama genede durumu net göstermebilmek için SP veriyorum. (çünkü devlet sırrı değil, Her faninin yazabileceği şeyler bunlar)
Kod: Tümünü seç
create procedure GirisCikisYap(
AProxyId varchar(8),
AMakinaId varchar(10),
APersonelId integer,
AOtomatik integer
) returns (
Status integer,
PartiAsamaStokDetayId integer,
PartiYil integer,
PartiId integer,
PartiKayitId integer,
PartiSinifId integer,
HamAdiToplami varchar(255),
Kilo Numeric(12, 3),
Metre Numeric(12, 3),
BobinSayisi integer,
IslemTipi integer,
YapilacakSiraNo integer,
YapilacakAsamaId integer,
YapilacakAsamaAdi varchar(40),
IlaveIslemlerAdiToplami varchar(255),
YapilacakReceteId varchar(20),
YapilacakReceteAdi varchar(40),
OnceYapilmasiGerekenAsamaId integer,
OnceYapilmasiGerekenAsamaAdi varchar(40),
BaskaMakinaId varchar(10),
SuAndaYaptigiAsamaId integer,
SuAndaYaptigiAsamaAdi varchar(40),
SuAndaYaptigiReceteId varchar(20),
SonraOkutulacakPartiYil integer,
SonraOkutulacakPartiId integer,
SonraOkutulacakHamAdiToplami varchar(255),
Serbest integer,
IsletmeIciTamirmi integer,
Yer varchar(100),
Mesaj varchar(255),
BoyaSiparisYil Integer,
BoyaSiparisId Integer,
Fason integer,
OrnekPartiSinifmi integer,
CikisiOlmayanMakinaId varchar(10),
MinImalatBitirmeSuresi integer,
FirmaId varchar(20),
FirmaAdi varchar(50),
CikistaKiloZorunlu integer,
CikistaMetreZorunlu integer,
HamTipiId integer
) as
declare variable MinSira integer;
declare variable OncekiSira integer;
declare variable KayitSayisi integer;
declare variable UstAsamaId integer;
declare variable TamirAsamaId integer;
declare variable FGirisTarihi TimeStamp;
declare variable FCikisTarihi TimeStamp;
declare variable FMakinaId varchar(10);
declare variable FMakinaAsamaId integer;
declare variable FMakinaReceteId varchar(20);
declare variable FPartiAsamalariId integer;
declare variable SerbestTamir integer;
declare variable SerbestAsamaAc integer;
declare variable SerbestMakinami integer;
declare variable SerbestAsamaId integer;
declare variable CikisOtomatik integer;
declare variable GirisKarariVerildi integer;
declare variable CikisKarariVerildi integer;
declare variable FNow TimeStamp;
declare variable FarkTarih Double Precision;
declare variable FKazanKarisikRecete integer;
declare variable FMakinaKarisikAsama integer;
declare variable FIlaveIslemlerAdi varchar(30);
declare variable FOrnekPartiSinifId integer;
declare variable SonrakiAsamayaYolVer integer;
declare variable OncekiAsamaBitmedenYolVer integer;
declare variable ImalatMakinalaraBolunebilir integer;
declare variable CikisiOlmayanVarmi integer;
declare variable CikisiOlmayanIlkSiraNo integer;
declare variable FPartiAsamaStokDetayId integer;
declare variable ImalatMiktar Numeric(12,3);
declare variable FMiktar Numeric(12,3);
declare variable PartiTamirSinifId integer;
declare variable GirisMiktar Numeric(12, 3);
declare variable SinifBobinSayisi integer;
declare variable PartiStokBekleId integer;
declare variable PartiStokBekleBitti integer;
declare variable FPartiTamirSinifId integer;
declare variable FCikisKilo Numeric(12,3);
declare variable FCikisMetre Numeric(12,3);
declare variable AKullaniciId integer;
Declare variable PartiStokBeraberYapilabilir1 integer;
Declare variable PartiStokBeraberYapilabilir2 integer;
Declare variable FatosOkey integer;
Declare variable FReceteIsEmriYil integer;
Declare variable FReceteIsEmriId integer;
Declare variable FMinPartiAsamalariId integer;
Declare variable ReceteSecmedenBoyaYapilabilsin integer;
Declare variable BoyaAsamasimi integer;
begin
if (AOtomatik is null) then
begin
Suspend;
exit;
end
if (AMakinaId is null) then
begin
Status = -1;
Mesaj = 'Makina Kodu Null olamaz..';
suspend;
exit;
end
SonraOkutulacakPartiYil = null;
SonraOkutulacakPartiId = null;
IlaveIslemlerAdiToplami = '';
CikisiOlmayanMakinaId = '';
GirisKarariVerildi = 0;
CikisKarariVerildi = 0;
CikisOtomatik = 0;
OrnekPartiSinifmi = 0;
CikisiOlmayanIlkSiraNo = -1;
Serbest = 0;
Select ReceteSecmedenBoyaYapilabilsin, TamirAsamaId, KazanKarisikRecete, MinImalatBitirmeSuresi from Sistem where SistemId = 1
into :ReceteSecmedenBoyaYapilabilsin, :TamirAsamaId, :FKazanKarisikRecete, :MinImalatBitirmeSuresi;
FPartiAsamalariId = -1;
select PartiStok.PartiKayitId, PartiStok.PartiSinifId, PartiStok.HamAdiToplami, PartiStok.BobinSayisi,
BoyaSiparisDetay.OrnekPartiSinifId, Ham.HamTipiId from PartiStok
left join BoyaSiparisDetay on BoyaSiparisDetay.BoyaSiparisDetayId = PartiStok.BoyaSiparisDetayId
left join Ham on Ham.HamId = PartiStok.HamId
where ProxyId = :AProxyId
into :PartiKayitId, :PartiSinifId, :HamAdiToplami, :SinifBobinSayisi, :FOrnekPartiSinifId, :HamTipiId;
if (FOrnekPartiSinifId is not null and FOrnekPartiSinifId = PartiSinifId) then OrnekPartiSinifmi = 1;
else OrnekPartiSinifmi = 0;
if (PartiKayitId is null) then
begin
Status = 11;
Mesaj = 'Okunan Kartta Parti Bilgisi Yok..';
suspend;
exit;
end
Select Parti.PartiYil, Parti.PartiId, Parti.IslemTipiId, BoyaSiparis.BoyaSiparisYil, BoyaSiparis.BoyaSiparisId, Parti.Fason,
Parti.FirmaId, Firma.Adi from Parti
left join Firma on Firma.FirmaId = Parti.FirmaId
left join BoyaSiparis on BoyaSiparis.BoyaSiparisKayitId = Parti.BoyaSiparisKayitId
where PartiKayitId = :PartiKayitId
into :PartiYil, :PartiId, :IslemTipi, :BoyaSiparisYil, :BoyaSiparisId, :Fason, :FirmaId, :FirmaAdi;
select min(sira) from PartiAsamalari
left join PartiAsamaStok on PartiAsamaStok.PartiAsamalariId = PartiAsamalari.PartiAsamalariId and PartiAsamaStok.PartiSinifId = :PartiSinifId
where PartiAsamalari.PartiKayitId = :PartiKayitId and PartiAsamalari.OtomasyonaDahilmi = 1 and
PartiAsamaStok.AsamayaDahil = 1 and PartiAsamaStok.CikisTarihi is null
into :MinSira;
yer = 'Min.Sira hesaplandi';
if (MinSira is null) then
begin
yer = 'Min.Sira null';
select count(*) from PartiAsamalari
left join PartiAsamaStok on PartiAsamaStok.PartiAsamalariId = PartiAsamalari.PartiAsamalariId and
PartiAsamaStok.PartiSinifId = :PartiSinifId and AsamayaDahil = 1
where PartiAsamalari.PartiKayitId = :PartiKayitId and PartiAsamalari.OtomasyonaDahilmi = 1 and AsamayaDahil = 1 into :KayitSayisi;
if (KayitSayisi > 0) then
begin
Status = 8;
Mesaj = 'imalat tamamlanmis';
yer = 'kayit var imalat tamamlanmis';
end
else
begin
Status = 7;
Mesaj = 'Partinin Tanimli asamasi yok';
yer = 'Parti asamasi yok';
end
suspend;
exit;
end
SonrakiAsamayaYolVer = 1;
OncekiAsamaBitmedenYolVer = 1;
ImalatMakinalaraBolunebilir = 1;
CikisiOlmayanVarmi = 0;
For select PartiAsamalari.PartiAsamalariId, PartiAsamalari.Sira, PartiAsamaStokDetay.PartiAsamaStokDetayId, PartiAsamalari.AsamaId, PartiAsamalari.ReceteId, R.UstAsamaId,
PartiAsamaStokDetay.GirisTarihi, PartiAsamaStokDetay.CikisTarihi, PartiAsamaStokDetay.MakinaId, PartiAsamaStok.PartiTamirSinifId,
PartiAsamaStokDetay.Kilo, PartiAsamaStokDetay.Metre, PartiAsamaStokDetay.BobinSayisi,
Asama.SonrakiAsamayaYolVer, Asama.OncekiAsamaBitmedenYolVer, Asama.ImalatMakinalaraBolunebilir, Asama.BoyaAsamasimi,
PartiStokBekle.PartiStokBekleId, PartiStokBekle.Bitti,
PartiAsamalari.CikistaKiloZorunlu, PartiAsamalari.CikistaMetreZorunlu,
PartiAsamaStokDetay.CikisKilo, PartiAsamaStokDetay.CikisMetre, PartiAsamaStok.GirisMiktar from PartiAsamalari
left join Recete R on R.ReceteId = PartiAsamalari.ReceteId
left join Asama on (Asama.AsamaId = PartiAsamalari.AsamaId or Asama.AsamaID = R.UstAsamaId)
left join PartiAsamaStok on PartiAsamaStok.PartiAsamalariId = PartiAsamalari.PartiAsamalariId and PartiAsamaStok.PartiSinifId = :PartiSinifId
left join PartiStokBekle on PartiStokBekle.PartiAsamalariId = PartiAsamalari.PartiAsamalariId and PartiStokBekle.PartiSinifId = :PartiSinifId
left join PartiAsamaStokDetay on PartiAsamaStokDetay.PartiAsamalariId = PartiAsamalari.PartiAsamalariId and PartiAsamaStokDetay.PartiSinifId = :PartiSinifId
where PartiAsamalari.PartiKayitId = :PartiKayitId and PartiAsamalari.Sira >= :MinSira and PartiAsamaStok.AsamayaDahil = 1 and PartiAsamaStok.PartiSinifId is not null
order by PartiAsamalari.Sira
into :FPartiAsamalariId, :YapilacakSiraNo, :PartiAsamaStokDetayId, :YapilacakAsamaId, :YapilacakReceteId, :UstAsamaId, :FGirisTarihi, :FCikisTarihi,
:FMakinaId, :PartiTamirSinifId, :Kilo, :Metre, :BobinSayisi,
:SonrakiAsamayaYolVer, :OncekiAsamaBitmedenYolVer, :ImalatMakinalaraBolunebilir, :BoyaAsamasimi,
:PartiStokBekleId, :PartiStokBekleBitti, :CikistaKiloZorunlu, :CikistaMetreZorunlu, :FCikisKilo, :FCikisMetre, :GirisMiktar do
begin
if (YapilacakReceteId is not null) then YapilacakAsamaId = UstAsamaId;
yer = 'Yapilacak Asama satiri okundu ';
if (FGirisTarihi is not null) then
begin /* GİRİŞ VEYA ÇIKIŞ KARARI VERİLECEK */
yer = 'GİRİŞ VEYA ÇIKIŞ karari vericek ';
if (FMakinaId is not null and (FMakinaId <> AMakinaId)) then
begin
if (ImalatMakinalaraBolunebilir > 0) then
begin
FPartiAsamaStokDetayId = Null;
Select PartiAsamaStokDetayId, PartiAsamaStokDetay.GirisTarihi, PartiAsamaStokDetay.Kilo, PartiAsamaStokDetay.Metre, PartiAsamaStokDetay.BobinSayisi,
PartiAsamaStokDetay.CikisKilo, PartiAsamaStokDetay.CikisMetre from PartiAsamaStokDetay
where PartiAsamaStokDetay.PartiAsamalariId = :FPartiAsamalariId and PartiAsamaStokDetay.PartiSinifId = :PartiSinifId and PartiAsamaStokDetay.MakinaId = :AMakinaId and PartiAsamaStokDetay.CikisTarihi is null
into :FPartiAsamaStokDetayId, :FGirisTarihi, :Kilo, :Metre, :BobinSayisi, :FCikisKilo, :FCikisMetre;
if (FPartiAsamaStokDetayId is not null) then
begin
if ( (CikistaKiloZorunlu = 1 and FCikisKilo = 0) or (CikistaMetreZorunlu = 1 and FCikisMetre = 0) ) then
begin
Status = 18;
Mesaj = 'Çıkış Kilo/Çıkış Metre Zorunlu';
suspend;
exit;
end
PartiAsamaStokDetayId = FPartiAsamaStokDetayId;
yer = 'Cikis karari verildi ';
CikisKarariVerildi = 1;
end
else
begin
Select Sum(Miktar) from PartiAsamaStokDetay where PartiAsamaStokDetay.PartiAsamalariId = :FPartiAsamalariId and PartiAsamaStokDetay.PartiSinifId = :PartiSinifId and PartiAsamaStokDetay.GirisTarihi is not null into :ImalatMiktar;
select count(*) from MakinaAsamalari where MakinaId = :AMakinaId and AsamaId = :YapilacakAsamaId into :KayitSayisi;
if (KayitSayisi = 1 and ImalatMiktar < GirisMiktar) then /* Makina Bu PartiSinifin son aşamasını yapabiliyorsa */
begin
Mesaj = 'Bolunecek';
GirisKarariVerildi = 2; /* Bölerek giriş yapacak */
end
else
begin
if (SonrakiAsamayaYolVer = 1) then /* yeni yaptım*/
begin
if (CikisiOlmayanIlkSiraNo <> -1) then CikisiOlmayanIlkSiraNo = YapilacakSiraNo;
CikisiOlmayanVarmi = 1;
CikisiOlmayanMakinaId = FMakinaId;
end
else
begin
Status = 4;
BaskaMakinaId = FMakinaId;
Mesaj = 'Baska Makinada imalatta';
suspend;
exit;
end
end
end
end
else
if (SonrakiAsamayaYolVer = 1) then
begin
if (CikisiOlmayanIlkSiraNo <> -1) then CikisiOlmayanIlkSiraNo = YapilacakSiraNo;
CikisiOlmayanVarmi = 1;
CikisiOlmayanMakinaId = FMakinaId;
end
else
begin
Status = 4;
BaskaMakinaId = FMakinaId;
Mesaj = 'Baska Makinada imalatta';
suspend;
exit;
end
end
else
if (FCikisTarihi is null) then
begin
if (CikisiOlmayanVarmi = 1 and (CikisiOlmayanIlkSiraNo < YapilacakSiraNo)) then
begin
Status = 14;
Mesaj = 'Önce XX Makinasında imalatı bitirin..';
suspend;
exit;
end
else
begin
if ( (CikistaKiloZorunlu = 1 and FCikisKilo = 0) or (CikistaMetreZorunlu = 1 and FCikisMetre = 0) ) then
begin
Status = 18;
Mesaj = 'Çıkış Kilo/Çıkış Metre Zorunlu';
suspend;
exit;
end
yer = 'Cikis karari verildi ';
CikisKarariVerildi = 1;
end
end
else
begin
if (ImalatMakinalaraBolunebilir > 0) then
begin
FPartiAsamaStokDetayId = Null;
Select PartiAsamaStokDetayId, PartiAsamaStokDetay.GirisTarihi, PartiAsamaStokDetay.Kilo, PartiAsamaStokDetay.Metre, PartiAsamaStokDetay.BobinSayisi,
PartiAsamaStokDetay.CikisKilo, PartiAsamaStokDetay.CikisMetre from PartiAsamaStokDetay
where PartiAsamaStokDetay.PartiAsamalariId = :FPartiAsamalariId and PartiAsamaStokDetay.PartiSinifId = :PartiSinifId and PartiAsamaStokDetay.MakinaId = :AMakinaId and PartiAsamaStokDetay.CikisTarihi is null
into :FPartiAsamaStokDetayId, :FGirisTarihi, :Kilo, :Metre, :BobinSayisi, :FCikisKilo, :FCikisMetre;
if (FPartiAsamaStokDetayId is not null) then
begin
if ( (CikistaKiloZorunlu = 1 and FCikisKilo = 0) or (CikistaMetreZorunlu = 1 and FCikisMetre = 0) ) then
begin
Status = 18;
Mesaj = 'Çıkış Kilo/Çıkış Metre Zorunlu';
suspend;
exit;
end
PartiAsamaStokDetayId = FPartiAsamaStokDetayId;
yer = 'Cikis karari verildi ';
CikisKarariVerildi = 1;
end
else
begin
Select Sum(Miktar) from PartiAsamaStokDetay where PartiAsamaStokDetay.PartiAsamalariId = :FPartiAsamalariId and PartiAsamaStokDetay.PartiSinifId = :PartiSinifId and PartiAsamaStokDetay.GirisTarihi is not null into :ImalatMiktar;
select count(*) from MakinaAsamalari where MakinaId = :AMakinaId and AsamaId = :YapilacakAsamaId into :KayitSayisi;
if (KayitSayisi = 1 and ImalatMiktar < GirisMiktar) then /* Makina Bu PartiSinifin son aşamasını yapabiliyorsa */
begin
Mesaj = 'Bolunecek';
GirisKarariVerildi = 2; /* Bölerek giriş yapacak */
end
else
begin
if (CikisiOlmayanIlkSiraNo <> -1) then CikisiOlmayanIlkSiraNo = YapilacakSiraNo;
CikisiOlmayanVarmi = 1;
CikisiOlmayanMakinaId = FMakinaId;
Mesaj = 'çıkışı olmayan satır var ' || EgemenIntegertoStr(YapilacakSiraNo);
end
end
end
end
end
else
begin /* GİRİŞ KARARI VERİLECEK */
Select SerbestTamir, SerbestMakinami, SerbestAsamaId, KarisikAsamaYapabilir from Makina where MakinaId = :AMakinaId into :SerbestTamir, :SerbestMakinami, :SerbestAsamaId, :FMakinaKarisikAsama;
yer = 'Giris karari vericek ';
Select PartiTamirSinifId from PartiTamirSinif where PartiTamirSinif.PartiSinifId = :PartiSinifId and Bitti = 0
into :FPartiTamirSinifId;
if (FPartiTamirSinifId is null) then IsletmeIciTamirmi = 0;
else IsletmeIciTamirmi = 1;
select max(PartiAsamalari.AsamaId) from PartiAsamaStokDetay
left join PartiAsamalari on PartiAsamalari.PartiAsamalariId = PartiAsamaStokDetay.PartiAsamalariId
where PartiAsamaStokDetay.MakinaId = :AMakinaId and CikisTarihi is null and PartiAsamalari.KontrolAsama = 0
into :FMakinaAsamaId;
select max(PartiAsamalari.ReceteId) from PartiAsamaStokDetay
left join PartiAsamalari on PartiAsamalari.PartiAsamalariId = PartiAsamaStokDetay.PartiAsamalariId
where PartiAsamaStokDetay.MakinaId = :AMakinaId and CikisTarihi is null and PartiAsamalari.KontrolAsama = 0
into :FMakinaReceteId;
select count(*) from MakinaAsamalari where MakinaId = :AMakinaId and AsamaId = :YapilacakAsamaId into :KayitSayisi;
if (KayitSayisi = 1) then /* Makina Bu PartiSinifin son aşamasını yapabiliyorsa */
begin
yer = 'makina asama icin uygun ';
if (CikisiOlmayanVarmi = 1) then
if (OncekiAsamaBitmedenYolVer = 0) then
begin
Status = 4;
BaskaMakinaId = CikisiOlmayanMakinaId;
Mesaj = 'Baska Makinada imalatta';
suspend;
exit;
end
if (FMakinaKarisikAsama = 0) then
if (FMakinaAsamaId is not null and (FMakinaAsamaId <> YapilacakAsamaId)) then
begin
Status = 3; /* Makina XXX Asamasini Yapiyor */
SuAndaYaptigiAsamaId = FMakinaAsamaId;
SuAndaYaptigiReceteId = FMakinaReceteId;
select adi from asama where AsamaId = :SuAndaYaptigiAsamaId into :SuAndaYaptigiAsamaAdi;
Mesaj = 'Makina su anda XX asamasini yapiyor';
yer = 'makina baska asama yapiyor ';
suspend;
exit;
end
if (FKazanKarisikRecete = 0) then
if ((FMakinaReceteId is not null and YapilacakReceteId is null) or
(FMakinaReceteId is not null and YapilacakReceteId is not null and FMakinaReceteId <> YapilacakReceteId)) then
begin
Status = 10; /* Makina XXX Recetesini Yapiyor */
SuAndaYaptigiAsamaId = FMakinaAsamaId;
SuAndaYaptigiReceteId = FMakinaReceteId;
if (FMakinaReceteId is not null) then Mesaj = 'Makina su anda XX recetesi yapiyor';
else Mesaj = 'Makina su anda recetesiz calisiyor';
Yer = 'Makinanin yaptigi recete ile yapilacak recete tutmuyor ';
suspend;
exit;
end
GirisKarariVerildi = 1;
end
else
begin
if (IsletmeIciTamirmi = 1 and SerbestTamir = 1) then
begin
yer = 'Stok isletme ici tamir, serbest tamir ';
Select Asama.OncekiAsamaBitmedenYolVer from Asama where Asama.AsamaId = :TamirAsamaId into :OncekiAsamaBitmedenYolVer;
if (CikisiOlmayanVarmi = 1 and OncekiAsamaBitmedenYolVer = 0) then
begin
Status = 4;
BaskaMakinaId = CikisiOlmayanMakinaId;
Mesaj = 'Baska Makinada imalatta';
suspend;
exit;
end
if (FMakinaKarisikAsama = 0) then
if (FMakinaAsamaId is not null and (FMakinaAsamaId <> TamirAsamaId)) then
begin
Status = 3; /* Makina XXX Asamasini Yapiyor */
SuAndaYaptigiAsamaId = FMakinaAsamaId;
select adi from asama where AsamaId = :SuAndaYaptigiAsamaId into :SuAndaYaptigiAsamaAdi;
Mesaj = 'Makina su anda XX asamasini yapiyor-Serbest tamir';
suspend;
exit;
end
YapilacakAsamaId = TamirAsamaId;
YapilacakReceteId = null;
GirisKarariVerildi = 1;
MinSira = YapilacakSiraNo;
Serbest = 1;
yer = 'Giris karari verildi ve tamir ';
end
else
if (SerbestMakinami = 1) then
begin
Select Asama.OncekiAsamaBitmedenYolVer from Asama where Asama.AsamaId = :SerbestAsamaId into :OncekiAsamaBitmedenYolVer;
if (CikisiOlmayanVarmi = 1 and OncekiAsamaBitmedenYolVer = 0) then
begin
Status = 4;
BaskaMakinaId = CikisiOlmayanMakinaId;
Mesaj = 'Baska Makinada imalatta';
suspend;
exit;
end
if (FMakinaKarisikAsama = 0) then
if (FMakinaAsamaId is not null and (FMakinaAsamaId <> SerbestAsamaId)) then
begin
Status = 3; /* Makina XXX Asamasini Yapiyor */
SuAndaYaptigiAsamaId = FMakinaAsamaId;
select adi from asama where AsamaId = :SuAndaYaptigiAsamaId into :SuAndaYaptigiAsamaAdi;
Mesaj = 'Makina su anda XX asamasini yapiyor-serbest asama ';
suspend;
exit;
end
YapilacakAsamaId = SerbestAsamaId;
YapilacakReceteId = null;
GirisKarariVerildi = 1;
Serbest = 1;
MinSira = YapilacakSiraNo;
yer = 'Giris karari verildi ve serbest ';
FPartiTamirSinifId = Null;
end
else
begin
OnceYapilmasiGerekenAsamaId = YapilacakAsamaId;
select adi from asama where AsamaId = :OnceYapilmasiGerekenAsamaId into :OnceYapilmasiGerekenAsamaAdi;
Status = 6;
Suspend;
exit;
end
end
end
if (CikisKarariVerildi = 1) then
begin
FNow = 'Now';
FarkTarih = FNow - FGirisTarihi;
if (FarkTarih < (0.000694444 * MinImalatBitirmeSuresi) ) then
begin
Status = 12;
mesaj = 'Cikis icin 60 saniye gecmesi gerekir..';
suspend;
exit;
end
Update PartiAsamaStokDetay Set CikisTarihi = 'now', CikisPersonelId = :APersonelId, CikisOtomatik = :AOtomatik, HareketKullaniciId = :AKullaniciId
where PartiAsamaStokDetay.PartiAsamaStokDetayID = :PartiAsamaStokDetayID;
Status = 2;
mesaj = 'Cikis Onaylandi';
Execute Procedure PartiGirisCikisiYap(:AMakinaId, :PartiSinifId, -1); /* Çıkış Yap */
suspend;
exit;
end
else
if (GirisKarariVerildi = 1) then
begin
if (BoyaAsamasimi = 1 and YapilacakReceteId is null and ReceteSecmedenBoyaYapilabilsin = 0) then
begin
Status = 21;
Mesaj = 'Boya Aşaması''nda Reçete girilmemiş imalat başlayamaz..';
suspend;
exit;
end
if (PartiStokBekleId is not null and PartiStokBekleBitti = 0) then
begin
Status = 17;
Mesaj = 'Okunan Kart''a ait Parti bu proses için Beklemeye Alınmış. ';
suspend;
exit;
end
select asama.adi, CikisOtomatikmi, PartiStokBeraberYapilabilir from Asama where AsamaId = :YapilacakAsamaId
into :YapilacakAsamaAdi, :CikisOtomatik, :PartiStokBeraberYapilabilir1;
KayitSayisi = 0;
FatosOkey = 0;
if (PartiStokBeraberYapilabilir1 = 1) then
begin
select Count(*) from PartiAsamaStokDetay
left join PartiAsamaStok on PartiAsamaStok.PartiAsamalariId = PartiAsamaStokDetay.PartiAsamalariId and PartiAsamaStok.PartiSinifId = PartiAsamaStokDetay.PartiSinifId
left join Asama on Asama.AsamaId = PartiAsamaStok.AsamaId
where PartiAsamaStokDetay.MakinaId = :AMakinaId and PartiAsamaStokDetay.cikistarihi is null and PartiAsamaStokDetay.giristarihi is not null and
Asama.PartiStokBeraberYapilabilir = 0
into :KayitSayisi;
if (kayitSayisi = 0) then FatosOkey = 1;
end
else
begin
select Count(*) from PartiAsamaStokDetay
where PartiAsamaStokDetay.MakinaId = :AMakinaId and PartiAsamaStokDetay.cikistarihi is null and PartiAsamaStokDetay.giristarihi is not null
into :KayitSayisi;
if (kayitSayisi = 0) then FatosOkey = 1;
end
if (FatosOkey = 0) then
begin
if (PartiStokBeraberYapilabilir1 = 0) then
begin
Status = 19;
Mesaj = 'Partinin bu aşaması için, Makinada aynı anda birden fazla parti stok imalatı Yapılamaz..';
suspend;
exit;
end
else
begin
Status = 20;
Mesaj = 'Makina''nın şu anda yaptığı aşama, aynı anda birden fazla parti stok imalatına uygun değil..';
suspend;
exit;
end
end
if (YapilacakReceteId is not null) then
begin
Select count(*) from PartiAsamaStokDetay where PartiAsamaStokDetay.PartiAsamalariId = :FPartiAsamalariId and PartiAsamaStokDetay.GirisTarihi is not null and PartiAsamaStokDetay.MakinaId <> :AMakinaId into :KayitSayisi;
if (KayitSayisi > 0) then exception KazandaPartiStoklariBolunemez;
select Recete.Adi from Recete where Recete.ReceteId = :YapilacakReceteId into :YapilacakReceteAdi;
end
if (Serbest = 0) then
begin
/* Ilave ıslemleri alıyoruz */
for select IlaveIslemler.Adi from PartiIlaveIslemler
left join IlaveIslemler on IlaveIslemler.IlaveIslemlerId = PartiIlaveIslemler.IlaveIslemlerId
where PartiIlaveIslemler.PartiKayitId = :PartiKayitId and PartiIlaveIslemler.PartiAsamalariId = :FPartiAsamalariId
into :FIlaveIslemlerAdi do
begin
if (StrLength(IlaveIslemlerAdiToplami) + StrLength(FIlaveIslemlerAdi) < 250) then
begin
if (IlaveIslemlerAdiToplami <> '' ) then IlaveIslemlerAdiToplami = IlaveIslemlerAdiToplami || ', ';
IlaveIslemlerAdiToplami = IlaveIslemlerAdiToplami || FIlaveIslemlerAdi;
end
end
if (CikisOtomatik = 1 and (CikisiOlmayanVarmi = 0 or (CikisiOlmayanIlkSiraNo = YapilacakSiraNo)) ) then
begin
Update PartiAsamaStokDetay Set MakinaId = :AMakinaId, GirisPersonelId = :APersonelId, GirisTarihi = 'now', GirisOtomatik = :AOtomatik, CikisTarihi = 'now', CikisPersonelId = :APersonelId, CikisOtomatik = :AOtomatik, HareketKullaniciId = :AKullaniciId
where PartiAsamaStokDetay.PartiAsamaStokDetayID = :PartiAsamaStokDetayID;
Status = 5; /* GirişCikiş Onaylandı */
Mesaj = 'Giris-Cikis Onaylandi';
Select min(HamAdiToplami) from PartiAsamalari
left join PartiAsamaStok on PartiAsamaStok.PartiAsamalariId = PartiAsamalari.PartiAsamalariId and asamayadahil = 1
left join PartiStok on PartiStok.PartiSinifId = PartiAsamaStok.PartiSinifId
where PartiAsamalari.PartiAsamalariId = :FPartiAsamalariId and AsamayaDahil = 1 and GirisTarihi is null
into :SonraOkutulacakHamAdiToplami;
Execute Procedure PartiGirisCikisiYap(:AMakinaId, :PartiSinifId, 0); /* giris ve cikis yap */
suspend;
exit;
end
else
begin
Update PartiAsamaStokDetay Set MakinaId = :AMakinaId, GirisPersonelId = :APersonelId, GirisTarihi = 'now', GirisOtomatik = :AOtomatik, HareketKullaniciId = :AKullaniciId
where PartiAsamaStokDetay.PartiAsamaStokDetayID = :PartiAsamaStokDetayID;
Status = 1; /* Giriş Onaylandı */
mesaj = 'Giris Onaylandi';
SonraOkutulacakHamAdiToplami = Null;
Select min(PartiStok.HamAdiToplami) from PartiAsamalari
left join PartiAsamaStok on PartiAsamaStok.PartiAsamalariId = PartiAsamalari.PartiAsamalariId and asamayadahil = 1
left join PartiStok on PartiStok.PartiSinifId = PartiAsamaStok.PartiSinifId
where PartiAsamalari.PartiAsamalariId = :FPartiAsamalariId and AsamayaDahil = 1 and GirisTarihi is null
into :SonraOkutulacakHamAdiToplami;
if (SonraOkutulacakHamAdiToplami is null and YapilacakReceteId is not null) then
begin
FReceteIsEmriId = null;
FReceteIsEmriYil = Null;
Select ReceteIsEmriDetay.ReceteIsEmriYil, ReceteIsEmriDetay.ReceteIsEmriId from ReceteIsEmriDetay where ReceteIsEmriDetay.PartiAsamalariId = :FPartiAsamalariId
into :FReceteIsEmriYil, :FReceteIsEmriId;
if (FReceteIsEmriId is not null) then
begin
FMinPartiAsamalariId = Null;
Select min(PartiAsamaStok.PartiAsamalariId) from ReceteIsEmriDetay
left join PartiAsamaStok on PartiAsamaStok.PartiAsamalariId = ReceteIsEmriDetay.PartiAsamalariId
where ReceteIsEmriDetay.ReceteIsEmriYil = :FReceteIsEmriYil and ReceteIsEmriDetay.ReceteIsEmriId = :FReceteIsEmriId and
ReceteIsEmriDetay.PartiAsamalariId <> :FPartiAsamalariId and PartiAsamaStok.Giristarihi is null
into :FMinPartiAsamalariId;
if (FMinPartiAsamalariId is not null) then
begin
Select Parti.PartiYil, Parti.PartiId, Min(PartiStok.HamAdiToplami) from PartiAsamalari
left join Parti on Parti.PartiKayitID = PartiAsamalari.PartiKayitID
left join PartiAsamaStok on PartiAsamaStok.PartiAsamalariId = PartiAsamalari.PartiAsamalariId
left join PartiStok on PartiStok.PartiSinifId = PartiAsamaStok.PartiSinifId
where PartiAsamalari.PartiAsamalariId = :FMinPartiAsamalariId and PartiAsamaStok.AsamayaDahil = 1 and PartiAsamaStok.GirisTarihi is null
group by Parti.PartiYil, Parti.PartiId
into :SonraOkutulacakPartiYil, :SonraOkutulacakPartiId, :SonraOkutulacakHamAdiToplami;
end
end
end
Execute Procedure PartiGirisCikisiYap(:AMakinaId, :PartiSinifId, 1); /* giris yap */
suspend;
exit;
end
end
else /* SERBESTASAMA ve TAMİR ASAMALARİ İÇİN İNSERT YAPIYORUZ *************/
begin
select Max(Sira) from PartiAsamalari
left join partiasamastok on partiasamastok.partiasamalariid = PartiAsamalari.PartiAsamalariId and PartiAsamastok.PartiSinifId = :PartiSinifId
where PartiAsamalari.PartiKayitId = :PartiKayitId and Sira < :MinSira and OtomasyonaDahilmi = 1 and asamayadahil is null and serbestAsama = 1
and PartiAsamalari.AsamaId = :YapilacakAsamaId into :OncekiSira;
SerbestAsamaAc = 0;
if (OncekiSira is not null) then /* Uygun Serbest Asama bulundu kontrol et */
begin
select count(*) from PartiAsamalari
left join PartiAsamaStok on PartiAsamaStok.PartiAsamalariId = PartiAsamalari.PartiAsamalariId and PartiAsamaStok.PartiSinifId = :PartiSinifId
where PartiAsamalari.PartiKayitId = :PartiKayitId and Sira > :OncekiSira and Sira < :MinSira and OtomasyonaDahilmi = 1 and AsamayaDahil = 1 into :KayitSayisi;
if (KayitSayisi > 0) then /* StokSınıfının Bulunan Serbest Aşamadan sonra asamasi var yeni serbest aşama aç */
begin
SerbestAsamaAc = 1;
end
else select PartiAsamalariId from PartiAsamalari where PartiAsamalari.PartiKayitId = :PartiKayitId and Sira = :OncekiSira into :FPartiAsamalariId;
end else SerbestAsamaAc = 1;
if (SerbestAsamaAc = 1) then
begin
FPartiAsamalariId = gen_id(PartiAsamalari_Id_Gen, 1);
insert into partiAsamalari(PartiAsamalariId, PartiKayitId, Sira, AsamaId, OtomasyonaDahilmi, SerbestAsama) values(:FPartiAsamalariId, :PartiKayitId, :MinSira, :YapilacakAsamaId, 1, 1);
end
insert into PartiAsamaStok(PartiAsamalariId, PartiKayitId, PartiSinifId, AsamayaDahil, PartiTamirSinifId, AsamaId)
values(:FPartiAsamalariId, :PartiKayitId, :PartiSinifId, 1, :FPartiTamirSinifId, :YapilacakAsamaId);
Select Max(PartiAsamaStokDetayId) from PartiAsamaStokDetay
where PartiAsamaStokDetay.PartiAsamalariId = :FPartiAsamalariId and PartiAsamaStokDetay.PartiSinifId = :PartiSinifId
into :PartiAsamaStokDetayId;
if (CikisOtomatik = 1) then
begin
Status = 5; /* Giriş/Cıkıs Onaylandı */
mesaj = 'Giris/Cikis Onaylandi';
Update PartiAsamaStokDetay Set MakinaId = :AMakinaId, GirisPersonelId = :APersonelId, GirisTarihi = 'now', GirisOtomatik = :AOtomatik,
CikisTarihi = 'now', CikisPersonelId = :APersonelId, CikisOtomatik = :AOtomatik, PartiTamirSinifId = :FPartiTamirSinifId, HareketKullaniciId = :AKullaniciId
where PartiAsamaStokDetay.PartiAsamalariId = :FPartiAsamalariId and PartiAsamaStokDetay.PartiSinifId = :PartiSinifId;
end
else
begin
Status = 1; /* Giriş Onaylandı */
mesaj = 'Giris Onaylandi';
Update PartiAsamaStokDetay Set MakinaId = :AMakinaId, GirisPersonelId = :APersonelId, GirisTarihi = 'now', GirisOtomatik = :AOtomatik,
PartiTamirSinifId = :FPartiTamirSinifId, HareketKullaniciId = :AKullaniciId
where PartiAsamaStokDetay.PartiAsamalariId = :FPartiAsamalariId and PartiAsamaStokDetay.PartiSinifId = :PartiSinifId;
end
suspend;
exit;
end
end
else
if (GirisKarariVerildi = 2) then
begin
select asama.adi from Asama where AsamaId = :YapilacakAsamaId into :YapilacakAsamaAdi;
Yer = 'aynı asamaya (parelel) giriş yapılacak, Miktar hesapla ';
/* Bülenerek Giriş Onaylandı, kilo hesapla */
FMiktar = Null;
FMiktar = GirisMiktar - ImalatMiktar;
if (FMiktar <= 0) then
begin
Status = 16;
mesaj = 'Parti Stok Bölünecek, Miktar Hesaplanamadı..';
suspend;
exit;
end
else
begin
if (PartiStokBekleId is not null and PartiStokBekleBitti = 0) then
begin
Status = 17;
Mesaj = 'Okunan Kart''a ait Parti bu proses için Beklemeye Alınmış. ';
suspend;
exit;
end
/*xxPartiAsamaStokDetay-2*/
FPartiAsamaStokDetayID = Gen_Id(PartiAsamaStokDetay_Id_gen, 1);
insert into PartiAsamaStokDetay(PartiAsamaStokDetayID, PartiAsamalariId, PartiKayitId, PartiSinifId, PartiTamirSinifId, Miktar, MakinaId,
GirisTarihi, GirisPersonelId, GirisOtomatik, HareketKullaniciId)
values(:FPartiAsamaStokDetayID, :FPartiAsamalariId, :PartiKayitId, :PartiSinifId, :PartiTamirSinifId, :FMiktar, :AMakinaId,
'now', :APersonelId, 1, :AKullaniciId);
Status = 15;
mesaj = 'Giris Onaylandi';
PartiAsamaStokDetayId = FPartiAsamaStokDetayId;
Select Kilo, Metre from PartiAsamaStokDetay where PartiAsamaStokDetayID = :FPartiAsamaStokDetayID into :Kilo, :Metre;
Select min(HamAdiToplami) from PartiAsamalari
left join PartiAsamaStok on PartiAsamaStok.PartiAsamalariId = PartiAsamalari.PartiAsamalariId and asamayadahil = 1
left join PartiStok on PartiStok.PartiSinifId = PartiAsamaStok.PartiSinifId
where PartiAsamalari.PartiAsamalariId = :FPartiAsamalariId and AsamayaDahil = 1 and GirisTarihi is null
into :SonraOkutulacakHamAdiToplami;
suspend;
exit;
end
end
end
suspend;
end^
Gözden kaçabilir diye procedure ün ilk satırlarını tekrar yazıyorum
Kod: Tümünü seç
begin
if (AOtomatik is null) then
begin
Suspend;
exit;
end
...
...
...
SP bu şekilde çağrılıyor
Kod: Tümünü seç
SELECT * FROM GIRISCIKISYAP(''9A33AA00'', ''GALV-125-1'', 132, Null)
Eğer bir yorumunuz var ise buna göre yapın lütfen
- Terminator
- Üye
- Mesajlar: 313
- Kayıt: 13 Ara 2005 01:45
- Konum: İzmir, ama Aydın Efesi!
Coşkun,
an başta vermen gereken bilgileri cımbızla aldık senden netekim.
en başında suspend exit yaptığın halde bir SP nin 1 saniye bile sürmesi
normal değil.
orda başka bir sorun ya da sorunun yan etkisi olmalı.
SP nin adını değiştir yeniden yarat.
suspend exiti if blogu olmadan kullan.
bunca yıldır SP yazarım böyle bir sorun görmedim.
SP ni değiştirdiğinde, sorun vermeden compile ettiğine emin misin?
SP sonucunun row döndürmediğine emin misin?
bi yerlerde mutlaka gözünden kaçan bişeyler olmalı.
SP neden yavaş çalışıyor sorusuna gelince...
yavaş çalışır.
çok detaylı incelemedim kodunu vaktim yok ama
gördüğüm count(*) lar yetti.
FB de count(*) demek bütün istenen kayıtları okuyarak say demektir.
an başta vermen gereken bilgileri cımbızla aldık senden netekim.
en başında suspend exit yaptığın halde bir SP nin 1 saniye bile sürmesi
normal değil.
orda başka bir sorun ya da sorunun yan etkisi olmalı.
SP nin adını değiştir yeniden yarat.
suspend exiti if blogu olmadan kullan.
bunca yıldır SP yazarım böyle bir sorun görmedim.
SP ni değiştirdiğinde, sorun vermeden compile ettiğine emin misin?
SP sonucunun row döndürmediğine emin misin?
bi yerlerde mutlaka gözünden kaçan bişeyler olmalı.
SP neden yavaş çalışıyor sorusuna gelince...
yavaş çalışır.
çok detaylı incelemedim kodunu vaktim yok ama
gördüğüm count(*) lar yetti.
FB de count(*) demek bütün istenen kayıtları okuyarak say demektir.
Firebird Foundation Member #208
http://www.firebirdsql.org
http://www.firebirdsql.org
Benzer problemle ben de daha önce karşılaşmıştım.
Bu problem stored procedure' den daha ziyade büyük veritabanına bağlanıp ilk işlem yaparken meydana geliyor. Sanki ilk tablo vs. (SELECT...) işleminde FireBird veritabanı ile ilgili bir takım işlemler yapıyor gibi.
Hatta bu sorun PC'de 7 dakika, LapTop'ta 17 dakika sürdüğü olmuştu.
Ancak bu sorun çok gelişmiş PC'lerde 3-5 saniyeye iniyor ve sorun olmaktan çıkıyordu. (Gerçi benim kullandığım PC ve LapTop da o kadar eski değildi. PC: Pentium 4, 3 GHz, 1GB Ram; LapTop: Pentium 3, 1.2 GHz, 1 GB Ram)
Bu sorunun stored procedure'le ilgili olup olmadığını aynı bağlantıda önce bir kaç tablo açıp sonra stored procedure'u çağırarak test ediniz.
Bir de aynı işlemleri çok daha gelişmiş PC'lerde test ederseniz galiba benimle aynı kanaate varacaksınız.
İyi çalışmalar.
Bu problem stored procedure' den daha ziyade büyük veritabanına bağlanıp ilk işlem yaparken meydana geliyor. Sanki ilk tablo vs. (SELECT...) işleminde FireBird veritabanı ile ilgili bir takım işlemler yapıyor gibi.
Hatta bu sorun PC'de 7 dakika, LapTop'ta 17 dakika sürdüğü olmuştu.
Ancak bu sorun çok gelişmiş PC'lerde 3-5 saniyeye iniyor ve sorun olmaktan çıkıyordu. (Gerçi benim kullandığım PC ve LapTop da o kadar eski değildi. PC: Pentium 4, 3 GHz, 1GB Ram; LapTop: Pentium 3, 1.2 GHz, 1 GB Ram)
Bu sorunun stored procedure'le ilgili olup olmadığını aynı bağlantıda önce bir kaç tablo açıp sonra stored procedure'u çağırarak test ediniz.
Bir de aynı işlemleri çok daha gelişmiş PC'lerde test ederseniz galiba benimle aynı kanaate varacaksınız.
İyi çalışmalar.
- Terminator
- Üye
- Mesajlar: 313
- Kayıt: 13 Ara 2005 01:45
- Konum: İzmir, ama Aydın Efesi!
Bu, bilgisayarın hızıyla falan alakalı bir durum değil.
FB dün icad edilmedi. milyonlarca installu var dünya üzerinde.
Ben yıllardır kullanıyorum ve tablo SP sayılarım sizinkinden az değil.
FB büyük veritabanlarına connect oldugunda neden yavaşlar bunu
bu forumda açıkladım. her topicte tekrar tekrar yazacak değilim.
konunun FB ile de ilgisi yok. ben yüzlerce tablosu olan bir ORacle veya
MSSQL DB şemasının bile 1-2 dakikada yüklenebildiğini defalarca gördüm.
Kullandığınız componentler, açtığınız, doldurduğunuz datasetler vs
ilk bağlandığınızda neler oluyor bunu bilmeniz lazım.
Object oriented ve data-aware çağındayız. bir dataset sizin sandığınız gibi
küt diye sadece querynizi göndermiyor.
bomboş bir proje açın, ve bir Ddatabase ve transaction tanımlayın.
Database i açın, transactionu açın.
transactionu kapatın, databasei kapatın.
bunu defalarca yapan bir döngüyü deneyin.
haala yavaş mı?
yavaşsa buraya yazın.
yavaşsa, bir de şunu deneyin:
ethernet kartınızın properties kısmından, eğer destekliyorsa 100mbps ve
full-duplex yapın. yani otomatiği kaldırın, tam hıza setleyin.
Sorunun network trafiği olup olmadığını embedded FB kullanıp doğrudan dosya pathi vererek de deneyebilirsiniz, ya danetwork trafiğinizi de izleyebilirsiniz.
Coşkun sen önce şunu bir dene:
ve ibexpertten/başka bir konsoldan SP ni çağır:
nasıl çalışıyor bize açıkla.
FB dün icad edilmedi. milyonlarca installu var dünya üzerinde.
Ben yıllardır kullanıyorum ve tablo SP sayılarım sizinkinden az değil.
FB büyük veritabanlarına connect oldugunda neden yavaşlar bunu
bu forumda açıkladım. her topicte tekrar tekrar yazacak değilim.
konunun FB ile de ilgisi yok. ben yüzlerce tablosu olan bir ORacle veya
MSSQL DB şemasının bile 1-2 dakikada yüklenebildiğini defalarca gördüm.
Kullandığınız componentler, açtığınız, doldurduğunuz datasetler vs
ilk bağlandığınızda neler oluyor bunu bilmeniz lazım.
Object oriented ve data-aware çağındayız. bir dataset sizin sandığınız gibi
küt diye sadece querynizi göndermiyor.
bomboş bir proje açın, ve bir Ddatabase ve transaction tanımlayın.
Database i açın, transactionu açın.
transactionu kapatın, databasei kapatın.
bunu defalarca yapan bir döngüyü deneyin.
haala yavaş mı?
yavaşsa buraya yazın.
yavaşsa, bir de şunu deneyin:
ethernet kartınızın properties kısmından, eğer destekliyorsa 100mbps ve
full-duplex yapın. yani otomatiği kaldırın, tam hıza setleyin.
Sorunun network trafiği olup olmadığını embedded FB kullanıp doğrudan dosya pathi vererek de deneyebilirsiniz, ya danetwork trafiğinizi de izleyebilirsiniz.
Coşkun sen önce şunu bir dene:
Kod: Tümünü seç
Recreate procedure GIRCIK_TEMP(
AProxyId varchar(8),
AMakinaId varchar(10),
APersonelId integer,
AOtomatik integer
) returns (
Status integer,
PartiAsamaStokDetayId integer,
PartiYil integer,
PartiId integer,
PartiKayitId integer,
PartiSinifId integer,
HamAdiToplami varchar(255),
Kilo Numeric(12, 3),
Metre Numeric(12, 3),
BobinSayisi integer,
IslemTipi integer,
YapilacakSiraNo integer,
YapilacakAsamaId integer,
YapilacakAsamaAdi varchar(40),
IlaveIslemlerAdiToplami varchar(255),
YapilacakReceteId varchar(20),
YapilacakReceteAdi varchar(40),
OnceYapilmasiGerekenAsamaId integer,
OnceYapilmasiGerekenAsamaAdi varchar(40),
BaskaMakinaId varchar(10),
SuAndaYaptigiAsamaId integer,
SuAndaYaptigiAsamaAdi varchar(40),
SuAndaYaptigiReceteId varchar(20),
SonraOkutulacakPartiYil integer,
SonraOkutulacakPartiId integer,
SonraOkutulacakHamAdiToplami varchar(255),
Serbest integer,
IsletmeIciTamirmi integer,
Yer varchar(100),
Mesaj varchar(255),
BoyaSiparisYil Integer,
BoyaSiparisId Integer,
Fason integer,
OrnekPartiSinifmi integer,
CikisiOlmayanMakinaId varchar(10),
MinImalatBitirmeSuresi integer,
FirmaId varchar(20),
FirmaAdi varchar(50),
CikistaKiloZorunlu integer,
CikistaMetreZorunlu integer,
HamTipiId integer
) as
declare variable MinSira integer;
declare variable OncekiSira integer;
declare variable KayitSayisi integer;
declare variable UstAsamaId integer;
declare variable TamirAsamaId integer;
declare variable FGirisTarihi TimeStamp;
declare variable FCikisTarihi TimeStamp;
declare variable FMakinaId varchar(10);
declare variable FMakinaAsamaId integer;
declare variable FMakinaReceteId varchar(20);
declare variable FPartiAsamalariId integer;
declare variable SerbestTamir integer;
declare variable SerbestAsamaAc integer;
declare variable SerbestMakinami integer;
declare variable SerbestAsamaId integer;
declare variable CikisOtomatik integer;
declare variable GirisKarariVerildi integer;
declare variable CikisKarariVerildi integer;
declare variable FNow TimeStamp;
declare variable FarkTarih Double Precision;
declare variable FKazanKarisikRecete integer;
declare variable FMakinaKarisikAsama integer;
declare variable FIlaveIslemlerAdi varchar(30);
declare variable FOrnekPartiSinifId integer;
declare variable SonrakiAsamayaYolVer integer;
declare variable OncekiAsamaBitmedenYolVer integer;
declare variable ImalatMakinalaraBolunebilir integer;
declare variable CikisiOlmayanVarmi integer;
declare variable CikisiOlmayanIlkSiraNo integer;
declare variable FPartiAsamaStokDetayId integer;
declare variable ImalatMiktar Numeric(12,3);
declare variable FMiktar Numeric(12,3);
declare variable PartiTamirSinifId integer;
declare variable GirisMiktar Numeric(12, 3);
declare variable SinifBobinSayisi integer;
declare variable PartiStokBekleId integer;
declare variable PartiStokBekleBitti integer;
declare variable FPartiTamirSinifId integer;
declare variable FCikisKilo Numeric(12,3);
declare variable FCikisMetre Numeric(12,3);
declare variable AKullaniciId integer;
Declare variable PartiStokBeraberYapilabilir1 integer;
Declare variable PartiStokBeraberYapilabilir2 integer;
Declare variable FatosOkey integer;
Declare variable FReceteIsEmriYil integer;
Declare variable FReceteIsEmriId integer;
Declare variable FMinPartiAsamalariId integer;
Declare variable ReceteSecmedenBoyaYapilabilsin integer;
Declare variable BoyaAsamasimi integer;
begin
if (AOtomatik is null) then
begin
FirmaAdi='Ne firması be!'
Suspend;
exit;
end
FirmaAdi='bozuk saatleri ayarlama enstitüsü.'
Suspend;
EXIT;
-- istersen buraya kodunun kalanını koyabilirsin.
end
Kod: Tümünü seç
SELECT * FROM GIRCIK_TEMP('9A33AA00', 'GALV-125-1', 132, Null);
Firebird Foundation Member #208
http://www.firebirdsql.org
http://www.firebirdsql.org
- coskundeniz
- Üye
- Mesajlar: 22
- Kayıt: 20 Ara 2003 11:36
Kusura bakmayın, Daha önceki yazılarımda sorunu izah ederken mümkün oldukça insanların fazla vaktini almamak için yazıyı kısa tutmaya çalışmıştım.
yazınızda belirtiğiniz
Koşuldan dolayı SP içindeki hiç bir kodu işletmeden SP terk ediliyor. O yüzden
Sonraki yazınızda Network ile ilgili söylediklerinizin bu yavaşlığa etkisi olmasın diye, zaten VT'yi test yaptığım Bilgisayarda bulunduruyorum.
Ayrıca, yine istediğiniz için son yazınızda yazdığınız belirttiğiniz
Şeklinde denendi, hala SP'ün ilk çalışmasındaki yavaşlık devam ediyor, eğer exit'tan sonraki Kodu çıkartımsam ms düzeyinde hızımız oluyor.
Bu tesleri
1. kendi yazdığım basit bir test programı ile yapıyorum zaten. (Gerçek projede gözden kaçan unsurlar olabilir diye) Kullanılan componentler : TSQLConnection -> TSQLQuery
2. IBConsole ve IBOConsole yazılımları ile
Not : VT'e ilk bağlantımda herhangi bir yavaşlık yok FB Bu konuda herzamaki gibi çok iyi, sorun hala sadece ve sadece kodu büyük SP'nin ilk kullanımındaki yavaşlık.
Bu konuya herkesin gösterdiği ilgi ve çözüm önerisi için teşekkür etmek isterim, inşallah bu tartışmanın sonunda bir çözüme ulaşırız.
yazınızda belirtiğiniz
denendi durum aynıSP nin adını değiştir yeniden yarat.
suspend exiti if blogu olmadan kullan
evet eminimSP ni değiştirdiğinde, sorun vermeden compile ettiğine emin misin?
evet eminim, zaten SP ilk satırlarındakiSP sonucunun row döndürmediğine emin misin?
Kod: Tümünü seç
begin
if (AOtomatik is null) then
begin
Suspend;
exit;
end
...
...
...
demişsin, Ben özellikle SP hiç bir iş yapmadan terk edilsin diye Koşullu exit blogu koydum ve bu kod doğru çalışıyor, yani exit bloğunun altında kalan hiç bir kod çalıştırılmıyor ve hiç hayıt dönmüyor. o yüzden SP içindeki count(*) ve diğer operasyonlar çalıştırılmadığı için test süresine bir etkisi yok. Ben işleme girmeyen kodları özellikle silmeden test yapıyorum, yani SP kodu işletilmediği halde kod büyük ise bu yavaşllık oluyor, sanki SP ilk yüklendiğinde VT tarafından tekkrar compile ediliyor gibi veya sebebini anlayamadığım bir şkilde diskten o SP yüklemesi yavaş oluyor. Çünkü VT ile Connection'u kesmeden SP tekrar çalıştırılır ise ms düzeyinde işini yapıyor.SP neden yavaş çalışıyor sorusuna gelince...
yavaş çalışır.
çok detaylı incelemedim kodunu vaktim yok ama
gördüğüm count(*) lar yetti.
FB de count(*) demek bütün istenen kayıtları okuyarak say demektir.
Sonraki yazınızda Network ile ilgili söylediklerinizin bu yavaşlığa etkisi olmasın diye, zaten VT'yi test yaptığım Bilgisayarda bulunduruyorum.
Ayrıca, yine istediğiniz için son yazınızda yazdığınız belirttiğiniz
Kod: Tümünü seç
begin
if (AOtomatik is null) then
begin
FirmaAdi='Ne firması be!'
Suspend;
exit;
end
FirmaAdi='bozuk saatleri ayarlama enstitüsü.'
Suspend;
EXIT;
-- bu bölgede daha önce göndermiş olduğum SP kodu var, yani satır eksiltmedik
end
Bu tesleri
1. kendi yazdığım basit bir test programı ile yapıyorum zaten. (Gerçek projede gözden kaçan unsurlar olabilir diye) Kullanılan componentler : TSQLConnection -> TSQLQuery
2. IBConsole ve IBOConsole yazılımları ile
Not : VT'e ilk bağlantımda herhangi bir yavaşlık yok FB Bu konuda herzamaki gibi çok iyi, sorun hala sadece ve sadece kodu büyük SP'nin ilk kullanımındaki yavaşlık.
Bu konuya herkesin gösterdiği ilgi ve çözüm önerisi için teşekkür etmek isterim, inşallah bu tartışmanın sonunda bir çözüme ulaşırız.
- Terminator
- Üye
- Mesajlar: 313
- Kayıt: 13 Ara 2005 01:45
- Konum: İzmir, ama Aydın Efesi!
İlginç bir durum...
DB dosyasında bir bozulma veya bug etkisi olabilir.
Dosyanı eski versiyonlardan restore etmeden mi taşıdın?
Çözüm buluruz merak etme.
Elindeki DB dosyanın backupını alıp sonra da
FB 1.5.3 RC3 ile restore edip tekrar dener misin?
Eğer sorun devam ediyorsa bir de FB 2.0 Beta ile deneyelim aynı
dosyayı onunla restore ederek.
Kullandığın component IBX mi?
aynı işlemi öncelikle herhangi bir konsol programından connect olup
deneyebilir misin?
DB dosyasında bir bozulma veya bug etkisi olabilir.
Dosyanı eski versiyonlardan restore etmeden mi taşıdın?
Çözüm buluruz merak etme.
Elindeki DB dosyanın backupını alıp sonra da
FB 1.5.3 RC3 ile restore edip tekrar dener misin?
Eğer sorun devam ediyorsa bir de FB 2.0 Beta ile deneyelim aynı
dosyayı onunla restore ederek.
Kullandığın component IBX mi?
aynı işlemi öncelikle herhangi bir konsol programından connect olup
deneyebilir misin?
Firebird Foundation Member #208
http://www.firebirdsql.org
http://www.firebirdsql.org