veriler icerisinde bosluklari yakalamak

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

veriler icerisinde bosluklari yakalamak

Mesaj gönderen ikra »

selamu aleyküm...

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

su an kullandigim kodlar su sekilde

Kod: Tümünü seç

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;
simdiden tesekkür ederim...
selam ve dua ile...
kıdemsiz üye
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1527
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

tam olarak anlayamadım hocam, amacın faturanolarındaki boşlukları atmak mı? yok boşluk olanları, boşluklarına dokunmadan sadece listelemek mi??
DeveloperToolKit

..::|YeşilMavi|::..
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Mesaj gönderen ikra »

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...
kıdemsiz üye
Kullanıcı avatarı
aliemrei
Üye
Mesajlar: 19
Kayıt: 08 Kas 2005 06:15
Konum: Antalya

slm

Mesaj gönderen aliemrei »

sanırım önceklikle hangi vt yi kullandığını yazarsan ona göre bir cevap çıkacak.
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Mesaj gönderen ikra »

Firebird v 1.5 kullaniyorum. yazmayi unutmusum :oops:
kıdemsiz üye
Kullanıcı avatarı
aliemrei
Üye
Mesajlar: 19
Kayıt: 08 Kas 2005 06:15
Konum: Antalya

Mesaj gönderen aliemrei »

tablo yapısını ve yapmak istediğini biraz daha açıklayıcı yazarsan sanırım yardımcı olabilirim.
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Mesaj gönderen ikra »

hocam söyle farz edelim...

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.
kıdemsiz üye
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Mesaj gönderen Biltes »

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...
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Mesaj gönderen ikra »

hocam ikinci bir tablo kullanmadan, yalnizca hesap islemi ile SP de bunu halletmemin bir imkani yok mu?
kıdemsiz üye
Kullanıcı avatarı
aliemrei
Üye
Mesajlar: 19
Kayıt: 08 Kas 2005 06:15
Konum: Antalya

Mesaj gönderen aliemrei »

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 - :oncekisayi ) <> 1) do
begin
oncekisayi = :oncekisayi +1;
eksikidno = :oncekisayi;
suspend;
end
oncekisayi = :sayi;
end


end
end
^
Kullanıcı avatarı
Biltes
Üye
Mesajlar: 361
Kayıt: 11 Oca 2005 02:24
Konum: Edirne

Mesaj gönderen Biltes »

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...
ikra
Üye
Mesajlar: 901
Kayıt: 28 Nis 2005 01:26
Konum: Simdilik Topragin Üstü

Mesaj gönderen ikra »

Ö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 :oops:

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...
kıdemsiz üye
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

Silinen ID'lerini öğrenmek istediğiniz tablonun adını MYTABLO ile değiştirerek bu procedure'ü oluşturunuz:

Kod: Tümünü seç

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
Select * FROM P_SILINEN_ID_LER

veya

select FIRST 5 * from P_SILINEN_ID_LER

dediğinizde sadece silinen ID'ler gelecektir.
Kullanıcı avatarı
aliemrei
Üye
Mesajlar: 19
Kayıt: 08 Kas 2005 06:15
Konum: Antalya

Mesaj gönderen aliemrei »

ikra yazdı: aliemrei Hocam...

ikinci sorun ise bu biraz sonsuz döngü gibi calisiyor hocam :oops:
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...

bu yöntemle tek yapman gerekenede :

Kod: Tümünü seç

update tablo set IDNO = GEN_ID(GENERATORADI,1)
gün sonu eylemi olarak bu işlemlenden ibaret olur.

Hakan Can 'ın kodu işini görecektir.
En son aliemrei tarafından 10 Kas 2005 04:47 tarihinde düzenlendi, toplamda 2 kere düzenlendi.
Kolay Gelsin
Kullanıcı avatarı
lazio
Moderator
Mesajlar: 1527
Kayıt: 11 Tem 2003 04:55
Konum: İstanbul

Mesaj gönderen lazio »

Kod: Tümünü seç

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
DeveloperToolKit

..::|YeşilMavi|::..
Cevapla