🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.bazy-danych
Article #195345

Re: [OT] Re: Baza ok 2500 tabel.

#195345
From: Adam
Date: Wed, 05 Jul 2017 13:21
2162 lines
98749 bytes
W dniu 2017-07-05 o 13:30, wloochacz pisze:
> W dniu 2017-06-20 o 15:20, Adam pisze:
> /ciach/
>
>> Natomiast Symfonia czy jakieś tam Inserty mają oprócz tego, co
>> napisałeś jeszcze sporo innych problemów. Najpoważniejsze: brak
>> spójności systemu. Bywa u klientów, że towar zostanie pobrany na
>> dokument, a nie zejdzie ze stanu magazynowego.
>>
>> W przypadku Optimy, CDN-XL czy Enovy - o spójność baz danych dbają
>> triggery.
> No popatrz, mam bazę Enovy (stan na rok 2015, ale nie sadzę aby były aż
> tak poważne zmiany) pod ręką i nie ma w niej ani jednego triggera.
> Tak wszystko co piszesz poniżej w kontekście Enovy, nie jest prawdziwe...

Aż zobaczyłem do jakiejś bazy:

name	id	xtype	uid	info	status	base_schema_ver	replinfo	parent_obj	crdate 
ftcatid	schema_ver	stats_schema_ver	type	userstat	sysstat	indexdel 
refdate	version	deltrig	instrig	updtrig	seltrig	category	cache
AdresyWWW_INTERFACEUPDATE	2151103	TR	1	0	0	0	0	85575343	2016-08-10 
15:24:11.603	0	0	0	TR	0	8	0	2016-08-10 15:24:11.603	0	85575343	0	0	0	0	0
Zaplaty_INTERFACEDELETE	7723130	TR	1	0	0	0	0	1636916903	2016-08-10 
15:24:13.190	0	0	0	TR	0	8	0	2016-08-10 15:24:13.190	0	1636916903	0	0	0	0	0
Nieobecnosci_INTERFACEDELETE	11199140	TR	1	0	0	0	0	733245667	2016-08-10 
15:24:12.517	0	0	0	TR	0	8	0	2016-08-10 15:24:12.517	0	733245667	0	0	0	0	0
tr_bi_pik_UmowaHistorie	13959126	TR	1	0	0	0	0	1963870063	2016-08-10 
15:24:01.140	0	0	0	TR	0	8	0	2016-08-10 15:24:01.140	0	1963870063	0	0	0	0	0
DefDokumentow_INTERFACEDELETE	14675150	TR	1	0	0	0	0	690101499	2016-08-10 
15:24:11.947	0	0	0	TR	0	8	0	2016-08-10 15:24:11.947	0	690101499	0	0	0	0	0
Attachments_INTERFACEUPDATE	18151160	TR	1	0	0	0	0	533576939	2016-08-10 
15:24:11.607	0	0	0	TR	0	8	0	2016-08-10 15:24:11.607	0	533576939	0	0	0	0	0
ZasInnyPlatnik_INTERFACEDELETE	23723187	TR	1	0	0	0	0	1700917131 
2016-08-10 15:24:13.193	0	0	0	TR	0	8	0	2016-08-10 15:24:13.193	0 
1700917131	0	0	0	0	0
OcenyArkusze_INTERFACEDELETE	27199197	TR	1	0	0	0	0	1181247263	2016-08-10 
15:24:12.520	0	0	0	TR	0	8	0	2016-08-10 15:24:12.520	0	1181247263	0	0	0	0	0
tr_bi_pik_ZajKomornicze	29959183	TR	1	0	0	0	0	1060914851	2016-08-10 
15:24:01.147	0	0	0	TR	0	8	0	2016-08-10 15:24:01.147	0	1060914851	0	0	0	0	0
DefElementow_INTERFACEDELETE	30675207	TR	1	0	0	0	0	754101727	2016-08-10 
15:24:11.953	0	0	0	TR	0	8	0	2016-08-10 15:24:11.953	0	754101727	0	0	0	0	0
BasicDocs_INTERFACEUPDATE	34151217	TR	1	0	0	0	0	853578079	2016-08-10 
15:24:11.607	0	0	0	TR	0	8	0	2016-08-10 15:24:11.607	0	853578079	0	0	0	0	0
ZbiegiPracyIRodz_INTERFACEDELETE	39723244	TR	1	0	0	0	0	1956918043 
2016-08-10 15:24:13.197	0	0	0	TR	0	8	0	2016-08-10 15:24:13.197	0 
1956918043	0	0	0	0	0
OcenyPracownikow_INTERFACEDELETE	43199254	TR	1	0	0	0	0	1501248403 
2016-08-10 15:24:12.523	0	0	0	TR	0	8	0	2016-08-10 15:24:12.523	0 
1501248403	0	0	0	0	0
tr_bi_pik_ZajKomorniczeHis	45959240	TR	1	0	0	0	0	1124915079	2016-08-10 
15:24:01.153	0	0	0	TR	0	8	0	2016-08-10 15:24:01.153	0	1124915079	0	0	0	0	0
DefElementowOcen_INTERFACEDELETE	46675264	TR	1	0	0	0	0	818101955 
2016-08-10 15:24:11.957	0	0	0	TR	0	8	0	2016-08-10 15:24:11.957	0 
818101955	0	0	0	0	0
BudzetyProjektu_INTERFACEUPDATE	50151274	TR	1	0	0	0	0	1045578763 
2016-08-10 15:24:11.610	0	0	0	TR	0	8	0	2016-08-10 15:24:11.610	0 
1045578763	0	0	0	0	0
ZestawieniaKS_INTERFACEDELETE	55723301	TR	1	0	0	0	0	129435535	2016-08-10 
15:24:13.200	0	0	0	TR	0	8	0	2016-08-10 15:24:13.200	0	129435535	0	0	0	0	0
PrzedmiotySzkol_Zakres_FK_RELATION	57103294	TR	1	0	0	0	0	1814297523 
2016-08-10 15:24:11.157	0	0	0	TR	0	8	0	2016-08-10 15:24:11.157	0 
1814297523	0	0	0	0	0
OcenyRealizacje_INTERFACEDELETE	59199311	TR	1	0	0	0	0	1565248631 
2016-08-10 15:24:12.527	0	0	0	TR	0	8	0	2016-08-10 15:24:12.527	0 
1565248631	0	0	0	0	0
DefElemOcenPrac_INTERFACEDELETE	62675321	TR	1	0	0	0	0	882102183 
2016-08-10 15:24:11.960	0	0	0	TR	0	8	0	2016-08-10 15:24:11.960	0 
882102183	0	0	0	0	0
DaneKnt_INTERFACEUPDATE	66151331	TR	1	0	0	0	0	1877581727	2016-08-10 
15:24:11.610	0	0	0	TR	0	8	0	2016-08-10 15:24:11.610	0	1877581727	0	0	0	0	0

itd - 490 rekordów.

Optimka ma 272, CDN-XL ma 852.
Zresztą do XL masz dokumentację, podsyłałem Ci kiedyś.

>
>> Albo cała transakcja (w znaczeniu ścieżki logicznej zdarzeń)
>> przejdzie, albo cała zostanie wycofana. Nawet, gdybym grzebał
>> bezpośrednio w tabelach z danymi, transakcje są spójne, albo trigger
>> nie pozwoli zmienić pola, gdy pozostałe warunki nie są zachowane.
>> Jest to bardzo dobre dla serwisantów.
> Dobre dla serwisantów?
> A co to za serwisant, który grzebie w bazie nie wiedząc jakie będę tego
> konsekwencje dla całego systemu?
>
> Taki "serwisant" niech lepiej trzyma lepkie łapki blisko siebie...

E, tam, nie przesadzaj.

Przykładowy trigger dotyczący elementu transakcji (np. faktury) poniżej.

Myślisz, że bez triggera ktoś by to zapamiętał?


GO
/****** Object:  Trigger [CDN].[TraElem_InsertUpdateDelete_Trigger] 
Script Date: 07/05/2017 15:13:13 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [CDN].[TraElem_InsertUpdateDelete_Trigger]
   ON [CDN].[TraElem]
   FOR INSERT, UPDATE, DELETE
AS
IF (SELECT TOP 1 TrE_TypDokumentu FROM inserted where TrE_TypDokumentu = 
301) = 301
BEGIN
DECLARE @EFakturaTrNId int
Declare dodane Cursor Local Fast_Forward For
Select TrE_TrNId
  From inserted
Open Dodane
While 1=1
   Begin
     Fetch Next From Dodane InTo
         @EfakturaTrNID
      If @@Fetch_Status <> 0 Break
    IF exists (SELECT * FROM CDN.TraNag WHERE TrN_TrNid = @EfakturaTrNId 
AND TrN_DabID IS NOT NULL AND TrN_TypDokumentu = 301 and 
TrN_EfakturaGUID IS NOT NULL)
    AND Exists (SELECT tre_treid FROM inserted where tre_cenat = 0 and 
tre_trnid = @EfakturaTrNId)
      BEGIN
           RaisError ('Nie można modyfikować e-faktury', 16,1)
           RollBack Tran
           Return
      END
END
END
   -- jesli zmienimy lppow na proformie to trzeba tez na wz do nich 
nalezacych
IF exists (SELECT TrE_TypDokumentu FROM inserted where TrE_TypDokumentu 
in (308,309,320) )
BEGIN
    IF  UPDATE( TrE_LpPow )
        AND NOT UPDATE( TrE_TrEId )
        AND NOT UPDATE( TrE_TrNId )
        AND NOT UPDATE( TrE_ZwrId )
        AND NOT UPDATE( TrE_TrEIdProd )
        AND NOT UPDATE( TrE_TypDokumentu )
        AND NOT UPDATE( TrE_Aktywny )
        AND NOT UPDATE( TrE_DataDok )
        AND NOT UPDATE( TrE_DataOpe )
        AND NOT UPDATE( TrE_TwrId )
        AND NOT UPDATE( TrE_Stawka )
        AND NOT UPDATE( TrE_Flaga )
        AND NOT UPDATE( TrE_Zrodlowa )
        AND NOT UPDATE( TrE_TwCNumer )
        AND NOT UPDATE( TrE_TypNB )
        AND NOT UPDATE( TrE_Cena0 )
        AND NOT UPDATE( TrE_Rabat )
        AND NOT UPDATE( TrE_CenaW )
        AND NOT UPDATE( TrE_CenaT )
        AND NOT UPDATE( TrE_Ilosc )
        AND NOT UPDATE( TrE_Jm )
        AND NOT UPDATE( TrE_JmZ )
        AND NOT UPDATE( TrE_JmCalkowite )
        AND NOT UPDATE( TrE_JmPrzelicznikL )
        AND NOT UPDATE( TrE_JmPrzelicznikM )
        AND NOT UPDATE( TrE_IloscJM )
        AND NOT UPDATE( TrE_WartoscNetto )
        AND NOT UPDATE( TrE_WartoscBrutto )
        AND NOT UPDATE( TrE_Cena0WD )
        AND NOT UPDATE( TrE_CenaWWD )
        AND NOT UPDATE( TrE_WartoscNettoWal )
        AND NOT UPDATE( TrE_WartoscBruttoWal )
        AND NOT UPDATE( TrE_KosztUslugi)
        AND NOT UPDATE (TrE_Atr1_DeAId)
        AND NOT UPDATE (TrE_Atr1_Kod)
        AND NOT UPDATE (TrE_Atr1_Wartosc)
        AND NOT UPDATE (TrE_Atr2_DeAId)
        AND NOT UPDATE (TrE_Atr2_Kod)
        AND NOT UPDATE (TrE_Atr2_Wartosc)
        AND NOT UPDATE (TrE_Atr3_DeAId)
        AND NOT UPDATE (TrE_Atr3_Kod)
        AND NOT UPDATE (TrE_Atr3_Wartosc)
        AND NOT UPDATE (TrE_Atr4_DeAId)
        AND NOT UPDATE (TrE_Atr4_Kod)
        AND NOT UPDATE (TrE_Atr4_Wartosc)
        AND NOT UPDATE (TrE_Atr5_DeAId)
        AND NOT UPDATE (TrE_Atr5_Kod)
        AND NOT UPDATE (TrE_Atr5_Wartosc)
      BEGIN
      set nocount on
        DECLARE
          @TrE_TrEId1 INT,
          @TrN_Rodzaj1 INT,
          @TrE_TrNId1 INT,
          @TrE_TypDokumentu1 INT,
          @TrE_LpPow1 INT,
          @TrE_TrEId2 INT,
          @PFzRO int,
          @TrE_TrEIdRO INT,
          @TrE_LpPow2 INT,
    @TrE_TrEIdWZ INT
        DECLARE Dodawane CURSOR LOCAL FAST_FORWARD FOR
          SELECT TrE_TrEId, TrE_TrNId, TrE_LpPow, TrE_TypDokumentu
          FROM inserted
          ORDER BY TrE_TrNId, TrE_Lp
        OPEN Dodawane
        WHILE 1=1
         BEGIN
           FETCH NEXT FROM Dodawane INTO @TrE_TrEId1, @TrE_TrNId1, 
@TrE_LpPow1, @TrE_TypDokumentu1
           IF @@FETCH_STATUS <> 0 BREAK
           SELECT TOP 1
             @TrN_Rodzaj1     = TrN_Rodzaj
           FROM cdn.TraNag
             JOIN cdn.TraElem ON TrN_TrNId = TrE_TrNId AND TrE_TrEId = 
@TrE_TrEId1
          IF (UPDATE (TrE_LpPow) and @TrE_TypDokumentu1 = 320)
          begin
     SELECT TOP 1 @TrE_TrEIdWZ = a.TrE_TrEId
             FROM CDN.TraElem a
             JOIN CDN.tranagrelacje on TrR_TrNID = a.TrE_TrNID AND 
TrR_FaTyp =320 AND TrR_TrNTyp NOT IN (317,309,320)
             JOIN CDN.traelem b on TrR_FaId = b.TrE_TrNID AND 
a.TrE_Lppow = b.TrE_LpPow
             JOIN CDN.tranag  on TrR_TrNId = TrN_TrNID
             WHERE b.TrE_TrEId = @TrE_TrEId1 AND TrN_Rodzaj not in 
(302200,302202) AND a.TrE_TrEId not in (SELECT TeR_ChildId FROM 
CDN.TraElemRelacje WHERE TeR_ParentId = @TrE_TrEId1)
             AND a.TrE_TrEId not in (SELECT TeR_ParentId FROM 
CDN.TraElemRelacje WHERE TeR_ChildId = @TrE_TrEId1)
             ORDER BY TrR_TrRId DESC
            INSERT INTO CDN.TraElemRelacje 
(TeR_ParentTyp,TeR_ParentId,TeR_ChildTyp,TeR_ChildId,TeR_Flaga)
             SELECT TOP 1 
b.TrE_TypDokumentu,b.TrE_TrEId,a.TrE_TypDokumentu,a.TrE_TrEId,0
             FROM CDN.TraElem a
             JOIN CDN.tranagrelacje on TrR_TrNID = a.TrE_TrNID AND 
TrR_FaTyp =320 AND TrR_TrNTyp NOT IN (317,309,320)
             JOIN CDN.traelem b on TrR_FaId = b.TrE_TrNID AND 
a.TrE_Lppow = b.TrE_LpPow
             JOIN CDN.tranag  on TrR_TrNId = TrN_TrNID
             WHERE b.TrE_TrEId = @TrE_TrEId1 AND TrN_Rodzaj not in 
(302200,302202) AND a.TrE_TrEId not in (SELECT TeR_ChildId FROM 
CDN.TraElemRelacje WHERE TeR_ParentId = @TrE_TrEId1)
             AND a.TrE_TrEId not in (SELECT TeR_ParentId FROM 
CDN.TraElemRelacje WHERE TeR_ChildId = @TrE_TrEId1)
             ORDER BY TrR_TrRId DESC
            select @PFzRO = a.Trr_TrNId from cdn.tranagrelacje a
            where a.TrR_FaId =@TrE_TrNId1 AND a.Trr_TrNTyp =308 AND 
a.Trr_FaTyp =320
     if @PFzRO > 0
   begin
select @TrE_TrEIdRO = 0, @TrE_TrEId2 = 0
create table #RO (TrE_TrEIdRO int ,TrE_TrEIdFA int)
     insert into #RO(TrE_TrEIdRO)
  select TeR_ChildId from cdn.traelemrelacje where TeR_ParentId = 
@TrE_TrEId1 and TeR_ParentTyp = 320  and TeR_ChildTyp = 308
     insert into #RO(TrE_TrEIdRO)
  select TeR_ParentId from cdn.traelemrelacje where TeR_ChildId = 
@TrE_TrEId1 and TeR_ChildTyp = 320  and TeR_ParentTyp = 308
select top 1 @TrE_TrEId2 = TeR_ChildId from cdn.traelemrelacje where 
TeR_ParentId = @TrE_TrEId1 and TeR_ParentTyp = 320  and TeR_ChildTyp in 
(302,306)
and TeR_ChildId not in (SELECT TeR_ChildId FROM CDN.TraElemRelacje WHERE 
TeR_ParentId in (select TrE_TrEIdRO from #RO)) order by ter_terid desc
if @TrE_TrEId2 = 0
   select top 1 @TrE_TrEId2 = TeR_ParentId from cdn.traelemrelacje where 
TeR_ChildId = @TrE_TrEId1 and TeR_ChildTyp = 320  and TeR_ParentTyp in 
(302,306)
   and TeR_ParentId not in (SELECT TeR_ChildId FROM CDN.TraElemRelacje 
WHERE TeR_ParentId in (select TrE_TrEIdRO from #RO)) order by ter_terid desc
if @TrE_TrEId2 <> 0
begin
update #RO set TrE_TrEIdFA = @TrE_TrEId2
insert into CDN.TraElemRelacje 
(TeR_ParentTyp,TeR_ParentId,TeR_ChildTyp,TeR_ChildId,TeR_Flaga)
select 308,TrE_TrEIdRO,TrE_TypDokumentu,TrE_TrEIdFA,0 from #RO join 
cdn.traelem on TrE_TrEIdFA = TrE_TrEId--where  TrE_TrEID = @TrE_TrEId2
--select 308,@TrE_TrEIdRO,TrE_TypDokumentu,@TrE_TrEId2,0 from 
cdn.traelem where  TrE_TrEID = @TrE_TrEId2
exec [CDN].[UstawRezerwacje] @TrE_TrEId2,0,0
end
drop table #RO
/*
      select @TrE_LpPow2 = TrE_Lppow
      FROM Cdn.TraElem
      where TrE_TreId = @TrE_TrEId1
      select @TrE_TrEIdRO = tre_treid from cdn.traelem where tre_trnid = 
@PFzRO and tre_lppow = @TrE_LpPow2
      SELECT TOP 1 @TrE_TrEId2 = a.TrE_TrEId
      FROM CDN.TraElem a
      JOIN CDN.tranagrelacje on TrR_TrNID = a.TrE_TrNID AND TrR_FaTyp IN 
(308,309) AND TrR_TrNTyp NOT IN (317,309,308,320)
      JOIN CDN.traelem b on TrR_FaId = b.TrE_TrNID AND a.TrE_Lppow = 
@TrE_Lppow1
      WHERE b.TrE_TrEId = @TrE_TrEIdRO AND a.TrE_TrEId not in (SELECT 
TeR_ChildId FROM CDN.TraElemRelacje WHERE TeR_ParentId = @TrE_TrEIdRO)
      ORDER BY TrR_TrRId DESC
      INSERT INTO CDN.TraElemRelacje 
(TeR_ParentTyp,TeR_ParentId,TeR_ChildTyp,TeR_ChildId,TeR_Flaga)
      SELECT TOP 1 
b.TrE_TypDokumentu,b.TrE_TrEId,a.TrE_TypDokumentu,a.TrE_TrEId,0
      FROM CDN.TraElem a
      JOIN CDN.tranagrelacje on TrR_TrNID = a.TrE_TrNID AND TrR_FaTyp IN 
(308,309) AND TrR_TrNTyp NOT IN (317,309,308,320)
      JOIN CDN.traelem b on TrR_FaId = b.TrE_TrNID AND a.TrE_Lppow = 
@TrE_Lppow1
      WHERE b.TrE_TrEId = @TrE_TrEIdRO AND a.TrE_TrEId not in (SELECT 
TeR_ChildId FROM CDN.TraElemRelacje WHERE TeR_ParentId = @TrE_TrEIdRO)
      ORDER BY TrR_TrRId DESC
      exec [CDN].[UstawRezerwacje] @TrE_TrEId2,0,0
*/
     end
   end
           /*IF (UPDATE (TrE_LpPow) and @TrN_Rodzaj1 = 320009)
           BEGIN
             UPDATE a SET a.TrE_LppowRel = d.TrE_Lppow
             FROM Cdn.TraElem a
             JOIN deleted d ON  d.TrE_TreId = @TrE_TrEId1
             where a.TrE_TreId = @TrE_TrEId1
           END*/
           IF (UPDATE (TrE_LpPow) and @TrN_Rodzaj1 in (320000,320009))
           BEGIN
             UPDATE a SET a.TrE_Lppow = d.TrE_Lppow
             FROM Cdn.TraElem a
             JOIN deleted d ON  d.TrE_TreId = @TrE_TrEId1
             where a.TrE_TreId = @TrE_TrEId1
    --poprawa zgłoszenia 150109
     UPDATE a SET a.TrE_LppowRel = a.TrE_Lppow ,a.TrE_Lppow = 
