cursor

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
hakkus
Üye
Mesajlar: 160
Kayıt: 18 Haz 2003 12:02
Konum: Konya

cursor

Mesaj gönderen hakkus »

Merhabalar,
Database olarak firebird kullanıyorum.
Select le seçtiğim veriler üzerinde table.next gibi aşağı doğru hareket etmek istiyorum. Bunu storedProcedure'in içinde yapmam gerek.
"Declare cursor............
fetch // next " ifadesini firebird'de kullanamadım.
Ayrıca
"For select alan1, alan2 from table" ile de yapamadım.
Bu konuda bilgisi olan varmı?
Saygıyla.
saygılar
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

viewtopic.php?t=1163&highlight=cursor

linkine bakarsaniz orada stored procedure icinden interbase'in cursor tanimlamaya musade etmedigi gecmekte idi. Fakat bu benim 2 yil onceki bir tespitim idi. Firebird icin son durumdan haberdar degilim.. Boyle bir sorun devam ediyor olabilir....
Kullanıcı avatarı
fahrettin
Admin
Mesajlar: 2619
Kayıt: 11 Haz 2003 10:38
Konum: İstanbul
İletişim:

Mesaj gönderen fahrettin »

bir de ek olarak yapmak istediginiz is tam olarak nedir? Belki cursor tanımlamaya gerek olmadan bir cozum onerisi olabilir....
hakkus
Üye
Mesajlar: 160
Kayıt: 18 Haz 2003 12:02
Konum: Konya

Mesaj gönderen hakkus »

Fahrettin Bey,
ilginize teşekkür ederim.
Bir funksiyonum var delphide çalışan..
detail deki kalan>0 kayıtları seçiyorum.
table1.filter
//
var odenen:float;
begin
table1.first;
while not table1.eof do
begin
if odenen>table1KALAN then
begin
table1.edit;
table1Kalan:=0;
Odenen:=odenen-kalan;
end;
if odenen=Table1KALAN then
begin
table1.edit;
table1Kalan:=0;
Odenen:=0;
Exit;
end;
if odenen<Table1KALAN then
begin
table1.edit;
table1Kalan:=Table1Kalan-Odenen
odenen:=0;
exit;
end;
if odenen=0 then exit;
table1.next;
end;
END;
///
Bu fonksiyonu SProcedure yapmak istiyorum.
Kayıtlar select le seçildikten sonra kalan ve odenen değerine göre kalan alanı update edilecek. Her update odenen miktarı azalacak. Odenen=0 durumunda exit olacak.
Saygıyla.
saygılar
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,

IB ve FB'de henüz Delphi'den kullanılabilecek bir biçimde CURSOR kullanımı yok. Ancak Hem IB'de hem de FB'de CURSOR kullanımı var. Bunu kullanmak için C++'de yazmanız gerekiyor. Maalesef ben de çok tırmalamıştım ancak IB'nin ve FB'nin dokumanlarını hatmedince gördüm :) Orada da söylemişler Delphi'den CURSOR kullanılamaz diye :)

Yapmak istediğiniz eşleme mantığını ben de SP olarak yapayım dediğimde karşılaşmıştım. Ne yazık ki SP yönteminden vazgeçmeniz gerekiyor. Ancak tamamını değil ama bir kısmını SP'ye yıkarsanız işlemlerinizi kolaylaştırmış olursunuz. Yani bazı seri sorgu veya update'leri ancak SP'ye atın o zaman daha kolay olur. Ben öyle yapmıştım. :)

Benzer bir sorundu ve ben de Yarı Delphi tarafında yarı FB tarafında yaparak çözdüm.

Kolay gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
hakkus
Üye
Mesajlar: 160
Kayıt: 18 Haz 2003 12:02
Konum: Konya

Mesaj gönderen hakkus »

Merhabalar,
Sayın Kuri_TLJ
İlginiz ve cevaplarınız için teşekkür ederim.
Saygıyla
saygılar
Kullanıcı avatarı
safak
Şafak EBESEK
Mesajlar: 165
Kayıt: 05 Ağu 2003 04:39
Konum: Istanbul
İletişim:

Mesaj gönderen safak »

Gönderdiğiniz kodu yeniden düzenledim. Kodun mantığını değiştirmedim. Çok daha değişik şekillerde de yazılabilir. Temel olarak FOR SELECT DO ile seçilmiş kayıtlar tek tek taranıyor ve istenilen kayıtlar UPDATE WHERE ile güncelleniyor. Yeni durumu aşağıdaki satırlarda bulabilirsiniz:

