Die komplette Ermittlung und Berechnung befindet sich als Procedure "VA_GETTP" in der Datenbank.
Diese kann auch für diverse Listen und Reporte verwendet werden.
die procedure kann mittels SQL folgendermaßen aufgerufen werden:
select * from VA_GETTP(:IDFA)
Beispiel in Kombination mit mehreren Tabellen:
select h.blnr, a.anr, a.kmodnr, tp.*
from b02au h
left join b02auh2 h2 on h2.idr = h.idr
left join g02art a on a.idr = h2.aid
left join va_gettp(h.idr) tp on 1 = 1
where h.blnr = :BLNR
Achtung: Bei Verwendung der Procedure für eine Liste von Verträgen, ist darauf zu achten die Anzahl der Verträge einzugrenzen. Da Informationen über alle Lieferscheine und Sofortfakturen der betreffenden Verträge abgerufen werden, kann sich dies bei zu vielen Verträgen zeitintensiv auswirken.
use v8.8.90.17 vom 24.04.2013
PROCEDURE VA_GETTP (
idva idr2)
returns (
tp_colcnt betrag, /* Anzahl Farbtoner aus Zaehlermodell */
tp_colbkperc betrag, /* Kalk.Schwarz Toneranteil zur Farbe aus Zaehlermodell */
zh_kapa_bk betrag, /* Kalk.Schwarz Toneranteil zur Farbe aus Zaehlermodell */
zh_kapa_col betrag, /* Kapa Farbe IST */
zh_me_ton_bk betrag, /* Berechnete Menge Toner Basis Zaehler Schwarz */
zh_me_ton_col betrag, /* Berechnete Menge Toner Basis Zaehler Farbe */
lf_kapa_bk betrag, /* Berechnete Kapa Basis Lieferungen Schwarz */
lf_kapa_col betrag, /* Berechnete Kapa Basis Lieferungen Farbe */
lf_me_ton_bk betrag, /* Gelieferte Tonermenge Schwarz */
lf_me_ton_col betrag, /* Gelieferte Tonermenge Fabe */
zh_date_last date, /* Datum der letzten Zaehlererfassung */
tp_diff_bk betrag, /* Diff.Menge Toner Schwarz */
tp_diff_col betrag, /* Diff.Menge Toner Farbe */
tp_schwell_bk betrag, /* Schwellwert Schwarz */
tp_schwell_col betrag) /* Schwellwert Farbe */
as
declare variable temp_typ integer;
declare variable temp_stattyp integer;
declare variable temp_zhcnt integer;
declare variable zhcnt_1_bk integer;
declare variable zhcnt_2_bk integer;
declare variable zhcnt_1_col integer;
declare variable zhcnt_2_col integer;
declare variable temp_kapa betrag;
declare variable temp_menge betrag;
begin
if (idva is null) then exit;
/*----------------------------------------------------------------------*/
/* Kostenmodell Werte */
tp_colcnt = null;
tp_colbkperc = null;
select km.tp_colcnt, km.tp_colbkperc
from b02auh2 h2
join g02art a on a.idr = h2.aid
join g68kmod km on km.idr = a.kmodid
where h2.idr = :IDVA
into :tp_colcnt, :tp_colbkperc;
if ( coalesce(tp_colcnt,0) = 0 ) then tp_colcnt = 1;
/*----------------------------------------------------------------------*/
/* Zaehler Klicks */
zhcnt_1_bk = null;
zhcnt_2_bk = null;
zhcnt_1_col = null;
zhcnt_2_col = null;
for
select '1', e.datum, z.stattyp, p.zhcnt
from b37zherfpos p
join g61zh z on z.idr = p.zhid and z.stattyp in (20,30)
join b37zherf e on p.idzherf = e.idr
where p.idzherf =
(
select first 1 idr
from b37zherf
where idva = :IDVA and kzok = "*" and kzsw is null
order by datum asc
)
union
/* Aktuell */
select '2', e.datum, z.stattyp, p.zhcnt
from b37zherfpos p
join g61zh z on z.idr = p.zhid and z.stattyp in (20,30)
join b37zherf e on p.idzherf = e.idr
where p.idzherf =
(
select first 1 idr
from b37zherf
where idva = :IDVA and kzok = "*" and kzsw is null
order by datum desc
)
order by 2, 3
into :temp_typ, :zh_date_last, :temp_stattyp, :temp_zhcnt
do begin
if ( ( temp_typ = 1 ) and (temp_stattyp = 20) )then zhcnt_1_bk = temp_zhcnt;
if ( ( temp_typ = 2 ) and (temp_stattyp = 20) )then zhcnt_2_bk = temp_zhcnt;
if ( ( temp_typ = 1 ) and (temp_stattyp = 30) )then zhcnt_1_col = temp_zhcnt;
if ( ( temp_typ = 2 ) and (temp_stattyp = 30) )then zhcnt_2_col = temp_zhcnt;
end
/*----------------------------------------------------------------------*/
/* KAPA Berechnung */
/* Toner Color */
if (( not zhcnt_1_col is null ) and ( not zhcnt_2_col is null )) then
begin
zh_kapa_col = zhcnt_2_col - zhcnt_1_col;
end
/* Toner Black */
if ( ( not zhcnt_1_bk is null ) and ( not zhcnt_2_bk is null ) ) then
begin
zh_kapa_bk = zhcnt_2_bk - zhcnt_1_bk;
/* SW anteil bei Col Kopien */
if ((not zh_kapa_col is null) and ( not tp_colbkperc is null )) then
begin
zh_kapa_bk = zh_kapa_bk + ( zh_kapa_col * tp_colbkperc / 100 );
end
end
/*----------------------------------------------------------------------*/
/* Lieferungen Toner */
lf_kapa_bk = null;
lf_kapa_col = null;
lf_me_ton_bk = null;
lf_me_ton_col = null;
for
/* Lieferscheine */
select
akz.tp_typ,
sum(p.menge * p.mevkf) menge,
sum( (p.menge * p.mevkf) * a.kapa ) kapa
from b03lf h
join b03lfpos p on p.idh = h.idr
join g02art a on a.idr = p.aid
join g47artkz akz on akz.idr = a.artkzid and akz.tp_typ in (20,30)
where h.idva = :idva and h.bldate <= :zh_date_last
group by 1
union
/* Sofortfaktura */
select
akz.tp_typ,
sum(p.menge * p.mevkf) menge,
sum( (p.menge * p.mevkf) * a.kapa ) kapa
from b04fk h
join b04fkpos p on p.idh = h.idr
join g02art a on a.idr = p.aid
join g47artkz akz on akz.idr = a.artkzid and akz.tp_typ in (20,30)
where h.idva = :idva and h.bltyp = 4020 and h.bldate <= :zh_date_last
group by 1
into :temp_typ, :temp_menge, :temp_kapa
do
begin
/* Black */
if (temp_typ = 20 ) then
begin
lf_kapa_bk = temp_kapa;
lf_me_ton_bk = temp_menge;
end
/* Color */
if (temp_typ = 30 ) then
begin
lf_kapa_col = temp_kapa / tp_colcnt;
lf_me_ton_col = temp_menge;
end
end
/*----------------------------------------------------------------------*/
/* Berechnung ZH --> Toner Menge*/
/* Toner BK Menge Soll Basis Klicks = ZH.KAPA / ( LF.KAPA / LF.Menge )*/
if (( coalesce( lf_me_ton_bk,0 ) > 0 ) and ( coalesce(lf_kapa_bk,0) > 0 ) ) then
begin
zh_me_ton_bk = ( zh_kapa_bk / ( lf_kapa_bk / lf_me_ton_bk ) );
end
/* Toner Col Menge Soll Basis Klicks = ZH.KAPA / ( LF.KAPA / LF.Menge )*/
if (( coalesce( lf_me_ton_col,0 ) > 0 ) and ( coalesce(lf_kapa_col,0) > 0 ) ) then
begin
zh_me_ton_col = ( zh_kapa_col / ( lf_kapa_col / lf_me_ton_col ) );
end
/*----------------------------------------------------------------------*/
/* Berechnung Diff */
tp_diff_bk = lf_me_ton_bk - zh_me_ton_bk;
tp_diff_col = lf_me_ton_col - zh_me_ton_col;
if ( coalesce(lf_me_ton_bk,0) > 0 ) then
begin
tp_schwell_bk = tp_diff_bk / lf_me_ton_bk * 100;
end
if ( coalesce(lf_me_ton_col,0) > 0 ) then
begin
tp_schwell_col = tp_diff_col / lf_me_ton_col * 100;
end
suspend;
end