@TrE_Lppow1 FROM Cdn.TraElem a
     JOIN deleted d ON  d.TrE_TreId = @TrE_TrEId1
      join cdn.traelemrelacje on TeR_ChildId = a.tre_treid and 
TeR_ParentId = @TrE_TrEId1 and TeR_ChildTyp = 306
   join cdn.tranag WZ on a.tre_trnid = WZ.trn_trnid
   join cdn.tranagrelacje on trr_faid =  WZ.trn_trnid and TrR_TrNTyp = 302
   join cdn.traelem b on b.tre_trnid = TrR_TrNId and b.tre_treid = 
@TrE_TrEIdWZ
    --poprawa zgłoszenia 154645
     UPDATE a SET a.TrE_LppowRel = a.TrE_Lppow ,a.TrE_Lppow = 
@TrE_Lppow1 FROM Cdn.TraElem a
     where a.tre_zwrid in(
     select a.tre_treid FROM Cdn.TraElem a
      JOIN deleted d ON  d.TrE_TreId = @TrE_TrEId1
      join cdn.traelemrelacje on TeR_ChildId = a.tre_treid and 
TeR_ParentId = @TrE_TrEId1 and TeR_ChildTyp = 306
   join cdn.tranag WZ on a.tre_trnid = WZ.trn_trnid
   join cdn.tranagrelacje on trr_faid =  WZ.trn_trnid and TrR_TrNTyp = 302
   join cdn.traelem b on b.tre_trnid = TrR_TrNId and b.tre_treid = 
@TrE_TrEIdWZ)
             --UPDATE a SET a.TrE_LppowRel = a.TrE_Lppow ,a.TrE_Lppow = 
@TrE_Lppow1
             --FROM Cdn.TraElem a
             --JOIN deleted d ON  d.TrE_TreId = @TrE_TrEId1 and 
a.TrE_Lppow = d.TrE_Lppow and a.TrE_TwrId = d.TrE_TwrId
             --JOIN CDN.TraNagRelacje ON d.TrE_TrnId = TrR_FaId
             --WHERE TrR_TrNTyp = 306 AND a.TrE_TrnId = TrR_TrNId
           END
           IF (UPDATE (TrE_LpPow) and @TrE_TypDokumentu1 in (308,309))
            BEGIN
             SELECT TOP 1 @TrE_TrEId2 = a.TrE_TrEId
             FROM CDN.TraElem a
             JOIN CDN.tranagrelacje on TrR_TrNID = a.TrE_TrNID AND 
TrR_FaTyp IN (308,309) AND TrR_TrNTyp NOT IN (317,309,308,320)
             JOIN CDN.traelem b on TrR_FaId = b.TrE_TrNID AND 
a.TrE_Lppow = b.TrE_LpPow
             WHERE b.TrE_TrEId = @TrE_TrEId1 AND a.TrE_TrEId not in 
(SELECT TeR_ChildId FROM CDN.TraElemRelacje WHERE TeR_ParentId = 
@TrE_TrEId1)
             ORDER BY TrR_TrRId DESC
             INSERT INTO CDN.TraElemRelacje 
(TeR_ParentTyp,TeR_ParentId,TeR_ChildTyp,TeR_ChildId,TeR_Flaga)
             SELECT TOP 1 
b.TrE_TypDokumentu,b.TrE_TrEId,a.TrE_TypDokumentu,a.TrE_TrEId,0
             FROM CDN.TraElem a
             JOIN CDN.tranagrelacje on TrR_TrNID = a.TrE_TrNID AND 
TrR_FaTyp IN (308,309) AND TrR_TrNTyp NOT IN (317,309,308)
             JOIN CDN.traelem b on TrR_FaId = b.TrE_TrNID AND 
a.TrE_Lppow = b.TrE_LpPow
             WHERE b.TrE_TrEId = @TrE_TrEId1 AND a.TrE_TrEId not in 
(SELECT TeR_ChildId FROM CDN.TraElemRelacje WHERE TeR_ParentId = 
@TrE_TrEId1)
             AND a.TrE_TrEId not in (SELECT TeR_ParentId FROM 
CDN.TraElemRelacje WHERE TeR_ChildId = @TrE_TrEId1) and b.TrE_LppowRel 
is not null
             ORDER BY TrR_TrRId DESC
             UPDATE CDN.TraElem SET TrE_Lppow = 
TrE_LppowRel,TrE_LppowRel = NULL  WHERE TrE_TrEId = @TrE_TrEId1 and 
TrE_LppowRel is not null
             exec [CDN].[UstawRezerwacje] @TrE_TrEId2,0,0
            END
        END
       CLOSE Dodawane
       DEALLOCATE Dodawane
       set nocount off
     END
  end
IF exists (SELECT TrE_TypDokumentu FROM inserted where TrE_TypDokumentu 
= 311 ) or exists (SELECT TrE_TypDokumentu FROM deleted where 
TrE_TypDokumentu = 311 )
BEGIN
      set nocount on
        DECLARE
          @TrE_TrEIdAI INT
     DECLARE Dodawane CURSOR LOCAL FAST_FORWARD FOR
          SELECT TrE_TrEId
          FROM inserted
          ORDER BY TrE_TrNId, TrE_Lp
        OPEN Dodawane
        WHILE 1=1
         BEGIN
           FETCH NEXT FROM Dodawane INTO @TrE_TrEIdAI
           IF @@FETCH_STATUS <> 0 BREAK
If (Update (TrE_Atr1_DeAId) Or Update (TrE_Atr1_Kod) Or Update 
(TrE_Atr1_Wartosc) Or Update (TrE_Atr2_DeAId) Or Update (TrE_Atr2_Kod) 
Or Update (TrE_Atr2_Wartosc)
          Or Update (TrE_Atr3_DeAId) Or Update (TrE_Atr3_Kod) Or Update 
(TrE_Atr3_Wartosc) Or Update (TrE_Atr4_DeAId) Or Update (TrE_Atr4_Kod) 
Or Update (TrE_Atr4_Wartosc)
          Or Update (TrE_Atr5_DeAId) Or Update (TrE_Atr5_Kod) Or Update 
(TrE_Atr5_Wartosc))
          BEGIN
            DELETE FROM Cdn.TraElemAtr WHERE  Tra_TrEId =@TrE_TrEIdAI
            INSERT INTO Cdn.TraElemAtr SELECT 
Tre_TreId,1,TrE_Atr1_DeAId,TrE_Atr1_Kod,TrE_Atr1_Wartosc FROM 
Cdn.TraElem WHERE Tre_TreId=@TrE_TrEIdAI AND TrE_Atr1_DeAId>0 AND 
TrE_Atr1_DeAId is not NULL
            INSERT INTO Cdn.TraElemAtr SELECT 
Tre_TreId,2,TrE_Atr2_DeAId,TrE_Atr2_Kod,TrE_Atr2_Wartosc FROM 
Cdn.TraElem WHERE Tre_TreId=@TrE_TrEIdAI AND TrE_Atr2_DeAId>0 AND 
TrE_Atr2_DeAId is not NULL
            INSERT INTO Cdn.TraElemAtr SELECT 
Tre_TreId,3,TrE_Atr3_DeAId,TrE_Atr3_Kod,TrE_Atr3_Wartosc FROM 
Cdn.TraElem WHERE Tre_TreId=@TrE_TrEIdAI AND TrE_Atr3_DeAId>0 AND 
TrE_Atr3_DeAId is not NULL
            INSERT INTO Cdn.TraElemAtr SELECT 
Tre_TreId,4,TrE_Atr4_DeAId,TrE_Atr4_Kod,TrE_Atr4_Wartosc FROM 
Cdn.TraElem WHERE Tre_TreId=@TrE_TrEIdAI AND TrE_Atr4_DeAId>0 AND 
TrE_Atr4_DeAId is not NULL
            INSERT INTO Cdn.TraElemAtr SELECT 
Tre_TreId,5,TrE_Atr5_DeAId,TrE_Atr5_Kod,TrE_Atr5_Wartosc FROM 
Cdn.TraElem WHERE Tre_TreId=@TrE_TrEIdAI AND TrE_Atr5_DeAId>0 AND 
TrE_Atr5_DeAId is not NULL
          END
     END
       CLOSE Dodawane
       DEALLOCATE Dodawane
      set nocount off
return
end
   -- uruchamiamy procedurę obsługi zasobów, jesli są podmieniane 
jakiekolwiek pola za wyjatkiem TrE_LpPow
    IF        (    UPDATE( TrE_LpPow )
               OR UPDATE( TrE_Lp )
               OR UPDATE( TrE_PodmiotTyp )
               OR UPDATE( TrE_PodId )
               OR UPDATE( TrE_KatId )
               OR UPDATE( TrE_TwrNazwa )
               OR UPDATE( TrE_TwrEAN )
               OR UPDATE( TrE_TwrNumerKat )
               OR UPDATE( TrE_TwrKod )
               OR UPDATE( TrE_TwrOpis )
      OR UPDATE( TrE_KosztKGO )
               OR UPDATE( TrE_TwrSWW )
               OR UPDATE( TrE_Prog )
               OR UPDATE( TrE_UpustTyp )
               OR UPDATE( TrE_Upust )
               OR UPDATE( TrE_UpustKnt )
               OR UPDATE( TrE_UpustKntTyp )
               OR UPDATE( TrE_Waluta )
               OR UPDATE( TrE_KursNumer )
               OR UPDATE( TrE_KursL )
               OR UPDATE( TrE_KursM )
               OR UPDATE( TrE_WartoscZakupuWylicz )
               OR UPDATE (TrE_Atr1_DeAId)
               OR UPDATE (TrE_Atr1_Kod)
               OR UPDATE (TrE_Atr1_Wartosc)
               OR UPDATE (TrE_Atr2_DeAId)
               OR UPDATE (TrE_Atr2_Kod)
               OR UPDATE (TrE_Atr2_Wartosc)
               OR UPDATE (TrE_Atr3_DeAId)
               OR UPDATE (TrE_Atr3_Kod)
               OR UPDATE (TrE_Atr3_Wartosc)
               OR UPDATE (TrE_Atr4_DeAId)
               OR UPDATE (TrE_Atr4_Kod)
               OR UPDATE (TrE_Atr4_Wartosc)
               OR UPDATE (TrE_Atr5_DeAId)
               OR UPDATE (TrE_Atr5_Kod)
               OR UPDATE (TrE_Atr5_Wartosc)
      OR UPDATE (TrE_WartoscTymczasowa)
      OR UPDATE (TrE_ZTwID)
               OR UPDATE (TrE_ZTwGlowny)
               OR UPDATE (TrE_ZestawWiazanie)
               OR UPDATE (TrE_zTwKod)
      OR UPDATE (TrE_TwrTyp)
      OR UPDATE (TrE_TwrKodDostawcy)
      OR UPDATE (TrE_DoZwrotu)
             )
        AND NOT UPDATE( TrE_TrEId )
        AND NOT UPDATE( TrE_TrNId )
        AND NOT UPDATE( TrE_ZwrId )
        AND NOT UPDATE( TrE_TrEIdProd )
--       AND NOT UPDATE( TrE_Lp )
        AND NOT UPDATE( TrE_TypDokumentu )
        AND NOT UPDATE( TrE_Aktywny )
        AND NOT UPDATE( TrE_DataDok )
        AND NOT UPDATE( TrE_DataOpe )
--       AND NOT UPDATE( TrE_PodmiotTyp )
--       AND NOT UPDATE( TrE_PodID )
--       AND NOT UPDATE( TrE_KatID )
        AND NOT UPDATE( TrE_TwrId )
--       AND NOT UPDATE( TrE_TwrNazwa )
--       AND NOT UPDATE( TrE_TwrEAN )
--       AND NOT UPDATE( TrE_TwrNumerKat )
--       AND NOT UPDATE( TrE_TwrKod )
--       AND NOT UPDATE( TrE_TwrOpis )
--       AND NOT UPDATE( TrE_TwrSWW )
        AND NOT UPDATE( TrE_Stawka )
        AND NOT UPDATE( TrE_Flaga )
        AND NOT UPDATE( TrE_Zrodlowa )
        AND NOT UPDATE( TrE_TwCNumer )
        AND NOT UPDATE( TrE_TypNB )
        AND NOT UPDATE( TrE_Cena0 )
        AND NOT UPDATE( TrE_Rabat )
        AND NOT UPDATE( TrE_CenaW )
