Witam,
siedze z jednym tematem - i zatrzymalem sie w kwestii okreslenia daty dokumentu oryginalnego w przypadku korekty.
Przy jednej korekcie wiadomo - luz - ale jak to rozwiazac jesli do danego dokumentu bylo pare korekt? albo byla korekta do korekty?
A znowu z poziomu korekty musze wiedziec kiedy dokladnie dana WZ czy FS byla wystawiona.
W Polsce nie ma czegoś takiego jak korekta korekty - i tym samym nie ma tego w Xl-u. Można mieć kilka korekt, ale działa to w ten sposób, że oryginał wskazuje na ostatnią korektę, a ostatnia korekta na korektę wcześniejszą itd. - o ile dobrze pamiętam - XL bez klucza włączyć nie mogę, a że już nie pracuje w firmie partnerskiej to i klucza serwisowego nie ma W każdym razie datą dokumentu źródłowego winna być data faktury Vat - czyli dokumentu który cały czas korygujesz. A czy go korygujesz 10 razy, czy też raz nie ma znaczenia - to on jest dokumentem bazowym.
w Polsce nie ma a w cdn jest - a przynajmniej w samym mechanizmie zapisywania korekt - dokladnie tak jak opisales ;D
w tabeli tranag nie do szukalem sie nic wiecej poza gidami dokumentu korygowanego - co niestety przy kolejnych korektach pokazuje poprzednia korekte. natomiast nie znalazlem nigdzie daty dokumentu poczatkowego. takze lipa.
aha - jak by ktos mial rozwiazanie nawet jako oddzielna funkcje w ktorej petla sie jakas wykonuje - to tez chetnie przyjme
konkretnie napisze mi o co chodzi.
mamy w obrocie pewien rodzaj towaru ktory ma klient prawo zwrocic do okreslonego czasu od sprzedazy (tak wiem - sa kaucje - sila wyzsza powoduje ze ich nie uzywamy) - jednak w interesie firmy ten zwrot moze nastapic tylko do okreslonej daty od dnia sprzedazy. Po tym czasie nie chcemy tego przyjmowac, bo sami oddajac to dalej ponosimy koszty karne. I chodzi o to ze musze zablokowac mozliwosc zatwierdzania takowych korekt. Oczywiscie dla wiekszosci operatorow. No a aby to osiagnac - musze miec jakies bezposrednie odniesienie do dokumentu poczatkowego - w kazdym mozliwym przypadku
U siebie też miałem z tym problem - zamęczanie bazy przy próbie dojścia do dokumentu źródłowego dla korekt. Darowałem sobie klepanie funkcji, etc - przy nich baza dalej byłaby obciążona.
Założyłem tabelę wiążącą dokument korekty z numerem dokumentu pierwotnego, zasiliłem, a następnie na cdn.TraNag założyłem trigger aktualizujący tę tabelę pomocniczą.
Teraz w swoich zapytaniach jednym JOIN łączę korektę z dokumentem pierwotnym... Polecam takie rozwiązanie - szybkie i odciążające bazę...
Pozdrawiam,
Marcin ---------------------------------------------------------------------------------
Tako rzecze dokumentacja tabel CDN XL 7.1
TwrZasoby TwZ_DataP INTEGER Data przyjęcia towaru na magazyn Potrzebne przy podróżach w czasie.
Samo dojście do dokumentu źródłowego to nie jest jakieś duże obciążenie. Żeby zrobić to co potrzebujesz możesz np. zrobić trigger, który dla inserted o GIDtypie 2041, będzie za pomocą pętli przesuwał się "w górę" dopóki nie natrafi na GIDTyp 2033. Tak naprawdę pewnie nie masz więcej niż 5 korekt do dokumentu, a taka pętla będzie praktycznie niezauważalna względem wydajności - w końcu wykona się tylko wtedy jak będziesz robić korektę do FS. W takim przypadku osiągniesz to co chciałeś, a sam trigger będzie mało skomplikowany - mając FS i 4 korekty w momencie tworzenia czwartej pobierzesz z niej trn_zwrtyp i trn_zwrnumer i zapętlisz dopóki nie natrafisz na trn_zwrtyp = 2033. Wtedy wyciągniesz datę i po kłopocie. Oczywiście możesz też stworzyć tabelę, aczkolwiek zadbaj o jakiś indeks, który po jej wypełnieniu zadba o wydajność zapytań na niej. Sam Gidnumer FS początkowego dla wstawianej korekty tak czy tak musisz znaleźć i nie ma tu mowy o odciążaniu bazy - i jedno i drugie troszeczkę ją dociąży
declare @gid_korekty int
set @gid_korekty=
;WITH CTE_DatesTable
AS
(
SELECT TrN_GidTyp,TrN_GidNumer,TrN_ZwrNumer as TrN_ZwrNumer from cdn.tranag
WHERE TrN_GidNumer=@gid_korekty
UNION ALL
SELECT A.TrN_GidTyp,A.TrN_GidNumer,A.TrN_ZwrNumer
FROM CDN.TraNag A
JOIN CTE_DatesTable B ON B.TrN_ZwrNumer=A.TrN_GidNumer and A.TrN_GidNumer<>@gid_korekty
)
SELECT TrN_GidTyp,TrN_GidNumer,TrN_ZwrNumer FROM CTE_DatesTable WHERE TrN_GidTyp=2033
OPTION (MAXRECURSION 0);
Każdy select to obciążenie, więc nie tak całkiem nic nie zamula i czy CTE jest takie nowe to bym się sprzeczał... Ale rzeczywiście, jakoś źle pomyślałem pisząc poprzedni post, bo przecież jeżeli założysz wyzwalacz na Tranag to w momencie tworzenia korekty, możesz po prostu zwrócić datę dokumentu oryginalnego poprzez prosty select -
CTE jest od 2005 mssql. A wyzwalacz też "zamula" i to bardziej, bo na moment serwer SQL wymusza blokadę tabeli przed uruchomieniem procedur wywołania. Po za tym w moim rozwiązaniu można zwrócić wszystkie korekty do danej faktury wystarczy wyciąć warunek TrN_GidTyp=2033. W dodatku w Pańskim rozwiązaniu zwrócona będzie tylko wartość poprzednio korygowanego dokumentu a nie oryginalnego. Poniżej gotowa funkcja :
CREATE FUNCTION CDN.Usr_PobierzOryginal(@GidKorekty int)
RETURNS Datetime
AS
BEGIN
DECLARE @Data Datetime
;WITH CTE_DatesTable
AS
(
SELECT TrN_Data2,TrN_GidTyp,TrN_GidNumer,TrN_ZwrNumer as TrN_ZwrNumer from cdn.tranag
WHERE TrN_GidNumer=@GidKorekty
UNION ALL
SELECT A.TrN_Data2,A.TrN_GidTyp,A.TrN_GidNumer,A.TrN_ZwrNumer
FROM CDN.TraNag A
JOIN CTE_DatesTable B ON B.TrN_ZwrNumer=A.TrN_GidNumer and A.TrN_GidNumer<>@GidKorekty
)
SELECT @Data=CDN.TsToDate(TrN_Data2,0) FROM CTE_DatesTable WHERE TrN_GidTyp=2033
OPTION (MAXRECURSION 0);
RETURN @Data
END
Rozumiem, że ta funkcja,podobnie jak trigger podniesie podczas dodawania korekty w XL okno komunikatu i cofnie transakcje w przypadku gdy data będzie zbyt odległa ?
Jeśli transakcja miałaby być cofnięta to rzeczywiście przez trigger , więc funkcję możemy np. tak wykorzystać :
CREATE TRIGGER CDN.CheckDateFSK
ON CDN.TraNag
AFTER UPDATE
AS
BEGIN
DECLARE @data datetime
DECLARE @data2 datetime
DECLARE @GidKorekty int
if update(Trn_Stan)
Begin
SELECT @data=CDN.TsToDate(TrN_Data2,0),@GidKorekty= TrN_GidNumer FROM inserted
SELECT @data2=CDN.Usr_PobierzOryginal(@GidKorekty)
if @data>DateAdd(dd,40,@data2)
BEGIN
RAISERROR('#CDN_BLAD/# #CDN_1=Od wystawienia dokumentu pierowtnego upłynął zbyt długi okres czasu', 16, 1)
SET NOCOUNT ON
RETURN
END
END
end
END
END
Ostatnio zmieniony 31 sie 2010, 16:18 przez tkozakiewicz, łącznie zmieniany 2 razy.