torsdag den 2. august 2012

M3 tip: SQL: Find gældende kostpris på en given dato

Mange steder i M3 skal man finde de gældende data ud fra gyldighedsdatoer.
Det kan være styklistelinier, salgspriser, kostpriser mv.

For eks. styklistelinier sørger M3 selv for, at skrive en 'Gyldig Til'-dato på en gammel linie, når der oprettes en ny, så man vil altid kun finde én linie, hvis man selekterer på en dato mellem 'Fra-' og 'Til-'datoerne.

Men for kostpriser er der ingen 'Gyldig Til'-dato, så her skal man selektere på den seneste 'Gyldig Fra'-dato.
Dette klarer M3-programmerne jo fint, men når der skal laves udtræk, så er det (kun) lidt bøvlet.
Eksemplet herunder viser, hvordan man kan finde en vares gældende kostpris pr. dags dato (her 2012-08-02).

select kofaci, koitno, kostrt, kopctp, kopcdt, kocsu3
 from mchead t1
 where kocono=1 and kofaci='001' and koitno='10000' and kocroc=0 and kopctp=3
 and kopcdt in
  (select max(kopcdt) from mchead t2
  where t2.kocono=1 and t1.kofaci=t2.kofaci and t1.koitno=t2.koitno and t1.kostrt=t2.kostrt and t1.kocroc=t2.kocroc and t1.kopctp=t2.kopctp
  and t2.kopcdt<=20120802
  group by t2.kocono, t2.kofaci, t2.koitno, t2.kostrt)

Metoden er, at der laves en grupperet sub-select, hvor man finder den 'største' 'Fra-dato', som er mindre end den valgte dato, og så sørger for, at kalkuledatoen skal være lig denne.

Med denne simple SQL får man også oplysning om, hvilken dato denne gældende kostpris er kalkuleret.
(I eksemplet forudsættes det, at kostprisen findes i kalkuletype 3 og sumniveau 3, og vi finder kostprisen for vare '10000' på facility '001')

Ingen kommentarer:

Send en kommentar