Delphi tarafında oluşturacağım XML formatında bir yazıyı firebird'e gönderiyorum...
misal:
Kod: Tümünü seç
<KAYIT>
<SATIR>
<HESAP_ID>30</HESAP_ID>
<FIS_TURU>3</FIS_TURU>
<OLUSTURAN_KISI>1</OLUSTURAN_KISI>
<TARIH>25.03.1982</TARIH>
<ACIKLAMA>AÇIKLAMALAR, FALAN DA FİLAN DA...</ACIKLAMA>
<BORC_TUTARI>1500</BORC_TUTARI>
<ALACAK_TUTARI></ALACAK_TUTARI>
</SATIR>
<SATIR>
<HESAP_ID>30</HESAP_ID>
<FIS_TURU>3</FIS_TURU>
<OLUSTURAN_KISI>1</OLUSTURAN_KISI>
<TARIH>25.03.1982</TARIH>
<ACIKLAMA>BİŞEYLER...</ACIKLAMA>
<BORC_TUTARI></BORC_TUTARI>
<ALACAK_TUTARI>1500</ALACAK_TUTARI>
</SATIR>
</KAYIT>
Örneğin 1. UDF_KONTROL_ET; UDF'si XML uygusna "UYGUN XML" gibisinden bir mesaj döndürüyor, uygun değilse probleme göre farklı mesajlar döndürüyor...
2. UDF_SATIRLARA_AYIR; UDF'si XML'nin ilk <SATIR>....</SATIR> bloğunu geri döndürüyor...
3. UDF_ILK_SATIRI_CIKART; UDF'si de UDF_SATIRLARA_AYIR UDF'si ile ilk satırı alınmış XML'den ilk <SATIR></SATIR> bloğunu siliyor
4. SP_HUCRELERE_AYIR stored procunun içinde de birçok UDF mevcut ve bunlar da BORC_TUTARI, ALACAK_TUTARI, FIS_NO vb. hücrelerin değerini tek tek geri döndürüyor...
Bunlarla birlikte yazdığım formül (en azından geçici olarak, deneme amaçlı yazdığım Stored Procedurenin içeriği) yaklaşık olarak aşağıdaki gibidir:
Kod: Tümünü seç
select UDF_KONTROL_ET(XML) from RDB$DATABASE
into :L_UYGUN_MU;
if (:L_UYGUN_MU<>"UYGUN XML") then
exception HATAVER;
/*BURADA İLK SATIR L_SATIR DEĞİŞKENİNE ALINIYOR...*/
select UDF_SATIR_DONDUR(XML) from RDB$DATABASE
into :L_SATIR;
/*YUKARIDA ALINAN İLK SATIR XML İÇERİĞİNDEN SİLİNİYOR*/
select UDF_ILK_SATIRI_CIKART(XML) from RDB$DATABASE
into:XML;
/*L_SATIR boş değil ve null değil ise döngüye devam...*/
while ((L_SATIR<>'') and (not(L_SATIR is null))) do
begin
/*L_SATIR içindeki hücre bilgilerini ayır ve değişkenlere al*/
select
hesap_id,
fis_turu,
olusturan_kisi,
tarih,aciklama,
borc_tutari,
alacak_tutari
from
SP_HUCRELERE_AYIR(:L_SATIR)
into
:l_hesap_id,
:l_fis_turu,
:l_olusturan_kisi,
:l_tarih,
:l_aciklama,
:l_borc_tutari,
:l_alacak_tutari;
/*DEĞİŞKENLERE ALINMIŞ BİLGİLERİ TABLOYA KAYDET*/
insert into tbl_yevmiye_defteri(
HESAP_ID,
FIS_TURU,
OLUSTURAN_KISI,
TARIH,
ACIKLAMA,
BORC_TUTARI,
ALACAK_TUTARI)
values(
:l_fis_turu,
:l_olusturan_kisi,
:l_tarih,
:l_aciklama,
:l_borc_tutari,
:l_alacak_tutari;
);
/*İLK SATIR L_SATIR DEĞİŞKENİNE ALINIYOR...*/
select UDF_SATIR_DONDUR(XML) from RDB$DATABASE
into :L_SATIR;
/*YUKARIDA ALINAN İLK SATIR XML İÇERİĞİNDEN SİLİNİYOR*/
select UDF_ILK_SATIRI_CIKART(XML) from RDB$DATABASE
into:XML;
end;
Hata Mesajı: "Connection was lost to database:
MUHASEBE (D:\Belgeler\Bilgisayarla İlgili\Delphi Uygulamalarım\Muhasebe1\Veri Tabani\VeriTabani.fdb)"
1. düğme "close database"
2. düğme "restore connection"
Bunun sebebi ne olabilir? Ben 3 günden beri çeşitli şekillerde denedim ama bir türlü başaramadım... Sonsuz döngüye girmesinden şüpheleniyorum fakat veri tabanımın boyutunda herhangi bir artış yok, kayıtlarda herhangi bir artış yok...
UDF'leri oluşturan DLL dosyalarını da tek tek kontrol ettim, herhangi bir problem yok? Bunun sebebi ne olabilir? Bu konuda bana yardımcı olursanız sevinirim... Herkese iyi çalışmalar...