firebirdde triger çalışıyor dediler bana

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ı
ALUCARD
Üye
Mesajlar: 1270
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Mesaj gönderen ALUCARD »

Kod: Tümünü seç

CREATE PROCEDURE MUSTERI_URUN_CIKIS_DELETE_ODENDI ( ODEMEDURUM char (255),  LOG INTEGER,  GENELTOPLAM FLOAT)  AS
begin
 if (ODEMEDURUM='Yapıldı') then
  begin
  update MUSTERIKARTI set 
    ALACAKTUTARI = ALACAKTUTARI+:GENELTOPLAM where
    LOG = :LOG; 
  delete from MUSTERIKARTI 
    where LOG=:LOG and BORCTUTARI=0; 
end
END
şeklinde değiştirdim

bu seferde

Kod: Tümünü seç

[b]This operation is not defined for system tables.
unsuccessful metadata update.
Name longer than database column size.[/b]
hatası verdi
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365. Üyesi
Hiç Bir Şey İnsan Kadar Yükselemez ve Alçalamaz

Erkan ÇAĞLAR
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1270
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Mesaj gönderen ALUCARD »

pardon procedurun adını uzun yazmışım ondan yapmıyormuş

şimdi oldu
procedurun adını biraz kıstım
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365. Üyesi
Hiç Bir Şey İnsan Kadar Yükselemez ve Alçalamaz

Erkan ÇAĞLAR
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

ama nedir satisbaslik
. ile eristigine gore ya nesne yada record
sen bunu veritabanı icinde nasıl kullanıyorsun.
delphideki degisken nesneleri, vs. firebird icine ısınlama diye bir sey yok malesef
vt deki storedproc a bir giris parametresi tanımla
sp yi cagırırken su sekilde cagır
(yaptıgın islem bir recordset dondurmedigi icin)
execute procedure mysp(parametre)
bunu ibsql ile delphiden calıstırıabilirsin
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1270
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Mesaj gönderen ALUCARD »

gkimirti yazdı:ama nedir satisbaslik
. ile eristigine gore ya nesne yada record
sen bunu veritabanı icinde nasıl kullanıyorsun.

tamam hocam kızma ya :cry:

yaptık bi hata

şimdi benim yapmak istediğm satisbaslik (Burda Satıi faturalarının başlık bilgileri tutuluyor.) tablosunun ODEME alanının değeri eğer Yapıldı ise müşterinin hem alacağina hemde borcuna eklemekki bakiye değişmesin

uğraştım şu kodu çıkardım

Kod: Tümünü seç

CREATE PROCEDURE MUS_URUN_CIKIS_INSERT_ODENDI(
    ODEMEDURUM CHAR(25),
    LOG INTEGER,
    GENELTOPLAM FLOAT)
AS
   DECLARE VARIABLE DLR_KAYIT_SAYISI INTEGER;
        begin
        IF (ODEMEDURUM='Yapıldı') THEN
      select count(*)from MUSTERIKARTI where LOG = :LOG INTO DLR_KAYIT_SAYISI; 
      if (DLR_KAYIT_SAYISI=0) then
      insert into MUSTERIKARTI (LOG,ALACAKTUTARI) values(:LOG,0);
      update musterikarti set ALACAKTUTARI = ALACAKTUTARI-:GENELTOPLAM where LOG = :LOG;
        End
ama çalışmıyor.

Kod: Tümünü seç

Arithmatic overlof or division by zero occurred.
arithmatic exception, numeric overlof, or string trunction.
Cannot transliterate character between character sets.
hatası verdi
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365. Üyesi
Hiç Bir Şey İnsan Kadar Yükselemez ve Alçalamaz

Erkan ÇAĞLAR
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

karsılastırma icin string ifadeler (hele hele icinde turkce karakter bulunan -Yapıldı gibi-) kullanmak yerine sayısal ifadeler kullan
yada tek karakterli string kullan
gerek programında gerek vt deki sp icinde bir acıklama ile neyin ne oldugunu yazarsın ilerde baktıgında da kafan karısmaz...

bu hatayı farklı alan tiplerini birbirine atarken veriyordu.
mesela double (yada float) alanı numeric bir degiskene atayınca bu tip bir hata almıstım. belki karsılastırmadan kaynaklanıyordur eger degil ise
GENELTOPLAM ile ALACAKTUTARI aynı tipte mi onlara bakmak lazım.

kolay gelsin
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

odemedurumunu integer a çevir ve bunalrın karşılıklarını bir tabloada tut
ID integer
ADI varchar(20)
bunu delphi içinde istersen lookup olarak yada view içinde join ile karşılığını alırsın. eğer bir değişiklik yapman gerekirse kodu değiştirmek yerine tabloya bir alan eklemen yeterli olacaktır. hatta bunu kullanıcıya bile açabilirsin. Ayrıca türkçe yada özel karakterler gibi yada büyük küçük harf gibi yazılım hatalarını ortadan kaldırmış olursun, ayrıca tam hatırlamıyorum ama sıfır değerini bir sayıya bölmeye kalkarsan hata verir

Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

