Dokumenty magazynu a faktury

Jak każdy program i nasza DM Plaza nie jest wolna od błędów - prosimy opiszcie je - szybciej zostaną naprawione
AJP_Kuba
Ekspert
Posty: 155
Rejestracja: 2009-06-05, 07:20
Lokalizacja: Kraków
Kontakt:

Dokumenty magazynu a faktury

Post autor: AJP_Kuba »

Dokument magazynowy jest przypisany do faktury przez pole DOKUMENT.FAKTURA_ID
To nie jest jednoznaczne przypisanie
Dla niektórych dokumentów faktura_id jest wskazaniem na fakturę zakupu, dla innych - na fakturę sprzedaży. W oknach wyświetlania dokumentów są przyjęte pewne założenia, tj. dokumentami magazynowymi do faktur sprzedaży są tylko WZ, dla faktur zakupu - tylko PZ. Niby logicznie... do czasu. Tworzę fakturę, zatwierdzam, powstaje WZ, coś nie gra, fakturę anuluję, powstaje WZ.
Odnajduję anulowaną fakturę sprzedaży, widzę do niej tylko WZ.
Jeśli odszukam fakturę zakupu o ID takim, jak moja anulowana faktura sprzedaży, będę pod nią widział dwa dokumenty PZ: jeden faktycznie tej faktury, i drugi - stornujący (od strony magazynowej) moją anulowaną sprzedaż.

Tego się nie da raportować, sama poprawka będzie też niezłą gimnastyką:
- id jest dwuznaczne
- daty dokumentów nie muszą być jednolite (wszak faktura zakupu i PZ nie muszą mieć tych samych dat - ba, mało tego! możemy mieć zarówno fakturę przez PZ, jak i po PZ)
AJP_Kuba
Ekspert
Posty: 155
Rejestracja: 2009-06-05, 07:20
Lokalizacja: Kraków
Kontakt:

Post autor: AJP_Kuba »

Szukając rozwiązania zupełnie innego problemu, natknąłem się na procedurę zmieniającą listę (val1, val2, val3) na tablicę; dzięki temu można ładnie powiązać faktury z dokumentami PZ... z grubsza, bo pamiętamy o ograniczeniu długości pola opisującego podstawę wystawienia.

Kod: Zaznacz cały

SET TERM ^ ;
CREATE OR ALTER PROCEDURE SPLIT_STRING (
    AINPUT VARCHAR(8192))
RETURNS (
    RESULT VARCHAR(255))
AS
DECLARE VARIABLE LASTPOS INTEGER;
DECLARE VARIABLE NEXTPOS INTEGER;
DECLARE VARIABLE TEMPSTR VARCHAR(8192);
BEGIN
  AINPUT = :AINPUT || ',';
  LASTPOS = 1;
  NEXTPOS = position(',', :AINPUT, LASTPOS);
  WHILE (:NEXTPOS > 1) do
  BEGIN
    TEMPSTR = substring(:AINPUT from :LASTPOS for :NEXTPOS - :LASTPOS);
    RESULT = :TEMPSTR;
    LASTPOS = :NEXTPOS + 1;
    NEXTPOS = position(',', :AINPUT, LASTPOS);
    suspend;
  END
END
^
SET TERM ; ^
ODPOWIEDZ