Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Baza ok 2500 tabel.

756 views
Skip to first unread message

Cezary Grądys

unread,
Jun 13, 2017, 12:14:27 PM6/13/17
to
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
czar...@wa.onet.pl

wloochacz

unread,
Jun 13, 2017, 12:28:18 PM6/13/17
to
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

M.M.

unread,
Jun 13, 2017, 3:30:06 PM6/13/17
to
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

Marcin B.

unread,
Jun 13, 2017, 6:47:45 PM6/13/17
to
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.



Jivanmukta

unread,
Jun 13, 2017, 10:44:32 PM6/13/17
to
> Jakie maksymalne ilości tabel spotykacie w praktyce?

Pracowałem z systemem SAP R/3 który ma 14000 tabel.

Cezary Grądys

unread,
Jun 14, 2017, 2:32:43 AM6/14/17
to
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.

Adam

unread,
Jun 14, 2017, 6:07:38 AM6/14/17
to
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

Cezary Grądys

unread,
Jun 14, 2017, 7:36:21 AM6/14/17
to
W dniu 14.06.2017 o 12:07, Adam pisze:
Chyba nie jest prosto, jak baza ma 14000 tabel :)

Stokrotka

unread,
Jun 14, 2017, 10:19:14 AM6/14/17
to
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 )


.

Adam

unread,
Jun 14, 2017, 11:58:20 AM6/14/17
to
W dniu 2017-06-14 o 13:36, Cezary Grądys pisze:
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

Jacek

unread,
Jun 15, 2017, 3:42:42 AM6/15/17
to
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...

M.M.

unread,
Jun 15, 2017, 5:42:03 AM6/15/17
to
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

Cezary Grądys

unread,
Jun 15, 2017, 8:37:35 AM6/15/17
to
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
czar...@wa.onet.pl

M.M.

unread,
Jun 15, 2017, 10:22:14 AM6/15/17
to
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.

Cezary Grądys

unread,
Jun 15, 2017, 2:57:21 PM6/15/17
to
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
czar...@wa.onet.pl

irq

unread,
Jun 16, 2017, 8:23:48 AM6/16/17
to
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
> czar...@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.

Stokrotka

unread,
Jun 16, 2017, 12:16:41 PM6/16/17
to

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

Cezary Grądys

unread,
Jun 16, 2017, 4:07:05 PM6/16/17
to
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
czar...@wa.onet.pl


Adam

unread,
Jun 19, 2017, 7:34:18 AM6/19/17
to
W dniu 2017-06-15 o 11:42, M.M. pisze:
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

Stokrotka

unread,
Jun 19, 2017, 11:03:23 AM6/19/17
to
Jak widać na początku ktoś nad tym panował,
a potem się coś rozjechało.

Adam

unread,
Jun 19, 2017, 1:55:17 PM6/19/17
to
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

Andrzej Stróżyński

unread,
Jun 20, 2017, 1:24:41 AM6/20/17
to
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

Adam

unread,
Jun 20, 2017, 9:20:44 AM6/20/17
to
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

Stokrotka

unread,
Jun 20, 2017, 12:53:27 PM6/20/17
to

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

Adam

unread,
Jun 21, 2017, 5:42:29 AM6/21/17
to
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

Adam

unread,
Jun 21, 2017, 5:49:59 AM6/21/17
to
W dniu 2017-06-21 o 11:42, Adam pisze:
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

Stokrotka

unread,
Jun 21, 2017, 8:22:26 AM6/21/17
to

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

>

Andrzej Stróżyński

unread,
Jun 21, 2017, 8:32:44 AM6/21/17
to
W dniu 2017-06-21 o 11:42, Adam pisze:
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

wloochacz

unread,
Jul 5, 2017, 7:30:11 AM7/5/17
to
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

Adam

unread,
Jul 5, 2017, 9:21:42 AM7/5/17
to
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

wloochacz

unread,
Jul 10, 2017, 1:47:50 PM7/10/17
to
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

Adam

unread,
Jul 10, 2017, 5:07:17 PM7/10/17
to
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
0 new messages