Trigger icinde set genator gen_fis_no to 0 olmuyor

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ı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Trigger icinde set genator gen_fis_no to 0 olmuyor

Mesaj gönderen musti »

Triger icinde genaraotur sifirlayamıyiroum
set GENERATOR GEN_FIS_NO TO 0;
olmuyor hata veriyor

trigger soyle

Kod: Tümünü seç

CREATE TRIGGER FIS_MASTER_BI0 FOR FIS_MASTER
ACTIVE BEFORE INSERT POSITION 0
AS 
 DECLARE variable gecici CHAR(2); 
begin 
  select coalesce(max(cast(substring(fis_no from 7 for 2) as integer)),0)
    from fis_master
   into gecici; 

if (gecici=0) then 
 set GENERATOR GEN_FIS_NO TO 0
end

dedigim zaman
Invalid token.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 20, char 3.
set


mesajını veriyor
Kullanıcı avatarı
gkimirti
Admin
Mesajlar: 1956
Kayıt: 02 Eyl 2003 04:44
Konum: İstanbul

Mesaj gönderen gkimirti »

Kod: Tümünü seç

execute statement  'set generator gen_deneme to 0';
seklinde kullanabilirsin
yalnız burda daha kritik bir durum sozkonusu..
generatorleri setledikten sonra rollback ile geri alamazsın..
yani trigger bu generatoru kosul saglandı diye sıfırladı
ama kullanıcı islemi iptal etti yani commit etmedi
ama generator artık sıfırlanmıstır...
ÜŞENME,ERTELEME,VAZGEÇME
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

hocam tskler
istedigim cevabi aldim sizden
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Generator ü sıfırlamanın bir yoluda şu;

Kod: Tümünü seç

select gen_id(gen_stok_id, -1 * gen_id(gen_stok_id, 0)) from rdb$database
Burada mevcut generator u -1 ile çarpıp kendisinden çıkartarak sıfırlama yapılıyor.

Tabi sonucu SP içinde kullanırken into ile bir değişkene atamak lazım :wink:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

s.a.

bunu isitememdeki amac aynı anda iki pcden fiş girişi yapılacagı zaman aynı noyu otomatik veriyordu. bende gen_id yapayım dedim ama o zaman mantıgımız yanlis oluyor soyleki

fis_no =gun+ay+no
yani
fis_no ='08.10' + GEN_ID

eger 08.10 ile baslayan hic yoksa gen_id yi sifirla
('set generator gen_deneme to 0';

buraya kadar sorun yok ama sorun su
eger 07.10 tarihine girerisek o zaman gen_id sorunlu oluyor

o zaman da her gune bri genartor tutmak gerekiyor tabiki bu soz konusu bile degil.

ben de gen_id yi max ike o no ile baslaya son noya eşitledim bu seferde her iki makinayada aynısı veriyor.

yani nasıl yapacam bilemiyorum zor işim zor

kaydet tusuna basınca yeni no alayım dedim. o zaman da ekrandaki fisno bu idi sonra ben buna kaydetmiştim baska bir numaradan cıktı diyorlar ü
:(
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Burada amaç sadece eşsiz (unique) liği sağlamak ise generator u sıfırlamana gerek yok. Yok her güne ait kayıtlara sıra ile numara vermen gerekiyorsa bir başka yöntemle o güne ait anahtar (key) i oluştururken select count(*) ... unu alıp bir artırarak anahtar alanı oluşturabilirsin :idea:
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
musti
Üye
Mesajlar: 527
Kayıt: 11 Tem 2005 09:44

Mesaj gönderen musti »

hocam
2veys 3 pc den fis girisi yapiliyor
fis bir master ve birde fis_detail dosyasından olusuyor
fis numara pk ve fk

fis numarası o gun ve ayın toplamının arırımıdan olusuyor
yani bugun 09.10.2005 ve ilk fis ise fisno=09.10.1 oluyor bu arada ikinci pcden giris ise 09.10.2 oluyor.
ama 3.pc dune ait fis girecekse dunde en son 40 nolu fisi girmisse yeni fis_no=08.09.41 olmalı

yapmak istedigim bu hocam saygılar
Cevapla