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
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
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
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
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
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
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.
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 !!!
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
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.
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.
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.