FireBird'te inc(tarih)

Firebird ve Interbase veritabanları ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
ahmet_sinav
Üye
Mesajlar: 263
Kayıt: 17 Nis 2004 07:44
Konum: İzmir Yeşilyurt Ulu Cami
İletişim:

FireBird'te inc(tarih)

Mesaj gönderen ahmet_sinav »

Kod: Tümünü seç

CREATE PROCEDURE P_TAKSIT_BOL (ADET INTEGER,PESINAT DOUBLE PRECISION,HIZMET_IDNO INTEGER,TOPLAM_TUTAR DOUBLE PRECISION)
AS
DECLARE VARIABLE VARMI INTEGER;
DECLARE VARIABLE KALAN DOUBLE PRECISION;
DECLARE VARIABLE TARIH VARCHAR(10);
DECLARE VARIABLE AY INTEGER;
DECLARE VARIABLE GUN INTEGER;
DECLARE VARIABLE YIL INTEGER;
DECLARE VARIABLE i INTEGER;
BEGIN
    i=0;
    GUN=SUBSTRING (TARIH FROM 1 FOR 2);
    AY=SUBSTRING (TARIH FROM 3 FOR 2);
    YIL=SUBSTRING (TARIH FROM 7 FOR 4);
    SELECT IDNO FROM HIZMET_TAKSITLERI WHERE  HT_HIZMET_IDNO=:HIZMET_IDNO INTO VARMI;
    IF (not VARMI IS NULL) THEN
        BEGIN
            KALAN=(TOPLAM_TUTAR-PESINAT)/ADET;
            WHILE (i=0) DO
                BEGIN
                    ay=ay+1; if (ay>=13) then
                    begin
                    ay=1;
                    yil=yil+1;
                    end
                    tarih=gun+'.'+yil+'.'+tarih;
                    INSERT INTO HIZMET_TAKSITLERI (HT_ALINAN,HT_KALAN,HT_TUTAR,HT_TARIH,HT_HIZMET_IDNO,HT_PESINAT)
                                           VALUES (0,:KALAN,:TOPLAM_TUTAR,:TARIH,:HIZMET_IDNO,:PESINAT);
                END
        EXIT;
        END

KALAN=0;
ADET=0;
INSERT INTO HIZMET_TAKSITLERI (HT_ALINAN,HT_KALAN,HT_TUTAR,HT_TARIH,HT_HIZMET_IDNO,HT_PESINAT)
                                           VALUES (0,:KALAN,:TOPLAM_TUTAR,:TARIH,:HIZMET_IDNO,:PESINAT);

END
şeklinde bir kod yazdım bunun amacı gönderilen parametrelere göre hizmet_taksitleri tablosunda taksitler oluşturmak.
Fakat tarih olayında tıkandım.

Kod: Tümünü seç

ay=ay+1; if (ay>=13) then 
                    begin 
                    ay=1; 
                    yil=yil+1; 
                    end 
                    tarih=gun+'.'+yil+'.'+tarih;
tarihi bir sonraki aya geçirmeye çalışıyorum.tanımladığım değişkenler (ay,gun,yıl) integer ve ben bu değerleri Varchar(10) olan tarih alanına atmaya çalışıyorum fakat tarih alanı string diğer alan da integer olduğu için

Kod: Tümünü seç

tarih=gun+'.'+yil+'.'+tarih;
satırında normal olarak hata alıyorum.Bunu nasıl çözebilirim veya Inc(tarih)
gibi bir fonksiyon var mı?
yardımlarınız için şimdiden teşekkürler;
Saygılar;
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

S.A.
sanırım CAST senin işini görecektir. son toplama alanında sayıları (gün ay yıl) cast ile tek tek string tipinde toplatacaksın.

Kod: Tümünü seç

 tarih=cast(gun as char)+'.'+cast(ay as char)+'.'+cast(yil as char)
valla cast ın kullanımı yukarda doğrumu bilemiyorum ama buna benzer bişey olması lazım. forumda vardı.
kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
ahmet_sinav
Üye
Mesajlar: 263
Kayıt: 17 Nis 2004 07:44
Konum: İzmir Yeşilyurt Ulu Cami
İletişim:

Mesaj gönderen ahmet_sinav »

selam;

Kod: Tümünü seç

tarih=cast(gun as char)+'.'+cast(ay as char)+'.'+cast(yil as char);
şeklinde proceedure'e kodu ekleyince