--       AND NOT UPDATE( TrE_Waluta )
--       AND NOT UPDATE( TrE_KursNumer )
--       AND NOT UPDATE( TrE_KursL )
--       AND NOT UPDATE( TrE_KursM )
        AND NOT UPDATE( TrE_CenaT )
        AND NOT UPDATE( TrE_Ilosc )
        AND NOT UPDATE( TrE_Jm )
        AND NOT UPDATE( TrE_JmZ )
        AND NOT UPDATE( TrE_JmCalkowite )
        AND NOT UPDATE( TrE_JmPrzelicznikL )
        AND NOT UPDATE( TrE_JmPrzelicznikM )
        AND NOT UPDATE( TrE_IloscJM )
        AND NOT UPDATE( TrE_WartoscNetto )
        AND NOT UPDATE( TrE_WartoscBrutto )
        AND NOT UPDATE( TrE_Cena0WD )
        AND NOT UPDATE( TrE_CenaWWD )
        AND NOT UPDATE( TrE_WartoscNettoWal )
        AND NOT UPDATE( TrE_WartoscBruttoWal )
        AND NOT UPDATE( TrE_MagId )
--       AND NOT UPDATE( TrE_Prog )
--       AND NOT UPDATE( TrE_UpustTyp )
--       AND NOT UPDATE( TrE_Upust )
--       AND NOT UPDATE( TrE_UpustKnt )
--       AND NOT UPDATE( TrE_UpustKntTyp )
        AND NOT UPDATE( TrE_KosztUslugi)
        AND NOT UPDATE (TrE_WyborDostaw)
        BEGIN
      set nocount on
      If (Update (TrE_Atr1_DeAId) Or Update (TrE_Atr1_Kod) Or Update 
(TrE_Atr1_Wartosc) Or Update (TrE_Atr2_DeAId) Or Update (TrE_Atr2_Kod) 
Or Update (TrE_Atr2_Wartosc)
          Or Update (TrE_Atr3_DeAId) Or Update (TrE_Atr3_Kod) Or Update 
(TrE_Atr3_Wartosc) Or Update (TrE_Atr4_DeAId) Or Update (TrE_Atr4_Kod) 
Or Update (TrE_Atr4_Wartosc)
          Or Update (TrE_Atr5_DeAId) Or Update (TrE_Atr5_Kod) Or Update 
(TrE_Atr5_Wartosc))
          begin
        DECLARE
          @TrE_TrEIdAtr INT
     DECLARE Dodawane CURSOR LOCAL FAST_FORWARD FOR
          SELECT TrE_TrEId
          FROM inserted
          ORDER BY TrE_TrNId, TrE_Lp
        OPEN Dodawane
        WHILE 1=1
         BEGIN
           FETCH NEXT FROM Dodawane INTO @TrE_TrEIdAtr
           IF @@FETCH_STATUS <> 0 BREAK
  If (Update (TrE_Atr1_DeAId) Or Update (TrE_Atr1_Kod) Or Update 
(TrE_Atr1_Wartosc) Or Update (TrE_Atr2_DeAId) Or Update (TrE_Atr2_Kod) 
Or Update (TrE_Atr2_Wartosc)
          Or Update (TrE_Atr3_DeAId) Or Update (TrE_Atr3_Kod) Or Update 
(TrE_Atr3_Wartosc) Or Update (TrE_Atr4_DeAId) Or Update (TrE_Atr4_Kod) 
Or Update (TrE_Atr4_Wartosc)
          Or Update (TrE_Atr5_DeAId) Or Update (TrE_Atr5_Kod) Or Update 
(TrE_Atr5_Wartosc))
          BEGIN
            DELETE FROM Cdn.TraElemAtr WHERE  Tra_TrEId =@TrE_TrEIdAtr
            INSERT INTO Cdn.TraElemAtr SELECT 
Tre_TreId,1,TrE_Atr1_DeAId,TrE_Atr1_Kod,TrE_Atr1_Wartosc FROM 
Cdn.TraElem WHERE Tre_TreId=@TrE_TrEIdAtr AND TrE_Atr1_DeAId>0 AND 
TrE_Atr1_DeAId is not NULL
            INSERT INTO Cdn.TraElemAtr SELECT 
Tre_TreId,2,TrE_Atr2_DeAId,TrE_Atr2_Kod,TrE_Atr2_Wartosc FROM 
Cdn.TraElem WHERE Tre_TreId=@TrE_TrEIdAtr AND TrE_Atr2_DeAId>0 AND 
TrE_Atr2_DeAId is not NULL
            INSERT INTO Cdn.TraElemAtr SELECT 
Tre_TreId,3,TrE_Atr3_DeAId,TrE_Atr3_Kod,TrE_Atr3_Wartosc FROM 
Cdn.TraElem WHERE Tre_TreId=@TrE_TrEIdAtr AND TrE_Atr3_DeAId>0 AND 
TrE_Atr3_DeAId is not NULL
            INSERT INTO Cdn.TraElemAtr SELECT 
Tre_TreId,4,TrE_Atr4_DeAId,TrE_Atr4_Kod,TrE_Atr4_Wartosc FROM 
Cdn.TraElem WHERE Tre_TreId=@TrE_TrEIdAtr AND TrE_Atr4_DeAId>0 AND 
TrE_Atr4_DeAId is not NULL
            INSERT INTO Cdn.TraElemAtr SELECT 
Tre_TreId,5,TrE_Atr5_DeAId,TrE_Atr5_Kod,TrE_Atr5_Wartosc FROM 
Cdn.TraElem WHERE Tre_TreId=@TrE_TrEIdAtr AND TrE_Atr5_DeAId>0 AND 
TrE_Atr5_DeAId is not NULL
          END
     END
       CLOSE Dodawane
       DEALLOCATE Dodawane
       end
      set nocount off
GOTO KOMUNIKAT
end
   DECLARE
     @MyIdentity         INT, -- niezwykle ważne dla ProdElem
     -- zmienne pomocnicze dla kursora
     @TrE_TrEId          INT,
     @TrE_TrNId         INT,
     @TrE_ZwrId          INT,
     @TrE_Lp             INT,
     @TrE_LpPow           INT,
     @TrE_TypDokumentu   SMALLINT,
     @TrE_Aktywny        SMALLINT,
     @TrE_DataDok        DATETIME,
     @TrE_DataOpe        DATETIME,
     @TrE_TwrId          INT,
     @TrE_TwrKod         NVarchar(40),
     @TrE_TwrNazwa       NVarchar(255),
     @TrE_Stawka         DECIMAL(5,2),
     @TrE_CenaW          DECIMAL(15,2),
     @TrE_CenaWWD        DECIMAL(15,2),
     @TrE_CenaT          DECIMAL(15,2),
     @TrE_Waluta         NVarchar(3),
     @TrE_KursNumer      INT,
     @TrE_KursL          DECIMAL(15,4),
     @TrE_KursM          DECIMAL(5,0),
     @TrE_Ilosc          DECIMAL(15,4),
     @TrE_WartoscNetto   DECIMAL(15,2),
     @TrE_WartoscBrutto  DECIMAL(15,2),
     @TrE_WartoscZakupu  DECIMAL(15,2),
     @TrE_JMPrzelicznikL DECIMAL(15,2),
     @TrE_JMPrzelicznikM DECIMAL( 7,0),
     @TrE_IloscJM        DECIMAL(15,4),
     @TrE_PodmiotTyp     INT,
     @TrE_PodId          INT,
     @TrE_KosztUslugi    DECIMAL(15,2),
     @TrE_TypNB          TINYINT,
     @Tre_WyborDostaw    TINYINT,
     @TrE_IFA24Mag       INT,
     @Tre_MagId          INT,
  @TrE_KosztUslugiZDok DECIMAL(15,2),
     -- zmienne z naglowka dla poprawnego zbudowania subelementu
     @TrN_TrNId      INT,
     @TrN_FaId       INT,
     @TrN_ZwrId      INT,
     @TrN_Rodzaj     INT,
     @TrN_Bufor      SMALLINT,
     @TrN_MagZrdId   INT,
     @TrN_MagDocId   INT,
     @TrN_DataDok    DATETIME,
     @TrN_DataWys    DATETIME,
     @TrN_DataOpe    DATETIME,
     @TrN_TrSTyp     SMALLINT,
     @TrN_TypNB      TINYINT,
     @TrN_PodmiotTyp     INT,
     @TrN_PodId          INT,
     @TrN_Centrala   TINYINT,
     @TrN_Waluta     NVarchar(3),
     @TrN_KursNumer      INT,
     @TrN_KursL     DECIMAL(15,4),
     @TrN_KursM     DECIMAL(5,0),
     @WalutaSys     NVarchar(3),
     @TrN_DekId     INT,
     @TrN_NumerPelny  NVarchar(31),
     -- zmienne dla dokumentu pierwotnego
     @TrN_TrNId_Old        INT,
     @TrN_TrNId_PAdoFA_Old INT,
     @TrN_FaId_Old         INT,
     @TrE_TrEId_Old        INT,
     -- zmienne dla kreowanego subelementu
     @TrS_TrSId      INT,
     @TrS_TrEId      INT,
     @TrS_TrSIdDost  INT,
     @TrS_ZwrId      INT,
     @TrS_TwrId      INT,
     @TrS_MagId      INT,
     @TrS_Rodzaj     INT,
     @TrS_Typ        INT,
     @TrS_Metoda     INT,
     @TrS_DataOpe    DATETIME,
     @TrS_Ilosc      DECIMAL(15,4),
     @TrS_Wartosc    DECIMAL(15,2),
     @TrS_Cena       DECIMAL(15,2),
     @TrS_Termin     DATETIME,
     -- zmienne pomocnicze dla metody
     @QUAN           INT,
     @Metoda         INT,
     @ZawszeBraki    INT,
  @ZezwalajMimoRez INT,
     @DataZamowienia INT,
     -- zmienne pomocnicze symulacji marży
     @Marza_Sym_Ostatnia   INT,
     @Marza_Sym_Srednia    INT,
     -- Pomocnicza dla kursora
     @TrS_TrSId_K    INT,
     @TrS_TrEId_K    INT,
     -- zmienna dla aktualizacji ceny zakupu i marz
     @TwC_TwCId          INT,
     @TwC_TwCNumer       INT,
     @TwC_Wartosc        DECIMAL(15,2),
     @TwC_Marza          DECIMAL(15,2), -- potrzebna, zeby zbadać, czy 
nie jest za duża
     @TwC_MarzaWStu      DECIMAL(15,2), -- potrzebna, zeby zbadać, czy 
nie jest za duża
     @TwC_Waluta         NVarchar(3),
     @TwC_Typ            SMALLINT,
     @Twr_Typ            SMALLINT,
     @Twr_KosztUslugiTyp SMALLINT,
     @Twr_KosztUslugi    DECIMAL(15,2),
     @Twr_Stawka         DECIMAL(5,2),
     @Twr_KursL          DECIMAL(15,4),
     @Twr_KursM          DECIMAL(5,0),
     @Twr_KosztUslugiNew     DECIMAL(15,2),
     @Twr_KosztUslugiWalNew  DECIMAL(15,2),
     @Waluta     NVarchar(3),
     @KursNumer  INT,
     @KursL     DECIMAL(15,4),
     @KursM     DECIMAL(5,0),
     @CenaW_New       DECIMAL(15,2),
     -- aktualizacja ceny zakupu przy zapisie MM-OL
     @Aktualizuj_CenaZ_MMOL TINYINT,
     -- dla liczenia wzoru na marże cen sprzedaży, gdy aktualizacja jest 
na "Nie"
     @CenaZakupuNew    DECIMAL(15,2),
     @CenaZakupuNewPLN DECIMAL(15,2),
     @CenaZakupuNewWal DECIMAL(15,2),
     -- dla dostaw
     @DostIloscRecordowReal int,
     @DostIloscRecordow int,
     @DostIloscRecordowDodanych int,
     @DostTrS_Ilosc decimal(15,4),
     @DostTrS_TrSId int,
     @ResztaWartosc DECIMAL(15,2),
     -- pomocnicze dla komunikatu
     @Data_Dost          DATETIME,
     @Komunikat          NVarchar(250)
   SET NOCOUNT ON
   -- ustawienie komunikatu
   SET @Komunikat = ''
   -- symbol waluty systemowej
   SET @WalutaSys = ( SELECT SUBSTRING(Fir_Wartosc,1,3) FROM cdn.Firma 
WHERE Fir_Numer = 3 )
   -- elementy kasowane jesli wybordostawy = 2 to nie robimy nic
   DECLARE @TrE TABLE ( TrEId INT )
   INSERT INTO @TrE ( TrEId ) SELECT TrE_TrEId FROM deleted
   IF EXISTS(SELECT TrS_WyborDostaw FROM cdn.TraSElem JOIN @TrE ON TrEId 
= TrS_TrEId WHERE ISNULL(TrS_WyborDostaw,0) = 2)
   RETURN
   DELETE cdn.TraSElem FROM cdn.TraSElem JOIN @TrE ON TrEId = TrS_TrEId 
-- WHERE TrS_TrEId IN ( SELECT TrE_TrEId FROM deleted ) -- = @TrE_TrEId
   IF NOT EXISTS ( SELECT * FROM inserted ) AND EXISTS ( SELECT * FROM 
deleted )
   BEGIN
       DECLARE
          @TrE_TrEId3 INT,
          @TrE_TypDok3 INT
        DECLARE Dodawane CURSOR LOCAL FAST_FORWARD FOR
          SELECT TrE_TrEId, TrE_TypDokumentu
          FROM deleted
          ORDER BY TrE_TrEId
        OPEN Dodawane
        WHILE 1=1
         BEGIN
           FETCH NEXT FROM Dodawane INTO @TrE_TrEId3, @TrE_TypDok3
           IF @@FETCH_STATUS <> 0 BREAK
           EXEC [CDN].[UstawRezerwacje]  @TrE_TrEId3, 1,@TrE_TypDok3
       DELETE CDN.TraElemRelacje WHERE TeR_ParentTyp=@TrE_TypDok3 and 
TeR_ParentId=@TrE_TrEId3
    DELETE CDN.TraElemRelacje WHERE TeR_ChildTyp=@TrE_TypDok3 and 
TeR_ChildId=@TrE_TrEId3
        END
       CLOSE Dodawane
       DEALLOCATE Dodawane
      DELETE CDN.TraSElem WHERE TRS_TrEIdWydania in(SELECT TrE_TrEId 
FROM deleted)
   END
   -- elementy kasowane trzeba skasowac atrybuty
   --IF EXISTS ( SELECT * FROM deleted )
   --  BEGIN
   --    DELETE FROM Cdn.TraElemAtr WHERE  TrA_TrEId  in (SELECT 
TrE_TrEId FROM deleted)
   --  END
   -- Metoda rozliczania magazynu
   IF EXISTS ( SELECT * FROM inserted )
     BEGIN
       SET @Metoda = ( SELECT TOP 1 ISNULL( Fir_Wartosc,1 ) FROM 
cdn.Firma WHERE Fir_Numer = 1352 )
       SET @QUAN   = ( SELECT TOP 1 ISNULL( Fir_Wartosc,0 ) FROM 
cdn.Firma WHERE Fir_Numer = 1485 )
     END
   -- elementy dodawane
   DECLARE Dodawane CURSOR LOCAL FAST_FORWARD FOR
     SELECT TrE_TrEId, TrE_TrNId, TrE_ZwrId, TrE_Lp, TrE_TypDokumentu, 
TrE_Aktywny, TrE_DataDok, TrE_DataOpe, TrE_TwrId, TrE_TwrKod, TrE_Stawka ,
            TrE_CenaW, TrE_CenaWWD, TrE_CenaT, TrE_Waluta, 
TrE_KursNumer, TrE_KursL, TrE_KursM, TrE_Ilosc, TrE_WartoscNetto, 
TrE_WartoscBrutto,
            TrE_JMPrzelicznikL, TrE_JMPrzelicznikM, TrE_PodmiotTyp, 
TrE_PodId, TrE_LpPow, TrE_IloscJM, TrE_TypNB, Tre_WyborDostaw, 
Tre_MagID, TrE_IFA24Mag, TrE_KosztUslugi
       FROM inserted
       ORDER BY TrE_TrNId, TrE_Lp
     OPEN Dodawane
       WHILE 1=1
       BEGIN
         FETCH NEXT FROM Dodawane INTO @TrE_TrEId, @TrE_TrNId, 
@TrE_ZwrId, @TrE_Lp, @TrE_TypDokumentu, @TrE_Aktywny, @TrE_DataDok, 
@TrE_DataOpe, @TrE_TwrId, @TrE_TwrKod, @TrE_Stawka,
                                       @TrE_CenaW, @TrE_CenaWWD, 
@TrE_CenaT, @TrE_Waluta, @TrE_KursNumer, @TrE_KursL, @TrE_KursM, 
@TrE_Ilosc, @TrE_WartoscNetto, @TrE_WartoscBrutto,
                                       @TrE_JMPrzelicznikL, 