-------------------------------------------------------------------
CREATE PROCEDURE NEW_PROCEDURE (
....MUSNO INTEGER,
....ODEME DOUBLE PRECISION)
AS
DECLARE VARIABLE DUSEN DOUBLE PRECISION;
DECLARE VARIABLE ANAHTAR BIGINT;
BEGIN

....FOR SELECT KALAN,TEKIL FROM AYRINTI
........WHERE AMUS_NO=:MUSNO AND KALAN>0
........ORDER BY TARIH ASC
........INTO:DUSEN, :ANAHTAR DO
....BEGIN

........IF (ODEME>DUSEN) THEN
........BEGIN
............ODEME=ODEME-DUSEN;
............UPDATE AYRINTI SET ODENEN=ODENEN+KALAN, KALAN=0
.............WHERE TEKIL=:ANAHTAR ;
........END

........IF (ODEME=DUSEN) THEN
........BEGIN
............ODEME=0;
............UPDATE AYRINTI SET ODENEN=ODENEN+KALAN, KALAN=0
.............WHERE TEKIL=:ANAHTAR ;
............EXIT ;
........END

........IF (ODEME<DUSEN) THEN
........BEGIN
............UPDATE AYRINTI SET ODENEN=ODENEN+:ODEME, KALAN=KALAN-:ODEME
.............WHERE TEKIL=:ANAHTAR ;
............ODEME=0;
............EXIT ;
........END

....END

END
-------------------------------------------------------------------

Aşağıdaki noktaları göz önüde bulundurmanızı öneriyorum:
**
SQL set mantığı ile çalışıyor. Halbuki çoğumuz kayıt mantığına alışığız. SQL yaklaşımında bir tablo içerisindeki her kayıt tek olmalıdır. UPDATE ifadesinden sonra, hangi kayıdın update edileceğini bildirmek için WHERE kullandım. Tablonuzda her kayıtın tekil olmasını sağlayan bir anahtar varsa onu kullanabilirsiniz. Ben tablonuzda TEKIL alanı olduğunu varsayarak kodu düzenledim. Eğer Tablonuz bu şartı sağlamıyorsa, siz de bir alan (autoincrement olabilir) ekleyip kayıt düzeyinde tekilliği sağlayabilirsiniz.
**
Birbirini takip eden if blokları bir risk taşıyor. Örneğin birinci if bloğu çalışır, bazı şartları değiştirir ve ardından ikinci if bloğu da çalışabilir. Sizin kodunuzda ödeme düşenin tam iki katı ise, hem birinci hem de ikinci if bloğu tetiklenir. Böyle durumlarda ya CASE ya da ELSE IF yapıları kullanılmalı. Bir diğer yol da: her if bloğu bitişine EXIT koymak. Sizin kodunuzda olmadığı için koymadım. Bu bakışla uygun görürseniz eklersiniz.

Kolay Gelsin,
Kullanıcı avatarı
mussimsek
Admin
Mesajlar: 7601
Kayıt: 10 Haz 2003 12:26
Konum: İstanbul
İletişim:

Mesaj gönderen mussimsek »

Merhaba,

kodlarınızı Mesaj yazarken üstte bulunan Code butonuna basıp yapıştırıp, sonra tekrar code butonuna basınca daha düzgün gözüküyor. Yani şöyle olacak

[ code] kodlar [ /code]

o zaman boşlukları gözardı etmiyor ve daha düzgün gözüküyor.

Kolay gelsin.
Kullanıcı avatarı
safak
Şafak EBESEK
Mesajlar: 165
Kayıt: 05 Ağu 2003 04:39
Konum: Istanbul
İletişim:

Mesaj gönderen safak »

Ben de bir yolu olmalı diye düşünüyodum.
Teşekkürler.
hakkus
Üye
Mesajlar: 160
Kayıt: 18 Haz 2003 12:02
Konum: Konya

Mesaj gönderen hakkus »

Merhabalar,
İlginize özellikle Sayın Şafak'a çok teşekkür ederim.
saygılar
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,

Aslında konuyla alakalı değil ama FB'yi ilgilendirdiği için sorayım dedim.

Ver 1.5'i bazı Windows XP makinalarda sorun çıkardı. Bu sebeple ben kullanmayı istemedim daha sonraki versiyonları bekledim. Sizin karşılaştığınız bir sorun oldu mu hiç?

Çünkü bazı gelişmelerden bahsediyor PDF'lerde filan ne bileyim IsnullInt gibi bir takım şeylerden bahsediyor ama ben denediğimde olumlu sonuç alamadım.

Şunlardan biraz bahsedebilir misiniz?

Teşekkürler.

Kolay Gelsin.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Cevapla