Unsuccessful execution caused by a system error that precludes
successful execution of subsequent statements.
Dynamic SQL Error.
expression evaluation not supported.

Bu tarz bir işlemin desteklenmediğine dair bir hata alıyorum.
Tek tırnak yerine çift tırnak koyunca
Column Unknown hatası alıyorum.
Sayın Aslangeri arkadaşımın verdiği cast kullanımı doğru.misalen tek başına

Kod: Tümünü seç

tarih=cast(gun as char)
çalışıyor.ay gun ve yılı aynı yöntemle tarih değişkenine atabiliyorum ve hata almıyorum fakat araya nokta koymaya çalıştığım zaman yukarıdaki hatayı alıyorum.
Farklı bir değişken tanımlayıp buna "." atayıp sonra birleştireyim dedim gene aynı hata.
Benim buradan anladığım farklı tipleri cast fonksiyonu kullanarak birleştiremiyoruz.Ya da ben eksik birşeyler yapıyorum.
Yardımlarınız için şimdiden teşekkürler;
Saygılar;

Bu arada VT=fb 1.5
Kullanıcı avatarı
ahmet_sinav
Üye
Mesajlar: 263
Kayıt: 17 Nis 2004 07:44
Konum: İzmir Yeşilyurt Ulu Cami
İletişim:

Mesaj gönderen ahmet_sinav »

forumda önceden yazılan

viewtopic.php?t=3301&highlight=cast

bi konuşmada bahsi geçmiş
olay

Kod: Tümünü seç

tarih=cast (gun as char)||Nokta||cast (gun as char)||nokta||cast (gun as char);
şeklinde yapınca problem çözüldü;
+ yerine ||
Saygılar;
Kullanıcı avatarı
ahmet_sinav
Üye
Mesajlar: 263
Kayıt: 17 Nis 2004 07:44
Konum: İzmir Yeşilyurt Ulu Cami
İletişim:

Mesaj gönderen ahmet_sinav »

Selam arkadaşlar;
yukaraıdaki procedure'un en son hali aşağıdaki gibi

Kod: Tümünü seç

BEGIN
    i=1;
    GUN=SUBSTRING (TARIH FROM 1 FOR 2);
    AY=SUBSTRING (TARIH FROM 3 FOR 2);
    YIL=SUBSTRING (TARIH FROM 7 FOR 4);
    NOKTA='.';
    tarih=gelentarih;
    if (adet is null) then exit;
    SELECT IDNO FROM HIZMET_TAKSITLERI WHERE  HT_HIZMET_IDNO=:HIZMET_IDNO INTO VARMI;/*önceden böyle bir kayıt olup olmadığına bakılır*/
    IF (VARMI IS NULL) THEN  /*önceden böyle bir kayıt yoksa*/
        BEGIN/*1*/
            if (adet=0)/*ödeme peşin ise*/
                then
                    begin/*2*/
                     KALAN=0;/*kalan 0'a eşitlenir*/
                     ADET=0;/*adet 0'dır zaten*/
                     INSERT INTO HIZMET_TAKSITLERI (HT_ALINAN,HT_KALAN,HT_TUTAR,HT_TARIH,HT_HIZMET_IDNO,HT_PESINAT,HT_ADET)/*tek bir kayıt insertlenir*/
                                            VALUES (:TOPLAM_TUTAR,:KALAN,:TOPLAM_TUTAR,:TARIH,:HIZMET_IDNO,:TOPLAM_TUTAR,:ADET);/*ödeme peşin yapıldıysa alınan toplam_tutara eşittir kalan 0'dır tarih ilgili tarihtir*/

                    end/*2-2*/
            if (adet>0) then/*ödeme peşin değilse*/
            begin/*3*/
            KALAN=(TOPLAM_TUTAR-PESINAT)/ADET;/*aylık ödeme miktarı hesaplanıyor*/
            WHILE (i=adet) DO
                BEGIN/*4*/
                    ay=ay+1; if (ay>=13) then
                    begin/*5*/
                    ay=1;
                    yil=yil+1;
                    end/*5-5*/
                    tarih=cast (gun as char)||Nokta||cast (gun as char)||nokta||cast (gun as char);/*tarih ay arttırımından sonra birleştiriliyor*/
                    i=i+1;
                    INSERT INTO HIZMET_TAKSITLERI (HT_ALINAN,HT_KALAN,HT_TUTAR,HT_TARIH,HT_HIZMET_IDNO,HT_PESINAT,HT_ADET)
                                           VALUES (0,:KALAN,:TOPLAM_TUTAR,:TARIH,:HIZMET_IDNO,:PESINAT,:ADET);
                END/*4-4*/
            end/*3-3*/
        EXIT;     
        END/*1*/