@TrE_JMPrzelicznikM, @TrE_PodmiotTyp, @TrE_PodId, @TrE_LpPow, 
@TrE_IloscJM, @TrE_TypNB, @Tre_WyborDostaw, @TrE_MagId, @TrE_IFA24Mag , 
@TrE_KosztUslugiZDok
         IF @@FETCH_STATUS <> 0 BREAK
         -- Zmiana towaru musimy usunąć relacje na elementach
         IF UPDATE( TrE_TwrId )
           BEGIN
             IF NOT EXISTS (SELECT TrE_TwrId FROM deleted WHERE 
@TrE_TrEId =  TrE_TrEId AND @TrE_TwrId = TrE_TwrId)
                BEGIN
      DECLARE
       @TrE_TrEIdWiNi1 INT,
       @TrE_TypWiNi1 INT
      DECLARE Kasowane CURSOR LOCAL FAST_FORWARD FOR
       SELECT TrE_TrEId, TrE_TypDokumentu
       FROM deleted
       ORDER BY TrE_TrEId
      OPEN Kasowane
      WHILE 1=1
      BEGIN
       FETCH NEXT FROM Kasowane INTO @TrE_TrEIdWiNi1, @TrE_TypWiNi1
       IF @@FETCH_STATUS <> 0 BREAK
       DELETE CDN.TraElemRelacje WHERE TeR_ParentTyp=@TrE_TypWiNi1 and 
TeR_ParentId=@TrE_TrEIdWiNi1
       DELETE CDN.TraElemRelacje WHERE TeR_ChildTyp=@TrE_TypWiNi1 and 
TeR_ChildId=@TrE_TrEIdWiNi1
      END
      CLOSE Kasowane
      DEALLOCATE Kasowane
                END
           END
         -- Sprawdzenie zgodności przeliczników i ilości
         IF    (( @TrE_JMPrzelicznikL =  @TrE_JMPrzelicznikM AND 
@TrE_Ilosc <> @TrE_IloscJM)
            OR ( @TrE_JMPrzelicznikL <> @TrE_JMPrzelicznikM AND 
@TrE_Ilosc =  @TrE_IloscJM))
            AND (@TrE_Ilosc<>0 AND @TrE_IloscJM<>0)
           BEGIN
             SET @Komunikat = 'Zapis niemożliwy !  Dla towaru  ' + 
@TrE_TwrKod + ' przeliczniki miar niezgodne z ilościami ! '
             IF @Komunikat <> '' GOTO KOMUNIKAT
           END
         -- Przepisujemy z PA na FA czy wybor dostaw
         IF @TrE_TypDokumentu = 302
          update FA set FA.TrE_WyborDostaw = PA.TrE_WyborDostaw from 
cdn.TraElem FA left join cdn.TraElem PA on FA.TrE_PATrEID = PA.TrE_TrEID
    where FA.TrE_TrEId = @TrE_TrEId AND FA.TrE_PATrEID > 0
         -- Niezwykle istotne ze wzglednu na prawidlowy FK dla ProdElem 
po wykonaniu triggera
         SET @MyIdentity = @@IDENTITY
         -- Odczytanie z naglowka informacji potrzebnych do zbudowania 
subelementu i decyzji o sposobie aktualizowania ceny zakupu
         SELECT TOP 1
           @TrN_TrNId      = TrN_TrNId,
           @TrN_FaId       = case when TrN_TypDokumentu= 313 or 
TrN_TypDokumentu= 314 then CDN.TraNagRelacjeFaId (TrN_TrNID,0,2 ) else 
CDN.TraNagRelacjeFaId (TrN_TrNID,0,0 ) end ,
           --@TrN_FaId       = TrN_FaId,
           @TrN_ZwrId      = TrN_ZwrId,
           @TrN_Rodzaj     = TrN_Rodzaj,
           @TrN_Bufor      = TrN_Bufor,
           @TrN_MagZrdId   = TrN_MagZrdId,
           @TrN_MagDocId   = TrN_MagDocId,
           @TrN_DataDok    = TrN_DataDok,
           @TrN_DataWys    = TrN_DataWys,
           @TrN_DataOpe    = TrN_DataOpe,
           @TrN_TrSTyp     = ISNULL(TrN_TrSTyp,3),
           @TrN_TypNB      = TrN_TypNB,
           @TrN_PodmiotTyp = TrN_PodmiotTyp,
           @TrN_PodId      = TrN_PodId,
           @TrN_Centrala   = TrN_Centrala,
           @TrN_Waluta     = TrN_Waluta,
           @TrN_KursNumer  = TrN_KursNumer,
           @TrN_KursL      = TrN_KursL,
           @TrN_KursM      = TrN_KursM
         FROM cdn.TraNag
           JOIN cdn.TraElem ON TrN_TrNId = TrE_TrNId AND TrE_TrEId = 
@TrE_TrEId
         -- ustalenie symbolu waluty, jeśli jest to waluta systemowa
         IF ( @TrN_Waluta = '' OR @TrN_Waluta = @WalutaSys ) AND 
@TrN_KursL=1 AND @TrN_KursM = 1
           SET @TrN_Waluta = @WalutaSys
         -- Sprawdzenie zgodności podmiotu między nagłówkiem i elementem 
(ZB)
         If IsNull(@TrN_PodmiotTyp, 0) <> IsNull(@TrE_PodmiotTyp, 0) Or 
IsNull(@TrN_PodId, 0) <> IsNull(@TrE_PodId, 0)
           Update CDN.TraElem Set TrE_PodmiotTyp = @TrN_PodmiotTyp, 
TrE_PodId = @TrN_PodId Where TrE_TrEId = @TrE_TrEId
         -- Ustalenie metody rozliczania magazynu dla dodawanego elementu
         IF @QUAN = 1 AND @TrE_DataOpe > ( SELECT 
ISNULL(MAX(TrN_DataOpe),0) FROM cdn.TraNag WHERE TrN_Rodzaj = 310005 )
           SET @Metoda = 4
         -- ustawiamy lppow dla wz jesli zmienia sie lppow na proformie
        IF (Update (TrE_LpPow) and @TrN_Rodzaj in (320000,320009))
         BEGIN
          UPDATE a SET a.TrE_Lppow = @TrE_Lppow
          FROM Cdn.TraElem a
          join deleted d on  d.TrE_Treid = @TrE_TrEId and a.TrE_lppow = 
d.TrE_lppow and a.TrE_TwrId = d.TrE_TwrId
             JOIN CDN.TraNagRelacje ON d.TrE_TrnId = TrR_FaId
             --JOIN Cdn.TraNag c ON d.TrE_TrnId = c.TrN_RelTrnId
             WHERE TrR_FaTyp = 306 AND a.TrE_TrnId = TrR_TrNId
          --WHERE c.TrN_TypDokumentu = 306 and a.TrE_TrnId = c.TrN_TrNId
         END
         If (Update (TrE_Atr1_DeAId) Or Update (TrE_Atr1_Kod) Or Update 
(TrE_Atr1_Wartosc) Or Update (TrE_Atr2_DeAId) Or Update (TrE_Atr2_Kod) 
Or Update (TrE_Atr2_Wartosc)
          Or Update (TrE_Atr3_DeAId) Or Update (TrE_Atr3_Kod) Or Update 
(TrE_Atr3_Wartosc) Or Update (TrE_Atr4_DeAId) Or Update (TrE_Atr4_Kod) 
Or Update (TrE_Atr4_Wartosc)
          Or Update (TrE_Atr5_DeAId) Or Update (TrE_Atr5_Kod) Or Update 
(TrE_Atr5_Wartosc))
          BEGIN
            DELETE FROM Cdn.TraElemAtr WHERE  Tra_TrEId =@TrE_TrEId
            INSERT INTO Cdn.TraElemAtr SELECT 
Tre_TreId,1,TrE_Atr1_DeAId,TrE_Atr1_Kod,TrE_Atr1_Wartosc FROM 
Cdn.TraElem WHERE Tre_TreId=@TrE_TrEId AND TrE_Atr1_DeAId>0 AND 
TrE_Atr1_DeAId is not NULL
            INSERT INTO Cdn.TraElemAtr SELECT 
Tre_TreId,2,TrE_Atr2_DeAId,TrE_Atr2_Kod,TrE_Atr2_Wartosc FROM 
Cdn.TraElem WHERE Tre_TreId=@TrE_TrEId AND TrE_Atr2_DeAId>0 AND 
TrE_Atr2_DeAId is not NULL
            INSERT INTO Cdn.TraElemAtr SELECT 
Tre_TreId,3,TrE_Atr3_DeAId,TrE_Atr3_Kod,TrE_Atr3_Wartosc FROM 
Cdn.TraElem WHERE Tre_TreId=@TrE_TrEId AND TrE_Atr3_DeAId>0 AND 
TrE_Atr3_DeAId is not NULL
            INSERT INTO Cdn.TraElemAtr SELECT 
Tre_TreId,4,TrE_Atr4_DeAId,TrE_Atr4_Kod,TrE_Atr4_Wartosc FROM 
Cdn.TraElem WHERE Tre_TreId=@TrE_TrEId AND TrE_Atr4_DeAId>0 AND 
TrE_Atr4_DeAId is not NULL
            INSERT INTO Cdn.TraElemAtr SELECT 
Tre_TreId,5,TrE_Atr5_DeAId,TrE_Atr5_Kod,TrE_Atr5_Wartosc FROM 
Cdn.TraElem WHERE Tre_TreId=@TrE_TrEId AND TrE_Atr5_DeAId>0 AND 
TrE_Atr5_DeAId is not NULL
          END
         -- Kreowanie subelementów jest podejmowane tylko w 
uzasadnionych przypadkach
         -- Anulowane
         IF @TrE_Aktywny = 0
         BEGIN
           DELETE FROM CDN.TrasElemDost WHERE TsD_TrEId = @TrE_TrEID
           -- Kasujemy rezerwacje na subelementach dla RO/ZD i ich relacje
           exec [CDN].[UstawRezerwacje]  @TrE_TrEId, 1, @TrE_TypDokumentu
           DELETE CDN.TraSElem WHERE TRS_TrEIdWydania = @TrE_TrEId
           DELETE CDN.TraElemRelacje WHERE 
TeR_ParentTyp=@TrE_TypDokumentu and TeR_ParentId = @TrE_TrEId
           DELETE CDN.TraElemRelacje WHERE 
TeR_ChildTyp=@TrE_TypDokumentu and TeR_ChildId = @TrE_TrEId
     IF @TrN_Rodzaj IN (302006,302004)
            begin
       update WZ set WZ.TrE_LpPow =  FA.TrE_LpPow from cdn.traelem WZ
       left join cdn.tranagrelacje on WZ.TrE_TrNId =  TrR_TrNId and 
TrR_FaTyp = 305 and TrR_TrNTyp= 306
       left join cdn.TraElem PA on PA.TrE_TrNId = TrR_FaId
       left join cdn.TraElem FA on FA.TrE_PATrEID = PA.TrE_TrEID
       where FA.TrE_TrEId = @TrE_TrEId AND  WZ.TrE_Lppow = PA.TrE_LpPow 
and   FA.TrE_PATrEID > 0
       update PA set PA.TrE_LpPow =  FA.TrE_LpPow from cdn.TraElem PA 
left join cdn.TraElem FA on FA.TrE_PATrEID = PA.TrE_TrEID where 
FA.TrE_TrEId = @TrE_TrEId AND FA.TrE_PATrEID > 0
            end
     --PA z Pobraniem- >FA -> Korekta nie zwraca na magazyn
           IF @TrN_Rodzaj IN (302006) AND @TrN_Bufor = 0
            begin
       --update TraS set trs_treid = @TrE_TrEId from  cdn.TraSElem TraS 
join cdn.TraElem  on tre_treid = trs_treid where TrE_TrNId = @TrN_FaId 
and TrE_LpPow = @tre_lppow and TrE_TypDokumentu != 304 --usługa złozona 
RW nie przepinamy.
       update TraS set trs_treid = FA.TrE_TrEId from  cdn.TraSElem TraS
       left join cdn.TraElem PA on PA.TrE_TrEID = TraS.TrS_TrEId
       left join cdn.TraElem FA on FA.TrE_PATrEID = PA.TrE_TrEID
       where FA.TrE_TrEId = @TrE_TrEId  and PA.TrE_TypDokumentu != 304 
--usługa złozona RW nie przepinamy.
       update TraS set tsd_treid = FA.TrE_TrEId from  cdn.TraSElemDost TraS
       left join cdn.TraElem PA on PA.TrE_TrEID = TraS.Tsd_TrEId
       left join cdn.TraElem FA on FA.TrE_PATrEID = PA.TrE_TrEID
       where FA.TrE_TrEId = @TrE_TrEId  and PA.TrE_TypDokumentu != 304 
--usługa złozona RW nie przepinamy.
            end
           CONTINUE
         END