freeman35 yazdı:ayrıca tam hatırlamıyorum ama sıfır değerini bir sayıya bölmeye kalkarsan hata verir
Tam tersi olacak yani bir sayıyı sıfıra bolmek hataya sebep olur.... ;)
* http://www.fahrettin.org Manzara Fotoğraflarım... :)
* http://delphiturkiye.gunduz.info Seminerler... ;)
* http://www.hakmar.com.tr Kalite bir haktır... 8)
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,
ALUCARD yazdı: uğraştım şu kodu çıkardım

Kod: Tümünü seç

CREATE PROCEDURE MUS_URUN_CIKIS_INSERT_ODENDI(
    ODEMEDURUM CHAR(25),
    LOG INTEGER,
    GENELTOPLAM FLOAT)
AS
   DECLARE VARIABLE DLR_KAYIT_SAYISI INTEGER;
        begin
        IF (ODEMEDURUM='Yapıldı') THEN
      select count(*)from MUSTERIKARTI where LOG = :LOG INTO DLR_KAYIT_SAYISI; 
      if (DLR_KAYIT_SAYISI=0) then
      insert into MUSTERIKARTI (LOG,ALACAKTUTARI) values(:LOG,0);
      update musterikarti set ALACAKTUTARI = ALACAKTUTARI-:GENELTOPLAM where LOG = :LOG;
        End
ama çalışmıyor.

Kod: Tümünü seç

Arithmatic overlof or division by zero occurred.
arithmatic exception, numeric overlof, or string trunction.
Cannot transliterate character between character sets.
hatası verdi
Şimdi ben hatalara göz attığımda bir kaç şey dikkatimi çekti. Nedenini ve ne zaman karşılaştığımı hatırlamıyorum ama benzer bir durum olmuştu.

Kod: Tümünü seç

      select count(*)from MUSTERIKARTI where LOG = :LOG INTO DLR_KAYIT_SAYISI; 
      if (DLR_KAYIT_SAYISI=0) then
      insert into MUSTERIKARTI (LOG,ALACAKTUTARI) values(:LOG,0);
sanırım Select Count(*)'dan Null değer dönüyor OLABİLİR. Ve karşılaştırmada Null değer ile rakam karşılaştırmasına kızıyor olabilir. Bundan bir bir buçuk yıl önce Interbase ile çalışırken karşılaştım sanırım ve o sebeple IsNull UDF'ini yazmıştım.

Hangi DB var? Hangi Version? Bunları da eklersen biraz daha netleştirebiliriz sanırım.

Ayrıca cannot translitarete between character sets diyor ise, table'ların Collationları birbirinden farklı demektir ve String alanlara atama yaparken kızar. Bunları da bir kontrol etmek gerekiyor. Hepsini aynı Collation'a çevirmek lazım.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1270
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Mesaj gönderen ALUCARD »

yaşasın artık triger de yazıyorum sp de

yanlız şimdi yapmak istediğm şey

işlem yapılan satır uzerindeyken

yani kdv alanına 18 girdiğimde toplam alanındaki sayıyı kdv ye gore hesaplayıp geneltoplam alanına yazacak

mümkünmü dür :lol:
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365. Üyesi
Hiç Bir Şey İnsan Kadar Yükselemez ve Alçalamaz

Erkan ÇAĞLAR
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Mümkün tabiki :wink:

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1270
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Mesaj gönderen ALUCARD »

husonet yazdı:Mümkün tabiki :wink:
de nasıl oldugu konusunda bir fikir edinmek istiyorum...
:o
:oops:
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365. Üyesi
Hiç Bir Şey İnsan Kadar Yükselemez ve Alçalamaz

Erkan ÇAĞLAR
Kullanıcı avatarı
mege
Admin
Mesajlar: 2360
Kayıt: 05 Şub 2004 04:32
Konum: Beşiktaş
İletişim:

Mesaj gönderen mege »

ALUCARD yazdı:mümkünmü dür :lol:
Fahrettin abi görmesin bunu :P valla ben iki seminerde ne gösteriyom diye kafanıza kafanıza atar valla triggerları sp'leri :lol:
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

:) Bencede :)

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Kullanıcı avatarı
ALUCARD
Üye
Mesajlar: 1270
Kayıt: 27 Eyl 2003 10:12
Konum: Samsun
İletişim:

Mesaj gönderen ALUCARD »

haklısınız da mumkun olmaya şey yok tur diyelim peki bir fikir edinebilirmiyim...... :oops:
بِسْمِ اللهِ الرَّحْمنِ الرَّحِيمِ
Forumun 365. Üyesi
Hiç Bir Şey İnsan Kadar Yükselemez ve Alçalamaz

Erkan ÇAĞLAR
Kullanıcı avatarı
husonet
Admin
Mesajlar: 2962
Kayıt: 25 Haz 2003 02:14
Konum: İstanbul
İletişim:

Mesaj gönderen husonet »

Bunu triger ile yapacaksın mantık şu olmalı. Mantık olarak delphi'de yaptığın kodlamadan farklı bir yapısı yok. Olay alanların null olup olmadığına bakarsın ve null değilse oradaki oranıda işlemine dahil edersin.

Kolay Gelsin...

Gazete manşetleri
* DİKKAT :Lütfen forum kurallarını okuyalım ve uyalım...!
* Warez,crack vs. paylaşımı kesinlikle yasaktır.
Cevapla