SP içinde tekrar kayıt filitreleme

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
anemos
Üye
Mesajlar: 110
Kayıt: 02 Nis 2007 07:51
Konum: Sakarya / Hendek

SP içinde tekrar kayıt filitreleme

Mesaj gönderen anemos »

Merhaba,

FIFO maliyetine göre hesaplama yapan bir SP hazırladım.
Yapmak istediğim:
SP ile hesaplama sonucunda miktarı tükenenlere "0" veriyorum. Dönen sonuçları Select yaparken "0" dan büyük değerleri Where kullanmadan, SP içersinde elemek istiyorum. SP de nasıl bir düzenleme gerekiyor?

Tablo yapısı ve SP aşağıdadır.

Kod: Tümünü seç

CREATE TABLE HAREKETLER
(
  HAREKET_ID Integer,
  STOK_ID Integer,
  TARIH Date,
  G_C Varchar(1) COLLATE PXW_TURK,
  ACIKLAMA Varchar(40) COLLATE PXW_TURK,
  MIKTAR Double precision,
  FIYAT Double precision,
  TUTAR Double precision
);

Kod: Tümünü seç

CREATE PROCEDURE FIFO_HESAP_LISTESI (
    STK_ID Integer DEFAULT 1 )
RETURNS (
    HAREKET_ID Integer,
    STOK_ID Integer,
    TARIH Date,
    G_C Varchar(1),
    ACIKLAMA Varchar(40),
    MIKTAR Double precision,
    BAKIYE Double precision )
AS
DECLARE GIREN_TOP_SATIR DOUBLE PRECISION DEFAULT 0;
DECLARE CIKAN_TOPLAMI DOUBLE PRECISION DEFAULT 0;
BEGIN
EXECUTE STATEMENT
'SELECT Sum(MIKTAR) FROM HAREKETLER WHERE G_C = ''C''' INTO :CIKAN_TOPLAMI;
  FOR
    SELECT HAREKET_ID,STOK_ID,TARIH,G_C,ACIKLAMA,MIKTAR
    FROM HAREKETLER WHERE STOK_ID = :STK_ID AND G_C = 'G'    
    INTO :HAREKET_ID,:STOK_ID,:TARIH,:G_C,:ACIKLAMA,:MIKTAR  
  DO 
    BEGIN    
    GIREN_TOP_SATIR = GIREN_TOP_SATIR + MIKTAR;
    IF (GIREN_TOP_SATIR - CIKAN_TOPLAMI > 0) THEN 	
	  IF (GIREN_TOP_SATIR - CIKAN_TOPLAMI < MIKTAR) THEN 
             MIKTAR = GIREN_TOP_SATIR - CIKAN_TOPLAMI;
          ELSE
	     MIKTAR = MIKTAR;
    ELSE
    	MIKTAR = 0;
        BAKIYE =IIF(GIREN_TOP_SATIR - CIKAN_TOPLAMI > 0,
                         GIREN_TOP_SATIR - CIKAN_TOPLAMI, 0);
	SUSPEND;
    END
END
emin_as
Üye
Mesajlar: 559
Kayıt: 01 Eki 2008 10:05
Konum: izmir
İletişim:

Re: SP içinde tekrar kayıt filitreleme

Mesaj gönderen emin_as »

Firbirddeki procedure lerde suspend yapılınca satır bilgisi döner, eger suspend bölümüne if-kontrolu koyarsan hangi bilgilerin döneceğini seçebilirsin.

Aşagıdaki kod bakiye 0 dan küçükse bilgiyi döndürecektir.

Kod: Tümünü seç

  ELSE
       MIKTAR = 0;
        BAKIYE =IIF(GIREN_TOP_SATIR - CIKAN_TOPLAMI > 0,
                         GIREN_TOP_SATIR - CIKAN_TOPLAMI, 0);
   if (BAKIYE < 0) then  SUSPEND;
    END
anemos
Üye
Mesajlar: 110
Kayıt: 02 Nis 2007 07:51
Konum: Sakarya / Hendek

Re: SP içinde tekrar kayıt filitreleme

Mesaj gönderen anemos »

Çok teşekkür ederim, hız da arttı.
Cevapla