/*
         -- FZ z PZ, FZKI z PZKI akceptowane trwale lub w buforze
         IF @TrN_Rodzaj IN ( 301004, 301005 ) AND @TrN_Bufor IN ( 0, 1 )
         begin
         -- Sprawdzenie, czy należy aktualizować cenę zakupu na MM-OL
         -- Rodzaj marży: 0 = "od stu", 1 = "w stu"
         IF @TrN_Rodzaj = 301004
           AND @TrE_Ilosc > 0
           AND @TrN_Bufor IN ( 0 )
           BEGIN
         SELECT
           @Twr_Typ            = Twr_Typ,
           @Twr_KosztUslugiTyp = Twr_KosztUslugiTyp,
           @Twr_KosztUslugi    = Twr_KosztUslugi,
           @Twr_Stawka         = Twr_Stawka,
           @Twr_KursL          = Twr_KursL,
           @Twr_KursM          = Twr_KursM
         FROM cdn.Towary
         WHERE Twr_TwrId = @TrE_TwrId
         IF @TrN_Waluta = @WalutaSys
           BEGIN
             SET @Waluta    = @TrE_Waluta
             SET @KursNumer = @TrE_KursNumer
             SET @KursL     = @TrE_KursL
             SET @KursM     = @TrE_KursM
             SET @CenaW_New = @TrE_CenaW
           END
         -- parametry waluty z nagłówka
         ELSE
           BEGIN
             SET @Waluta    = @TrN_Waluta
             SET @KursNumer = @TrN_KursNumer
             SET @KursL     = @TrN_KursL
             SET @KursM     = @TrN_KursM
             SET @CenaW_New = @TrE_CenaWWD
           END
             -- parametry kursu waluty dla towaru lub usługi z typem 
kwotowym
             IF @Twr_Typ = 1 OR ( @Twr_Typ = 0 AND @Twr_KosztUslugiTyp = 1 )
               UPDATE cdn.Towary SET
                 Twr_Waluta         = @Waluta,
                 Twr_KursNumer      = @KursNumer,
                 Twr_KursL          = @KursL,
                 Twr_KursM          = @KursM
               WHERE Twr_TwrId = @TrE_TwrId
             -- koszt usługi ( usługa i typ kosztu kwotowy )
             IF @Twr_Typ = 0 AND @Twr_KosztUslugiTyp = 1
               BEGIN
                 -- od netto
                 IF @TrE_TypNB = 1
                   BEGIN
                     SET @Twr_KosztUslugiNew    = @TrE_CenaT
                     SET @Twr_KosztUslugiWalNew = @CenaW_New
                   END
                 -- od brutto
                 ELSE IF @TrE_TypNB = 2
                   BEGIN
                     SET @Twr_KosztUslugiNew    = @TrE_CenaT   - ROUND ( 
@TrE_CenaT   * @TrE_Stawka / (100 + @TrE_Stawka) , 2 )
                     SET @Twr_KosztUslugiWalNew =  @CenaW_New - ROUND ( 
@CenaW_New  * @TrE_Stawka / (100 + @TrE_Stawka) , 2 )
                   END
                 UPDATE cdn.Towary SET
                   Twr_KosztUslugi    = @Twr_KosztUslugiNew,
                   Twr_KosztUslugiWal = @Twr_KosztUslugiWalNew
                 WHERE Twr_TwrId = @TrE_TwrId
               END
             -- Kursor po cenach dla towaru lub usługi z kosztem kwotowym:
             -- aktualizacja ceny zakupu (TwC_TwCNumer = 1)
             -- aktualizacja marży dla cen sprzedaży z aktualizacją 
ustawiną na "Nie" ( TwC_TwCNumer <> 1 AND TwC_Aktualizacja = 0 )
             IF @Twr_Typ = 1 OR ( @Twr_Typ = 0 AND @Twr_KosztUslugiTyp = 1 )
               BEGIN
                 DECLARE TwrCeny CURSOR LOCAL FAST_FORWARD FOR
                 SELECT TwC_TwCNumer, TwC_TwCId, TwC_Waluta, 
TwC_Wartosc, TwC_Typ
                   FROM cdn.TwrCeny
                   WHERE TwC_TwrId = @TrE_TwrId AND TwC_TwCNumer = 1
                 UNION ALL
                 SELECT TwC_TwCNumer, TwC_TwCId, TwC_Waluta, 
TwC_Wartosc, TwC_Typ
                   FROM cdn.TwrCeny
                   WHERE TwC_TwrId = @TrE_TwrId AND TwC_TwCNumer <> 1 
AND TwC_Aktualizacja = 0
                 OPEN TwrCeny
                   WHILE 1=1
                     BEGIN
                       FETCH NEXT FROM TwrCeny INTO @TwC_TwCNumer, 
@TwC_TwCId, @TwC_Waluta, @TwC_Wartosc, @TwC_Typ
                       IF @@FETCH_STATUS <> 0 BREAK
                       -- aktualizacja ceny zakupu
                       IF @TwC_TwCNumer = 1
                         BEGIN
                           -- od netto
                           IF @TrE_TypNB = 1
                             IF @TwC_Typ = 1
                               SET @TwC_Wartosc = @CenaW_New  * ( 
@TrE_JMPrzelicznikM / @TrE_JMPrzelicznikL )
                             ELSE
                               SET @TwC_Wartosc = ( @CenaW_New + ROUND( 
@CenaW_New * @TrE_Stawka / 100, 2 ) ) * (  @TrE_JMPrzelicznikM / 
@TrE_JMPrzelicznikL )
                           -- od brutto
                           ELSE IF @TrE_TypNB = 2
                             IF @TwC_Typ = 1
                               SET @TwC_Wartosc = ( @CenaW_New  - ROUND( 
@CenaW_New * @TrE_Stawka / ( 100+@TrE_Stawka), 2 ) ) *  ( 
@TrE_JMPrzelicznikM / @TrE_JMPrzelicznikL )
                             ELSE
                               SET @TwC_Wartosc =  @CenaW_New   *  ( 
@TrE_JMPrzelicznikM / @TrE_JMPrzelicznikL )
                           UPDATE cdn.TwrCeny SET
                             TwC_Wartosc = @TwC_Wartosc,
                             TwC_Waluta  = @Waluta
                           WHERE TwC_TwCId = @TwC_TwCId
                           SET @CenaZakupuNew = @TwC_Wartosc
                           SET @CenaZakupuNewWal = @CenaZakupuNew
                           SET @CenaZakupuNewPLN = @CenaZakupuNew * 
@KursL/@KursM
                         END  -- @TwC_TWCNumer = 1
                       -- aktualizacja marż dla cen sprzedaży
                       -- tylko wtedy, gdy waluta zakupu i sprzedaży są 
równe lub gdy waluta sprzedazy jest systemowa
                       ELSE IF @TwC_TwCNumer <> 1 AND  ( @TwC_Waluta = 
@Waluta OR @TwC_Waluta = @WalutaSys )
                         BEGIN
                           -- cena sprzedaży brutto - obliczamy jej 
reprezentację netto
                           IF @TwC_Typ = 2
                             SET @TwC_Wartosc  =  @TwC_Wartosc - ROUND( 
@TwC_Wartosc * @Twr_Stawka / ( 100 + @Twr_Stawka), 2 )
                           -- marża "od stu" i "w stu"
                           IF @CenaZakupuNew <> 0
                             BEGIN
                              -- jeśli waluta zakupu i sprzedaży są 
równe, to bierzemy cenę zakupu w walucie dokumentu
                              -- w przeciwnym przypadku, gdy cena 
sprzedaży jest w walucie systemowej, to bierzemy cenę zakupu w walucie 
systemowej
                              IF @TwC_Waluta = @WalutaSys AND @Waluta <> 
@WalutaSys
                                SET @CenaZakupuNew = @CenaZakupuNewPLN
                              ELSE
                                SET @CenaZakupuNew = @CenaZakupuNewWal
                               SET @TwC_Marza = ( ( @TwC_Wartosc / 
@CenaZakupuNew ) - 1 ) * 100
                               IF ( @TwC_Marza = -100 )  OR ( 
@CenaZakupuNew = @TwC_Wartosc )
                                 SET @TwC_MarzaWStu = 100
                               ELSE IF @TwC_Wartosc = 0
                                 SET @TwC_MarzaWStu = -100
                               ELSE
                                 SET @TwC_MarzaWStu = 100 * @TwC_Marza / 
( 100 + @TwC_Marza )
                               IF @TwC_Marza     > 99999.99 SET 
@TwC_Marza     = 99999.99
                               IF @TwC_MarzaWStu > 99999.99 SET 
@TwC_MarzaWStu = 99999.99
                               IF @TwC_Marza     < - 99999.99 SET 
@TwC_Marza     = -99999.99
                               IF @TwC_MarzaWStu < - 99999.99 SET 
@TwC_MarzaWStu = -99999.99
                             END
                             IF @TwC_Marza IS NOT NULL AND 
@TwC_MarzaWStu IS NOT NULL
                             UPDATE cdn.TwrCeny SET
                               TwC_Marza = @TwC_Marza,
                               TwC_MarzaWStu = @TwC_MarzaWStu
                             WHERE TwC_TwCId = @TwC_TwCId
                         END
                     END -- kursor TwrCeny
                 CLOSE TwrCeny
                 DEALLOCATE TwrCeny
               END -- Towar lub usługa z kosztem kwotowym
           END -- aktualizacji ostatniej ceny zakupu
           CONTINUE
         end
*/
     --dla 149306 mimo ze FAWZ to trzeba ustawić rezerwację
     IF  UPDATE( TrE_Ilosc ) and @TrN_Rodzaj = 302004 and exists(
              SELECT Twr_Typ FROM cdn.Towary WHERE Twr_TwrId = 
@TrE_TwrId and Twr_Typ = 0)
                EXEC [CDN].[UstawRezerwacje] @TrE_TrEId,0,@TrE_TypDokumentu
         -- FA z WZ, PA z WZ, FAKI z WZKI, PAKI z WZ, FZKI z PZ, AI, AI 
z PW/RW, RO z PA, RO z FA, RO z WZ akceptowane trwale, PF z FA, PF z RO
         IF @TrN_Rodzaj IN ( 302004, 305004, 302005, 305005, 301005, 
311000, 311001, 308008, 308009, 308010, 320008, 320009, 320000 ) AND 
@TrN_Bufor IN ( 0 )  and @TrE_TypDokumentu != 304
           CONTINUE
         -- ZD konwertowane do PZ/FZ
         IF @TrN_Rodzaj IN ( /*309000,*/ 309008, 309009 ) --AND 
@TrN_FaId IS NOT NULL
           CONTINUE
         -- FZKW, PZKW w buforze
         IF @TrN_Rodzaj IN  ( 301002, 307002, 310002, 301006, 
307006,303002,307003, 307011 ) AND @TrN_Bufor IN ( 1 )
           CONTINUE
         -- RO, ZD z pzeznaczeniem do centrali XL
         IF @TrN_Rodzaj IN  ( 308000, 309000 ) AND @TrN_Centrala IN ( 1 )
           CONTINUE
         -- FA z PA z buforze
         IF @TrN_Rodzaj IN (302006) AND @TrN_Bufor = 1
           CONTINUE
         -- PWP - pierwszy przebieg (TrE_Aktywny = 1 - nie liczymy 
zasobów, najpierw RWS musi wyliczyć koszt)
         IF @TrE_TypDokumentu IN (317) AND @TrE_Aktywny = 1
           CONTINUE
         -- PWP - drugi przebieg (TrE_Aktywny = 2 - liczymy zsoby, 
PdE_Wartosc są już policzone)
         IF @TrE_TypDokumentu IN (317) AND @TrE_Aktywny = 2
           BEGIN
             UPDATE cdn.TraElem SET TrE_Aktywny = 1 WHERE TrE_TrEId = 
@TrE_TrEId
             SET @TrE_Aktywny = 1
           END
         -- przeksztalcenia ZD do PZ, RO do FA/PA/WZ, PA do FA, PF do 
FS, PF do RO, ZD do FZ
         -- skasowanie subelementów zamowieniowych/rezerwacyjnych z 
dokumentu pierwotnego
  /*       IF  @TrN_Rodzaj IN ( 307010, 302008, 305008, 306008, 306010, 
302006, 302009, 308011, 301011 )
           BEGIN
             SET @TrN_FaId_Old  = ( SELECT TOP 1 TrN_TrNId FROM 
cdn.TraNag  WHERE TrN_TrNId = @TrE_TrNId    )
             -- tablica nagłówków do przeglądnięcia i skasowania subelemntów
             DECLARE @TrN_TrNId_Prw TABLE (TrN_TrNId INT)
             INSERT INTO @TrN_TrNId_Prw SELECT TrN_TrNId FROM cdn.TraNag
             JOIN CDN.TraNagRelacje ON TrN_TrNId = TrR_TrNId
             WHERE TrR_FaId  = @TrN_FaId_Old
             DECLARE E CURSOR LOCAL FAST_FORWARD FOR
               SELECT TrE_TrEId
               FROM cdn.TraElem
               WHERE TrE_TrNId IN ( SELECT TrN_TrNId FROM @TrN_TrNId_Prw 
) --  AND TrE_TwrId = @TrE_TwrId
                 OPEN E
                   WHILE 1=1
                     BEGIN
                       FETCH NEXT FROM E INTO @TrE_TrEId_Old
                       IF @@FETCH_STATUS <> 0 BREAK
                       -- skasowanie subelementów z dokumentu pierwotnego
                       DELETE FROM cdn.TraSElem WHERE TrS_TrEId = 
@TrE_TrEId_Old
                     END
                 CLOSE E
             DEALLOCATE E
           END*/
        IF  @TrN_Rodzaj IN (   306010, 302006, 302009, 308011 )
           BEGIN
               DELETE FROM cdn.TraSElem WHERE TrS_TrEId in (SELECT TrE_TrEId
               FROM cdn.TraElem
               WHERE TrE_TrNId IN ( SELECT TrN_TrNId FROM cdn.TraNag
               JOIN CDN.TraNagRelacje ON TrN_TrNId = TrR_TrNId
               WHERE TrR_FaId  = @TrE_TrNId and trn_typdokumentu = 320 
and trn_trstyp = 3) )
/*
             SET @TrN_FaId_Old  = ( SELECT TOP 1 TrN_TrNId FROM 
cdn.TraNag  WHERE TrN_TrNId = @TrE_TrNId    )
             -- tablica nagłówków do przeglądnięcia i skasowania subelemntów
             DECLARE @TrN_TrNId_Prw TABLE (TrN_TrNId INT)
             INSERT INTO @TrN_TrNId_Prw SELECT TrN_TrNId FROM cdn.TraNag
             JOIN CDN.TraNagRelacje ON TrN_TrNId = TrR_TrNId
             WHERE TrR_FaId  = @TrN_FaId_Old
             DECLARE E CURSOR LOCAL FAST_FORWARD FOR
               SELECT TrE_TrEId
               FROM cdn.TraElem
               WHERE TrE_TrNId IN ( SELECT TrN_TrNId FROM @TrN_TrNId_Prw 
) --  AND TrE_TwrId = @TrE_TwrId
                 OPEN E
                   WHILE 1=1
                     BEGIN
                       FETCH NEXT FROM E INTO @TrE_TrEId_Old
                       IF @@FETCH_STATUS <> 0 BREAK
                       -- skasowanie subelementów z dokumentu pierwotnego
                       DELETE FROM cdn.TraSElem WHERE TrS_TrEId = 
@TrE_TrEId_Old
                     END
                 CLOSE E
             DEALLOCATE E*/
           END
          /*IF  @TrN_Rodzaj IN ( 307010, 302008, 305008, 306008,  301011 )
           BEGIN
             SET @TrN_FaId_Old  = ( SELECT TOP 1 TrN_TrNId FROM 
cdn.TraNag  WHERE TrN_TrNId = @TrE_TrNId    )
             -- tablica nagłówków do przeglądnięcia i skasowania subelemntów
             DECLARE @TrN_TrNId_Prw1 TABLE (TrN_TrNId INT)
             INSERT INTO @TrN_TrNId_Prw1 SELECT TrN_TrNId FROM cdn.TraNag
             JOIN CDN.TraNagRelacje ON TrN_TrNId = TrR_TrNId
             WHERE TrR_FaId  = @TrN_FaId_Old
             DECLARE E CURSOR LOCAL FAST_FORWARD FOR
               SELECT TrE_TrEId
               FROM cdn.TraElem
               WHERE TrE_TrNId IN ( SELECT TrN_TrNId FROM 
@TrN_TrNId_Prw1 ) --  AND TrE_TwrId = @TrE_TwrId
                 OPEN E
                   WHILE 1=1
                     BEGIN
                       FETCH NEXT FROM E INTO @TrE_TrEId_Old
                       IF @@FETCH_STATUS <> 0 BREAK
                       -- skasowanie subelementów z dokumentu pierwotnego
                       --DELETE FROM cdn.TraSElem WHERE TrS_TrEId = 
@TrE_TrEId_Old
                     END
                 CLOSE E
             DEALLOCATE E
           END*/
         -- przed trwalym zapisem skasowanie subelemntów z dokumentu 
konwertowanego
         -- nie można przepinać zasobów, ponieważ na dokumencie 
pierwotnym mogą być usługi, które zaburzaja LP
         -- WZ z FA, WZ z PA, WZKI z FA, WZKI z PA, PZ z FZ, PZKI z 
FZKI, WZ z RO
         --
        IF  @TrN_Rodzaj IN ( /*306004, 306006,*/ 306005, 306007, 
/*307004,*/ 307005 /*, 306008*/ )
           EXEC CDN.KasujTraSElemZDokZrodlowych @TrN_TrNId, @TrN_Rodzaj, 
@TrN_FaId
/* -- ZG 9.0
           BEGIN
             SET @TrN_TrNId_Old = ( SELECT TrN_FaId FROM cdn.TraNag 
WHERE TrN_TrNId = @TrE_TrNId )
             -- przypadek szczególny - FA z PA nie przechodzi przez 
302006, tylko od razu dostaje 302004
             SET @TrN_TrNId_PAdoFA_Old = ( SELECT ISNULL(TrN_FaId,0) 
FROM cdn.TraNag WHERE TrN_TrNId = @TrN_TrNId_Old AND TrN_Rodzaj = 302004 )
             -- ooptymalizacja 8.5
             DECLARE @TrN TABLE ( TrNId INT )
             INSERT INTO @TrN ( TrNId ) SELECT @TrN_TrNId_Old
             INSERT INTO @TrN ( TrNId ) SELECT @TrN_TrNId_PAdoFA_Old
             INSERT INTO @TrN ( TrNId ) SELECT TrN_TrNId FROM cdn.TraNag 
WHERE TrN_ZwrId = @TrN_TrNId_Old
             DECLARE E CURSOR LOCAL FAST_FORWARD FOR
               SELECT TrE_TrEId
               FROM cdn.TraElem
                 JOIN @TrN ON TrNId = TrE_TrNId
                      AND TrE_TwrId = @TrE_TwrId
                 OPEN E
                   WHILE 1=1
                     BEGIN
                       FETCH NEXT FROM E INTO @TrE_TrEId_Old
                       IF @@FETCH_STATUS <> 0 BREAK
                       -- subelementy ze starego elemntu sa kasowane
                       -- najpierw korekcyjne PZKW, które wskazują na 
kasowane subelemnty
                       DECLARE SKR CURSOR LOCAL FAST_FORWARD FOR
                         SELECT K.TrS_TrSId, K.TrS_TrEId, TrN_DekId, 
TrN_NumerPelny
                         FROM cdn.TraSElem P LEFT OUTER JOIN cdn.TraSElem K
                         WITH ( INDEX = TrSZwrot) ON P.TrS_TrSId = 
K.TrS_ZwrId
                         JOIN cdn.TraElem ON TrE_TrEId = K.TrS_TrEId
                         JOIN cdn.TraNag ON TrN_TrNId = TrE_TrNId
                         WHERE K.TrS_Rodzaj = 306072 AND P.TrS_TrEId = 
@TrE_TrEId_Old
                           OPEN SKR
                             WHILE 1=1
                               BEGIN
                                 FETCH NEXT FROM SKR INTO @TrS_TrSId_K, 
@TrS_TrEId_K, @TrN_DekId, @TrN_NumerPelny
                                 IF @@FETCH_STATUS <> 0 BREAK
                                 IF @TrN_DekId IS NOT NULL
                                   BEGIN
                                     SET @Komunikat = 'Zapis niemożliwy 
! Dokument korekcyjny WZKK (' + @TrN_NumerPelny + '), na którym musi 
zostać zmodyfikowany koszt jest już zaksięgowany ! '
                                     IF @Komunikat <> '' GOTO KOMUNIKAT
                                   END
                                 DELETE FROM cdn.TraSElem WHERE 
TrS_TrSId = @TrS_TrSId_K
                                 EXEC CDN.sp_AktualizujWZKK @TrS_TrEId_K
                               END
                           CLOSE SKR
                         DEALLOCATE SKR
                       -- teraz właściwy subelemnt z pierwotnego
                       DELETE FROM cdn.TraSElem WHERE TrS_TrEId = 
@TrE_TrEId_Old
                     END
                 CLOSE E
             DEALLOCATE E
           END
*/
         -- zainicjowanie typu
         SET @TrS_Typ        = -1
         -- dokumenty w buforze
         IF @TrN_Bufor = 1
           BEGIN
             -- FZ, PW, PZ z ZD, BO, PWP, ZD, PW z AI, FZ z ZD
             IF @TrN_Rodzaj IN  ( 301000, 303000, 307000, 307010, 
310000, 317000, 309000, 303010, 312010, 301011, 301050, 313000, 313004 )
               SET @TrS_Typ = 4
             -- FA, FA z RO, PA, PA z RO
             IF @TrN_Rodzaj IN ( 302000, 302008, 305000, 305008, 318000, 
302009, 320000 )
               SET @TrS_Typ = @TrN_TrSTyp
             IF @TrN_Rodzaj IN ( 302004,305004 ) and @TrE_TypDokumentu = 304
               SET @TrS_Typ = @TrN_TrSTyp
             -- FA z WZ dla elementów dodanych
             IF @TrN_Rodzaj IN ( 302004 ) AND @TrE_LpPow < 0
               SET @TrS_Typ = @TrN_TrSTyp
             -- RO, RO z PF
             IF @TrN_Rodzaj IN ( 308000, 308011 )
                SET @TrS_Typ = 3
             -- RW, WZ, WZ z FA, WZ z PA, MM, RW z AI
             IF @TrN_Rodzaj IN ( 304000, 304006, 304004,304008, 306000, 
306004, 306006, 312000,312008, 304010, 306008, 306010, 312100, 314000, 
314004, 314006 )
               SET @TrS_Typ = 2
             -- FAKI, FAKI z WZKI, PAKI, PAKI z WZKI, RWKI, WZKI  w buforze
             IF @TrN_Rodzaj IN  ( 302001, 302005, 305001, 305005, 
304001, 306001, 314001, 318001 ) AND @TrN_Bufor IN ( 1 )
               SET @TrS_Typ = 4
             -- FAKI, FAKI z WZKI, PAKI, PAKI z WZKI, RWKI, WZKI  w 
