Triger da problemim var

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
spiderman
Üye
Mesajlar: 70
Kayıt: 02 Ara 2005 03:17

Triger da problemim var

Mesaj gönderen spiderman »

Merhabalar,

Asagida 1 adet triger ve 1 adet sp var. ornekgini verdigim triger 1 table'in delete,insert ve edit eventlarinda calisiyor. datalari diger trigerlar tarafindanda kullanilan sp ye atarak toplam stok rakkamini takip etmemi sagliyor. Sorunum stokid ve turid gibi fieldlarin Null gelmesi durumunda satir guncellestirmede bulunamadi gibi bir hata olusturuyor. engellemek icin isnull kontrollerini koydum. ama genede bazen ayni hatayi veriyor. eger inceleyip yaptigim hatalari bulursaniz cok sevinirim. zor durumda kaldim ama cozemiyorumda :(

Saygilarimla;

Triger :

Kod: Tümünü seç

CREATE TRIGGER [ERP_DepoTransferMST_All] ON [dbo].[ERP_DepoTransferMST]
FOR INSERT, UPDATE, DELETE
AS
BEGIN
  /* Trigger body */
  SET NOCOUNT ON
  DECLARE StokCRS CURSOR FOR
     SELECT GirisDepoID,GirenUrunID,GirenTurID,GirenPaket,GirenMiktar,GirenMiktar FROM Deleted
  OPEN StokCRS
  DECLARE @mDepoID Integer
  DECLARE @mStokID Integer
  DECLARE @mTurID Integer
  DECLARE @mPaket nvarchar(10)
  DECLARE @mAdet float
  DECLARE @mAdet2 float
  FETCH NEXT FROM StokCRS INTO @mDepoID,@mStokID,@mTurID,@mPaket,@mAdet,@mAdet2
  WHILE (@@FETCH_STATUS = 0) BEGIN
    Set @mAdet=0-Isnull(@mAdet,0)
    Set @mAdet2=0-IsNull(@mAdet2,0)
    Set @mStokID=isnull(@mStokID,0)
    Set @mTurID=isnull(@mTurID,0)
    Execute StokIsle @mDepoID,@mStokID,@mTurID,@mPaket,@mAdet,@mAdet2
    FETCH NEXT FROM StokCRS INTO @mDepoID,@mStokID,@mTurID,@mPaket,@mAdet,@mAdet2
  END
  CLOSE StokCRS
  DEALLOCATE StokCRS
  DECLARE YStokCRS CURSOR FOR
     SELECT GirisDepoID,GirenUrunID,GirenTurID,GirenPaket,GirenMiktar,GirenMiktar FROM Inserted
  OPEN YStokCRS
  FETCH NEXT FROM YStokCRS INTO @mDepoID,@mStokID,@mTurID,@mPaket,@mAdet,@mAdet2
  WHILE (@@FETCH_STATUS = 0) BEGIN
    Set @mAdet=Isnull(@mAdet,0)
    Set @mAdet2=IsNull(@mAdet2,0)
    Set @mStokID=isnull(@mStokID,0)
    Set @mTurID=isnull(@mTurID,0)
    Execute StokIsle @mDepoID,@mStokID,@mTurID,@mPaket,@mAdet,@mAdet2
    FETCH NEXT FROM YStokCRS INTO @mDepoID,@mStokID,@mTurID,@mPaket,@mAdet,@mAdet2
  END
  CLOSE YStokCRS
  DEALLOCATE YStokCRS
END
GO
Stored Procedure

Kod: Tümünü seç

CREATE PROCEDURE StokIsle (@DepoID integer,@UrunID integer,@TurID integer,@Paket varchar(10),@Adet float,@Adet2 Float) as
Set @TurID=IsNull(@TurID,0)
Set @UrunID=IsNull(@UrunID,0)
Set @Paket=IsNull(@Paket,'')
If  (Select Kod From dbo.ERP_HizliStok
        Where DepoID=@DepoID and UrunID=@UrunID and isnull(TurID,0)=isnull(@TurID,0) and
              isnull(Paket,'')=isnull(@Paket,'')) is Null
 INSERT INTO dbo.ERP_HizliStok
   (DepoID, UrunID, TurID,Paket)
   VALUES(@DepoID, @UrunID,@TurID,@Paket)
UPDATE dbo.ERP_HizliStok
Set Stok=ISNull(Stok,0)+ISNull(@Adet,0),
       StokOlcum=ISNull(StokOlcum,0)+ISNull(@Adet2,0)
Where DepoID=@DepoID and UrunID=@UrunID and isnull(TurID,0)=isnull(@TurID,0) and Paket=@Paket
GO
Hakan Can
Üye
Mesajlar: 634
Kayıt: 04 Mar 2005 04:27
Konum: Ankara

Mesaj gönderen Hakan Can »

DECLARE StokCRS CURSOR FOR
SELECT GirisDepoID,GirenUrunID,GirenTurID,GirenPaket,GirenMiktar,GirenMiktar FROM Deleted

yerine örneğin:

DECLARE StokCRS CURSOR FOR
SELECT GirisDepoID, ISNULL(GirenUrunID, 0), ISNULL(GirenTurID, 0), ISNULL(GirenPaket, 0), ISNULL(GirenMiktar, 0), ISNULL(GirenMiktar, 0) FROM Deleted

yazarak baştan NULL problemini halledip diğer NULL kontrollerini iptal ederek hem daha sade TRIGGER ve STORED PROCEDURE yazmış
hem belki de problemini de halletmiş olabilirsin.

Bu şekilde sadeleştirip tekrar bu kodları ve mümkünse ait olduğu tablonun yapısını (CREATE TABLE (...) gönderirsen belki daha yardımcı olabiliriz.

İyi çalışmalar.
Kullanıcı avatarı
spiderman
Üye
Mesajlar: 70
Kayıt: 02 Ara 2005 03:17

Mesaj gönderen spiderman »

Ilginize cok tesekkur ederim

Stok Devir Dosyasi (Triger Bu dosyada)

Kod: Tümünü seç

CREATE TABLE [dbo].[Stok_Devirler] (
	[Kod] [int] IDENTITY (1, 1) NOT FOR REPLICATION  NOT NULL ,
	[StokID] [int] NULL ,
	[TurID] [int] NULL ,
	[Paket] [nvarchar] (15) COLLATE Turkish_CI_AS NULL ,
	[Miktar] [float] NULL ,
	[Dvz] [nvarchar] (3) COLLATE Turkish_CI_AS NULL ,
	[BFiyat] [float] NULL ,
	[Depo] [int] NULL ,
	[Tarih] [datetime] NULL ,
	[RMiktar] [float] NULL 
) ON [PRIMARY]
GO

Stok Miktarlari Dosyasi (SP bu dosyaya yaziyor)

Kod: Tümünü seç

CREATE TABLE [dbo].[ERP_HizliStok] (
	[Kod] [int] IDENTITY (1, 1) NOT FOR REPLICATION  NOT NULL ,
	[DepoID] [int] NULL ,
	[UrunID] [int] NULL ,
	[TurID] [int] NULL ,
	[Paket] [nvarchar] (10) COLLATE Turkish_CI_AS NULL ,
	[Stok] [float] NULL ,
	[StokOlcum] [float] NULL 
) ON [PRIMARY]
GO

Cevapla