arkadaslar bir tablo icerisinde faturalari tutuyorum. fatura numaralari her yil sifirdan baslamali. ve ben bunlari faturano,yil field lari üzerinde arama yapip, var sayilan yil icin secmis oldugum fatura no verilmis mi verilmemis mi o'nu görüyorum. bir de fatura no'larinda bosluklar olabiliyor. ve ben de program acildiginda ilk bes boslugu listelemeliyim.
isi delphi kisminda cözdüm. calisiyor. fakat biraz uzun sürüyor. bunun icin storedprocedure ile yapip isi server da bitirmek istiyorum. yardimci olursaniz sevinirim...
var i,j,k,l : integer;
liste : TStringList;
-------------------------
for i := 1 to qangebotcheck.RecordCount do begin
j := qangebotcheckkvnr.value;
qangebotcheck.Next;
k := qangebotcheckkvnr.value;
inc(j);
if j < k then begin
for l := j to k -1 do begin
Liste.Add(inttostr(l));
end;
end;
if liste.Count = 5 then break;
end;
yalnizca verilmemis 5 adet fatura nosunu stringlist e yüklemek. ama bunu sp ile yapip sanal tablo gibi göstermem gerekiyor.
sanki bir tablo varmis ve verilmemis fatura nolarini tutuyormus gibi...
bir tablomuz var ve bu tabloda yalnizca iki field var.
bunlardan biri ID (autoinc) ve ikincisi ise isim (Varchar).
her bir isim girdigimde ID otomatik olarak bir artiyor.
ve ben arada bir rastgele veri siliyorum.
simdi öyle bir döngü yapmaliyim ki SP ile, hangi verileri sildigimi ID leri kontrol ederek bulmaliyim.
bana sonuc olarak SP den söyle bir sey dönmeli. Örn.
5
7
12
36
53
bu sekilde silinen ID leri listeleyecek.
Hocam şöyle bir yol izleyebilirsin;
temp adında bir tane vt oluştur ve silerken bu kayıtları bu vt'ye kayıt et
otomatik olarak zorlanmadan ve çok fazla uğraşmadan çabuk bir şekilde istediğin sonuca ulaşabilirsin...
Kolay Gele..
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
CREATE PROCEDURE EKSIGIBUL
RETURNS (
EKSIKIDNO INTEGER)
AS
DECLARE VARIABLE ONCEKISAYI INTEGER = -1;
DECLARE VARIABLE SAYI INTEGER;
begin
for select t.idno from tablo t into :sayi do
begin
if ((:oncekisayi = -1) or (((:sayi-:oncekisayi) = 1))) then
oncekisayi = :sayi;
else
begin
while ((:sayi - ncekisayi ) <> 1) do
begin
oncekisayi = ncekisayi +1;
eksikidno = ncekisayi;
suspend;
end
oncekisayi = :sayi;
end
Hocam aklımda şöyle bir yöntem geldi;
Vt'deki id alanını kayıt sayın kadar bir döngü oluşturarak sıra ile kontrol ettir. Örnek olarak döngü sıra ile bakarken diyelimki 10'a geldiğinde id alanında 10 varmı yok mu bakıcak eğer varsa 11'e geçicek, yoksa bir memo nesnesine yada hernereye eklemek istiyorsanız buna göre olmayan nesneleri sıra ile ekleyecek. Aklıma böyle bir yol geldi ama umarım işine yarar. Sana kod olarak yardımcı olmak isterdim ama kod olarak bakamadım henüz...
Bir gelişme olursa sana cevabını yazarım...
Kolay gele...
Var olmaya değer her şey bilinmeye de değerdir. Çünkü bilgi varlığın bir imgesidir. Onda iyi ve kötü aynı anda bulunmaktadır...
Öncelikle ilgilenen tüm arkadaslara tesekkür ediyorum...
aliemrei Hocam...
vermis oldugunuz kodlari denedim fakat tam sonuc alamadim... $öyle ki:
eger ilk ID no 84 ise, sayim 84 ten basliyor. benim yapmak istedigimde sayi 1 den baslamali.
sonuc 1-2-3-4-5 olmasi gerekirken, 84-85-86-87-88 olarak görünüyor.
ikinci sorun ise bu biraz sonsuz döngü gibi calisiyor hocam
beynim iflas etti cikamiyorum icinden bir türlü. bunu 1 den baslatabilirmiyiz ve sonsuz döngüden kurtarip ilk 5 rakam ile sinirlayabilirmiyiz?
Simdi den cok tesekkür ediyorum.
selam ve dua ile...
CREATE PROCEDURE P_SILINEN_ID_LER
RETURNS (SILINEN_ID INTEGER)
AS
DECLARE VARIABLE aCURRENT_ID INTEGER;
DECLARE VARIABLE aSAYAC INTEGER;
BEGIN
aSAYAC = 1;
FOR SELECT ID FROM MYTABLO ORDER BY ID INTO :aCURRENT_ID
DO
BEGIN
WHILE (aSAYAC < aCURRENT_ID) DO
BEGIN
SILINEN_ID = aSAYAC;
aSAYAC = aSAYAC + 1;
SUSPEND;
END
aSAYAC = aCURRENT_ID + 1;
END
END
ikinci sorun ise bu biraz sonsuz döngü gibi calisiyor hocam
Sonsuz döngü gibi değil tabiki kayıt adetin ve eksik numaran kadar.
prosedürlerde table gibi çalıştıklarından "FIRST 5 * from" şeklinde bir sorgu kullanman bunun gerektiğinden fazla dönmesine engel olacaktır.
Ek olarak umurarım bu kayıtların binlerce olmayacaktır. Yoksa bu yöntem ile bir fatura kesmek işkence haline gelebilir kullanıcılar için. Birde hiç atlanmış numaranın tekrar verilmesi gibi bir durum gerektiren fatura sistemi ile karşılaşmamıştım. Eğer amacın fatura seri numarası değilde sadece atlanmış ID no bırakmamak adına ise sana farklı bir yöntem kullanamadını tavsiye ederim. Foreinkey, UPDATE = CASCADE yöntemini kullanıp GENERATORU SIFIRLAYIP numaraları tekrar aldırman daha mantıklı bir çözüm gibi geldi...
CREATE PROCEDURE NEW_PROCEDURE
RETURNS (KULLANILMAYAN INTEGER)
AS
DECLARE VARIABLE VAR_MAX_ID INTEGER;
DECLARE VARIABLE VAR_MIN_ID INTEGER;
DECLARE VARIABLE VAR_KONTROL_ID INTEGER;
DECLARE VARIABLE VAR_KONTROL_COUNT INTEGER;
DECLARE VARIABLE VAR_TMP INTEGER;
begin
select min(fat_id) from fatura
into :var_min_id;
select max(fat_id) from fatura
into :var_max_id;
if (:var_min_id is null) then
var_kontrol_id = 0;
else
var_kontrol_id = :var_min_id;
var_kontrol_count = 0;
while(var_max_id <> var_kontrol_id and var_kontrol_count <> 5)
do
begin
var_kontrol_id = :var_kontrol_id + 1;
select count(fat_id) from fatura
where fat_id = :var_kontrol_id
into :var_tmp;
if (:var_tmp <= 0) then
begin
Kullanilmayan = :var_kontrol_id;
var_kontrol_count = var_kontrol_count + 1;
suspend;
end
end
end