🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.bazy-danych
32 messages
32 total messages Started by Cezary Grądys Tue, 13 Jun 2017 16:14
Baza ok 2500 tabel.
#195324
Author: Cezary Grądys
Date: Tue, 13 Jun 2017 16:14
9 lines
1128 bytes
Witam.

Co o tym sądzić? Czy to uzasadnione może być, czy spodziewać się
więlkiej lipy? Branża ubezpieczeniowa.
Jakie maksymalne ilości tabel spotykacie w praktyce?

-- 
Cezary Grądys
czarekgr@wa.onet.pl
Re: Baza ok 2500 tabel.
#195326
Author: wloochacz
Date: Tue, 13 Jun 2017 16:28
15 lines
1536 bytes
W dniu 2017-06-13 o 18:14, Cezary Grądys pisze:
> Witam.
> 
> Co o tym sądzić? Czy to uzasadnione może być, czy spodziewać się
> więlkiej lipy? Branża ubezpieczeniowa.
IMO lipa; taka ilość tabel sugeruje partycjonowanie w bieda wersji.
Oczywiście mogę się mylić i ciekaw jestem czy się mylę ;-)

> Jakie maksymalne ilości tabel spotykacie w praktyce?
Ok. 1000 +/- 15%
Ale to kobyła do wszystkiego była, której projekt wyrósł z baz ISAM...
W formie stricte relacyjnej można by to było zrobić ciut inaczej i lepiej.

-- 
wloochacz
Re: Baza ok 2500 tabel.
#195325
Author: M.M.
Date: Tue, 13 Jun 2017 19:30
26 lines
2455 bytes
On Tuesday, June 13, 2017 at 6:14:27 PM UTC+2, Cezary Grądys wrote:
> Witam.
> 
> Co o tym sądzić? Czy to uzasadnione może być, czy spodziewać się
> więlkiej lipy? Branża ubezpieczeniowa.
> Jakie maksymalne ilości tabel spotykacie w praktyce?

Nie można nic powiedzieć o systemie na podstawie samej ilości
tabel :) Co w sytuacji, gdy automat w jakimś celu zakłada
tabele? Co gdy jedna z tabel ma taką definicję:
nazwa_tabeli, numer_rekordu, nazwa_pola, dane_wlasciwe - taka
jedna tabela zastępuje dowolną ilość tabel w bazie :)

Trzeba coś wiedzieć, albo chociaż założyć o tabelach.
Gdy założy się rozsądek, to aplikacja pracująca na bazie zawierającej
(powiedzmy) od 6 do 14 dobrze zaprojektowanych tabel i te tabele 
zawierają "dane główne", a nie jakieś szczegółowe ustawienia, to 
(ta aplikacja) może być już baaaardzo zaawansowaną i rozbudowaną
aplikacją. A gdy ilość tabel idzie w tysiące to co można myśleć?

Myślę, że tabele są generowane automatycznie, albo powstają/powstały w
celu jakiejś optymalizacji. Wyłuskaj z tego "dane główne", zastanów
się ile potrzeba tabel przy dobrej normalizacji, bez optymalizacji,
wtedy będzie można jakieś zgrubne wnioski wyciągać.

Pozdrawiam
Re: Baza ok 2500 tabel.
#195327
Author: Marcin B.
Date: Tue, 13 Jun 2017 22:47
15 lines
1682 bytes
On 2017-06-13 18:14, Cezary Grądys wrote:
> Witam.
> 
> Co o tym sądzić? Czy to uzasadnione może być, czy spodziewać się
> więlkiej lipy? Branża ubezpieczeniowa.
> Jakie maksymalne ilości tabel spotykacie w praktyce?
> 

Trzeba rzucić okiem na bazę, sama liczba tabel niewiele mówi. Z
doświadczenia wiem, że większy ERP to grubo ponad 1000 tabel, a np.
systemy bankowe to kilka tys. Chociaż widziałem kiedyś w pewnym ERP
tabele dokument_wz, dokument_mm, dokument_pw itd., przy czym 90% pól
było wspólne - wtedy można się przyczepić do struktury bazy.

M.
Re: Baza ok 2500 tabel.
#195328
Author: Jivanmukta
Date: Wed, 14 Jun 2017 02:44
3 lines
810 bytes
> Jakie maksymalne ilości tabel spotykacie w praktyce?

Pracowałem z systemem SAP R/3 który ma 14000 tabel.
Re: Baza ok 2500 tabel.
#195329
Author: Cezary Grądys
Date: Wed, 14 Jun 2017 06:32
10 lines
1451 bytes
W dniu 14.06.2017 o 04:44, Jivanmukta pisze:
>> Jakie maksymalne ilości tabel spotykacie w praktyce?
> 
> Pracowałem z systemem SAP R/3 który ma 14000 tabel.
> 


Dzięki wszystkim, widzę, że na dwoje babka wróżyła.
Bardziej skłaniam się, że to jakaś lipa, jakieś sprawy historyczne, bo
dokumentacji prawie nie ma.
Re: Baza ok 2500 tabel.
#195330
Author: Adam
Date: Wed, 14 Jun 2017 10:07
18 lines
1396 bytes
W dniu 2017-06-14 o 04:44, Jivanmukta pisze:
>> Jakie maksymalne ilości tabel spotykacie w praktyce?
>
> Pracowałem z systemem SAP R/3 który ma 14000 tabel.
>