buforze dla ilości dodatnich
             IF @TrN_Rodzaj IN  ( 302001, 302005, 305001, 305005, 318001 
) AND @TrN_Bufor IN ( 1 ) AND @TrE_Ilosc > 0
               BEGIN
                 DECLARE @TrN_TrSTyp_Pierw INT
                 -- dla nie RWSK z dokumentu pierwotnego
                 IF @TrN_Rodzaj <> 318001
                   SELECT TOP 1
                     @TrN_TrSTyp_Pierw = ISNULL(MAX(TrN_TrSTyp),0)
                   FROM cdn.TraNag
                     JOIN cdn.TraElem ON TrE_TrNId = TrN_TrNId
                   WHERE TrE_TrEId = @TrE_ZwrId
                 -- dla RWSK ze skojarzonego dokumentu PWPK
                 ELSE
                   SELECT TOP 1
                     @TrN_TrSTyp_Pierw = ISNULL(MAX(PWP_N.TrN_TrSTyp),0)
                   FROM cdn.TraNag RWS_N
                     JOIN cdn.TraElem RWS_E ON RWS_E.TrE_TrNId = 
RWS_N.TrN_TrNId
                     JOIN cdn.TraNag PWP_N ON PWP_N.TrN_TrNId = 
RWS_N.TrN_FaId
                   WHERE RWS_E.TrE_TrEId = @TrE_TrEId
                 -- jeśli na pierwotnym nie jest ustawione "pobranie", 
to z pierwotnego
                 IF @TrN_TrSTyp_Pierw = 2
                   SET @TrS_Typ = @TrN_TrSTyp_Pierw
                 ELSE
                   SET @TrS_Typ = 3
               END
             -- FAKI, FAKI z WZKI, PAKI, PAKI z WZKI w buforze dla 
ilości dodatnich
             IF @TrN_Rodzaj IN  ( 306001, 314001 ) AND @TrN_Bufor IN ( 1 
) AND @TrE_Ilosc > 0
               SET @TrS_Typ = 2
             -- FZKI, FZKI z PZKI, PWKI, PZKI, BOMKI w buforze
             IF (@TrN_Rodzaj IN  ( 301001, 301005, 303001, 307001, 
310001, 313001, 317001 ) AND @TrN_Bufor IN ( 1 )) or (@TrN_Rodzaj = 
301051  AND @TrN_Bufor = 1  and not exists (select * from cdn.TraNag 
where TrN_FaId = @TrN_TrNId and TrN_Rodzaj = 307005))
               SET @TrS_Typ = 3
             -- FZKI, FZKI z PZKI, PWKI, PZKI, BOMKI w buforze dla 
ilości dodatnich
             IF (@TrN_Rodzaj IN  ( 301001, 301005, 303001, 307001, 
310001, 313001, 317001) AND @TrN_Bufor IN ( 1 ) AND @TrE_Ilosc > 0) or 
(@TrN_Rodzaj = 301051  AND @TrN_Bufor = 1  AND @TrE_Ilosc > 0 and not 
exists (select * from cdn.TraNag where TrN_FaId = @TrN_TrNId and 
TrN_Rodzaj = 307005))
               SET @TrS_Typ = 4
           END
         -- dokumenty zaakceptowane trwale
         ELSE IF @TrN_Bufor = 0
           BEGIN
             -- FZ, FZKI, FZKI z PZKI, ZD, FZ z ZD
             IF @TrN_Rodzaj IN ( 301000, 301001, 301005, 309000, 301011, 
301050)  or (@TrN_Rodzaj = 301051   and not exists (select * from 
cdn.TraNag where TrN_FaId = @TrN_TrNId and TrN_Rodzaj = 307005))
               SET @TrS_Typ = 4
             -- PW, PWKI, PZ, PZ z FZ, PZKI, PZKI z FZKI, PZKW, PZKW z 
FZKW, PZ z ZD, BO, PWP, PW z AI, BOMKI, BOMKW
             IF @TrN_Rodzaj IN ( 303000, 303001, 303002, 307000, 307004, 
307001, 307005, 307002, 307003, 307011, 307006, 307010, 310000, 317000, 
303010, 310001, 310002, 312010, 313000, 313001, 313002, 313004, 317001 )
               SET @TrS_Typ = 1
             -- FAKI, PAKI - subelement o typie z dokumentu pierwotnego
             IF @TrN_Rodzaj IN ( 302001, 305001 )
               SET @TrS_Typ = ISNULL( ( SELECT MAX(TrS_Typ) FROM 
cdn.TraElem JOIN cdn.TraSElem ON TrS_TrEId = TrE_TrEId WHERE TrE_TrEId = 
@TrE_ZwrId ), 0 )
             -- FA, FA z WZ, PA, FA z RO, PA z RO, PF, PF z FA, PF z RO, 
FA z PF
             IF @TrN_Rodzaj IN ( 302000, 302006, 305000, 302008, 305008, 
320000, 320008, 320009, 302009 )
               SET @TrS_Typ = @TrN_TrSTyp
    IF @TrN_Rodzaj IN ( 302004,305004 ) and @TrE_TypDokumentu = 304
               SET @TrS_Typ = @TrN_TrSTyp
             -- FA z WZ dla elementów dodanych
             IF @TrN_Rodzaj IN ( 302004 ) AND @TrE_LpPow < 0
               SET @TrS_Typ = @TrN_TrSTyp
             -- RO, FA z RO, PA z RO
             IF @TrN_Rodzaj IN ( 308000, 308011 )
                SET @TrS_Typ = 3
             -- RW, RWKI, WZ, WZKI, WZ z FA, WZ z PA, WZKI, WZKI z FAKI, 
WZKI z PAKI, MM, RWS, RW z AI
             IF @TrN_Rodzaj IN ( 304000, 304006, 304004,304008, 304001, 
306000, 306004, 306006, 306001, 306005, 306007, 312000,312008, 318000, 
304010, 306008, 306010, 312100, 314000, 314001, 314004, 314006, 318001 )
               SET @TrS_Typ = 2
           END
         -- Jesli nie ustawiono prawidlowego typu - nie kreujemy 
subelementow
         IF @TrS_Typ NOT IN ( 1, 2, 3, 4 )
           CONTINUE
         -- Update wartości i cen elementu dla PWP - ( musi być przed 
ustawieniem subelementu - jest już RWS )
         IF @TrE_TypDokumentu = 317
           BEGIN
            SET @TrE_WartoscZakupu = ( SELECT 
ISNULL(SUM(PdE_WartoscZakupu),0) FROM cdn.ProdElem WHERE PdE_TrEId = 
@TrE_TrEId )
             UPDATE cdn.TraElem SET
               TrE_WartoscNetto     = @TrE_WartoscZakupu,
               TrE_WartoscBrutto    = ROUND(@TrE_WartoscZakupu * ( ( 100 
+ TrE_Stawka ) / 100 ), 2 ),
               TrE_WartoscNettoWal  = @TrE_WartoscZakupu,
               TrE_WartoscBruttoWal = ROUND(@TrE_WartoscZakupu * ( ( 100 
+ TrE_Stawka ) / 100 ), 2 ),
               TrE_Rabat            = 0,
               TrE_CenaT            = CASE TrE_IloscJM WHEN 0 THEN 0 
ELSE @TrE_WartoscZakupu / TrE_IloscJM END,
               TrE_CenaW            = CASE TrE_IloscJM WHEN 0 THEN 0 
ELSE @TrE_WartoscZakupu / TrE_IloscJM END ,
               TrE_Cena0            = CASE TrE_Ilosc   WHEN 0 THEN 0 
ELSE @TrE_WartoscZakupu / TrE_Ilosc   END ,
               TrE_CenaWWD          = CASE TrE_IloscJM WHEN 0 THEN 0 
ELSE @TrE_WartoscZakupu / TrE_IloscJM END,
               TrE_Cena0WD          = CASE TrE_Ilosc   WHEN 0 THEN 0 
ELSE @TrE_WartoscZakupu / TrE_Ilosc   END,
               TrE_Waluta           = @WalutaSys,
               TrE_KursNumer        = 0,
               TrE_KursL            = 1,
               TrE_KursM            = 1
             WHERE TrE_TrEId = @TrE_TrEId
             -- Wczytanie poprawionych wartości
             SELECT
               @TrE_WartoscNetto     = @TrE_WartoscZakupu,
               @TrE_CenaT            = CASE @TrE_IloscJM WHEN 0 THEN 0 
ELSE @TrE_WartoscZakupu / @TrE_IloscJM END,
               @TrE_CenaW            = CASE @TrE_IloscJM WHEN 0 THEN 0 
ELSE @TrE_WartoscZakupu / @TrE_IloscJM END,
               @TrE_CenaWWD          = CASE @TrE_IloscJM WHEN 0 THEN 0 
ELSE @TrE_WartoscZakupu / @TrE_IloscJM END,
               @TrE_Waluta           = @WalutaSys,
               @TrE_KursNumer        = 0,
               @TrE_KursL            = 1,
               @TrE_KursM            = 1
           END
         -- wartosci pozostalych pol
         SET @TrS_TrSId       = ( SELECT ISNULL(MAX(TrS_TrSId),0) FROM 
cdn.TraSElem ) + 1
         SET @TrS_TrEId       = @TrE_TrEId
         SET @TrS_TrSIdDost   = NULL
         SET @TrS_ZwrId       = NULL
         SET @TrS_TwrId       = @TrE_TwrId
         SET @TrS_MagId       = CASE WHEN @TrN_Rodzaj <> 312010 THEN 
CASE WHEN @TrE_MagId is null THEN @TrN_MagZrdId ELSE @TrE_MagId END ELSE 
@TrN_MagDocId END
         SET @TrS_Rodzaj      = @TrN_Rodzaj
         SET @TrS_Metoda      = @Metoda
         SET @TrS_DataOpe     = @TrE_DataOpe
         SET @TrS_Ilosc       = @TrE_Ilosc
         SET @TrS_Wartosc     = 0
         SET @TrS_Cena        = @TrE_CenaT
         SET @TrS_Termin      = NULL
         -- dostawy
         IF @TrS_Typ = 1
           BEGIN
             SET @TrS_Wartosc = @TrE_WartoscNetto
             SET @TrS_Cena    = case when @TrE_Ilosc <> 0 THEN 
@TrE_WartoscNetto / @TrE_Ilosc ELSE @TrS_Wartosc END
           END
         -- Zwykłe dostawy PZ, PZ z FZ, PW, BO, PZ z ZD, PWP, PW z AI, MM-OL
         IF @TrS_Rodzaj IN ( 307000, 307004, 303000, 310000, 307010, 
317000, 303010, 312010, 313000, 313004  )
           BEGIN
             -- TrS_TrSIdDost i TrS_ZwrId
             SET @TrS_TrSIdDost  = @TrS_TrSId
             SET @TrS_ZwrId      = NULL
           END
         -- Korekty ilościowe dostaw PZKI, PZKI z FZKI, PWKI, PZKW, 
BOMKI, BOMKW
         IF @TrS_Rodzaj IN ( 307001, 307005, 303001, 303002, 307002, 
310001, 310002, 307003, 307011, 307006, 313001, 313002, 317001 )
           BEGIN
             SELECT
               @TrS_TrSIdDost  = TrS_TrSIdDost,
               @TrS_Cena       = TrS_Cena,
               @TrS_ZwrId      = TrS_TrSId
             FROM cdn.TraSElem
             WHERE TrS_TrSId = ( -- TrS_TrSId pierwotnej dostawy
                                 SELECT TOP 1 A.TrS_TrSId
                                 FROM cdn.TraSElem A
                                   JOIN cdn.TraElem B ON B.TrE_TrEId = 
A.TrS_TrEId
                                 WHERE B.TrE_TrEId = @TrE_ZwrId
                                )
           END
         -- Dostawa i QUAN - zerowa cena i wartosc subelementu
         IF @TrS_Typ = 1 AND @TrS_Metoda = 4
           BEGIN
             SET @TrS_Wartosc = 0
             SET @TrS_Cena    = 0
           END
         -- daty dla rezerwacji i zamowien
         -- Rezerwacja - bufor
         IF @TrN_Rodzaj IN ( 308000, 308011 ) -- AND @TrN_Bufor = 1
           BEGIN
             SET @TrS_Termin  = @TrN_DataWys
           END
/*
         -- Rezerwacja - zapis trwaly (rezerwacja bezterminowa)
         IF @TrN_Rodzaj IN ( 308000 ) AND @TrN_Bufor = 0
           SET @TrS_DataOpe = NULL --@TrE_DataDok
*/
         -- Zamówienie - bufor i zapis trwaly
         IF @TrN_Rodzaj IN ( 309000 )
           BEGIN
             SELECT @DataZamowienia = ISNULL(MAX(Fir_Wartosc),2) FROM 
cdn.Firma WHERE Fir_Numer = 2075
             IF @DataZamowienia = 2
               SET @TrS_DataOpe = @TrN_DataWys
           END
         -- odwrotne ilosci dla korekt w buforze
         -- FAKI, FAKI z WZKI, PAKI, PAKI z WZKI, FZKI, FZKI z PZKI, 
PWKI, RWKI, WZKI, PZKI, BOMKI  w buforze
         IF (@TrN_Rodzaj IN  ( 302001, 302005, 305001, 305005, 301001, 
301005, 303001, 304001, 306001, 307001, 310001, 313001, 314001, 318001, 
317001) AND @TrN_Bufor IN ( 1 ) AND @TrS_Typ IN ( 3, 4 ) AND @TrS_Ilosc 
< 0 )
          or (@TrN_Rodzaj = 301051 AND @TrN_Bufor IN ( 1 ) AND @TrS_Typ 
IN ( 3, 4 ) AND @TrS_Ilosc < 0 and not exists (select * from cdn.TraNag 
where TrN_FaId = @TrN_TrNId and TrN_Rodzaj = 307005) )
           BEGIN
             SET @TrS_Ilosc = - @TrE_Ilosc
/*            IF @TrS_Typ IN ( 3, 4 ) AND @TrS_Ilosc < 0
               SELECT
                 @TrS_Typ  = CASE @TrS_Typ WHEN 4 THEN 3 ELSE 4 END,
                 @TrS_Ilosc = -@TrS_Ilosc
*/
           END
         -- insert subelemntu i procedura aktualizacji wartości zakupu 
(subelement dodawany tylko dla towaru)
         -- odczytanie typu karty (towar/usługa) oraz typu kosztu usługi 
i stawki VAT dla późniejszej aktualizacji ceny zakupu
         SELECT
           @Twr_Typ            = Twr_Typ,
           @Twr_KosztUslugiTyp = Twr_KosztUslugiTyp,
           @Twr_KosztUslugi    = Twr_KosztUslugi,
           @Twr_Stawka         = Twr_Stawka,
           @Twr_KursL          = Twr_KursL,
           @Twr_KursM          = Twr_KursM
         FROM cdn.Towary
         WHERE Twr_TwrId = @TrE_TwrId
         -- Kontrola ilosci przed dodaniem subelemntu
         IF @Twr_Typ = 1 AND (( @TrS_Typ = 1 AND @TrS_Ilosc < 0 ) OR ( 
@TrS_Typ = 2 AND @TrS_Ilosc > 0 ))  AND @TrE_IFA24Mag = 0
           BEGIN
             SELECT @ZawszeBraki = ISNULL(MAX(Fir_Wartosc),0) FROM 
