Firebird SP de Tarih döngüsü

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ı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Firebird SP de Tarih döngüsü

Mesaj gönderen aslangeri »

s.a. arkadaşlar.
firebirdde iki tarih arasındaki kayıtları tek tek gezmek için bir döngü kurulabilirmi acaba. veya böyle bir döngüyü nasıl kurabiliriz.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: Firebird SP de Tarih döngüsü

Mesaj gönderen emin_as »

Kod: Tümünü seç

CREATE PROCEDURE ARIZARAPORU(
  ILKTARIH DATE,
  SONTARIH DATE,
  ARIZAM1 VARCHAR(20) CHARACTER SET NONE)
RETURNS(
  PLAKAM VARCHAR(10) CHARACTER SET NONE,
  TARIHIM DATE,
  SIRANO INTEGER,
  TESLIMAL VARCHAR(30) CHARACTER SET NONE,
  BITISTARIHIM DATE)
AS
begin
for
  select distinct t.sirano, t.plaka,t.tarih,t.teslimalan,t.bitistarih from tamir t
    left join  tamhar h on h.sirano=t.sirano
   where t.tarih > :ilktarih and t.tarih < :sontarih and h.ariza = :arizam1
     into :sirano,:plakam,:tarihim,:teslimal,:BITISTARIHIM
   do
     suspend;
end^
Aradıgın böyle bir şey olablir mi, bu sadece iki tarih arasındaki listeleri dölküyor.
Listeler üzerinde işlem yapacaksan, do dan sonra begin end ile istediğini yapabilirsin.

Aşagıdaki örnek, mazbata oluşturmak için 5-6 yıl önce yazılmıştı.
SQL konusunda o dönem yeni oldugumdan kod çok temiz degil, ama sanırım fikir vermesi için yardımcı olur.
MAZOLUS harket tablolardan gelen bilgilerin toplamın, bir başka tabloya ekliyor.
Aslında sum larla çok daha basit tasarlanabilirdi.

Kod: Tümünü seç

CREATE PROCEDURE MAZOLUS(
  ID SMALLINT)
RETURNS(
  SONUC INTEGER)
AS
declare variable RAFILK VARCHAR(10);
     declare variable RAFSON VARCHAR(10);
     declare variable ILKTARIH DATE;
     declare variable SONTARIH DATE;
     declare variable DEVIRTARIH DATE;
     declare variable TARIHVAR VARCHAR(1);
     declare variable DEFTERVAR VARCHAR(1);
     declare variable DEVMIK NUMERIC(16, 2);
     declare variable DEVTUT NUMERIC(16, 2);
     declare variable ALMIK NUMERIC(16, 2);
     declare variable ALTUT NUMERIC(16, 2);
     declare variable VERMIK NUMERIC(16, 2);
     declare variable VERTUT NUMERIC(16, 2);
     declare variable BAKMIK NUMERIC(16, 2);
     declare variable BAKTUT NUMERIC(16, 2);
     declare variable RAFNO1 VARCHAR(10);
     declare variable RAFADI1 VARCHAR(30);
     declare variable TIP1 VARCHAR(1);
     declare variable MIK1 NUMERIC(16, 2);
     declare variable TUT1 NUMERIC(16, 2);