END
bu procedure'u tetikleyen trigger'ı ise aşağıdaki gibi düzenledim

Kod: Tümünü seç

CREATE TRIGGER HIZMETLER_BI0 FOR HIZMETLER
ACTIVE BEFORE INSERT POSITION 0
AS
begin
 EXECUTE PROCEDURE p_taksit_bol(NEW.H_TAKSIT_ADEDI,NEW.H_PESINAT,NEW.IDNO,NEW.H_TOPLAM_TUTAR,NEW.h_tarih);
end
kotlarda herhangibir problem yok ama hizmet taksitleri tablosuna insert işlemini hatalı yapıyor.
eğer taksit adedi 0 ise taksitlendirme yapmadan direkman peşin ödeme olarak alıyor fakat taksit sayısı 0'dan büyük olunca istediğim gibi taksit bölme işlemini yapmıyor mantık olarak kotlarda problem yokmuş gibi duruyor ama nedense istediğim işlemi (taksitlere bölme) yapmıyor.
Yardımlarınız için şimdiden teşekkürler;
Saygılar;
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

ahmet_sinav yazdı: GUN=SUBSTRING (TARIH FROM 1 FOR 2);
AY=SUBSTRING (TARIH FROM 3 FOR 2);
YIL=SUBSTRING (TARIH FROM 7 FOR 4);
NOKTA='.';
tarih=gelentarih;
tarih değişkenine değer tarihi kullandıktan sonra atmışsın. acaba bundan dolayı olabilirmi.
birde tarihleri alırken

Kod: Tümünü seç

 extract(day from tarih)
şeklinde alabilirsin. dönen değer sanırım sayısal oluyordu. ay için month yıl içinse year kullanabilirsin.
Kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
ahmet_sinav
Üye
Mesajlar: 263
Kayıt: 17 Nis 2004 07:44
Konum: İzmir Yeşilyurt Ulu Cami
İletişim:

Mesaj gönderen ahmet_sinav »

Selam;
Sayın Aslangeri;
Dediğiniz olaylara baktım kullanım için daha pratik ama benim sorunumu çözen bişiy değil hala sorunun ne olduğunu anlamış değilim.
Yardımlarınız için şimdiden teşekkürler;
Saygılar;
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

evet extract sorunu çözmüyor zaten dediğin gibi o kolaylaştırma açısında. çözüm onun üzerinde yazdıklarımdı. (tabi sorunu doğru tesbit etmişsem)

Kod: Tümünü seç

tarih=gelentarih
satırını

Kod: Tümünü seç

 GUN=SUBSTRING (TARIH FROM 1 FOR 2);
AY=SUBSTRING (TARIH FROM 3 FOR 2);
YIL=SUBSTRING (TARIH FROM 7 FOR 4); 
satırlarından önce yazıp bi dene.
Kolay gelsin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
ahmet_sinav
Üye
Mesajlar: 263
Kayıt: 17 Nis 2004 07:44
Konum: İzmir Yeşilyurt Ulu Cami
İletişim:

Mesaj gönderen ahmet_sinav »

İlginiz için teşekkür ederim.
dediğiniz değişikliği yaptım ve denedim zaten fakat hala aynı;
Saygılar;
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

şimdi bi dakka ben problemi taksitlerin tarihinde olarak algıladım o yüzden ona dönük bir çözüm düşündüm.
taksit sayısı 0'dan büyük olunca istediğim gibi taksit bölme işlemini yapmıyor
istediğiniz gibi bölme işlemi yapmıyor derken eğer problem 2 takside böl dediğin zaman 1 taksit yapıyorsa i=i+1 satırından kaynaklanıyor olabilir. eğer i=1 yerine i=0 yazarsan hallolması lazım (eğer problem bu ise)

Not: tam olarak yapmasını istediğiniz ama yapmadığı şey ney acaba.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
ahmet_sinav
Üye
Mesajlar: 263
Kayıt: 17 Nis 2004 07:44
Konum: İzmir Yeşilyurt Ulu Cami
İletişim:

Mesaj gönderen ahmet_sinav »