cdn.Firma WHERE Fir_Numer = 1536
    if (SELECT ISNULL(MAX(Fir_Wartosc),0) FROM cdn.Firma WHERE Fir_Numer 
= 1970) = 1 or  (SELECT ISNULL(MAX(Fir_Wartosc),0) FROM cdn.Firma WHERE 
Fir_Numer = 1776) = 1
    select @ZezwalajMimoRez = 1
     else
    select @ZezwalajMimoRez = 0
    --SELECT @ZezwalajMimoRez = ISNULL(MAX(Fir_Wartosc),0) FROM 
cdn.Firma WHERE Fir_Numer = 1970
        IF ((@TrS_Rodzaj IN (305001,302001,306001,302000,302009, 305000, 
306000,304000,302008, 305008, 306008,304008) AND @TrS_Typ = 2)
    and exists (select * from deleted join inserted on deleted.TrE_TrEID 
= inserted.TrE_TrEID and inserted.TrE_TrEID = @TrE_TrEId and 
deleted.tre_ilosc >= inserted.tre_ilosc and deleted.TrE_DataOpe = 
inserted.TrE_DataOpe))
     or
     ((@TrS_Rodzaj IN ( 306004,306006) AND @TrS_Typ = 2) and exists 
(select TrN_TrSTyp from cdn.tranag join cdn.tranagrelacje on trr_faid= 
trn_trnid and trr_trnid = @TrE_TrNID where TrN_TrSTyp =2))
      SET @Komunikat = CDN.TwrIlosciErr ( 1, @TrS_Typ, @TrS_TwrId, 
@TrS_MagId, @TrS_DataOpe, @TrS_Ilosc, 3)
    ELSE
     IF ((@TrS_Rodzaj IN (302008, 305008, 306008,304008,312008) AND 
@TrS_Typ = 2)
        OR  (@TrS_Rodzaj =306010 AND @TrS_Typ = 2 and exists(select 
trr_trrid from cdn.tranagrelacje where  trr_trnid = @trn_trnid and 
Trr_fatyp = 308 ))
        OR  (@TrS_Rodzaj =302009 AND @TrS_Typ = 2 and exists(select 
trr_trrid from cdn.tranagrelacje where  trr_trnid = @trn_trnid and 
Trr_fatyp = 308 ))
        OR  (@TrS_Rodzaj =306004 AND @TrS_Typ = 2 and exists(select 
trr_trrid from cdn.tranagrelacje where  trr_trnid = @trn_trnid and 
Trr_fatyp = 308 )))
       and not exists (select * from deleted join inserted on 
deleted.TrE_TrEID = inserted.TrE_TrEID and inserted.TrE_TrEID = 
@TrE_TrEId and deleted.tre_ilosc < inserted.tre_ilosc)
      IF @ZezwalajMimoRez = 1 and(@TrS_rodzaj in 
(306008,306010,306004,304008,312008) or (@TrS_rodzaj in (302009) AND 
@TrS_Typ = 2)  or (@TrS_rodzaj in (302008) AND @TrS_Typ = 2) or 
(@TrS_rodzaj in (305008) AND @TrS_Typ = 2))
       SET @Komunikat = CDN.TwrIlosciErr ( 1, @TrS_Typ, @TrS_TwrId, 
@TrS_MagId, @TrS_DataOpe, @TrS_Ilosc, 2 )
      ELSE
       SET @Komunikat = CDN.TwrIlosciErr ( 1, @TrS_Typ, @TrS_TwrId, 
@TrS_MagId, @TrS_DataOpe, @TrS_Ilosc, 1 )
     else
      SET @Komunikat = CDN.TwrIlosciErr ( 1, @TrS_Typ, @TrS_TwrId, 
@TrS_MagId, @TrS_DataOpe, @TrS_Ilosc, 0)
             IF @Komunikat <> '' GOTO KOMUNIKAT
           END
         -- Marze symulowane dla FA, PA, FA z PA, RWS (symulacja poprzez 
ustawienie wartosci na subelemencie rezerwacyjnym)
         IF @Twr_Typ = 1 AND @TrS_Typ IN ( 3, 4 )
           BEGIN
             SET @Marza_Sym_Ostatnia = ( SELECT TOP 1 
ISNULL(Fir_Wartosc,0) FROM cdn.Firma WHERE Fir_Numer = 1481 )
             SET @Marza_Sym_Srednia  = ( SELECT TOP 1 
ISNULL(Fir_Wartosc,0) FROM cdn.Firma WHERE Fir_Numer = 1482 )
             -- Marze symulowane tylko dla elementów z subelementami 
rezerwacyjnymi - poprawa wartosći na subelementach rezerwacyjnych
             IF @Marza_Sym_Ostatnia = 1 OR @Marza_Sym_Srednia = 1
               BEGIN
                  -- w każdym przypadku symulwoana wg ostatniej ceny zakupu
                  SET @TrS_Wartosc = @TrE_Ilosc * ( SELECT 
ROUND(ISNULL(TwC_Wartosc,0)*(@Twr_KursL/@Twr_KursM),2) FROM cdn.TwrCeny 
WHERE TwC_TwrId = @TrS_TwrId AND TwC_TwCNumer = 1 )
                  -- jeśli marża ze średniej z zasobów i nie brakuje zasobów
                  IF @Marza_Sym_Srednia = 1
                    IF ( SELECT ISNULL(SUM(TwZ_Ilosc),0) FROM 
cdn.TwrZasoby WHERE TwZ_TwrId = @TrS_TwrId ) <> 0
                      SET @TrS_Wartosc = @TrE_Ilosc * ( SELECT 
ISNULL(SUM(TwZ_Wartosc)/SUM(TwZ_Ilosc),0) FROM cdn.TwrZasoby WHERE 
TwZ_TwrId = @TrS_TwrId )
                  SET @TrS_Cena = CASE @TrS_Ilosc WHEN 0 THEN 0 ELSE 
@TrS_Wartosc / @TrS_Ilosc END
               END
           END
         -- Liczenie kosztu usługi dla RWS (na pozostałych wewnętrznych 
koszt usługi jest zapisywany z obiektu)
         IF @Twr_Typ = 0 AND @TrE_TypDokumentu = 318  and 
@TrE_KosztUslugiZDok = 0
           BEGIN
             IF @Twr_KosztUslugiTyp = 1
               SET @TrE_KosztUslugi = ROUND( @TrE_Ilosc * 
@Twr_KosztUslugi, 2 )
             ELSE IF @Twr_KosztUslugiTyp = 2
               SET @TrE_KosztUslugi = ROUND( @TrE_WartoscNetto * 
@Twr_KosztUslugi / 100, 2 )
             UPDATE cdn.TraElem SET TrE_KosztUslugi = @TrE_KosztUslugi 
WHERE TrE_TrEId = @TrE_TrEId
           END
         -- AVCO - przed dodaniem subelementu dostawczego lub kosztowego 
sprawdzić date ostatniej modyfikacji zasobu
         IF @TrS_Metoda = 3 AND @TrS_Typ IN ( 1, 2 )
           BEGIN
             SET @Data_Dost = ( SELECT ISNULL(TwZ_Data,'1800-01-01') 
FROM cdn.TwrZasoby WHERE TwZ_TwrId = @TrS_TwrId AND TwZ_MagId = 
@TrS_MagId AND TwZ_TrSIdDost IS NULL )
             IF @TrS_DataOpe < @Data_Dost
               BEGIN
               -- jeśli kontrola daty ostatniej modyfiakcji zasobu 
zaznaczona
               IF ( SELECT TOP 1 
ISNULL(MAX(SUBSTRING(Fir_Wartosc,1,1)),0) FROM cdn.Firma WHERE Fir_Numer 
= 1688 ) = 0
                 BEGIN
                   SET @Komunikat = 'Zapis niemożliwy !  Dla towaru ' + 
@TrE_TwrKod + ' data ostatniej modyfikacji zasobu (' + CONVERT( 
NVarchar(10), @Data_Dost, 120 ) + ') jest późniejsza niż data transakcji 
(' + CONVERT( NVarchar(10), @TrS_DataOpe, 120 ) + ')'
                   IF @Komunikat <> '' GOTO KOMUNIKAT
                 END
               END
           END
         -- ustawienia korekty wartosci dla PZ z dostawami
          SET @DostIloscRecordow = 0
          SET @DostIloscRecordowReal = 0
         IF @TrS_Rodzaj IN ( 307002,307006,310002,303002,307003, 307011)
           BEGIN
             SELECT @DostIloscRecordowReal =count(A.TrS_TrSId)
              FROM cdn.TraSElem A
              JOIN cdn.TraElem B ON B.TrE_TrEId = A.TrS_TrEId
             WHERE B.TrE_TrEId = @TrE_ZwrId
           END
         IF @DostIloscRecordowReal > 1
           BEGIN
             SELECT  @DostIloscRecordow =count(A.TrS_TrSId)
               FROM cdn.TraSElem A
               JOIN cdn.TraElem B ON B.TrE_TrEId = A.TrS_TrEId
               JOIN (SELECT A.TrS_TrSId, 
abs(ISNULL(A.TrS_Ilosc,0))-abs(ISNULL(B.TrS_Ilosc,0)) as Roznica
                     FROM cdn.TraSElem A
                     LEFT OUTER JOIN cdn.TraSElem B ON A.TrS_TrSId = 
B.TrS_ZwrId
      WHERE A.TrS_Typ = 1 AND A.TrS_TrEId = @TrE_ZwrId) AS C ON 
C.TrS_TrSId = A.TrS_TrSId
               WHERE B.TrE_TrEId = @TrE_ZwrId AND C.Roznica > 0
              SELECT @DostTrS_Ilosc =
              (SELECT ISNULL(sum(TrS_Ilosc),0) FROM cdn.TraSElem WHERE 
Trs_Typ = 1 AND TrS_TrEId = @TrE_ZwrId)
               +
              (SELECT ISNULL(sum(TrS_Ilosc),0) FROM cdn.TraSElem WHERE 
Trs_Typ = 1 AND TrS_Zwrid
               in(SELECT TrS_TrSId FROM cdn.TraSElem WHERE Trs_Typ = 1 
AND TrS_TrEId = @TrE_ZwrId ))
            SET @DostIloscRecordowDodanych = 1
            SET @ResztaWartosc = @TrE_WartoscNetto
            DECLARE DostawyKorektaWartosci CURSOR LOCAL FAST_FORWARD FOR
             SELECT A.TrS_TrSId
               FROM cdn.TraSElem A
               JOIN cdn.TraElem B ON B.TrE_TrEId = A.TrS_TrEId
               JOIN (SELECT A.TrS_TrSId, 
abs(ISNULL(A.TrS_Ilosc,0))-abs(ISNULL(B.TrS_Ilosc,0)) AS Roznica
                     FROM cdn.TraSElem A
                     LEFT OUTER JOIN (SELECT B.TrS_ZwrId, 
SUM(ISNULL(B.TrS_Ilosc,0))  as TrS_Ilosc
                                      FROM cdn.TraSElem A
                                      LEFT OUTER JOIN  cdn.TraSElem B ON 
A.TrS_TrSId = B.TrS_ZwrId WHERE A.TrS_Typ = 1 AND A.TrS_TrEId = 
@TrE_ZwrId AND B.TrS_ZwrId IS NOT NULL
                                      GROUP BY B.TrS_ZwrId) B ON 
A.TrS_TrSId = B.TrS_ZwrId
                     WHERE A.TrS_Typ = 1 AND A.TrS_TrEId = @TrE_ZwrId) 
AS C ON C.TrS_TrSId = A.TrS_TrSId
              WHERE B.TrE_TrEId = @TrE_ZwrId AND c.roznica > 0
            OPEN DostawyKorektaWartosci
            WHILE 1=1
            BEGIN
              FETCH NEXT FROM DostawyKorektaWartosci INTO @DostTrS_TrSId
              IF @@FETCH_STATUS <> 0 BREAK
                IF @DostIloscRecordowDodanych = @DostIloscRecordow
                SELECT
                 @TrS_TrSIdDost  = TrS_TrSIdDost,
                 @TrS_Cena       = TrS_Cena,
                 @TrS_Wartosc    = @ResztaWartosc,
                 @TrS_ZwrId      = TrS_TrSId
               FROM cdn.TraSElem
               WHERE TrS_TrSId = @DostTrS_TrSId
                ELSE
                SELECT
                 @TrS_TrSIdDost  = MAX(TrS_TrSIdDost),
                 @TrS_Cena       = MAX(TrS_Cena),
                 @TrS_Wartosc    = ROUND( 
(@TrE_WartoscNetto/@DostTrS_Ilosc)*SUM(TrS_Ilosc),2),
                 @TrS_ZwrId      = MIN(TrS_TrSId)
               FROM cdn.TraSElem
               WHERE TrS_TrSId = @DostTrS_TrSId OR TrS_ZwrID = 
@DostTrS_TrSId
               SET @DostIloscRecordowDodanych = 
@DostIloscRecordowDodanych + 1
               SET @ResztaWartosc = @ResztaWartosc - @TrS_Wartosc
               --select @TrS_TrSId, @TrS_TrEId, @TrS_TrSIdDost, 
@TrS_ZwrId, @TrS_TwrId, @TrS_MagId, @TrS_Rodzaj, @TrS_Typ, @TrS_Metoda, 
@TrS_DataOpe, @TrS_Ilosc, @TrS_Wartosc as wartosc, @TrS_Cena, 
@TrS_Termin, @TrE_ZwrId, @TrN_TrNId, @TrN_MagDocId, @TrN_Bufor
               EXECUTE CDN.AktualizujTraSElem @TrS_TrSId, @TrS_TrEId, 
@TrS_TrSIdDost, @TrS_ZwrId, @TrS_TwrId, @TrS_MagId, @TrS_Rodzaj, 
@TrS_Typ, @TrS_Metoda, @TrS_DataOpe, @TrS_Ilosc, @TrS_Wartosc, 
@TrS_Cena, @TrS_Termin, @TrE_ZwrId, @TrN_TrNId, @TrN_MagDocId, @TrN_Bufor
           END
           CLOSE DostawyKorektaWartosci
           DEALLOCATE DostawyKorektaWartosci
           UPDATE cdn.TraElem SET TrE_KosztUslugi = 0 WHERE TrE_TrEId = 
@TrE_TrEId
         END
         -- dodanie subelemntu (towary lub usługi gdy dokumenty rozchodowe )
         IF @Twr_Typ = 1 AND ISNULL(@Tre_WyborDostaw,0)  = 0 AND 
@DostIloscRecordowReal  < 2 AND @TrE_IFA24Mag = 0
           BEGIN
             EXECUTE CDN.AktualizujTraSElem @TrS_TrSId, @TrS_TrEId, 
@TrS_TrSIdDost, @TrS_ZwrId, @TrS_TwrId, @TrS_MagId, @TrS_Rodzaj, 
@TrS_Typ, @TrS_Metoda, @TrS_DataOpe, @TrS_Ilosc, @TrS_Wartosc, 
@TrS_Cena, @TrS_Termin, @TrE_ZwrId, @TrN_TrNId, @TrN_MagDocId, @TrN_Bufor
             UPDATE cdn.TraElem SET TrE_KosztUslugi = 0 WHERE TrE_TrEId 
= @TrE_TrEId
           END
         -- dodanie subelemntu dla rezerwacji (usługi)
         IF @Twr_Typ = 0
           BEGIN
              IF  @TrS_Rodzaj IN ( 307010, 302008, 305008, 306008, 
301011 , 306004, 307004, 302009, 302004, 306010,304000,304008,312008,312100)
                EXEC [CDN].[UstawRezerwacje] @TrS_TrEId,0,0
              IF  @TrE_TypDokumentu IN ( 308, 309)
                BEGIN
                  SET @TrS_Typ = @TrS_Typ + 10
                  EXECUTE CDN.AktualizujTraSElem @TrS_TrSId, @TrS_TrEId, 
@TrS_TrSIdDost, @TrS_ZwrId, @TrS_TwrId, @TrS_MagId, @TrS_Rodzaj, 
@TrS_Typ , @TrS_Metoda, @TrS_DataOpe, @TrS_Ilosc, @TrS_Wartosc, 
@TrS_Cena, @TrS_Termin, @TrE_ZwrId, @TrN_TrNId, @TrN_MagDocId, @TrN_Bufor
                END
           END
         -- Update wartości i cen elementu dla dokumentów wewnętrznych
         IF @TrE_TypDokumentu IN ( 304, 312, 318 ) AND @TrN_Rodzaj NOT 