begin
delete from mazbata where id=:id;
  select ilkraf,sonraf,ilktarih,sontarih,devirtarih,tarihvar,deftervar
    from maztanim where id=:id
    into :rafilk,:rafson,:ilktarih,:sontarih,:devirtarih, :tarihvar,:deftervar ;
  FOR
    select RAFNO,RAFADI,DEVIR,DEVIRTUTARI
      from STOK
      where RAFNO > :rafilk and RAFNO < :rafson
      into :RAFNO1,:RAFADI1,:DEVMIK,:DEVTUT
    do
      begin
        if (devtut is null) then devtut=0;
        if (devmik is null) then devmik=0;
        vermik=0;
        vertut=0;
        almik=0;
        altut=0;
        bakmik=0;
        baktut=0;
        if (tarihvar='A') then
        begin
          for
           select s.tip,sum(s.miktar),sum(s.tutar) from stmar s
             left join stmak h on h.tip=s.tip and h.makbuzno = s.makbuzno
             where rafno=:rafno1 and  tarih < :devirtarih
            group by s.tip
            into :tip1,:mik1,:tut1
          do
            begin
              if  (mik1 is null) then mik1=0;
              if  (tut1 is null) then tut1=0;
              if (tip1='A') then
              begin
                almik=mik1;
                altut=tut1;
              end
              if (tip1='B') then
              begin
                vermik=mik1;
                vertut=tut1;
              end
            end
         devmik=devmik+almik-vermik;
         devtut=devtut+altut-vertut;
         vermik=0;
          vertut=0;
          almik=0;
          altut=0;
          bakmik=0;
          baktut=0;
        end
        for
          select s.tip,sum(s.miktar),sum(s.tutar) from stmar s
            left join stmak h on h.tip=s.tip and h.makbuzno = s.makbuzno
            where rafno=:rafno1 and tarih >= :ilktarih  and tarih <= :sontarih
            group by s.tip
            into :tip1,:mik1,:tut1
          do
            begin
              if  (mik1 is null) then mik1=0;
              if  (tut1 is null) then tut1=0;

              if (tip1='A') then
              begin
                almik=mik1;
                altut=tut1;
              end
              if (tip1='B') then
              begin
                vermik=mik1;
                vertut=tut1;
              end
            end
         bakmik = devmik + almik - vermik;
         baktut = devtut + altut - vertut;
      insert into mazbata (id,rafno,rafadi,devirmik,devirtut,almik,altut,vermik,vertut,bakmik,baktut)
         values (:id,:rafno1,:rafadi1,:devmik,:devtut,:almik,:altut,:vermik,:vertut,:bakmik,:baktut);
         vermik=0;
          vertut=0;
          almik=0;
          altut=0;
          bakmik=0;
          baktut=0;
   end
   if (deftervar = 'A') then
   begin
     select sum(miktar),sum(tutar) from defhar7
     where tarih >= :ilktarih and tarih <= :sontarih
     into :mik1,:tut1;
     if  (mik1 is null) then mik1=0;
     if  (tut1 is null) then tut1=0;

     insert into mazbata (id,rafno,rafadi,devirmik,devirtut,almik,altut,vermik,vertut,bakmik,baktut)
         values (:id,'DEFTER7','7. DEFTER ',0,0,:mik1,:tut1,:mik1,:tut1,0,0);
   end
end^
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Firebird SP de Tarih döngüsü

Mesaj gönderen aslangeri »

@emin_as; ilgin için teşekkür ederim.
ancak istediğim tarih1 den tarih2 ye kadar bir döngü.
tarih aralığına göre filitrelemek değil.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: Firebird SP de Tarih döngüsü

Mesaj gönderen emin_as »

Evet yanlış anlamışım, while ile yapılabiliyor, for ile hiç denemedim.
Belki For select ile de yapılabilir, denemek lazım.

Kod: Tümünü seç


CREATE PROCEDURE NEW_PROCEDURE
RETURNS(
  CIKTI DATE,
  RAKAM SMALLINT)
AS
DECLARE VARIABLE TARIH DATE;
BEGIN
  TARIH  = 'TODAY';
  RAKAM = 1;
  while ( TARIH  < '12/01/2010') do
  begin     
    RAKAM = RAKAM+1;  
    TARIH = TARIH +1;
    CIKTI = TARIH;  
    SUSPEND;
  end  
END;
Kullanıcı avatarı
aslangeri
Moderator
Mesajlar: 4322
Kayıt: 26 Ara 2003 04:19
Konum: Ankara
İletişim:

Re: Firebird SP de Tarih döngüsü

Mesaj gönderen aslangeri »

evet bu işime yarıyabilir.
teşekkür ediyorum.
Duyduğun Şeylerin Söylediklerim Olduğuna Eminim Ama
Anladığın Şeylerin Anlatmak İstediklerim Olduğuna Emin Değilim
Cevapla