Sayın Aslangeri,
ilk postta evet problemim tarihle alakalı idi ama tarih olayını çözdüğümü bildirmiştim zaten.Yeni bir başlık açmadan aynı yere mesajı yazayım dedim çünkü aynı konuyla alakalı.önceki postları takip ederseniz bunu belirttiğimi görürsünüz.
Neyse hala olayı çözemedim bu gidişle delphi içerisinden halledicem gibi ama client-server'da performans nasıl olur biraz soru işareti.
Projeyi teslim etmeme az bir zaman kaldı ama hala aynı yerdeyim.
Yardımlarınız için şimdiden teşekkürler;
Saygılar;
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

kardeş kodların yapmasını istediğin şey, kodların yaptığı şeyi bir örnekle (rakamlarla )açıklayabilirmisin.
mesala
p_taksit_bol(NEW.H_TAKSIT_ADEDI,NEW.H_PESINAT,NEW.IDNO,NEW.H_TOPLAM_TUTAR,NEW.h_tarih);
gönderilen değerler

Kod: Tümünü seç

p_taksit_bol(3,100,1,1000,"01.01.2004")
burda 3 taksit, 100 lira peşinat, 1 numaralı musteri(yada ?), 1000 lira dan, 01.01.2004 den başlayarak takistlendir. istediğin sonuç

Kod: Tümünü seç

1.  01.02.2004 tarihinde 300 lira
2.  01.03.2004 tarihinde 300 lira
3.  01.04.2004 tarihiinde 300 lira
bu, peki yukardaki kodların verdiği sonuç ???????

Eğer yukardaki tesbitimde bi hata varsa senin yapmak istediğin ve programın yaptığını bu şekilde açıklayabilirmisin.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
ahmet_sinav
Üye
Mesajlar: 263
Kayıt: 17 Nis 2004 07:44
Konum: İzmir Yeşilyurt Ulu Cami
İletişim:

Mesaj gönderen ahmet_sinav »

Selam;
misalen
p_taksit_bol(5,1000000,1,3500000,"01.01.2004")
şeklinde procedure'e değer göndediğimde aşağıdaki değerlerin hizmet_islemleri tablosunda olması gerek

Kod: Tümünü seç

1-ht_alinan
2-ht_kalan
3-ht_tutar
4-ht_tarih
5-ht_hizmet_idno
6-ht_pesinat
7-ht_adet
-----------------------------------------------------
1)0-500000-500000-01.02.2004--1 -1000000-5 //bir sonraki ay
2)0-500000-500000-01.03.2004--1 -1000000-5//bir sonraki ay
3)0-500000-500000-01.04.2004--1 -1000000-5//bir sonraki ay
4)0-500000-500000-01.05.2004--1 -1000000-5//bir sonraki ay
5)0-500000-500000-01.06.2004--1 -1000000-5//bir sonraki ay
----------------------------------------------------
Şeklinde sonuç çıkarması gerekiyor.
Yani procedure'e gönderilen taksit adedi (5) kadar taksite bölecek(5 kere insertliyecek) sonra hesaplattırdığım aylık tutarı ve kalan miktarı
((3500000-1000000)/5=500000)'a
eşitleyecek sonra herbir insert için ayı bir arttıracak
(01.02.2004 01.03.2004.....).Fakat hiç bir işlem yapmıyor.
Taksit adedini 0(sıfır) girdiğim zaman(yani peşin ödeme olduğu zaman)
p_taksit_bol(0,0,1,3500000,"01.01.2004")

Kod: Tümünü seç

1)3500000-0-3500000-01.01.2004-1-0-0
 
şeklinde sonucu istediğim gibi çıkarıyor ve problemsiz çalışıyor
Yardımlarınız için şimdiden teşekkürler;
Saygılar;
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Mesaj gönderen aslangeri »

:eyo: :eyo:
Buldum Buldum
WHILE (i=adet) DO
:twisted: :twisted: :twisted:

Kod: Tümünü seç

while (i<adet) do
olması lazım sanırım.
:eyo: :eyo: :eyo: :eyo:
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Kullanıcı avatarı
ahmet_sinav
Üye
Mesajlar: 263
Kayıt: 17 Nis 2004 07:44
Konum: İzmir Yeşilyurt Ulu Cami
İletişim:

Mesaj gönderen ahmet_sinav »

Sayın Aslangeri;
Senden Allah Razı olsun ne deyim akılsız başın cezasını gözler çekermiş.
Kaç gündür uğraşıyorum bunu bir türlü görememişim.Şu an canavar gibi çalışıyor.Tekrar tekrar foruma ve aslangeri'ye çok teşekkürler.
Saygılar;
Cevapla