IN ( 312010 )
           BEGIN
             SET @TrE_WartoscZakupu = ( SELECT TrE_WartoscZakupu FROM 
cdn.TraElem WHERE TrE_TrEId = @TrE_TrEId )
             UPDATE cdn.TraElem SET
               TrE_WartoscNetto     = @TrE_WartoscZakupu,
               TrE_WartoscBrutto    = ROUND(@TrE_WartoscZakupu * ( ( 100 
+ TrE_Stawka ) / 100 ), 2 ),
               TrE_WartoscNettoWal  = @TrE_WartoscZakupu,
               TrE_WartoscBruttoWal = ROUND(@TrE_WartoscZakupu * ( ( 100 
+ TrE_Stawka ) / 100 ), 2 ),
               TrE_Rabat            = 0,
               TrE_CenaT            = CASE TrE_IloscJM WHEN 0 THEN 0 
ELSE @TrE_WartoscZakupu / TrE_IloscJM END,
               TrE_CenaW            = CASE TrE_IloscJM WHEN 0 THEN 0 
ELSE @TrE_WartoscZakupu / TrE_IloscJM END ,
               TrE_Cena0            = CASE TrE_Ilosc   WHEN 0 THEN 0 
ELSE @TrE_WartoscZakupu / TrE_Ilosc   END ,
               TrE_CenaWWD          = CASE TrE_IloscJM WHEN 0 THEN 0 
ELSE @TrE_WartoscZakupu / TrE_IloscJM END,
               TrE_Cena0WD          = CASE TrE_Ilosc   WHEN 0 THEN 0 
ELSE @TrE_WartoscZakupu / TrE_Ilosc   END,
               TrE_Waluta           = @WalutaSys,
               TrE_KursNumer        = 0,
               TrE_KursL            = 1,
               TrE_KursM            = 1
             WHERE TrE_TrEId = @TrE_TrEId
           END
         -- Aktualizacja ceny zakupu towaru i kosztu usługi na karcie 
magazynowej dla każdego elementu PWP
         -- Jeśli waluta dokumentu (naglowka) jest systemowa, to zmiana 
ceny zakupu na podstawie waluty elemetnu
         -- parametry waluty z elementu
         IF @TrN_Waluta = @WalutaSys
           BEGIN
             SET @Waluta    = @TrE_Waluta
             SET @KursNumer = @TrE_KursNumer
             SET @KursL     = @TrE_KursL
             SET @KursM     = @TrE_KursM
             SET @CenaW_New = @TrE_CenaW
           END
         -- parametry waluty z nagłówka
         ELSE
           BEGIN
             SET @Waluta    = @TrN_Waluta
             SET @KursNumer = @TrN_KursNumer
             SET @KursL     = @TrN_KursL
             SET @KursM     = @TrN_KursM
             SET @CenaW_New = @TrE_CenaWWD
           END
/*
         -- Sprawdzenie, czy należy aktualizować cenę zakupu na MM-OL
         IF @TrN_Rodzaj = 312010
           SELECT TOP 1 @Aktualizuj_CenaZ_MMOL = CONVERT(TINYINT, 
ISNULL(Fir_Wartosc,0)) FROM cdn.Firma WHERE Fir_Numer = 1758
         -- Rodzaj marży: 0 = "od stu", 1 = "w stu"
         IF ( @TrE_TypDokumentu IN ( 310, 303, 307, 301, 317, 313 ) OR ( 
@TrN_Rodzaj = 312010 AND @Aktualizuj_CenaZ_MMOL = 1 ) )
           AND @TrE_Ilosc > 0
           AND @TrN_Bufor IN ( 0 )
           BEGIN
             -- parametry kursu waluty dla towaru lub usługi z typem 
kwotowym
             IF @Twr_Typ = 1 OR ( @Twr_Typ = 0 AND @Twr_KosztUslugiTyp = 1 )
               UPDATE cdn.Towary SET
                 Twr_Waluta         = @Waluta,
                 Twr_KursNumer      = @KursNumer,
                 Twr_KursL          = @KursL,
                 Twr_KursM          = @KursM
               WHERE Twr_TwrId = @TrE_TwrId
             -- koszt usługi ( usługa i typ kosztu kwotowy )
             IF @Twr_Typ = 0 AND @Twr_KosztUslugiTyp = 1
               BEGIN
                 -- od netto
                 IF @TrE_TypNB = 1
                   BEGIN
                     SET @Twr_KosztUslugiNew    = @TrE_CenaT
                     SET @Twr_KosztUslugiWalNew = @CenaW_New
                   END
                 -- od brutto
                 ELSE IF @TrE_TypNB = 2
                   BEGIN
                     SET @Twr_KosztUslugiNew    = @TrE_CenaT   - ROUND ( 
@TrE_CenaT   * @TrE_Stawka / (100 + @TrE_Stawka) , 2 )
                     SET @Twr_KosztUslugiWalNew = @CenaW_New - ROUND ( 
@CenaW_New  * @TrE_Stawka / (100 + @TrE_Stawka) , 2 )
                   END
                 UPDATE cdn.Towary SET
                   Twr_KosztUslugi    = @Twr_KosztUslugiNew,
                   Twr_KosztUslugiWal = @Twr_KosztUslugiWalNew
                 WHERE Twr_TwrId = @TrE_TwrId
               END
             -- Kursor po cenach dla towaru lub usługi z kosztem kwotowym:
             -- aktualizacja ceny zakupu (TwC_TwCNumer = 1)
             -- aktualizacja marży dla cen sprzedaży z aktualizacją 
ustawiną na "Nie" ( TwC_TwCNumer <> 1 AND TwC_Aktualizacja = 0 )
             IF @Twr_Typ = 1 OR ( @Twr_Typ = 0 AND @Twr_KosztUslugiTyp = 1 )
               BEGIN
                 DECLARE TwrCeny CURSOR LOCAL FAST_FORWARD FOR
                 SELECT TwC_TwCNumer, TwC_TwCId, TwC_Waluta, 
TwC_Wartosc, TwC_Typ
                   FROM cdn.TwrCeny
                   WHERE TwC_TwrId = @TrE_TwrId AND TwC_TwCNumer = 1
                 UNION ALL
                 SELECT TwC_TwCNumer, TwC_TwCId, TwC_Waluta, 
TwC_Wartosc, TwC_Typ
                   FROM cdn.TwrCeny
                   WHERE TwC_TwrId = @TrE_TwrId AND TwC_TwCNumer <> 1 
AND TwC_Aktualizacja = 0
                 OPEN TwrCeny
                   WHILE 1=1
                     BEGIN
                       FETCH NEXT FROM TwrCeny INTO @TwC_TwCNumer, 
@TwC_TwCId, @TwC_Waluta, @TwC_Wartosc, @TwC_Typ
                       IF @@FETCH_STATUS <> 0 BREAK
                       -- aktualizacja ceny zakupu
                       IF @TwC_TwCNumer = 1
                         BEGIN
                           -- od netto
                           IF @TrE_TypNB = 1
                             IF @TwC_Typ = 1
                               SET @TwC_Wartosc = @CenaW_New  * ( 
@TrE_JMPrzelicznikM / @TrE_JMPrzelicznikL )
                             ELSE
                               SET @TwC_Wartosc = ( @CenaW_New + ROUND( 
@CenaW_New * @TrE_Stawka / 100, 2 ) ) * (  @TrE_JMPrzelicznikM / 
@TrE_JMPrzelicznikL )
                           -- od brutto
                           ELSE IF @TrE_TypNB = 2
                             IF @TwC_Typ = 1
                               SET @TwC_Wartosc = ( @CenaW_New  - ROUND( 
@CenaW_New * @TrE_Stawka / ( 100+@TrE_Stawka), 2 ) ) *  ( 
@TrE_JMPrzelicznikM / @TrE_JMPrzelicznikL )
                             ELSE
                               SET @TwC_Wartosc =  @CenaW_New   *  ( 
@TrE_JMPrzelicznikM / @TrE_JMPrzelicznikL )
                           UPDATE cdn.TwrCeny SET
                             TwC_Wartosc = @TwC_Wartosc,
                             TwC_Waluta  = @Waluta
                           WHERE TwC_TwCId = @TwC_TwCId
                           SET @CenaZakupuNew = @TwC_Wartosc
                           SET @CenaZakupuNewWal = @CenaZakupuNew
                           SET @CenaZakupuNewPLN = @CenaZakupuNew * 
@KursL/@KursM
                         END  -- @TwC_TWCNumer = 1
                       -- aktualizacja marż dla cen sprzedaży
                       -- tylko wtedy, gdy waluta zakupu i sprzedaży są 
równe lub gdy waluta sprzedazy jest systemowa
                       ELSE IF @TwC_TwCNumer <> 1 AND  ( @TwC_Waluta = 
@Waluta OR @TwC_Waluta = @WalutaSys )
                         BEGIN
                           -- cena sprzedaży brutto - obliczamy jej 
reprezentację netto
                           IF @TwC_Typ = 2
                             SET @TwC_Wartosc  =  @TwC_Wartosc - ROUND( 
@TwC_Wartosc * @Twr_Stawka / ( 100 + @Twr_Stawka), 2 )
                           -- marża "od stu" i "w stu"
                           IF @CenaZakupuNew <> 0
                             BEGIN
                              -- jeśli waluta zakupu i sprzedaży są 
równe, to bierzemy cenę zakupu w walucie dokumentu
                              -- w przeciwnym przypadku, gdy cena 
sprzedaży jest w walucie systemowej, to bierzemy cenę zakupu w walucie 
systemowej
                              IF @TwC_Waluta = @WalutaSys AND @Waluta <> 
@WalutaSys
                                SET @CenaZakupuNew = @CenaZakupuNewPLN
                              ELSE
                                SET @CenaZakupuNew = @CenaZakupuNewWal
                               SET @TwC_Marza = ( ( @TwC_Wartosc / 
@CenaZakupuNew ) - 1 ) * 100
                               IF ( @TwC_Marza = -100 )  OR ( 
@CenaZakupuNew = @TwC_Wartosc )
                                 SET @TwC_MarzaWStu = 100
                               ELSE IF @TwC_Wartosc = 0
                                 SET @TwC_MarzaWStu = -100
                               ELSE
                                 SET @TwC_MarzaWStu = 100 * @TwC_Marza / 
( 100 + @TwC_Marza )
                               IF @TwC_Marza     > 99999.99 SET 
@TwC_Marza     = 99999.99
                               IF @TwC_MarzaWStu > 99999.99 SET 
@TwC_MarzaWStu = 99999.99
          IF @TwC_Marza     < - 99999.99 SET @TwC_Marza     = -99999.99
                               IF @TwC_MarzaWStu < - 99999.99 SET 
@TwC_MarzaWStu = -99999.99
                             END
                             IF @TwC_Marza IS NOT NULL AND 
@TwC_MarzaWStu IS NOT NULL
                             UPDATE cdn.TwrCeny SET
                               TwC_Marza = @TwC_Marza,
                               TwC_MarzaWStu = @TwC_MarzaWStu
                             WHERE TwC_TwCId = @TwC_TwCId
                         END
                     END -- kursor TwrCeny
                 CLOSE TwrCeny
                 DEALLOCATE TwrCeny
               END -- Towar lub usługa z kosztem kwotowym
           END -- aktualizacji ostatniej ceny zakupu
         IF @MyIdentity IS NOT NULL
           BEGIN
             SET IDENTITY_INSERT cdn.Idn ON
             INSERT INTO cdn.Idn (i) VALUES (@MyIdentity)
             SET IDENTITY_INSERT cdn.Idn OFF
    DELETE FROM cdn.Idn  WHERE i = @MyIdentity --WiNi
           END
*/
       END
     CLOSE Dodawane
   DEALLOCATE Dodawane
   -- KosztUslugi = 0 dla towarów
   UPDATE CDN.TraElem SET TrE_KosztUslugi = 0 WHERE TrE_TrEId IN (select 
TrE_TrEId FROM inserted join cdn.towary on inserted.tre_twrid = 
twr_twrid and twr_typ = 1)
   -- sprawdzenie towaru z elementu po modyfikacjach dla dodawanych i 
kasowanych
   DECLARE EKI CURSOR LOCAL FAST_FORWARD FOR
     SELECT TrE_TrEId, TrE_TwrId, TrE_DataOpe, TrE_TwrKod, TrE_TwrNazwa
       FROM (
              SELECT TrE_TrEId, TrE_TwrId, TrE_DataOpe, TrE_TwrKod, 
TrE_TwrNazwa
              FROM deleted where ISNULL(Tre_WyborDostaw,0) = 0
              UNION ALL
              SELECT TrE_TrEId, TrE_TwrId, TrE_DataOpe, TrE_TwrKod, 
TrE_TwrNazwa
              FROM inserted where ISNULL(Tre_WyborDostaw,0) = 0
            ) AS TrE_ERR
       GROUP BY TrE_TrEId, TrE_TwrId, TrE_DataOpe, TrE_TwrKod, TrE_TwrNazwa
     OPEN EKI
       WHILE 1=1
       BEGIN
         FETCH NEXT FROM EKI INTO @TrE_TrEId, @TrE_TwrId, @TrE_DataOpe, 
@TrE_TwrKod,@TrE_TwrNazwa
         IF @@FETCH_STATUS <> 0 BREAK
         SET @Komunikat = CDN.TwrZasobyErr ( @TrE_TrEId, @TrE_TwrId, 
@TrE_TwrKod,@TrE_TwrNazwa, @TrE_DataOpe )
         IF @Komunikat <> '' GOTO KOMUNIKAT
       END
     CLOSE EKI
   DEALLOCATE EKI
   -- Wyswietlenie komunikatu i rollback całej transakcji
   KOMUNIKAT:
   IF @Komunikat <> ''
     BEGIN
       RAISERROR( '%s', 16, 1, @Komunikat)
       ROLLBACK TRAN
       SET NOCOUNT OFF
       RETURN
     END
   SET NOCOUNT OFF




>
>> Przykład z życia: pad prądu w środku wpisywania dokumentu. W różnych
>> systemach następuje rozjazd pomiędzy stanami handlowymi a stanami
>> magazynowymi, natomiast w Optimie/XL/Enovie praktycznie nigdy. Znam
>> tylko kilka zgłoszonych przypadków przez blisko 20 lat.
> Zatem mylisz transakcję bazodanową (która została wycofana, po padł
> prąd), ze spójnością danych logicznych zapewnioną przez triggery, po
> stronie bazy danych.
> I tak przez blisko 20 lat :P
>

Być może mylę - nie przeczę.
Bazodanowa - to jak coś w rodzaju TTS w Novellu?
Ale to chyba na innym poziomie, niż logiczna spójność. Muszę doczytać. 
Jakiś link?


-- 
Pozdrawiam.

Adam
Technical Details
Message-ID: <ojip52$9jn$1@usenet.news.interia.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.interia.pl!not-for-mail
References: <59400f55$0$663$65785112@news.neostrada.pl> <ohq7ub$s7h$1@gioia.aioe.org> <ohr1t9$h91$1@usenet.news.interia.pl> <59411fb2$0$15209$65785112@news.neostrada.pl> <ohrmer$rgq$1@usenet.news.interia.pl> <5b0cb897-0678-4a43-8e26-375b40c8f6ae@googlegroups.com> <oi8crp$kr8$1@usenet.news.interia.pl> <oi8p3q$dd2$1@usenet.news.interia.pl> <oi9365$1kh$1@usenet.news.interia.pl> <5948b198$0$5146$65785112@news.neostrada.pl> <oib7fa$b50$1@usenet.news.interia.pl> <595ccdc0$0$15205$65785112@news.neostrada.pl>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.interia.pl!not-for-mail
From: Adam <a.g@poczta.onet.pl>
Newsgroups: pl.comp.bazy-danych
Subject: Re: [OT] Re: Baza ok 2500 tabel.
Date: Wed, 5 Jul 2017 15:21:38 +0200
Organization: INTERIA.PL S.A.
Lines: 2162
Message-ID: <ojip52$9jn$1@usenet.news.interia.pl>
References: <59400f55$0$663$65785112@news.neostrada.pl> <ohq7ub$s7h$1@gioia.aioe.org> <ohr1t9$h91$1@usenet.news.interia.pl> <59411fb2$0$15209$65785112@news.neostrada.pl> <ohrmer$rgq$1@usenet.news.interia.pl> <5b0cb897-0678-4a43-8e26-375b40c8f6ae@googlegroups.com> <oi8crp$kr8$1@usenet.news.interia.pl> <oi8p3q$dd2$1@usenet.news.interia.pl> <oi9365$1kh$1@usenet.news.interia.pl> <5948b198$0$5146$65785112@news.neostrada.pl> <oib7fa$b50$1@usenet.news.interia.pl> <595ccdc0$0$15205$65785112@news.neostrada.pl>
NNTP-Posting-Host: ent22.internetdsl.tpnet.pl
Mime-Version: 1.0
X-Trace: usenet.news.interia.pl 1499260899 9847 83.15.205.22 (5 Jul 2017 13:21:39 GMT)
X-Complaints-To: usenet@firma.interia.pl
NNTP-Posting-Date: Wed, 5 Jul 2017 13:21:39 +0000 (UTC)
User-Agent: Mozilla/5.0 (Windows NT 5.1; WOW64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0
In-Reply-To: <595ccdc0$0$15205$65785112@news.neostrada.pl>
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit