Firebird 1.5.1 de SP lerin ilk kullanımındaki Yavaşlık

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Kullanıcı avatarı
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

Mesaj gönderen coskundeniz »

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
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Mesaj gönderen Terminator »

Ö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.
Firebird Foundation Member #208
http://www.firebirdsql.org
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

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!!
Kullanıcı avatarı
coskundeniz
Üye
Mesajlar: 22
Kayıt: 20 Ara 2003 11:36

Mesaj gönderen coskundeniz »

Ö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.
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Mesaj gönderen Terminator »

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.
Firebird Foundation Member #208
http://www.firebirdsql.org
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Terminator 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.
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ı seviyor :roll:

http://belgeler.org/howto/smart-questions.html

Terminator 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.
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 :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Mesaj gönderen Terminator »

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

Mesaj gönderen rsimsek »

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!!
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Mesaj gönderen Terminator »

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 :?:
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.
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
Kullanıcı avatarı
coskundeniz
Üye
Mesajlar: 22
Kayıt: 20 Ara 2003 11:36

Mesaj gönderen coskundeniz »

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
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
demişsin

ben yazımda
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ı
Bundanda anlaşılacağı gibi SP ilk satıırında exıt yapıldığı için VT den çelilen herhangi bir veri yok

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)
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
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Mesaj gönderen Terminator »

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.
Firebird Foundation Member #208
http://www.firebirdsql.org
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

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.
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Mesaj gönderen Terminator »

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:

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
ve ibexpertten/başka bir konsoldan SP ni çağır:

Kod: Tümünü seç

SELECT * FROM GIRCIK_TEMP('9A33AA00', 'GALV-125-1', 132, Null);
nasıl çalışıyor bize açıkla.
Firebird Foundation Member #208
http://www.firebirdsql.org
Kullanıcı avatarı
coskundeniz
Üye
Mesajlar: 22
Kayıt: 20 Ara 2003 11:36

Mesaj gönderen coskundeniz »

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
SP nin adını değiştir yeniden yarat.
suspend exiti if blogu olmadan kullan
denendi durum aynı
SP ni değiştirdiğinde, sorun vermeden compile ettiğine emin misin?
evet eminim
SP sonucunun row döndürmediğine emin misin?
evet eminim, zaten SP ilk satırlarındaki

Kod: Tümünü seç

begin 
  if (AOtomatik is null) then 
  begin 
    Suspend; 
    exit; 
  end 
   ... 
   ... 
   ... 

Koşuldan dolayı SP içindeki hiç bir kodu işletmeden SP terk ediliyor. O yüzden
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.
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.

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 
Ş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.
Kullanıcı avatarı
Terminator
Üye
Mesajlar: 313
Kayıt: 13 Ara 2005 01:45
Konum: İzmir, ama Aydın Efesi!

Mesaj gönderen Terminator »

İ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?
Firebird Foundation Member #208
http://www.firebirdsql.org
Cevapla