IMO - SAP nie jest dobrym przykładem :(

Dla ichniejszych ludzików z IT najmniejsza pierdółka rosła do rangi 
problemu miesiąca. Spotykałem się z sytuacją, że zmiana jednego pola 
była awykonalna, a na przykład zmiana adresu portu RS232 (dla wysyłania 
danych do drukarki fiskalnej) trwała blisko trzy tygodnie :(


-- 
Pozdrawiam.

Adam
Re: Baza ok 2500 tabel.
#195331
Author: Cezary Grądys
Date: Wed, 14 Jun 2017 11:36
18 lines
1893 bytes
W dniu 14.06.2017 o 12:07, Adam pisze:
> W dniu 2017-06-14 o 04:44, Jivanmukta pisze:
>>> Jakie maksymalne ilości tabel spotykacie w praktyce?
>>
>> Pracowałem z systemem SAP R/3 który ma 14000 tabel.
>>
> 
> IMO - SAP nie jest dobrym przykładem :(
> 
> Dla ichniejszych ludzików z IT najmniejsza pierdółka rosła do rangi 
> problemu miesiąca. Spotykałem się z sytuacją, że zmiana jednego pola 
> była awykonalna, a na przykład zmiana adresu portu RS232 (dla wysyłania 
> danych do drukarki fiskalnej) trwała blisko trzy tygodnie :(
> 
> 


Chyba nie jest prosto, jak baza ma 14000 tabel :)
Re: Baza ok 2500 tabel.
#195349
Author: Stokrotka
Date: Wed, 14 Jun 2017 14:19
30 lines
1998 bytes
Raczej wielka lipa.

Często pszyczyną jest to, że jak do konserwacji systemu zatrudniany jest 
nowy, kolejny programista,
to zamiast wczytać się w dokumentację i używać istniejącej tabeli,
po prostu zakłada garść nowyh tabel
(bo tak jest szybciej: w końcu jak pszyjmowali do roboty pytali o znajomość 
SQL
- a tu wystarczy jedna instrukcja by załozyć tabelę -,
a nie pytali o stosunek do dokumentacji, a kandydat na pracownika - 
programistę
nie pytał czy dokumentacja jest i ile już jest tabel marką auta.)

Czasem tabele robi automat.
Czasem właściwie, czasem bez sensu nie kasując tabeli
bo programista zapomniał, że powinien założyć tymczasową.

Jest jescze nadzieja, że ty spisując ilośc tabel , nie odzieliłeś, 
pomieszałeś
 tabele z indeksami i kluczami itp.
Ale nawet jak odejmiesz jakiś procent, nawet 75%, to i tak wyjdzie za wiele.
Raczj ktoś coś spiep...

-- 
(tekst bez: ó, ch, rz i -ii)
Ortografia to NAWYK, często nielogiczny, ktury ludzie ociężali umysłowo,
nażucają bezmyślnie następnym pokoleniom. ( ortografia . pev . pl )


. 
Re: Baza ok 2500 tabel.
#195332
Author: Adam
Date: Wed, 14 Jun 2017 15:58
38 lines
2275 bytes
W dniu 2017-06-14 o 13:36, Cezary Grądys pisze:
> W dniu 14.06.2017 o 12:07, Adam pisze:
>> W dniu 2017-06-14 o 04:44, Jivanmukta pisze:
>>>> Jakie maksymalne ilości tabel spotykacie w praktyce?
>>>
>>> Pracowałem z systemem SAP R/3 który ma 14000 tabel.
>>>
>>
>> IMO - SAP nie jest dobrym przykładem :(
>>
>> Dla ichniejszych ludzików z IT najmniejsza pierdółka rosła do rangi
>> problemu miesiąca. Spotykałem się z sytuacją, że zmiana jednego pola
>> była awykonalna, a na przykład zmiana adresu portu RS232 (dla
>> wysyłania danych do drukarki fiskalnej) trwała blisko trzy tygodnie :(
>>
>>
>
>
> Chyba nie jest prosto, jak baza ma 14000 tabel :)

Ciężko ogarnąć.

Jeśli jeszcze brakuje triggerów, to już prześledzenie transakcji może 
być co najmniej problematyczne.

Ja na szczęście pracuję z programami, którym wystarcza kilkaset tabel. 
Praktycznie wszystko jest jeszcze obwarowane triggerami, więc grzebiąc w 
bazie nie jestem w stanie (oczywiście bez wyłączenia triggera) 
przykładowo wycofać dokumentu wydania towaru, aby tenże towar nie 
pojawił się ponownie na stanie magazynowym.
Niektóre triggery sprawdzają kilkadziesiąt warunków - też nie sposób to 
robić ręcznie - ale to już OT.


-- 
Pozdrawiam.

Adam
Re: Baza ok 2500 tabel.
#195348
Author: Jacek
Date: Thu, 15 Jun 2017 07:42
7 lines
1110 bytes
Dnia Wed, 14 Jun 2017 04:44:29 +0200, Jivanmukta napisał(a):

>> Jakie maksymalne ilości tabel spotykacie w praktyce?
> 
> Pracowałem z systemem SAP R/3 który ma 14000 tabel.

To pewnie pozostałość po programistach piszących programy z DBFami...
Re: Baza ok 2500 tabel.
#195333
Author: M.M.
Date: Thu, 15 Jun 2017 09:42
40 lines
3144 bytes
On Wednesday, June 14, 2017 at 5:58:20 PM UTC+2, Adam wrote:
> W dniu 2017-06-14 o 13:36, Cezary Grądys pisze:
> > W dniu 14.06.2017 o 12:07, Adam pisze:
> >> W dniu 2017-06-14 o 04:44, Jivanmukta pisze:
> >>>> Jakie maksymalne ilości tabel spotykacie w praktyce?
> >>>
> >>> Pracowałem z systemem SAP R/3 który ma 14000 tabel.
> >>>
> >>
> >> IMO - SAP nie jest dobrym przykładem :(
> >>
> >> Dla ichniejszych ludzików z IT najmniejsza pierdółka rosła do rangi
> >> problemu miesiąca. Spotykałem się z sytuacją, że zmiana jednego pola
> >> była awykonalna, a na przykład zmiana adresu portu RS232 (dla
> >> wysyłania danych do drukarki fiskalnej) trwała blisko trzy tygodnie :(
> >>
> >>
> >
> >
> > Chyba nie jest prosto, jak baza ma 14000 tabel :)
> 
> Ciężko ogarnąć.
> 
> Jeśli jeszcze brakuje triggerów, to już prześledzenie transakcji może 
> być co najmniej problematyczne.
> 
> Ja na szczęście pracuję z programami, którym wystarcza kilkaset tabel. 
> Praktycznie wszystko jest jeszcze obwarowane triggerami, więc grzebiąc w 
> bazie nie jestem w stanie (oczywiście bez wyłączenia triggera) 
> przykładowo wycofać dokumentu wydania towaru, aby tenże towar nie 
> pojawił się ponownie na stanie magazynowym.
> Niektóre triggery sprawdzają kilkadziesiąt warunków - też nie sposób to 
> robić ręcznie - ale to już OT.

Kilkaset to też dużo. Jeśli można spytać, ile było które nie zawierały
danych nadmiarowych, jaka była średnia ilość rekordów w tabeli (licząc
tylko te nienadmiarowe) i ile tabel miało ilość rekordów powyżej średniej -
też licząc tylko te nienadmiarowe.

Pozdrawiam
Re: Baza ok 2500 tabel.
#195350
Author: Cezary Grądys
Date: Thu, 15 Jun 2017 12:37
20 lines
1940 bytes
W dniu 14.06.2017 o 16:19, Stokrotka pisze:
> apomniał, że powinien założyć tymczasową.
> 
> Jest jescze nadzieja, że ty spisując ilośc tabel , nie odzieliłeś, 
> pomieszałeś
> tabele z indeksami i kluczami itp.


Nie miałem możliwości długo się przyglądać, rzuciłem okiem z poziomu
PgAdmina, a tam ilość tabel jest jednoznacznie podana...

No to może jeszcze takie pytanie, kiedy taka ilość tabel jest
uzasadniona? Są podobno tacy, co robia tabele słownikowe nazwisk, ale
mimo wszystko jakoś trudno tyle tabel stworzyć.
Ja skłaniam się do wniosku, że brakuje odważnego do zrobienia
DROP TABLE...

-- 
Cezary Grądys
czarekgr@wa.onet.pl
Re: Baza ok 2500 tabel.
#195351
Author: M.M.
Date: Thu, 15 Jun 2017 14:22
38 lines
3115 bytes
On Thursday, June 15, 2017 at 2:37:35 PM UTC+2, Cezary Grądys wrote:
> W dniu 14.06.2017 o 16:19, Stokrotka pisze:
> > apomniał, że powinien założyć tymczasową.
> > 
> > Jest jescze nadzieja, że ty spisując ilośc tabel , nie odzieliłeś, 
> > pomieszałeś
> > tabele z indeksami i kluczami itp.
> 
> 
> Nie miałem możliwości długo się przyglądać, rzuciłem okiem z poziomu
> PgAdmina, a tam ilość tabel jest jednoznacznie podana...
> 
> No to może jeszcze takie pytanie, kiedy taka ilość tabel jest
> uzasadniona? 

Ty jesteś przy systemie, dlaczego Ty nie odpowiesz na to pytanie?
Jest kilka tak oczywistych powodów z których ilość tabel rośnie, że aż
wstyd te powody wymieniać. Ale czy urośnie w danym systemie do 300 czy
do 5tys to nie mam bladego pojęcia.

Wśród tych powodów jest optymalizacja: ktoś mógł ręcznie podzielić
tabele w pionie i w poziomie - jak ktoś się uprze, to ilość tabel
po takim zabiegu wzrośnie np. 10-50 razy. Może ciężki obliczeniowo
raport jest generowany codziennie, więc na wypadek gdyby chcieli
wrócić do raportu, wszystkie raporty są archiwizowane. Z trzech
lat działania takiego systemu już masz ponad tysiąc tabel. Potem
podsystemy w systemach zintegrowanych - na każdy pod system trzeba
np. 20-100 tabelek, 10 pod-systemów (bez żadnej denormalizacji) już
daje z 500-600 tabelek. Potem zapomniane tabele do skasowania -
chociaż tego wiele nie powinno być. 


> Są podobno tacy, co robia tabele słownikowe nazwisk, ale
> mimo wszystko jakoś trudno tyle tabel stworzyć.
> Ja skłaniam się do wniosku, że brakuje odważnego do zrobienia
> DROP TABLE...

Jeszcze raz: Ty widzisz system, a nas pytasz skąd tyle tabel.
Re: Baza ok 2500 tabel.
#195352
Author: Cezary Grądys
Date: Thu, 15 Jun 2017 18:57
15 lines
1560 bytes
W dniu 15.06.2017 o 16:22, M.M. pisze:

> Ty jesteś przy systemie, dlaczego Ty nie odpowiesz na to pytanie?
> Jest kilka tak oczywistych powodów z których ilość tabel rośnie, że aż
> wstyd te powody wymieniać. Ale czy urośnie w danym systemie do 300 czy
> do 5tys to nie mam bladego pojęcia.
> 

Nie jestem przy systemie i nie wiem czy będę. Dlatego pytam co o tym
sądzić.


-- 
Cezary Grądys
czarekgr@wa.onet.pl
Re: Baza ok 2500 tabel.
#195353
Author: irq
Date: Fri, 16 Jun 2017 12:23
16 lines
2138 bytes
W dniu czwartek, 15 czerwca 2017 20:57:21 UTC+2 użytkownik Cezary Grądys napisał:
> 
> Nie jestem przy systemie i nie wiem czy będę. Dlatego pytam co o tym
> sądzić.
> 
> 
> -- 
> Cezary Grądys
> czarekgr@wa.onet.pl

Witaj, kolego,

żeby się dowiedzieć, czy będziesz (chciał pozostać) przy systemie, musisz jednak przy nim nieco pobyć. Wtedy sam będziesz wiedział co o nim sądzić. Sprawdź czy nazwy tabel układają się w jakiś regularny schemat, czy ich struktura jest taka sama. Grupa za Ciebie nie znajdzie odpowiedzi na wszystkie pytania, ani nie podejmie decyzji.

Pozdrawiam
Irek.
Re: Baza ok 2500 tabel.
#195354
Author: Stokrotka
Date: Fri, 16 Jun 2017 16:16
14 lines
1668 bytes
>żeby się dowiedzieć, czy będziesz (chciał pozostać) przy systemie, musisz 
>jednak przy nim nieco pobyć. ...

Nie zgadzam się. Czasem od pierwszego wejżenia widać , że system sie nie 
nadaje, że do du...
Czasem nawet nie tszeba ogladać systemu, wystarczy kilka zdań opisu...
np ....szukam programisty ktury dokończy rozgżebaną robotę....


-- 
(tekst bez: ó, ch, rz i -ii)
Ortografia to NAWYK, często nielogiczny, ktury ludzie ociężali umysłowo,
nażucają bezmyślnie następnym pokoleniom. ( ortografia . pev . pl )
Re: Baza ok 2500 tabel.
#195355
Author: Cezary Grądys
Date: Fri, 16 Jun 2017 20:06
22 lines
1994 bytes
W dniu 16.06.2017 o 18:16, Stokrotka pisze:
> 

> 
> Nie zgadzam się. Czasem od pierwszego wejżenia widać , że system sie nie 
> nadaje, że do du...
> Czasem nawet nie tszeba ogladać systemu, wystarczy kilka zdań opisu...
> np ....szukam programisty ktury dokończy rozgżebaną robotę....
> 
> 

Albo przykład z którym się spotkałem dali polskie litery w loginach...
Mi z tego powodu raport nie chciał zadziałać, szefowi też, kombinowali z
uprawnieniami i w końcu doszli, że to to. No ale inteligentnie zmienili
login na taki jak adres poczty, więc zamiast 7 znaków miałem 23 znaki!
już po tym bylo widać czego się spodziewać.



-- 
Cezary Grądys
czarekgr@wa.onet.pl
Re: Baza ok 2500 tabel.
#195334
Author: Adam
Date: Mon, 19 Jun 2017 11:34
467 lines
15686 bytes
W dniu 2017-06-15 o 11:42, M.M. pisze:
> On Wednesday, June 14, 2017 at 5:58:20 PM UTC+2, Adam wrote:
>> W dniu 2017-06-14 o 13:36, Cezary Grądys pisze:
>>> W dniu 14.06.2017 o 12:07, Adam pisze:
>>>> W dniu 2017-06-14 o 04:44, Jivanmukta pisze:
>>>>>> Jakie maksymalne ilości tabel spotykacie w praktyce?
>>>>>
>>>>> Pracowałem z systemem SAP R/3 który ma 14000 tabel.
>>>>>
>>>>
>>>> IMO - SAP nie jest dobrym przykładem :(
>>>>
>>>> Dla ichniejszych ludzików z IT najmniejsza pierdółka rosła do rangi
>>>> problemu miesiąca. Spotykałem się z sytuacją, że zmiana jednego pola
>>>> była awykonalna, a na przykład zmiana adresu portu RS232 (dla
>>>> wysyłania danych do drukarki fiskalnej) trwała blisko trzy tygodnie :(
>>>>
>>>>
>>>
>>>
>>> Chyba nie jest prosto, jak baza ma 14000 tabel :)
>>
>> Ciężko ogarnąć.
>>
>> Jeśli jeszcze brakuje triggerów, to już prześledzenie transakcji może
>> być co najmniej problematyczne.
>>
>> Ja na szczęście pracuję z programami, którym wystarcza kilkaset tabel.
>> Praktycznie wszystko jest jeszcze obwarowane triggerami, więc grzebiąc w
>> bazie nie jestem w stanie (oczywiście bez wyłączenia triggera)
>> przykładowo wycofać dokumentu wydania towaru, aby tenże towar nie
>> pojawił się ponownie na stanie magazynowym.
>> Niektóre triggery sprawdzają kilkadziesiąt warunków - też nie sposób to
>> robić ręcznie - ale to już OT.
>
> Kilkaset to też dużo. Jeśli można spytać, ile było które nie zawierały
> danych nadmiarowych, jaka była średnia ilość rekordów w tabeli (licząc
> tylko te nienadmiarowe) i ile tabel miało ilość rekordów powyżej średniej -
> też licząc tylko te nienadmiarowe.
>


Poniżej wkleiłem CSV z tabelami z systemu CDN-Optima.
Baza produkcyjna z przed kilku lat.

Możesz to wkleić do jakiegoś arkusza, aby lepiej widzieć.

W zasadzie nie ma nadmiarowych tabel, dane nadmiarowe trzymane są w 
widokach.

Część tabel jest pustych, gdyż ich wypełnienie zależy m.in. od licencji 
wykupionych przez klienta (np. czy tylko Faktury, czy pełny Handel; czy 
czy Serwis; czy CRM) itp.
Zależy też od rodzaju działalności klienta - np. czy Książka Przychodów 
i Rozchodów, czy pełna Księga Handlowa.

Jeszcze dodatkowe informacje:

O ilości kolumn w tabeli nie bardzo wiem, jak zapytać.
Tabele mają od kilku pól do ponad 100.

Oprócz bazy roboczej (tu przedstawionej) jest jeszcze baza 
konfiguracyjna, wspólna dla wszystkich baz roboczych. Ma ok. 70 tabel.


Zrzut bazy roboczej:

Nr_kol;name;rows;reserved;data;index_size;unsed
1;AkordDefinicja;0;0;0;0;0
2;AkordProgres;0;0;0;0;0
3;Akordy;0;0;0;0;0
4;AkordyHist;0;0;0;0;0
5;AkordyHistWartosci;0;0;0;0;0
6;AnalizyBIParam;1;16;8;8;0
7;AutoEwid;0;0;0;0;0
8;AutoKoszty;0;0;0;0;0
9;AutoPrzejazd;0;0;0;0;0
10;AutoRozlicz;0;0;0;0;0
11;AutoTrasy;0;0;0;0;0
12;Awizo;0;0;0;0;0
13;AwizoOpakowania;0;0;0;0;0
14;AwizoTowary;0;0;0;0;0
15;AwizoTypyOpakowan;6;16;8;8;0
16;AwizoTypyTransportu;5;16;8;8;0
17;AwizoWarunkiDostawy;15;16;8;8;0
18;BnkBOMW;0;0;0;0;0
19;BnkCertyfikaty;0;0;0;0;0
20;BnkDokElem;24;48;8;40;0
21;BnkDokNag;13;96;8;88;0
22;BnkFormatyElem;461;112;24;48;40
23;BnkFormatyNag;35;32;8;24;0
24;BnkNazwy;4248;3072;1696;1104;272
25;BnkRachunki;6;128;8;120;0
26;BnkRachZakazy;0;0;0;0;0
27;BnkRaporty;3738;2264;912;1096;256
28;BnkRozKwoty;51576;44464;16504;26128;1832
29;BnkRozKwotyMW;0;0;0;0;0
30;BnkRozRelacje;103148;12168;3016;6952;2200
31;BnkZapisy;42241;45448;22152;21992;1304
32;BnkZapisyCDCSEPAInfo;0;0;0;0;0
33;BnkZdarzenia;50358;56040;24688;29784;1568
34;BnkZdarzeniaCDCSEPAInfo;0;0;0;0;0
35;BOElem;592;232;80;112;40
36;BONag;32;96;8;88;0
37;BRpAgregaty;3728;464;184;136;144
38;BudzetElem;0;0;0;0;0
39;BudzetNag;0;0;0;0;0
40;Centra;2;48;8;40;0
41;CentraKierownicy;0;0;0;0;0
42;CentraLink;2;48;8;40;0
43;CfgKlucze;1135;208;96;88;24
44;CfgWartosci;1143;176;80;48;48
45;CRMDokumenty;0;0;0;0;0
46;CRMKontakty;0;0;0;0;0
47;CrmKontaktyCykl;0;0;0;0;0
48;CrmUczestnicy;0;0;0;0;0
49;CTIWyslaneWyplaty;5;16;8;8;0
50;DaneBinarne;3;48;8;40;0
51;DaneBinarneLinki;0;0;0;0;0
52;DaneKad;57;32;16;16;0
53;DaneKadMod;32;16;8;8;0
54;DanePlac;28;16;8;8;0
55;DanePlacMod;136;64;32;32;0
56;DefAtrElem;14;32;8;24;0
57;DefAtrybuty;48;64;16;48;0
58;DefCeny;6;32;8;24;0
59;DefEtapy;0;0;0;0;0
60;DefinicjaZmian;2;32;8;24;0
61;DefinicjaZmianPola;4;48;8;40;0
62;DefinicjeStref;5;64;8;56;0
63;DefProjekty;1;48;8;40;0
64;DeklElem;30770;4560;3872;496;192
65;DeklKedu;68;32;8;24;0
66;DeklNag;446;256;104;144;8
67;DeklStr;169;1192;1112;32;48
68;DeklV27;0;0;0;0;0
69;DeklVUEK;0;0;0;0;0
70;DeklWydr;26734;4048;3336;488;224
71;DeklZaklady;0;0;0;0;0
72;DekretyElem;234058;84792;47440;36904;448
73;DekretyKonta;346390;60976;19944;40704;328
74;DekretyNag;91588;54624;23864;29856;904
75;DetalAtrybuty;0;0;0;0;0
76;DetalCeny;0;0;0;0;0
77;DetalFormyPlatnosci;0;0;0;0;0
78;DetalKntOsoby;0;0;0;0;0
79;DetalKontrahenci;0;0;0;0;0
80;DetalOperator;0;0;0;0;0
81;DetalPlatnosciDokumentu;0;0;0;0;0
82;DetalRaporty;0;0;0;0;0
83;DetalRoliczeniaZaleglosci;0;0;0;0;0
84;DetalStanFormyPlatnosci;0;0;0;0;0
85;DetalStanKonfiguracja;0;0;0;0;0
86;DetalStanKontrahenci;0;0;0;0;0
87;DetalStanOpakElem;0;0;0;0;0
88;DetalStanOpakNag;0;0;0;0;0
89;DetalStanOperatorzy;0;0;0;0;0
90;DetalStanowiska;0;0;0;0;0
91;DetalStanPlatnosciDokumentu;0;0;0;0;0
92;DetalStanStawkiVAT;0;0;0;0;0
93;DetalStanTowary;0;0;0;0;0
94;DetalStanTraElem;0;0;0;0;0
95;DetalStanTraNag;0;0;0;0;0
96;DetalStanTwrEan;0;0;0;0;0
97;DetalStanTwrJMZ;0;0;0;0;0
98;DetalStanZapisyKB;0;0;0;0;0
99;DetalStanZmiany;0;0;0;0;0
100;DetalTraElem;0;0;0;0;0
101;DetalTraNag;0;0;0;0;0
102;DetalWalKursy;0;0;0;0;0
103;DetalZakazyMagazyn;0;0;0;0;0
104;DetalZapisyKB;0;0;0;0;0
105;DlgDokumenty;0;0;0;0;0
106;DlgElem;0;0;0;0;0
107;DlgNag;0;0;0;0;0
108;DlgTrasy;0;0;0;0;0
109;DlgZaliczki;0;0;0;0;0
110;Dodatki;0;0;0;0;0
111;DodatkiHist;0;0;0;0;0
112;DodatkiUmowy;0;0;0;0;0
113;DokAtrybuty;188;280;16;160;104
114;DokDefinicje;103;88;24;64;0
115;DokNag;0;0;0;0;0
116;DokNagEtapy;0;0;0;0;0
117;DokNagEtapyHistoria;0;0;0;0;0
118;DokNagEtapyKolejne;0;0;0;0;0
119;DokNagPliki;0;0;0;0;0
120;DokNagProcesEtapy;0;0;0;0;0
121;DokPodmioty;0;0;0;0;0
122;DokRelacje;0;0;0;0;0
123;DPD;0;0;0;0;0
124;Dzialy;5;80;8;72;0
125;DzialZakazy;0;0;0;0;0
126;Dzienniki;48;32;8;24;0
127;DziennikZakazy;0;0;0;0;0
128;eSklepFormyPlatnosci;0;0;0;0;0
129;eSklepKntRelacje;0;0;0;0;0
130;eSklepMagazyny;0;0;0;0;0
131;eSklepROCechy;0;0;0;0;0
132;eSklepStanowiska;0;0;0;0;0
133;eSklepWaluty;0;0;0;0;0
134;EwidDodElem;0;0;0;0;0
135;EwidDodNag;0;0;0;0;0
136;FaCyklElem;0;0;0;0;0
137;FaCyklKnt;0;0;0;0;0
138;FaCyklNag;0;0;0;0;0
139;FaCyklTwrKnt;0;0;0;0;0
140;Firma;1113;176;120;48;8
141;FormatyRcp;0;0;0;0;0
142;FormyPlatnosci;11;64;8;56;0
143;FormyPlatnosciDF;37;32;8;24;0
144;FormyPlatnWaluty;2;48;8;40;0
145;FrsPromocje;0;0;0;0;0
146;Grupy;61;32;8;24;0
147;GrupyKontElem;0;0;0;0;0
148;GrupyKontNag;0;0;0;0;0
149;GrupyPotracen;2;48;8;40;0
150;GrupyPotrSkladniki;0;0;0;0;0
151;Harmonogram;0;0;0;0;0
152;HarmonogramLista;0;0;0;0;0
153;HisWyksztal;16;32;8;24;0
154;HisZatrud;45;64;16;48;0
155;Idn;0;0;0;0;0
156;IGaleriaAtrWartosci;0;0;0;0;0
157;IGaleriaAtrybuty;0;0;0;0;0
158;IGaleriaDefAtrWartosci;0;0;0;0;0
159;IGaleriaKategorie;0;0;0;0;0
160;IntrastatElem;0;0;0;0;0
161;IntrastatNag;0;0;0;0;0
162;Kalendarze;1;32;8;24;0
163;KalendDni;16;32;8;24;0
164;KalendDniGodz;18;48;8;40;0
165;KartyKredytowe;8;32;8;24;0
166;KasaChor;16;16;8;8;0
167;Katalogi;1;32;8;24;0
168;KatalogZakazy;0;0;0;0;0
169;Kategorie;83;104;24;80;0
170;KntAtrybuty;19;64;8;56;0
171;KntESklepy;0;0;0;0;0
172;KntGrupy;0;0;0;0;0
173;KntLinki;0;0;0;0;0
174;KntOdbiorcy;1;48;8;40;0
175;KntOsoby;321;96;32;32;32
176;KntPromocje;0;0;0;0;0
177;KntScalHist;0;0;0;0;0
178;KodyCN;1;32;8;24;0
179;KompensatyElem;0;0;0;0;0
180;KompensatyNag;0;0;0;0;0
181;KonfigText;0;0;0;0;0
182;Konta;9147;5152;1640;2960;552
183;KontaZakazy;0;0;0;0;0
184;Kontrahenci;1378;2576;1072;1288;216
185;KorektaPodatkuDochodowego;0;0;0;0;0
186;KragKosztElem;0;0;0;0;0
187;KragKosztNag;0;0;0;0;0
188;KRD;0;0;0;0;0
189;KsiDokElem;0;0;0;0;0
190;KsiDokNag;0;0;0;0;0
191;KsiRozrachunki;11427;16304;3872;11416;1016
192;KwotyCelne;3;32;8;24;0
193;KwotyDodatkowe;0;0;0;0;0
194;LimitNieobec;5;48;8;40;0
195;ListyPlac;332;296;96;176;24
196;Lokalizacje;1;48;8;40;0
197;Magazyny;2;32;8;24;0
198;MagazynZakazy;0;0;0;0;0
199;Marki;0;0;0;0;0
200;MarkiJezykObcy;0;0;0;0;0
201;Miasta;0;0;0;0;0
202;MiejscaUzytkowania;0;0;0;0;0
203;NotyOdsElem;0;0;0;0;0
204;NotyOdsNag;0;0;0;0;0
205;OAtrybuty;0;0;0;0;0
206;OAtrybutyGrupy;0;0;0;0;0
207;OAtrybutyGrupyLinki;0;0;0;0;0
208;OAtrybutyHist;0;0;0;0;0
209;OAtrybutyKlasy;0;0;0;0;0
210;OAtrybutyKlasyElem;0;0;0;0;0
211;Obroty;21592;5144;2336;1712;1096
212;OfertyDok;0;0;0;0;0
213;OfertyElem;0;0;0;0;0
214;OfertyElemCeny;0;0;0;0;0
215;OfertyKnt;0;0;0;0;0
216;OkresoweElem;6;48;8;40;0
217;OkresoweHarmonogram;0;0;0;0;0
218;OkresoweNag;2;64;8;56;0
219;OkresyObrach;6;48;8;40;0
220;OpisKadry;0;0;0;0;0
221;OpisPlace;0;0;0;0;0
222;Parametry;0;0;0;0;0
223;PKZP;0;0;0;0;0
224;PlikiJPK;0;0;0;0;0
225;PltPromocje;0;0;0;0;0
226;PodArkuszInwenElem;0;0;0;0;0
227;PodArkuszInwenNag;0;0;0;0;0
228;PodmiotyView;6137;3496;2720;696;80
229;PodtypWyplata;0;0;0;0;0
230;Poreczyciele;0;0;0;0;0
231;PozDeklPIT;73;32;16;16;0
232;PozDeklZUS;53;32;16;16;0
233;PracaSzczeg;66;40;24;16;0
234;PracEtaty;35;312;56;256;0
235;Pracidx;40;96;8;88;0
236;PracKartyRcp;0;0;0;0;0
237;PracKod;20;48;8;40;0
238;PracLimit;37;80;16;64;0
239;PracNieobec;518;208;80;80;48
240;PracPitKwoty;180;32;8;24;0
241;PracPitMies;77;32;8;24;0
242;PracPlanDni;0;0;0;0;0
243;PracPlanDniGodz;0;0;0;0;0
244;PracPracaDni;0;0;0;0;0
245;PracPracaDniGodz;0;0;0;0;0
246;PracSchorzenia;0;0;0;0;0
247;PracZestaw;0;0;0;0;0
248;PracZestawElem;0;0;0;0;0
249;PrmHistoria;0;0;0;0;0
250;PrmKarty;0;0;0;0;0
251;ProdElem;0;0;0;0;0
252;ProdReceptury;0;0;0;0;0
253;ProdSkladniki;0;0;0;0;0
254;Producenci;0;0;0;0;0
255;ProducenciJezykObcy;0;0;0;0;0
256;Progi;0;0;0;0;0
257;PrzeszacWalutElem;0;0;0;0;0
258;PrzeszacWalutNag;0;0;0;0;0
259;PrzWyrej;75;40;24;16;0
260;Rabaty;940;160;48;96;16
261;RegulyRcp;12;16;8;8;0
262;RemanentElem;0;0;0;0;0
263;RemanentNag;0;0;0;0;0
264;Rodzina;1;32;8;24;0
265;RptKolejka2;0;0;0;0;0
266;RptObrazy2;0;0;0;0;0
267;RptTemp2;0;16;8;8;0
268;RptZaznaczenia2;0;0;0;0;0
269;Ryczalt;0;0;0;0;0
270;SchematPlatnosci;216;128;32;96;0
271;SchematWindykacjiEtapy;3;16;8;8;0
272;SchematyOpakElem;0;0;0;0;0
273;SchematyOpakNag;0;0;0;0;0
274;SchematyWindykacji;1;32;8;24;0
275;SchKsiElem;245;96;56;32;8
276;SchKsiNag;47;48;16;32;0
277;SchKsiRelac;2;48;8;40;0
278;SenditAdresyNadawcze;2;16;8;8;0
279;SenditPaczki;17;16;8;8;0
280;SenditTypyPaczek;1;16;8;8;0
281;SenditZleceniePrzesylki;12;48;16;32;0
282;SerieKalNag;1;48;8;40;0
283;SerieKalPoz;7;32;8;24;0
284;SerieKalPozGodz;7;48;8;40;0
285;SrsCyklElem;0;0;0;0;0
286;SrsCyklNag;0;0;0;0;0
287;SrsCzesci;0;0;0;0;0
288;SrsCzynnosci;0;0;0;0;0
289;SrsNotatki;0;0;0;0;0
290;SrsRodzajeU;0;0;0;0;0
291;SrsUrzadzenia;0;0;0;0;0
292;SrsZlecenia;0;0;0;0;0
293;StatElem;0;0;0;0;0
294;StatNag;0;0;0;0;0
295;SystemCDN;9;16;8;8;0
296;SzDekElem;0;0;0;0;0
297;SzDekNag;0;0;0;0;0
298;Towary;13358;19032;9360;8104;1568
299;TraElem;1058563;896464;687976;207744;744
300;TraElemAtr;188994;15000;6992;6168;1840
301;TraElemKorZbiorcza;0;0;0;0;0
302;TraElemKwotyCelne;0;0;0;0;0
303;TraElemRelacje;6382;736;288;336;112
304;TraFakZaliczkowe;0;0;0;0;0
305;TraNag;98970;160624;97688;61408;1528
306;TraNagRelacje;96284;6944;2584;4264;96
307;TraSElem;542991;101560;43024;58232;304
308;TraSElemCechy;0;0;0;0;0
309;TraSElemDost;0;0;0;0;0
310;TraVat;149870;12368;10520;1688;160
311;TrSBlad;0;0;0;0;0
312;TrSBladOper;0;0;0;0;0
313;Trwale;46;176;16;160;0
314;TrwaleAIElem;0;0;0;0;0
315;TrwaleAINag;0;0;0;0;0
316;TrwaleAtrybuty;0;0;0;0;0
317;TrwaleCzesci;0;0;0;0;0
318;TrwaleHist;577;424;152;232;40
319;TrwaleHistPowiazania;2;32;8;24;0
320;TrwaleMaska;0;0;0;0;0
321;TrwaleMiejscaUzytkowania;0;0;0;0;0
322;TrwaleOsobyOdpowiedzialne;2;32;8;24;0
323;TrwalePowiazania;3;32;8;24;0
324;TrwaleZawieszeniaAmo;0;0;0;0;0
325;TwrAtrybuty;3465;600;232;344;24
326;TwrCeny;54842;7864;4672;2936;256
327;TwrDost;0;0;0;0;0
328;TwrEan;13372;1560;624;800;136
329;TwrESklep;0;0;0;0;0
330;TwrGrupy;17500;7856;2464;5032;360
331;TwrGrupyAtrybuty;0;0;0;0;0
332;TwrGrupyJezykObcy;0;0;0;0;0
333;TwrIlosci;820937;136200;61384;74624;192
334;TwrJezykObcy;0;0;0;0;0
335;TwrJm;0;0;0;0;0
336;TwrJMZ;5744;600;312;192;96
337;TwrKntAtrybuty;1;48;8;40;0
338;TwrLinki;39547;1768;1680;16;72
339;TwrPromocje;0;0;0;0;0
340;TwrPrzeceny;136902;19272;6104;9200;3968
341;TwrTSModEsklep;0;0;0;0;0
342;TwrZasoby;4671;808;328;368;112
343;TypNieobec;56;112;8;104;0
344;TypNieobecKartaPracy;20;16;8;8;0
345;TypWyplata;262;288;136;96;56
346;TypWyplataGrupa;0;0;0;0;0
347;TypWyplataGrupaSkladniki;0;0;0;0;0
348;TypWyplataStaz;0;0;0;0;0
349;TytUbezp;210;136;72;16;48
350;TytUmowy;0;0;0;0;0
351;Umowy;0;0;0;0;0
352;UmowyZestCzasu;0;0;0;0;0
353;Uprawnienia;1;48;8;40;0
354;Urzedy;491;352;168;160;24
355;UrzRachunki;1732;416;136;224;56
356;VatNag;37288;45272;27736;15912;1624
357;VatTab;60525;12184;9920;2008;256
358;VatTab7;56580;5400;3344;1696;360
359;VatZD;0;0;0;0;0
360;WdrKopieElektroniczne;2;296;208;88;0
361;WindykacjaLog;0;0;0;0;0
362;WkrZaznaczenia2;0;0;0;0;0
363;WypElementy;1947;1096;896;200;0
364;WypElementyPodstawa;270;96;48;48;0
365;WypElementyPodstawaElem;814;240;136;48;56
366;Wyplaty;1483;776;360;352;64
367;WyplatyElem;0;0;0;0;0
368;WyplatyNag;0;0;0;0;0
369;Wyposazenie;1;144;8;136;0
370;WyposazenieAIElem;0;0;0;0;0
371;WyposazenieAINag;0;0;0;0;0
372;WyposazenieMiejscaUzytkowania;0;0;0;0;0
373;WyposazenieOsobyOdpowiedzialne;0;0;0;0;0
374;WyposazeniePowiazania;0;0;0;0;0
375;WypSkladniki;2209;1064;664;360;40
376;Wzorce;0;0;0;0;0
377;WzorWartosci;0;0;0;0;0
378;ZajeciaWynagr;0;0;0;0;0
379;Zaklady;0;0;0;0;0
380;Zaliczki;0;0;0;0;0
381;Zamienniki;0;0;0;0;0
382;Zaniechania;0;0;0;0;0
383;ZaniechaniaRoz;0;0;0;0;0
384;ZapisyKPR;0;0;0;0;0
385;ZestawyRegul;2;48;8;40;0
386;ZestawyRegulElem;12;48;8;40;0
387;ZestawyTwr;0;0;0;0;0
388;ZestawyTwrSkladniki;0;0;0;0;0
389;ZestKsiKol;20;32;8;24;0
390;ZestKsiNag;15;48;8;40;0
391;ZestKsiPoz;592;192;88;64;40
392;ZestKsiWyniki;36;64;8;56;0
393;ZstPromocje;0;0;0;0;0


-- 
Pozdrawiam.

Adam
Re: Baza ok 2500 tabel.
#195335
Author: Stokrotka
Date: Mon, 19 Jun 2017 15:03
405 lines
14193 bytes
>
> Zrzut bazy roboczej:
>
> Nr_kol;name;rows;reserved;data;index_size;unsed
> 1;AkordDefinicja;0;0;0;0;0
> 2;AkordProgres;0;0;0;0;0
> 3;Akordy;0;0;0;0;0
> 4;AkordyHist;0;0;0;0;0
> 5;AkordyHistWartosci;0;0;0;0;0
> 6;AnalizyBIParam;1;16;8;8;0
> 7;AutoEwid;0;0;0;0;0
> 8;AutoKoszty;0;0;0;0;0
> 9;AutoPrzejazd;0;0;0;0;0
> 10;AutoRozlicz;0;0;0;0;0
> 11;AutoTrasy;0;0;0;0;0
> 12;Awizo;0;0;0;0;0
> 13;AwizoOpakowania;0;0;0;0;0
> 14;AwizoTowary;0;0;0;0;0
> 15;AwizoTypyOpakowan;6;16;8;8;0
> 16;AwizoTypyTransportu;5;16;8;8;0
> 17;AwizoWarunkiDostawy;15;16;8;8;0
> 18;BnkBOMW;0;0;0;0;0
> 19;BnkCertyfikaty;0;0;0;0;0
> 20;BnkDokElem;24;48;8;40;0
> 21;BnkDokNag;13;96;8;88;0
> 22;BnkFormatyElem;461;112;24;48;40
> 23;BnkFormatyNag;35;32;8;24;0
> 24;BnkNazwy;4248;3072;1696;1104;272
> 25;BnkRachunki;6;128;8;120;0
> 26;BnkRachZakazy;0;0;0;0;0
> 27;BnkRaporty;3738;2264;912;1096;256
> 28;BnkRozKwoty;51576;44464;16504;26128;1832
> 29;BnkRozKwotyMW;0;0;0;0;0
> 30;BnkRozRelacje;103148;12168;3016;6952;2200
> 31;BnkZapisy;42241;45448;22152;21992;1304
> 32;BnkZapisyCDCSEPAInfo;0;0;0;0;0
> 33;BnkZdarzenia;50358;56040;24688;29784;1568
> 34;BnkZdarzeniaCDCSEPAInfo;0;0;0;0;0
> 35;BOElem;592;232;80;112;40
> 36;BONag;32;96;8;88;0
> 37;BRpAgregaty;3728;464;184;136;144
> 38;BudzetElem;0;0;0;0;0
> 39;BudzetNag;0;0;0;0;0
> 40;Centra;2;48;8;40;0
> 41;CentraKierownicy;0;0;0;0;0
> 42;CentraLink;2;48;8;40;0
> 43;CfgKlucze;1135;208;96;88;24
> 44;CfgWartosci;1143;176;80;48;48
> 45;CRMDokumenty;0;0;0;0;0
> 46;CRMKontakty;0;0;0;0;0
> 47;CrmKontaktyCykl;0;0;0;0;0
> 48;CrmUczestnicy;0;0;0;0;0
> 49;CTIWyslaneWyplaty;5;16;8;8;0
> 50;DaneBinarne;3;48;8;40;0
> 51;DaneBinarneLinki;0;0;0;0;0
> 52;DaneKad;57;32;16;16;0
> 53;DaneKadMod;32;16;8;8;0
> 54;DanePlac;28;16;8;8;0
> 55;DanePlacMod;136;64;32;32;0
> 56;DefAtrElem;14;32;8;24;0
> 57;DefAtrybuty;48;64;16;48;0
> 58;DefCeny;6;32;8;24;0
> 59;DefEtapy;0;0;0;0;0
> 60;DefinicjaZmian;2;32;8;24;0
> 61;DefinicjaZmianPola;4;48;8;40;0
> 62;DefinicjeStref;5;64;8;56;0
> 63;DefProjekty;1;48;8;40;0
> 64;DeklElem;30770;4560;3872;496;192
> 65;DeklKedu;68;32;8;24;0
> 66;DeklNag;446;256;104;144;8
> 67;DeklStr;169;1192;1112;32;48
> 68;DeklV27;0;0;0;0;0
> 69;DeklVUEK;0;0;0;0;0
> 70;DeklWydr;26734;4048;3336;488;224
> 71;DeklZaklady;0;0;0;0;0
> 72;DekretyElem;234058;84792;47440;36904;448
> 73;DekretyKonta;346390;60976;19944;40704;328
> 74;DekretyNag;91588;54624;23864;29856;904
> 75;DetalAtrybuty;0;0;0;0;0
> 76;DetalCeny;0;0;0;0;0
> 77;DetalFormyPlatnosci;0;0;0;0;0
> 78;DetalKntOsoby;0;0;0;0;0
> 79;DetalKontrahenci;0;0;0;0;0
> 80;DetalOperator;0;0;0;0;0
> 81;DetalPlatnosciDokumentu;0;0;0;0;0
> 82;DetalRaporty;0;0;0;0;0
> 83;DetalRoliczeniaZaleglosci;0;0;0;0;0
> 84;DetalStanFormyPlatnosci;0;0;0;0;0
> 85;DetalStanKonfiguracja;0;0;0;0;0
> 86;DetalStanKontrahenci;0;0;0;0;0
> 87;DetalStanOpakElem;0;0;0;0;0
> 88;DetalStanOpakNag;0;0;0;0;0
> 89;DetalStanOperatorzy;0;0;0;0;0
> 90;DetalStanowiska;0;0;0;0;0
> 91;DetalStanPlatnosciDokumentu;0;0;0;0;0
> 92;DetalStanStawkiVAT;0;0;0;0;0
> 93;DetalStanTowary;0;0;0;0;0
> 94;DetalStanTraElem;0;0;0;0;0
> 95;DetalStanTraNag;0;0;0;0;0
> 96;DetalStanTwrEan;0;0;0;0;0
> 97;DetalStanTwrJMZ;0;0;0;0;0
> 98;DetalStanZapisyKB;0;0;0;0;0
> 99;DetalStanZmiany;0;0;0;0;0
> 100;DetalTraElem;0;0;0;0;0
> 101;DetalTraNag;0;0;0;0;0
> 102;DetalWalKursy;0;0;0;0;0
> 103;DetalZakazyMagazyn;0;0;0;0;0
> 104;DetalZapisyKB;0;0;0;0;0
> 105;DlgDokumenty;0;0;0;0;0
> 106;DlgElem;0;0;0;0;0
> 107;DlgNag;0;0;0;0;0
> 108;DlgTrasy;0;0;0;0;0
> 109;DlgZaliczki;0;0;0;0;0
> 110;Dodatki;0;0;0;0;0
> 111;DodatkiHist;0;0;0;0;0
> 112;DodatkiUmowy;0;0;0;0;0
> 113;DokAtrybuty;188;280;16;160;104
> 114;DokDefinicje;103;88;24;64;0
> 115;DokNag;0;0;0;0;0
> 116;DokNagEtapy;0;0;0;0;0
> 117;DokNagEtapyHistoria;0;0;0;0;0
> 118;DokNagEtapyKolejne;0;0;0;0;0
> 119;DokNagPliki;0;0;0;0;0
> 120;DokNagProcesEtapy;0;0;0;0;0
> 121;DokPodmioty;0;0;0;0;0
> 122;DokRelacje;0;0;0;0;0
> 123;DPD;0;0;0;0;0
> 124;Dzialy;5;80;8;72;0
> 125;DzialZakazy;0;0;0;0;0
> 126;Dzienniki;48;32;8;24;0
> 127;DziennikZakazy;0;0;0;0;0
> 128;eSklepFormyPlatnosci;0;0;0;0;0
> 129;eSklepKntRelacje;0;0;0;0;0
> 130;eSklepMagazyny;0;0;0;0;0
> 131;eSklepROCechy;0;0;0;0;0
> 132;eSklepStanowiska;0;0;0;0;0
> 133;eSklepWaluty;0;0;0;0;0
> 134;EwidDodElem;0;0;0;0;0
> 135;EwidDodNag;0;0;0;0;0
> 136;FaCyklElem;0;0;0;0;0
> 137;FaCyklKnt;0;0;0;0;0
> 138;FaCyklNag;0;0;0;0;0
> 139;FaCyklTwrKnt;0;0;0;0;0
> 140;Firma;1113;176;120;48;8
> 141;FormatyRcp;0;0;0;0;0
> 142;FormyPlatnosci;11;64;8;56;0
> 143;FormyPlatnosciDF;37;32;8;24;0
> 144;FormyPlatnWaluty;2;48;8;40;0
> 145;FrsPromocje;0;0;0;0;0
> 146;Grupy;61;32;8;24;0
> 147;GrupyKontElem;0;0;0;0;0
> 148;GrupyKontNag;0;0;0;0;0
> 149;GrupyPotracen;2;48;8;40;0
> 150;GrupyPotrSkladniki;0;0;0;0;0
> 151;Harmonogram;0;0;0;0;0
> 152;HarmonogramLista;0;0;0;0;0
> 153;HisWyksztal;16;32;8;24;0
> 154;HisZatrud;45;64;16;48;0
> 155;Idn;0;0;0;0;0
> 156;IGaleriaAtrWartosci;0;0;0;0;0
> 157;IGaleriaAtrybuty;0;0;0;0;0
> 158;IGaleriaDefAtrWartosci;0;0;0;0;0
> 159;IGaleriaKategorie;0;0;0;0;0
> 160;IntrastatElem;0;0;0;0;0
> 161;IntrastatNag;0;0;0;0;0
> 162;Kalendarze;1;32;8;24;0
> 163;KalendDni;16;32;8;24;0
> 164;KalendDniGodz;18;48;8;40;0
> 165;KartyKredytowe;8;32;8;24;0
> 166;KasaChor;16;16;8;8;0
> 167;Katalogi;1;32;8;24;0
> 168;KatalogZakazy;0;0;0;0;0
> 169;Kategorie;83;104;24;80;0
> 170;KntAtrybuty;19;64;8;56;0
> 171;KntESklepy;0;0;0;0;0
> 172;KntGrupy;0;0;0;0;0
> 173;KntLinki;0;0;0;0;0
> 174;KntOdbiorcy;1;48;8;40;0
> 175;KntOsoby;321;96;32;32;32
> 176;KntPromocje;0;0;0;0;0
> 177;KntScalHist;0;0;0;0;0
> 178;KodyCN;1;32;8;24;0
> 179;KompensatyElem;0;0;0;0;0
> 180;KompensatyNag;0;0;0;0;0
> 181;KonfigText;0;0;0;0;0
> 182;Konta;9147;5152;1640;2960;552
> 183;KontaZakazy;0;0;0;0;0
> 184;Kontrahenci;1378;2576;1072;1288;216
> 185;KorektaPodatkuDochodowego;0;0;0;0;0
> 186;KragKosztElem;0;0;0;0;0
> 187;KragKosztNag;0;0;0;0;0
> 188;KRD;0;0;0;0;0
> 189;KsiDokElem;0;0;0;0;0
> 190;KsiDokNag;0;0;0;0;0
> 191;KsiRozrachunki;11427;16304;3872;11416;1016
> 192;KwotyCelne;3;32;8;24;0
> 193;KwotyDodatkowe;0;0;0;0;0
> 194;LimitNieobec;5;48;8;40;0
> 195;ListyPlac;332;296;96;176;24
> 196;Lokalizacje;1;48;8;40;0
> 197;Magazyny;2;32;8;24;0
> 198;MagazynZakazy;0;0;0;0;0
> 199;Marki;0;0;0;0;0
> 200;MarkiJezykObcy;0;0;0;0;0
> 201;Miasta;0;0;0;0;0
> 202;MiejscaUzytkowania;0;0;0;0;0
> 203;NotyOdsElem;0;0;0;0;0
> 204;NotyOdsNag;0;0;0;0;0
> 205;OAtrybuty;0;0;0;0;0
> 206;OAtrybutyGrupy;0;0;0;0;0
> 207;OAtrybutyGrupyLinki;0;0;0;0;0
> 208;OAtrybutyHist;0;0;0;0;0
> 209;OAtrybutyKlasy;0;0;0;0;0
> 210;OAtrybutyKlasyElem;0;0;0;0;0
> 211;Obroty;21592;5144;2336;1712;1096
> 212;OfertyDok;0;0;0;0;0
> 213;OfertyElem;0;0;0;0;0
> 214;OfertyElemCeny;0;0;0;0;0
> 215;OfertyKnt;0;0;0;0;0
> 216;OkresoweElem;6;48;8;40;0
> 217;OkresoweHarmonogram;0;0;0;0;0
> 218;OkresoweNag;2;64;8;56;0
> 219;OkresyObrach;6;48;8;40;0
> 220;OpisKadry;0;0;0;0;0
> 221;OpisPlace;0;0;0;0;0
> 222;Parametry;0;0;0;0;0
> 223;PKZP;0;0;0;0;0
> 224;PlikiJPK;0;0;0;0;0
> 225;PltPromocje;0;0;0;0;0
> 226;PodArkuszInwenElem;0;0;0;0;0
> 227;PodArkuszInwenNag;0;0;0;0;0
> 228;PodmiotyView;6137;3496;2720;696;80
> 229;PodtypWyplata;0;0;0;0;0
> 230;Poreczyciele;0;0;0;0;0
> 231;PozDeklPIT;73;32;16;16;0
> 232;PozDeklZUS;53;32;16;16;0
> 233;PracaSzczeg;66;40;24;16;0
> 234;PracEtaty;35;312;56;256;0
> 235;Pracidx;40;96;8;88;0
> 236;PracKartyRcp;0;0;0;0;0
> 237;PracKod;20;48;8;40;0
> 238;PracLimit;37;80;16;64;0
> 239;PracNieobec;518;208;80;80;48
> 240;PracPitKwoty;180;32;8;24;0
> 241;PracPitMies;77;32;8;24;0
> 242;PracPlanDni;0;0;0;0;0
> 243;PracPlanDniGodz;0;0;0;0;0
> 244;PracPracaDni;0;0;0;0;0
> 245;PracPracaDniGodz;0;0;0;0;0
> 246;PracSchorzenia;0;0;0;0;0
> 247;PracZestaw;0;0;0;0;0
> 248;PracZestawElem;0;0;0;0;0
> 249;PrmHistoria;0;0;0;0;0
> 250;PrmKarty;0;0;0;0;0
> 251;ProdElem;0;0;0;0;0
> 252;ProdReceptury;0;0;0;0;0
> 253;ProdSkladniki;0;0;0;0;0
> 254;Producenci;0;0;0;0;0
> 255;ProducenciJezykObcy;0;0;0;0;0
> 256;Progi;0;0;0;0;0
> 257;PrzeszacWalutElem;0;0;0;0;0
> 258;PrzeszacWalutNag;0;0;0;0;0
> 259;PrzWyrej;75;40;24;16;0
> 260;Rabaty;940;160;48;96;16
> 261;RegulyRcp;12;16;8;8;0
> 262;RemanentElem;0;0;0;0;0
> 263;RemanentNag;0;0;0;0;0
> 264;Rodzina;1;32;8;24;0
> 265;RptKolejka2;0;0;0;0;0
> 266;RptObrazy2;0;0;0;0;0
> 267;RptTemp2;0;16;8;8;0
> 268;RptZaznaczenia2;0;0;0;0;0
> 269;Ryczalt;0;0;0;0;0
> 270;SchematPlatnosci;216;128;32;96;0
> 271;SchematWindykacjiEtapy;3;16;8;8;0
> 272;SchematyOpakElem;0;0;0;0;0
> 273;SchematyOpakNag;0;0;0;0;0
> 274;SchematyWindykacji;1;32;8;24;0
> 275;SchKsiElem;245;96;56;32;8
> 276;SchKsiNag;47;48;16;32;0
> 277;SchKsiRelac;2;48;8;40;0
> 278;SenditAdresyNadawcze;2;16;8;8;0
> 279;SenditPaczki;17;16;8;8;0
> 280;SenditTypyPaczek;1;16;8;8;0
> 281;SenditZleceniePrzesylki;12;48;16;32;0
> 282;SerieKalNag;1;48;8;40;0
> 283;SerieKalPoz;7;32;8;24;0
> 284;SerieKalPozGodz;7;48;8;40;0
> 285;SrsCyklElem;0;0;0;0;0
> 286;SrsCyklNag;0;0;0;0;0
> 287;SrsCzesci;0;0;0;0;0
> 288;SrsCzynnosci;0;0;0;0;0
> 289;SrsNotatki;0;0;0;0;0
> 290;SrsRodzajeU;0;0;0;0;0
> 291;SrsUrzadzenia;0;0;0;0;0
> 292;SrsZlecenia;0;0;0;0;0
> 293;StatElem;0;0;0;0;0
> 294;StatNag;0;0;0;0;0
> 295;SystemCDN;9;16;8;8;0
> 296;SzDekElem;0;0;0;0;0
> 297;SzDekNag;0;0;0;0;0
> 298;Towary;13358;19032;9360;8104;1568
> 299;TraElem;1058563;896464;687976;207744;744
> 300;TraElemAtr;188994;15000;6992;6168;1840
> 301;TraElemKorZbiorcza;0;0;0;0;0
> 302;TraElemKwotyCelne;0;0;0;0;0
> 303;TraElemRelacje;6382;736;288;336;112
> 304;TraFakZaliczkowe;0;0;0;0;0
> 305;TraNag;98970;160624;97688;61408;1528
> 306;TraNagRelacje;96284;6944;2584;4264;96
> 307;TraSElem;542991;101560;43024;58232;304
> 308;TraSElemCechy;0;0;0;0;0
> 309;TraSElemDost;0;0;0;0;0
> 310;TraVat;149870;12368;10520;1688;160
> 311;TrSBlad;0;0;0;0;0
> 312;TrSBladOper;0;0;0;0;0
> 313;Trwale;46;176;16;160;0
> 314;TrwaleAIElem;0;0;0;0;0
> 315;TrwaleAINag;0;0;0;0;0
> 316;TrwaleAtrybuty;0;0;0;0;0
> 317;TrwaleCzesci;0;0;0;0;0
> 318;TrwaleHist;577;424;152;232;40
> 319;TrwaleHistPowiazania;2;32;8;24;0
> 320;TrwaleMaska;0;0;0;0;0
> 321;TrwaleMiejscaUzytkowania;0;0;0;0;0
> 322;TrwaleOsobyOdpowiedzialne;2;32;8;24;0
> 323;TrwalePowiazania;3;32;8;24;0
> 324;TrwaleZawieszeniaAmo;0;0;0;0;0
> 325;TwrAtrybuty;3465;600;232;344;24
> 326;TwrCeny;54842;7864;4672;2936;256
> 327;TwrDost;0;0;0;0;0
> 328;TwrEan;13372;1560;624;800;136
> 329;TwrESklep;0;0;0;0;0
> 330;TwrGrupy;17500;7856;2464;5032;360
> 331;TwrGrupyAtrybuty;0;0;0;0;0
> 332;TwrGrupyJezykObcy;0;0;0;0;0
> 333;TwrIlosci;820937;136200;61384;74624;192
> 334;TwrJezykObcy;0;0;0;0;0
> 335;TwrJm;0;0;0;0;0
> 336;TwrJMZ;5744;600;312;192;96
> 337;TwrKntAtrybuty;1;48;8;40;0
> 338;TwrLinki;39547;1768;1680;16;72
> 339;TwrPromocje;0;0;0;0;0
> 340;TwrPrzeceny;136902;19272;6104;9200;3968
> 341;TwrTSModEsklep;0;0;0;0;0
> 342;TwrZasoby;4671;808;328;368;112
> 343;TypNieobec;56;112;8;104;0
> 344;TypNieobecKartaPracy;20;16;8;8;0
> 345;TypWyplata;262;288;136;96;56
> 346;TypWyplataGrupa;0;0;0;0;0
> 347;TypWyplataGrupaSkladniki;0;0;0;0;0
> 348;TypWyplataStaz;0;0;0;0;0
> 349;TytUbezp;210;136;72;16;48
> 350;TytUmowy;0;0;0;0;0
> 351;Umowy;0;0;0;0;0
> 352;UmowyZestCzasu;0;0;0;0;0
> 353;Uprawnienia;1;48;8;40;0
> 354;Urzedy;491;352;168;160;24
> 355;UrzRachunki;1732;416;136;224;56
> 356;VatNag;37288;45272;27736;15912;1624
> 357;VatTab;60525;12184;9920;2008;256
> 358;VatTab7;56580;5400;3344;1696;360
> 359;VatZD;0;0;0;0;0
> 360;WdrKopieElektroniczne;2;296;208;88;0
> 361;WindykacjaLog;0;0;0;0;0
> 362;WkrZaznaczenia2;0;0;0;0;0
> 363;WypElementy;1947;1096;896;200;0
> 364;WypElementyPodstawa;270;96;48;48;0
> 365;WypElementyPodstawaElem;814;240;136;48;56
> 366;Wyplaty;1483;776;360;352;64
> 367;WyplatyElem;0;0;0;0;0
> 368;WyplatyNag;0;0;0;0;0
> 369;Wyposazenie;1;144;8;136;0
> 370;WyposazenieAIElem;0;0;0;0;0
> 371;WyposazenieAINag;0;0;0;0;0
> 372;WyposazenieMiejscaUzytkowania;0;0;0;0;0
> 373;WyposazenieOsobyOdpowiedzialne;0;0;0;0;0
> 374;WyposazeniePowiazania;0;0;0;0;0
> 375;WypSkladniki;2209;1064;664;360;40
> 376;Wzorce;0;0;0;0;0
> 377;WzorWartosci;0;0;0;0;0
> 378;ZajeciaWynagr;0;0;0;0;0
> 379;Zaklady;0;0;0;0;0
> 380;Zaliczki;0;0;0;0;0
> 381;Zamienniki;0;0;0;0;0
> 382;Zaniechania;0;0;0;0;0
> 383;ZaniechaniaRoz;0;0;0;0;0
> 384;ZapisyKPR;0;0;0;0;0
> 385;ZestawyRegul;2;48;8;40;0
> 386;ZestawyRegulElem;12;48;8;40;0
> 387;ZestawyTwr;0;0;0;0;0
> 388;ZestawyTwrSkladniki;0;0;0;0;0
> 389;ZestKsiKol;20;32;8;24;0
> 390;ZestKsiNag;15;48;8;40;0
> 391;ZestKsiPoz;592;192;88;64;40
> 392;ZestKsiWyniki;36;64;8;56;0
> 393;ZstPromocje;0;0;0;0;0
>
Jak widać na początku ktoś nad tym panował,
a potem się coś rozjechało.

-- 
(tekst bez: ó, ch, rz i -ii)
Ortografia to NAWYK, często nielogiczny, ktury ludzie ociężali umysłowo,
nażucają bezmyślnie następnym pokoleniom. ( ortografia . pev . pl ) 
Re: Baza ok 2500 tabel.
#195336
Author: Adam
Date: Mon, 19 Jun 2017 17:55
54 lines
2924 bytes
W dniu 2017-06-19 o 17:03, Stokrotka pisze:
>>
>> Zrzut bazy roboczej:
>>
>> Nr_kol;name;rows;reserved;data;index_size;unsed
>> 1;AkordDefinicja;0;0;0;0;0
>> 2;AkordProgres;0;0;0;0;0
>> 3;Akordy;0;0;0;0;0
>> 4;AkordyHist;0;0;0;0;0
>> 5;AkordyHistWartosci;0;0;0;0;0
>> (...)
>>
> Jak widać na początku ktoś nad tym panował,
> a potem się coś rozjechało.
>

A w którym miejscu widzisz rozjazd?
Funkcjonalnie jest raczej OK.

Faktem jest, że program cały czas rośnie. Co jakiś czas dochodzi nowa 
funkcjonalność.
W dużym skrócie program rósł:

- Kasa/Bank i KP
- Faktury i Magazyn
- KH
- PiK
- CRM
- Serwis

Poza tym były swego czasu zmiany wymagające też nowych tabel i relacji. 
Przykładowo: najpierw na kartotece towaru było pole EAN.
Później trzeba było dodać wiele EAN-ów do jednej karty towarowej - więc 
powstała nowa tabela z relacją 1:Many w rodzaju [TowarID] [kody EAN]

W ciągu roku jest wydawanych kilka nowych wersji.
W wielu z nich są nowe funkcjonalności oraz poprawiane zgłoszone błędy.
Oczywiście część funkcjonalności (nie lubię tego określenia) jest 
wymuszona przepisami - np. faktury wewnętrzne, księgowanie paliwa 
50/50%, nieszczęsne JPK itd. Ale część to zgłoszenia klientów lub dealerów.

Oczywistym jest, że pisząc system na nowo można nieco inaczej ustawić 
tabele czy relacje, można pewnie trochę uprościć. Ciężko "uczesać" żywy 
system, zwłaszcza, że zasada jest, aby struktura rosła, ale raczej się 
nie zmieniała.
Zasada ta wynika z tego, że dealerzy piszą dodatki, szablony wydruków, 
własne moduły. Klienci "kumaci" także. Nie może raczej być tak, że coś 
się zmieni i nagle stare wydruki przestają działać.


-- 
Pozdrawiam.

Adam
[OT] Re: Baza ok 2500 tabel.
#195337
Author: Andrzej Stróżyński
Date: Tue, 20 Jun 2017 05:24
14 lines
1956 bytes
W dniu 2017-06-19 o 19:55, Adam pisze:
[...]
> Zasada ta wynika z tego, że dealerzy piszą dodatki, szablony wydruków, 
> własne moduły. Klienci "kumaci" także. Nie może raczej być tak, że coś 
> się zmieni i nagle stare wydruki przestają działać.

Po aktualizacji wersji "obce" raporty działają bez problemu w Optimie?
Pytam, bo taka Symfonia wywala obce raporty przy każdej aktualizacji 
(przynajmniej KDP)


-- 
pozdrawiam
AS
Re: [OT] Re: Baza ok 2500 tabel.
#195338
Author: Adam
Date: Tue, 20 Jun 2017 13:20
69 lines
4242 bytes
W dniu 2017-06-20 o 07:24, Andrzej Stróżyński pisze:
> W dniu 2017-06-19 o 19:55, Adam pisze:
> [...]
>> Zasada ta wynika z tego, że dealerzy piszą dodatki, szablony wydruków,rystal Reportd
>> własne moduły. Klienci "kumaci" także. Nie może raczej być tak, że coś
>> się zmieni i nagle stare wydruki przestają działać.
>
> Po aktualizacji wersji "obce" raporty działają bez problemu w Optimie?
> Pytam, bo taka Symfonia wywala obce raporty przy każdej aktualizacji
> (przynajmniej KDP)
>
>


Działają.
Pod jednym warunkiem: Starsze wersje Optimy (numeracja jedno- i 
dwu-cyfrowa, zakończona na wersji 17.x) były pisane w Clarionie. Wydruki 
ich częściowo też były pisane w Clarionie (oprócz tego w Crystalu).
Około roku 2010 Optima została przepisana w Visualach i innych 
dotNetach, siłą rzeczy część wydruków (w Clarionie) musiała zostać 
przepisana w Crystal Reports.
Od tej pory są już tylko dwa rodzaje wydruków:
1/ Crystal
2/ GenRap

GenRap jest bardzo prosty, sporo wydruków może sobie stworzyć bądź 
zmodyfikować użytkownik końcowy - działa to na zasadzie budowania 
raportów z klocków.

Crystala nie będę omawiał - raczej jest znany.

Z jednej strony trochę łatwiej operuje się wyglądem w porównaniu np. do 
raportów dotNET, jak w systemie Enova/Soneta, z drugiej czasem w 
dotNecie łatwiej coś uzyskać.
Ale zawsze w Crystalu można użyć SQL-a, jak coś trudno zrobić (lub nie 
da się) w czystej składni Crystala.

A dzięki kompatybilności systemu w dół (dopisywanie nowych kolumn, 
"poszerzanie" istniejących, nowe tabele) - raporty z przed kilku lat 
działają.
Jeszcze jedna zaleta: dzięki ODBC nie potrzeba raportów pisać pod 
konkretną bazę. Raport odwołuje się tylko do nazwy tabeli, więc raport 
stworzony na jednaj bazie będzie działał w zasadzie na dowolnej innej.

Aczkolwiek mam raporty pisane pod OLE DB wywoływane z zewnętrznych 
aplikacji - wtedy trzeba wołać je przez instancję i bazę.

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. 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.

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.


-- 
Pozdrawiam.

Adam
Re: [OT] Re: Baza ok 2500 tabel.
#195339
Author: Stokrotka
Date: Tue, 20 Jun 2017 16:53
15 lines
2039 bytes
> 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.

Nie wiem co Symfonia ma w środku,
ale byłam na kursie z urzędu pracy, gdzie uczono ksiegowości na Symfoni. 
Podobał mi się ten sytem z punktu widzenia użytkownika,
nie pisząc już o tym, że tani w zestawieniu z okszyczanymi dużymi systemami, 
z kturymi są tylko kłopoty, bo to ani uniwersalne, ani nie pisane od 
konkretnego użytkownika (użytkownik w sensie zakład produkcyjny).

-- 
(tekst bez: ó, ch, rz i -ii)
Ortografia to NAWYK, często nielogiczny, ktury ludzie ociężali umysłowo,
nażucają bezmyślnie następnym pokoleniom. ( ortografia . pev . pl ) 
Re: [OT] Re: Baza ok 2500 tabel.
#195340
Author: Adam
Date: Wed, 21 Jun 2017 09:42
50 lines
3102 bytes
W dniu 2017-06-20 o 18:53, Stokrotka pisze:
>
>> 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.
>
> Nie wiem co Symfonia ma w środku,
> ale byłam na kursie z urzędu pracy, gdzie uczono ksiegowości na Symfoni.
> Podobał mi się ten sytem z punktu widzenia użytkownika,
> nie pisząc już o tym, że tani w zestawieniu z okszyczanymi dużymi
> systemami, z kturymi są tylko kłopoty, bo to ani uniwersalne, ani nie
> pisane od konkretnego użytkownika (użytkownik w sensie zakład produkcyjny).
>


Symfonia siedzi nie na SQL, lecz na Pervasive. Czyli taki plikowy SQL, 
bardziej podobny jednak do dBase niż do "normalnych" SQL-i.
Od strony technicznej: naprawa bazy żmudna, baza łatwa do przewrócenia.

Od strony operatora: program bardzo siermiężny. Nie ma automatów. Są 
tylko proste szablony księgowań.

Przykładowo w innych systemach (Optima, CDN-XL, Enova) można stworzyć 
wzorce, które jedną fakturę:

1/ paliwo osobowy
2/ paliwo "z kratką"
3/ papier xero
4/ kawa
5/ drukarka (środek trwały)
6/ serniczek ;)

rozksięgują odpowiednio - [1] - bez VAT; [2] - odliczanie 50% VAT; [3] - 
można puścić w kręgi kosztów, równolegle na konta 4. i 5.; [5] - jako 
ST, z osobną amortyzacją bilansową i kosztową, i/lub z amortyzacją 
sezonową; [6] - omijamy, nie podlega księgowaniu

To dość prosty przykład.

Nie wiem, jak w Symfonii wygląda obsługa kont bankowych.
W innych systemach może następować automatyczne rozliczanie płatności po 
imporcie przelewów z banku, lub wysyłka wprost z programu przelewów do 
realizacji.

Takich "licytacji" można tworzyć jeszcze wiele.


-- 
Pozdrawiam.

Adam
Re: [OT] Re: Baza ok 2500 tabel.
#195341
Author: Adam
Date: Wed, 21 Jun 2017 09:49
69 lines
4037 bytes
W dniu 2017-06-21 o 11:42, Adam pisze:
> W dniu 2017-06-20 o 18:53, Stokrotka pisze:
>>
>>> 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.
>>
>> Nie wiem co Symfonia ma w środku,
>> ale byłam na kursie z urzędu pracy, gdzie uczono ksiegowości na Symfoni.
>> Podobał mi się ten sytem z punktu widzenia użytkownika,
>> nie pisząc już o tym, że tani w zestawieniu z okszyczanymi dużymi
>> systemami, z kturymi są tylko kłopoty, bo to ani uniwersalne, ani nie
>> pisane od konkretnego użytkownika (użytkownik w sensie zakład
>> produkcyjny).
>>
>
>
> Symfonia siedzi nie na SQL, lecz na Pervasive. Czyli taki plikowy SQL,
> bardziej podobny jednak do dBase niż do "normalnych" SQL-i.
> Od strony technicznej: naprawa bazy żmudna, baza łatwa do przewrócenia.
>
> Od strony operatora: program bardzo siermiężny. Nie ma automatów. Są
> tylko proste szablony księgowań.
>
> Przykładowo w innych systemach (Optima, CDN-XL, Enova) można stworzyć
> wzorce, które jedną fakturę:
>
> 1/ paliwo osobowy
> 2/ paliwo "z kratką"
> 3/ papier xero
> 4/ kawa
> 5/ drukarka (środek trwały)
> 6/ serniczek ;)
>
> rozksięgują odpowiednio - [1] - bez VAT; [2] - odliczanie 50% VAT; [3] -
> można puścić w kręgi kosztów, równolegle na konta 4. i 5.; [5] - jako
> ST, z osobną amortyzacją bilansową i kosztową, i/lub z amortyzacją
> sezonową; [6] - omijamy, nie podlega księgowaniu
>
> To dość prosty przykład.
>
> Nie wiem, jak w Symfonii wygląda obsługa kont bankowych.
> W innych systemach może następować automatyczne rozliczanie płatności po
> imporcie przelewów z banku, lub wysyłka wprost z programu przelewów do
> realizacji.
>
> Takich "licytacji" można tworzyć jeszcze wiele.
>

Jeszcze jeden przykład:
Moduł "Biuro Rachunkowe" dla Optimy umożliwia pracę na wielu podmiotach 
(ważne dla biur rachunkowych mających kilkudziesięciu czy więcej 
klientów) i robienie globalnie dla wszystkich lub wskazanych m.in. 
wysyłanie na serwery Ministerstwa plików JPK, wysyłanie VAT7, wydruki 
deklaracji, naliczanie wypłat właścicieli, tworzenie różnych raportów.
Nie potrzeba wchodzić do każdej z firm z osobna.
Jest to bardzo duże ułatwienie.

A ceny systemów są podobne.

Jednak ważniejszy od ceny jest support.
Ważne też jest, że Optima, Enova czy XL są systemami otwartymi i można 
zrobić czy dorobić dużo więcej dodatków, wydruków, raportów czy osobnych 
modułów (np. import danych z innych systemów) niż w Symfonii.


-- 
Pozdrawiam.

Adam
Re: [OT] Re: Baza ok 2500 tabel.
#195342
Author: Stokrotka
Date: Wed, 21 Jun 2017 12:22
46 lines
3116 bytes
>>> 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.
>>
>> Nie wiem co Symfonia ma w środku,
>> ale byłam na kursie z urzędu pracy, gdzie uczono ksiegowości na Symfoni.
>> Podobał mi się ten sytem z punktu widzenia użytkownika,
>> nie pisząc już o tym, że tani w zestawieniu z okszyczanymi dużymi
>> systemami, z kturymi są tylko kłopoty, bo to ani uniwersalne, ani nie
>> pisane od konkretnego użytkownika (użytkownik w sensie zakład 
>> produkcyjny).
>>
>
>
> Symfonia siedzi nie na SQL, lecz na Pervasive. Czyli taki plikowy SQL, 
> bardziej podobny jednak do dBase niż do "normalnych" SQL-i.
> Od strony technicznej: naprawa bazy żmudna, baza łatwa do przewrócenia.
>
> Od strony operatora: program bardzo siermiężny. Nie ma automatów. Są 
> tylko proste szablony księgowań.

Są wystarczające ułatwienia dla użytkownika.
Nie jest to system dla dużej firmy, wymagającej pracy "hurtowej".

> Nie wiem, jak w Symfonii wygląda obsługa kont bankowych.
> W innych systemach może następować automatyczne rozliczanie płatności po 
> imporcie przelewów z banku, lub wysyłka wprost z programu przelewów do 
> realizacji.

Nawet jeśli tego nie ma, a pewnie nie ma, to programy "z drugiej strony" 
umozliwiają to, wiem bo wdarażałam taki program ,
włacznie z odpowiednim imortem danyh.

-- 
(tekst bez: ó, ch, rz i -ii)
Ortografia to NAWYK, często nielogiczny, ktury ludzie ociężali umysłowo,
nażucają bezmyślnie następnym pokoleniom. ( ortografia . pev . pl )

>
> Takich "licytacji" można tworzyć jeszcze wiele.
>
>
> -- 
> Pozdrawiam.
>
> Adam 
Re: [OT] Re: Baza ok 2500 tabel.
#195343
Author: Andrzej Stróżyński
Date: Wed, 21 Jun 2017 12:32
61 lines
3856 bytes
W dniu 2017-06-21 o 11:42, Adam pisze:
> W dniu 2017-06-20 o 18:53, Stokrotka pisze:
>>
>>> 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.
>>
>> Nie wiem co Symfonia ma w środku,
>> ale byłam na kursie z urzędu pracy, gdzie uczono ksiegowości na Symfoni.
>> Podobał mi się ten sytem z punktu widzenia użytkownika,
>> nie pisząc już o tym, że tani w zestawieniu z okszyczanymi dużymi
>> systemami, z kturymi są tylko kłopoty, bo to ani uniwersalne, ani nie
>> pisane od konkretnego użytkownika (użytkownik w sensie zakład 
>> produkcyjny).
>>
> 
> 
> Symfonia siedzi nie na SQL, lecz na Pervasive. Czyli taki plikowy SQL, 
> bardziej podobny jednak do dBase niż do "normalnych" SQL-i.
> Od strony technicznej: naprawa bazy żmudna, baza łatwa do przewrócenia.
> 
> Od strony operatora: program bardzo siermiężny. Nie ma automatów. Są 
> tylko proste szablony księgowań.
> 
> Przykładowo w innych systemach (Optima, CDN-XL, Enova) można stworzyć 
> wzorce, które jedną fakturę:
> 
> 1/ paliwo osobowy
> 2/ paliwo "z kratką"
> 3/ papier xero
> 4/ kawa
> 5/ drukarka (środek trwały)
> 6/ serniczek ;)
> 
> rozksięgują odpowiednio - [1] - bez VAT; [2] - odliczanie 50% VAT; [3] - 
> można puścić w kręgi kosztów, równolegle na konta 4. i 5.; [5] - jako 
> ST, z osobną amortyzacją bilansową i kosztową, i/lub z amortyzacją 
> sezonową; [6] - omijamy, nie podlega księgowaniu
> 
> To dość prosty przykład.
> 
> Nie wiem, jak w Symfonii wygląda obsługa kont bankowych.
> W innych systemach może następować automatyczne rozliczanie płatności po 
> imporcie przelewów z banku, lub wysyłka wprost z programu przelewów do 
> realizacji.
> 
> Takich "licytacji" można tworzyć jeszcze wiele.

Nie pastw się nad Symfonią, skoro jej nie znasz.
Jest wersja SQL
Z funkcjonalnością nie jest pewnie tak źle, skoro kilku znajomych 
księgowych nie narzeka a niektórzy pracują też na innych programach, 
więc mają porównanie.
Złe doświadczenie mam tylko z jednym dorabianym raportem w KDP (wersja 
na Pervasive) który, bez żadnej zmiany w kodzie, należy na nowo doczytać 
po "dużej" aktualizacji wersji - z reguły raz do roku.



-- 
pozdrawiam
AS
Re: [OT] Re: Baza ok 2500 tabel.
#195344
Author: wloochacz
Date: Wed, 05 Jul 2017 11:30
36 lines
3066 bytes
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...

> 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...

> 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

-- 
wloochacz
Re: [OT] Re: Baza ok 2500 tabel.
#195345
Author: 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
Re: [OT] Re: Baza ok 2500 tabel.
#195346
Author: wloochacz
Date: Mon, 10 Jul 2017 17:47
95 lines
5633 bytes
W dniu 2017-07-05 o 15:21, Adam pisze:
> 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:
/ciach/

> itd - 490 rekordów.
No i co tam zobaczyłeś, bo  nic z tego nie rozumiem...

> Optimka ma 272, CDN-XL ma 852.
> Zresztą do XL masz dokumentację, podsyłałem Ci kiedyś.
Pisałem o Enovie, a Ty mi tu pokazujesz XL.
A to, że "logika" w ERP XL jest w bazie danych, to jasne.
Burdel z tym taki, że łooo matko...
A najlepiej jest wtedy, gdy mam na przestrzeni kilku lat, kilka firm 
obsługujących ten sam system u klienta (tzw. fakt autentyczny i dotyczy 
ERP XL), robi własne zmiany w triggerach.
Każda z tych firm grzebie sobie w bazie jak im się podoba.
Po kilkunastu takich zmianach, nikt tak naprawdę nie wie co w tym 
trigger-hell się dzieje i kiedy się dzieje...

>>> 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.
Jasne, ale mam inną opinię.

> Przykładowy trigger dotyczący elementu transakcji (np. faktury) poniżej.
Myślę, że ten trigger  jest z definicji zjebany.

Select top 1?
A co w przypadku, kiedy insert będzie batchowy i będzie więcej niż jeden 
rekord wkładany w tym samym czasie?

Dlatego powtórzę: "Taki "serwisant" niech lepiej trzyma lepkie łapki 
blisko siebie..."
Na co Ty - nie przesadzaj...

 > Myślisz, że bez triggera ktoś by to zapamiętał?
Tak, ale to wymaga programowania w ERPie, a nie w jego bazie.

Poza tym ten cały trigger, jest wzorcowym przykładem jak nie należy tego 
robić i dlaczego nie należy tak tego robić.
Po prostu utrzymanie takiego systemu to istny horror-szoł...

>>> 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?
Bazodanowa to bazodanowa, zgodna z ACID.
W porównaniu do ACID, TTS w Novell to bieda wersja, ale głównie dlatego 
że operuje na plikach (czy na blokach pliku? Ja jestem noga od Novella i 
wiem tyle ile wyczytam) i z tego co wiem, wymaga interakcji z Novell TTS.
W bazie danych nie posługujesz się pojęciem pliku i nic Cię on nie 
obchodzi, a sama transakcja dotyczy wszystkich (zazwyczaj chodzi o 
polecania DML, ale bywa różnie w różnych bazach danych) poleceń SQL, 
które są nią objęte.

> Ale to chyba na innym poziomie, niż logiczna spójność. Muszę doczytać. 
> Jakiś link?
ACID
https://pl.wikipedia.org/wiki/ACID
https://msdn.microsoft.com/en-us/library/aa480356.aspx?f=255&MSPPError=-2147217396

-- 
wloochacz
Re: [OT] Re: Baza ok 2500 tabel.
#195347
Author: Adam
Date: Mon, 10 Jul 2017 21:07
156 lines
7937 bytes
W dniu 2017-07-10 o 19:47, wloochacz pisze:
> W dniu 2017-07-05 o 15:21, Adam pisze:
>> 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:
> /ciach/
>
>> itd - 490 rekordów.
> No i co tam zobaczyłeś, bo  nic z tego nie rozumiem...
>

Wylistowałem triggery z bazy danych Enovy, baza z roku 2014.

>> Optimka ma 272, CDN-XL ma 852.
>> Zresztą do XL masz dokumentację, podsyłałem Ci kiedyś.
> Pisałem o Enovie, a Ty mi tu pokazujesz XL.
> A to, że "logika" w ERP XL jest w bazie danych, to jasne.

W Enovie chyba też.
Mam tylko kilku klientów z Enovy, robionych zresztą "z doskoku". Od 
ładnych kilku lat jakoś nie mogę się zebrać, aby skoczyć do Roberta 
podpisać umowę.
W każdym razie bazy Enovy nie naprawiałem, nie znam jej tak, jak baz 
dawnego CDN-u.

> Burdel z tym taki, że łooo matko...

Dopóki nie zatrudniali studentów, i dopóki CDN to był CDN a nie jakiś 
Comarch, to było dobrze :(

> A najlepiej jest wtedy, gdy mam na przestrzeni kilku lat, kilka firm
> obsługujących ten sam system u klienta (tzw. fakt autentyczny i dotyczy
> ERP XL), robi własne zmiany w triggerach.

Niestety, czasem nawet do wydruku w Crystalu trzeba podpiąć pod bazę 
dodatkowe tabele i triggery. Mam tak w jednej specyficznej firmie - 
obrót "żelastwem" na budowy (kształtowniki, ramy, pojemniki, pręty, itp).

> Każda z tych firm grzebie sobie w bazie jak im się podoba.
> Po kilkunastu takich zmianach, nikt tak naprawdę nie wie co w tym
> trigger-hell się dzieje i kiedy się dzieje...
>

Najgorzej to przejąć takiego klienta. Robi się dla niego jakiś dodatkowy 
wydruk lub mniej typowy obieg dokumentów, i to, co chodzi na bazach 
testowych albo u innych klientów, u niego nie chce :(

>>>> 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.
> Jasne, ale mam inną opinię.
>
>> Przykładowy trigger dotyczący elementu transakcji (np. faktury) poniżej.
> Myślę, że ten trigger  jest z definicji zjebany.
>

Wziąłem pierwszy lepszy z brzegu, tam gdzie mi kursor myszki w 
Management Studio stanął.

> Select top 1?
> A co w przypadku, kiedy insert będzie batchowy i będzie więcej niż jeden
> rekord wkładany w tym samym czasie?

Z tego, co na szybko popatrzyłem to TOP 1 wskazuje na typ i rodzaj 
dokumentu. Dokument może być tylko i wyłącznie jednego rodzaju czy typu 
i nie podlega zmianom. Tu akurat IMO nie ma błędu. Zresztą te flagi są 
zakładane w momencie inicjacji rekordu, a rekord jest blokowany na 
wyłączność w trakcie inicjalizacji.

>
> Dlatego powtórzę: "Taki "serwisant" niech lepiej trzyma lepkie łapki
> blisko siebie..."
> Na co Ty - nie przesadzaj...
>
>> Myślisz, że bez triggera ktoś by to zapamiętał?
> Tak, ale to wymaga programowania w ERPie, a nie w jego bazie.
>

A później ktoś mnie woła do jakiegoś Wf-Maga, że poszła faktura a towar 
dalej wisi na stanie.
Wydaje mi się, że triggery w tym momencie dużo pomagają i jeszcze więcej 
(a w zasadzie całkowicie) zabezpieczają bazę.
Zważ na to, że systemy CDN-u (łącznie z FPP) są poniekąd "otwarte", 
można coś "wtykać" choćby przez API.
Nie wyobrażam sobie tworzenia własnych, nawet najprostszych formatek czy 
funkcji dodatkowych bez triggerów.

> Poza tym ten cały trigger, jest wzorcowym przykładem jak nie należy tego
> robić i dlaczego nie należy tak tego robić.
> Po prostu utrzymanie takiego systemu to istny horror-szoł...

Nie mam innych doświadczeń, brak podstaw abym się wypowiadał.

>>>> 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?
> Bazodanowa to bazodanowa, zgodna z ACID.
> W porównaniu do ACID, TTS w Novell to bieda wersja, ale głównie dlatego
> że operuje na plikach (czy na blokach pliku? Ja jestem noga od Novella i
> wiem tyle ile wyczytam) i z tego co wiem, wymaga interakcji z Novell TTS.

Novella zaprzestałem serwisować już gdzieś na v.5.x - więc dość dawno 
temu. Aczkolwiek jeszcze kilka lat temu coś naprawiałem w bazach KH w 
jakiejś Spółdzielni Mieszkaniowej - jakoś mnie przez kogoś znaleźli. 
Mieli CDN Klasykę na Novellu, a sieć na RG58.

> W bazie danych nie posługujesz się pojęciem pliku i nic Cię on nie
> obchodzi, a sama transakcja dotyczy wszystkich (zazwyczaj chodzi o
> polecania DML, ale bywa różnie w różnych bazach danych) poleceń SQL,
> które są nią objęte.
>
>> Ale to chyba na innym poziomie, niż logiczna spójność. Muszę doczytać.
>> Jakiś link?
> ACID
> https://pl.wikipedia.org/wiki/ACID
> https://msdn.microsoft.com/en-us/library/aa480356.aspx?f=255&MSPPError=-2147217396

Dzięki, w wolnej chwili poczytam.


-- 
Pozdrawiam.

Adam
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads