SP den gelen bilgide 40.kayıttan sonrası yanlış

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Salih
Üye
Mesajlar: 250
Kayıt: 11 Mar 2004 05:36

SP den gelen bilgide 40.kayıttan sonrası yanlış

Mesaj gönderen Salih »

Merhaba,

'Saçmalama' dediğinizi duyar gibiyim. Arama da yaptım ama bir sonuca ulaşamadım henüz. Şimdi sorunu biraz açmaya çalışayım.

IBQuery ile Stored procedure çağırıp, sonucu DBGrid'de gösteriyorum.
Ancak DBGridde 41 inci kayıttan sonraki Tutar kolonunun değeri sıfır olarak geliyor.
Eğer bu kayıtlardan örneğin ilk 10 tanesini silersem, daha önce sıfır gelen kayıtların gerçek tutar değerleri gösteriliyor. AMa 40 tan sonrakilerin tutarı gene sıfır.

IBQuery şu şekilde :
select * from SP_TEMPFAT1 ( :BAYIKODU)

IB Expert içinden aynı SP'yi aynı bayi için çalıştırdığımda kayıtların doğru olduğunu görüyorum. DBGrid içinde veya Query parametrelerinde, gelen kayıtlarla ilgili bir sınırlama olabilir mi ?

Bana 70 kayıt dönüyor ve sorun sadece 41-70 arasındaki kayıtlarda ve sadece Tutar alanında. Diğer alanlardaki bilgiler doğru. Bakalım daha neler göreceğiz.
Sevgi, Saygı.....
Kullanıcı avatarı
Kuri_YJ
Moderator
Mesajlar: 2248
Kayıt: 06 Ağu 2003 12:07
Konum: İstanbul
İletişim:

Mesaj gönderen Kuri_YJ »

Selamlar,

SP'nizi ve Table Structure'ınızı gönderin inceleyelim.
Kuri Yalnız Jedi
Harbi Özgürlük İçin Pisi http://www.pisilinux.org/
Salih
Üye
Mesajlar: 250
Kayıt: 11 Mar 2004 05:36

Mesaj gönderen Salih »

Problemin tanımını biraz değiştiriyorum, soru çok daha uzun olacak ama :

Aslında DBgrid doğrudan query sonucuna bağlı değil.

SP_TEMPFAT1 çalışınca TEMPFAT dosyasını yaratıyor, DBGrid ise TEMPFAT dosyasını gösteriyor.

Kod: Tümünü seç

DBGfat.datasource := DSfat;
DSfat.dataset := TBTmpfat;
TBTmpFat.TableName := TmpFat; 
daha doğru ifade etmiş oldum şimdi.

Stored procedure'u IB expert'ten çalıştırırsam kayıtlar doğru, ama delphi içinden çalıştırırsam Xalan, Tutar ve Ftutar değerleri 40. kayıttan sonra 0 geliyor.

Stored Procedure şu şekilde :

Kod: Tümünü seç

SET TERM ^ ;
CREATE PROCEDURE SP_TEMPFAT1 (BAYIKODU VARCHAR(15))
RETURNS ( SIPNO INTEGER, IRSNO INTEGER, HESAPADI VARCHAR(35),
    ADET SMALLINT,  ALAN NUMERIC(12,3), XALAN NUMERIC(12,3),
    UNITEKODU CHAR(1), UNITEADI VARCHAR(15), CIFT VARCHAR(1),
    SEC VARCHAR(1), FATFIYAT NUMERIC(12,3), ISKONTO SMALLINT,
    ISK1 SMALLINT, ISK2 SMALLINT, ISK3 SMALLINT, 
    TUTAR NUMERIC(12,3), FTUTAR NUMERIC(12,3), GARNO INTEGER)
AS
DECLARE VARIABLE HESAPKODU VARCHAR(15);
DECLARE VARIABLE NUMROWS SMALLINT;
DECLARE VARIABLE ISKHESAP FLOAT;
BEGIN
/* FATURA için gereken bilgileri SIPDETAY dan okuyup süzer, TMPFAT tablosunda oluşturur */
  DELETE  FROM TMPFAT;
  FOR
    SELECT SD.siparisno, SD.HESAPKODU, SD.IRSNO, SD.ADET, SD.ALAN, SD.UNITEKODU, SD.CIFT, SD.FATFIYAT, SA.ISKONTO, SA.ISK1, SA.ISK2, SA.ISK3, SA.GARNO
      FROM SIPDETAY SD, SIPANA SA
      WHERE (SA.BAYIKODU = :BAYIKODU) AND (SD.FATNO is NULL) AND
            (SA.SIPARISNO = SD.SIPARISNO) AND (SD.IRSTARIH is not  NULL)
      INTO :SIPNO, :HESAPKODU, :IRSNO, :ADET, :ALAN, :UNITEKODU, :CIFT, :FATFIYAT, :ISKONTO, :ISK1, :ISK2, :ISK3, :GARNO
  DO
  begin
    if (ISK1 is null) then ISK1 = 1;
    if (ISK2 is null) then ISK2 = 1;
    if (ISK3 is null) then ISK3 = 0;
    if (ISK1 = 0 ) then ISK1 = 1;
    if (ISK2 = 0 ) then ISK2 = 1;
    if (unitekodu is null ) then  UNITEKODU = ' ';
    UNITEADI = ' ';
    select UNITEADI from UNITE
      where UNITE.UNITEKODU  = :UNITEKODU into  :UNITEADI;
    if (UNITEADI is null ) then UNITEADI = ' ';

    select HESAPLAR.HESAPADI from HESAPLAR
      where HESAPLAR.HESAPKODU  = :HESAPKODU into :HESAPADI;

    select count(*) from TMPFAT
      where
        TMPFAT.SIPNO     = :SIPNO     AND
        TMPFAT.IRSNO     = :IRSNO     AND
        TMPFAT.HESAPADI  = :HESAPADI  AND
        TMPFAT.UNITEKODU = :UNITEKODU into numrows;
    SEC = ' ';
    if (numrows = 0) THEN
      INSERT INTO TMPFAT (SIPNO, IRSNO, HESAPADI, HESAPKODU,  UNITEKODU, ADET, ALAN, UNITEADI,CIFT,FATFIYAT,ISKONTO,ISK1,ISK2,ISK3,TUTAR,FTUTAR,SEC,GARNO)
       values (:SIPNO, :IRSNO, :HESAPADI, :HESAPKODU,  :UNITEKODU, 0, 0, :UNITEADI,:CIFT, :FATFIYAT,:ISKONTO,:ISK1,:ISK2,:ISK3,0,0,:SEC,:GARNO);

    update tmpFAT set TMPFAT.ADET = TMPFAT.ADET + :ADET,
                      TMPFAT.ALAN = TMPFAT.ALAN + :ALAN
    where
      TMPFAT.SIPNO     = :SIPNO     AND
      TMPFAT.IRSNO     = :IRSNO     AND
      TMPFAT.HESAPADI  = :HESAPADI  AND
      TMPFAT.UNITEKODU = :UNITEKODU;
  END

FOR
 SELECT SIPNO, IRSNO, CIFT, HESAPADI, ADET, ALAN, UNITEKODU, UNITEADI, FATFIYAT, ISKONTO, ISK1, ISK2, ISK3, TUTAR, FTUTAR, GARNO
    FROM TMPFAT
    ORDER BY TMPFAT.SIPNO, TMPFAT.IRSNO, TMPFAT.CIFT, TMPFAT.HESAPADI
    INTO :SIPNO, :IRSNO, :CIFT, :HESAPADI, :ADET, :ALAN, :UNITEKODU, :UNITEADI, :FATFIYAT, :ISKONTO, :ISK1, :ISK2, :ISK3, :TUTAR, :FTUTAR, :GARNO

/* ISK1 / ISK2 Oranı ile Faturada yazılacak ALAN bilgisini hesapla */
/* ve faturaya yazılacak FTUTAR bilgisini hesapla */
 DO begin
/* deneme yapmak için */
/*    ISKONTO = 20; ISK1 = 1; ISK2 = 2; ISK3 = 5; */

    TUTAR = :FATFIYAT * (1 - :ISKONTO/100.00) * :ALAN;
    if (:ISK2 > 0) then XALAN = :ALAN * :ISK1 / :ISK2; ELSE XALAN = ALAN;

    FTUTAR = :FATFIYAT * (1.00 - (:ISKONTO + :ISK3) / 100.00) * :XALAN;

    update tmpFAT set TMPFAT.TUTAR = :TUTAR ,
                      TMPFAT.FTUTAR = :FTUTAR,
                      TMPFAT.XALAN  = :XALAN
    where
      TMPFAT.SIPNO     = :SIPNO     AND
      TMPFAT.IRSNO     = :IRSNO     AND
      TMPFAT.HESAPADI  = :HESAPADI  AND
      TMPFAT.UNITEKODU = :UNITEKODU;
       SUSPEND;
    END
END
^
SET TERM ; ^
GRANT SELECT,INSERT,DELETE,UPDATE ON TMPFAT TO PROCEDURE SP_TEMPFAT1;
GRANT SELECT ON SIPDETAY TO PROCEDURE SP_TEMPFAT1;
GRANT SELECT ON SIPANA TO PROCEDURE SP_TEMPFAT1;
GRANT SELECT ON UNITE TO PROCEDURE SP_TEMPFAT1;
GRANT SELECT ON HESAPLAR TO PROCEDURE SP_TEMPFAT1;
TMPFAT tablosunun yapısı da şöyle :

Kod: Tümünü seç

CREATE TABLE TMPFAT (
    SIPNO      INTEGER NOT NULL,
    IRSNO      INTEGER,
    CIFT       VARCHAR(1) NOT NULL COLLATE PXW_TURK,
    HESAPADI   VARCHAR(35) NOT NULL COLLATE PXW_TURK,
    UNITEKODU  CHAR(1) NOT NULL COLLATE PXW_TURK,
    HESAPKODU  VARCHAR(15) COLLATE PXW_TURK,
    ADET       SMALLINT,
    ALAN       DMN_ALAN /* DMN_ALAN = NUMERIC(12,3) DEFAULT 0 */,
    XALAN      DMN_ALAN /* DMN_ALAN = NUMERIC(12,3) DEFAULT 0 */,
    UNITEADI   DMN_AD15 COLLATE PXW_TURK /* DMN_AD15 = VARCHAR(15) */,
    SEC        VARCHAR(1) COLLATE PXW_TURK,
    FATFIYAT   DMN_PARA /* DMN_PARA = NUMERIC(12,2) */,
    ISKONTO    SMALLINT,
    ISK1       SMALLINT,
    ISK2       SMALLINT,
    ISK3       SMALLINT,
    TUTAR      DMN_PARA /* DMN_PARA = NUMERIC(12,2) */,
    FTUTAR     DMN_PARA /* DMN_PARA = NUMERIC(12,2) */,
    GARNO      INTEGER
);

/******************************************************************************/
/****                             Primary Keys                             ****/
/******************************************************************************/

ALTER TABLE TMPFAT ADD CONSTRAINT PK_TMPFAT PRIMARY KEY (SIPNO, CIFT, HESAPADI, UNITEKODU);


/******************************************************************************/
/****                              Privileges                              ****/
/******************************************************************************/


/* Privileges of users */
GRANT SELECT, INSERT, UPDATE, DELETE ON TMPFAT TO PUBLIC;

/* Privileges of procedures */
GRANT SELECT ON TMPFAT TO PROCEDURE SP_FAT_YAZILDI;
GRANT SELECT, INSERT, UPDATE, DELETE ON TMPFAT TO PROCEDURE SP_TEMPFAT1;
Sevgi, Saygı.....
Salih
Üye
Mesajlar: 250
Kayıt: 11 Mar 2004 05:36

Mesaj gönderen Salih »

SP'nin sonundaki anlamsız SUSPEND i kaldırınca sorun çözüldü , Saatlerimi yedi ama bu tek kelime.... :eyo:

Amma ve lakin ilk 40 kayıttaki tutar bilgilerinin doğru, 40 tan sonrakilerin ise yanlış gelmesinin nedenini hala tam olarak anlayamadım.
Sevgi, Saygı.....
Kullanıcı avatarı
hdayi
Kıdemli Üye
Mesajlar: 1284
Kayıt: 29 Oca 2004 01:53
Konum: Erciyes'in eteklerinden.

Mesaj gönderen hdayi »

:)
viewtopic.php?t=7217

Anlaşılan bu suspend yanlış kullanılınca sapıtıyor...
Bişnev in ney çün hikâyet mîküned
Ez cüdâyîhâ şikâyet mîküned
Resim
Cevapla