*Kalkulation
#main
VAR Seite(s,2,0)
VAR Zeile(s,2,0)
VAR cyZeile(d,8,2)
VAR ZlMax(s,2,0)
VAR RandX(d,8,2)
VAR RandY(d,8,2)
VAR SizeX(d,8,2)
VAR Heute(D,10,0)
VAR mSumme(d,8,2)

* 85 Zeilen im Abstand 8 LPI == A4-hoch
ZlMax=     85 - 2
cyZeile= 2,54/8
RandX=      1,80
RandY=      0,80
SizeX=      17,6
Seite=      1
Zeile=      0
Heute=H

VAR LfdNrRoot(u,6,0)

VAR HDR08N(C,30,0)
HDR08N=Times New Roman,8,N
VAR HDR08F(C,30,0)
HDR08F=Times New Roman,8,F
VAR DET08N(C,30,0)
DET08N=Arial,8,N
VAR DET08F(C,30,0)
DET08F=Arial,8,F


* Datensatz BELEGVERZEICHNIS
REC recBVZ(BELEGVERZEICHNIS,0,18)$[FltKey<18]
IF EOF(recBVZ)
  GOTO :EOF_recBVZ
* Datensaetze Beleginhalte
REC recPOS(BELEGPOSITIONEN,0,18)$[FltKey<18]
REC recEXT(BELEGKOPF_ERWEITERUNG,0,18)$[FltKey<18]
REC recADR(BELEGADRESSEN,0,19)$[FltKey<18]0
REC recTXT(BELEGPOSITIONSTEXTE,0,18)$[FltKey<18]

* eigene Anschrift
REC recEIG(EIGENE_ANSCHRIFTEN,0,0)
SEEK recEIG($[recBVZ.EIGANSCH>2])
IF EOF(recEIG)
  SEEK recEIG(01)

VAR PosEbene(s,2,0)
VAR AktEbene(s,2,0)
PosEbene=1 + $[recBVZ.TITEL] + $[recEXT.LOSE] + $[recEXT.UNTERTITEL]
AktEbene=1

*--------------------------------------------------
* Erste Seite initialisieren

OUT INITPAGESIZE
OUT STARTJOB Kalkulation $[FltKey<18] 
OUT TRANSPARENT
OUT STARTPAGE

Zeile=      0
OUT ##TitelZeile
OUT ##KopfBericht
OUT ##KopfDetail

*--------------------------------------------------
* TODO:   Ausgabeschleife aktivieren
LOOP recPOS(#loopMAIN)

*--------------------------------------------------
* letzte Seite abschliessen

IFNOT BOOL($[Zeile] >= $(ZlMax]-4))
  GOTO :Abschluss

SUB #Fuss
SUB #Kopf

:Abschluss
Zeile=$[ZlMax] - 4

SEEK recPOS($[LfdNrRoot<6])
VAR gesDBL(d,8,2)
VAR gesDBM(d,8,2)
VAR gesDBF(d,8,2)
VAR gesDBLP(d,8,1)
VAR gesDBMP(d,8,1)
VAR gesDBFP(d,8,1)
VAR gesDB1H(d,8,2)
VAR txtZeit(C,12,0)
VAR numStd(d,9,0)
VAR numMin(d,2,0)

gesDBL= $[recPOS.VKLOHN]  -  $[recPOS.EKLOHN]
gesDBM= $[recPOS.VKMAT]   -  $[recPOS.EKMAT]
gesDBF= $[recPOS.VKFREMD] -  $[recPOS.EKFREMD]
IF BOOL($[gesDBL] > 0)
   gesDBLP= 100 * ($[gesDBL] / $[recPOS.EKLOHN])
IF BOOL($[gesDBM] > 0)
   gesDBMP= 100 * ($[gesDBM] / $[recPOS.EKMAT])
IF BOOL($[gesDBF] > 0)
   gesDBFP= 100 * ($[gesDBF] / $[recPOS.EKFREMD])
IFNOT BOOL(($[recPOS.ZEIT] / 60.00) = (0))
   gesDB1H=($[gesDBL] + $[gesDBM]) / ($[recPOS.ZEIT] / 60.00)

numStd= $[recPOS.ZEIT] / 60.00
numMin= $[recPOS.ZEIT] - ( $[numStd] * 60 )
IF BOOL( $[numMin] < 0 )
   GOTO :MinusZeit
GOTO :Zeit_End
:MinusZeit
numStd= $[numStd] - 1
numMin= 60 + $[numMin]
:Zeit_End

txtZeit= $[numStd] : $[numMin]
IF BOOL( $[numMin] < 10 )
   txtZeit= $[numStd] : 0$[numMin]

OUT ##outLINE
OUT ##FussBericht
OUT ##FussZeile

:NoFuss
OUT ENDPAGE
OUT ENDJOB

:EOF_recBVZ



#end

#loopMAIN
* Wird fuer jeden Satz von recMAIN aufgerufen

IF BOOL( $[recPOS.SATZART] = 1 )
  LfdNrRoot=$[recPOS.LFDNR]

IF BOOL( ($[recPOS.EBENE] = $[AktEbene] ) & ($[recPOS.SATZART] > 0) )
  SUB #subPOS

#end

#CheckPage
* Fussbereich ausgeben, wenn letzte Zeile erreicht
IF BOOL($[Zeile] >= $[ZlMax])
   SUB #Fuss
* Kopfbereich ausgeben, wenn erste Zeile erreicht
IF BOOL($[Zeile] = 0)
   SUB #Kopf

#end

#Fuss
Zeile=$[ZlMax]+1
*OUT ##FussSeite
OUT ##FussZeile
OUT ENDPAGE
* naechste Seite anfangen
Seite=$[Seite]+1
Zeile=0
OUT STARTPAGE

#end

#Kopf
Zeile=0
OUT ##TitelZeile
*OUT ##KopfSeite
OUT ##KopfDetail
IF BOOL($[mSumme]=0)
   RETURN
*OUT ##Uebertrag

#end

##KopfBericht
* Berichtskopf erscheint auf der ersten Seite
CY=4
L= 0;0; 5;1;$[HDR08N];Kunde:
L=10;0;40;1;$[HDR08F];$[recADR.NAME1]
L=10;1;40;1;$[HDR08F];$[recADR.STRASSE]
L=10;2;40;1;$[HDR08F];$[recADR.PLZ<8] $[recADR.ORT]

L=52;0; 8;1;$[HDR08N];$[recBVZ.VORHABEN]:
L=60;0;40;1;$[HDR08F];$[recBVZ.BETREFF1]
L=60;1;40;1;$[HDR08F];$[recBVZ.BETREFF2]
L=60;2;40;1;$[HDR08F];$[recBVZ.BETREFF3]

L= 0;3;100;1; ;\-

#end

##KopfSeite
* Seitenkopf erscheint ab 2. Seite
CY=1
L=0;0;10;1;Arial,12,F;Liste
C=46;0;8;1;Arial,12,N;-$[Seite]-
R=85;0;15;1;Arial,12,N;$[Heute]

#end

##KopfDetail
CY=4
L= 0;0;10;1;$[HDR08F];Pos.
L= 0;1;10;1;$[HDR08F];Menge
L=43;0; 8;1;$[HDR08N];Lohn
L=43;1; 8;1;$[HDR08N];Mat.
R=51;0; 9;1;$[HDR08F];EK
R=60;0; 9;1;$[HDR08F];VK *)
R=69;0; 9;1;$[HDR08F];DB1
R=78;0; 6;1;$[HDR08F];% DB
R=84;0; 7;1;$[HDR08F];E-Zeit
R=84;1; 7;1;$[HDR08F];G-Zeit
R=91;0; 9;1;$[HDR08F];EP ($[recBVZ.WAEHRUNG])
R=91,0;1,0;9,0;1,0;$[HDR08F], 8,N;GP ($[recBVZ.WAEHRUNG])
L=0,0;3,0;100,0;1,0; ;\-
R=91,0;2,0;9,0;1,0;$[HDR08F], 8,N;DB/Std.

#end

##Uebertrag
* Das ist die Ausgabedefinition fuer den Uebertrag von vorher
CY=1
R=80;0;20;1;Times New Roman,12,F;Übertrag $[mSumme]

#end

##TitelZeile
* TODO: beschreiben Sie hier die Verwendung
CY=3

L= 0;0;100;1; ;\-

L= 0;1; 90;1;$[HDR08N];$[recEIG.NAME1], $[recEIG.STRASSE], $[recEIG.PLZORT]
R=90;1; 10;1;$[HDR08N];Seite -$[Seite]-

L= 0;2;100;1; ;\-

#end

##FussZeile
* TODO: beschreiben Sie hier die Verwendung
CY=2
L= 0;0;100;1; ;\-

L= 0;1; 65;1;$[HDR08N];Kalkulation $[recBVZ.BELARTTEXT] $[recBVZ.PRJNR]/$[recBVZ.BELEGART]/$[recBVZ.BELEGNR]
L=65;1; 20;1;$[HDR08N];*) Preis vor Rabatt
R=85;1; 15;1;$[HDR08N];Stand: $[Heute]

*L= 0;2;100;1; ;\-

#end

##outLstg
CY=4
L=0,0;1,0;10,0;1,0;$[DET08F];$[recPOS.POSNR]
R=0,0;2,0;6,0;1,0;$[DET08N];$[recPOS.MENGE]
L=6,0;2,0;4,0;1,0;$[DET08N]; $[recPOS.ME]
L=10,0;1,0;41,0;1,0;$[DET08N];$[recPOS.ARTNR] $[recPOS.KTXT1]
L=10,0;2,0;41,0;1,0;$[DET08N];$[recPOS.KTXT2]
L=10,0;3,0;41,0;1,0;$[DET08N], 8,N;$[recPOS.KTXT3]
R=51,0;1,0;9,0;1,0;$[DET08N];$[numEKLe]
R=51,0;2,0;9,0;1,0;$[DET08N];$[numEKMe]
R=60,0;1,0;9,0;1,0;$[HDR08N];$[numVKLe]
R=60,0;2,0;9,0;1,0;$[HDR08N];$[numVKMe]
R=69,0;1,0;9,0;1,0;$[DET08N];$[numDBLe]
R=69,0;2,0;9,0;1,0;$[DET08N];$[numDBMe]
R=78,0;1,0;6,0;1,0;$[DET08N];$[numDBLP]
R=78,0;2,0;6,0;1,0;$[DET08N];$[numDBMP]
R=84,0;1,0;7,0;1,0;$[DET08N];$[numZEITe]
R=84,0;2,0;7,0;1,0;$[DET08N];$[txtGZeit]
R=91,0;1,0;9,0;1,0;$[DET08N];$[recPOS.EPPOS]
R=91,0;2,0;9,0;1,0;$[DET08N];$[txtABSGP]
R=91,0;3,0;9,0;1,0;$[DET08N], 8,N;$[txtDB1H]

#end

##outTitelStart
* TODO: beschreiben Sie hier die Verwendung
CY=1
L= 0;0;10;1;$[DET08F];$[recTIT.POSNR]
L=10;0;41;1;$[DET08F];$[recTIT.KTXT1]


#end

##outTitelEnde
CY=3
L= 0;0;10;1;$[DET08F];Titelsumme
L= 0;1;10;1;$[DET08N];$[recTIT.POSNR]
L=10;0;33;1;$[DET08N];$[recTIT.KTXT1]
L=43;0; 8;1;$[HDR08N];Lohn
L=43;1; 8;1;$[HDR08N];Mat.
L=43;2; 8;1;$[HDR08N];Fremdanteil
R=51;0; 9;1;$[HDR08F];$[recTIT.EKLOHN]
R=51;1; 9;1;$[HDR08F];$[recTIT.EKMAT]
R=51;2; 9;1;$[HDR08F];$[recTIT.EKFREMD]
R=60;0; 9;1;$[HDR08F];$[recTIT.VKLOHN]
R=60;1; 9;1;$[HDR08F];$[recTIT.VKMAT]
R=60;2; 9;1;$[HDR08F];$[recTIT.VKFREMD]
R=69;0; 9;1;$[HDR08F];$[DBL]
R=69;1; 9;1;$[HDR08F];$[DBM]
R=69;2; 9;1;$[HDR08F];$[DBF]
R=78;0; 6;1;$[HDR08F];$[DBLP]
R=78;1; 6;1;$[HDR08F];$[DBMP]
R=78;2; 6;1;$[HDR08F];$[DBFP]
R=84;0; 7;1;$[HDR08F];$[txtZeit]
R=91,0;2,0;9,0;1,0;$[DET08F];$[DB1H]
R=91,0;1,0;9,0;1,0;$[DET08F];$[recTIT.ABSGP]

#end

##outLINE
* TODO: beschreiben Sie hier die Verwendung
CY=1
L= 0;0;100;1; ;\-

#end

##FussBericht
CY=3
L= 0;0;40;1;$[HDR08F];Summe Einzelleistungen
L= 0;1;40;1;$[HDR08F];$[recBVZ.BELARTTEXT] Nr. $[recBVZ.BELEGNR]
L=43;0; 8;1;$[HDR08N];Lohn
L=43;1; 8;1;$[HDR08N];Mat.
L=43;2; 8;1;$[HDR08N];Fremdanteil
R=51;0; 9;1;$[HDR08F];$[recPOS.EKLOHN]
R=51;1; 9;1;$[HDR08F];$[recPOS.EKMAT]
R=51;2; 9;1;$[HDR08F];$[recPOS.EKFREMD]
R=60;0; 9;1;$[HDR08F];$[recPOS.VKLOHN]
R=60;1; 9;1;$[HDR08F];$[recPOS.VKMAT]
R=60;2; 9;1;$[HDR08F];$[recPOS.VKFREMD]
R=69;0; 9;1;$[HDR08F];$[gesDBL]
R=69;1; 9;1;$[HDR08F];$[gesDBM]
R=69;2; 9;1;$[HDR08F];$[gesDBF]
R=78;0; 6;1;$[HDR08F];$[gesDBLP]
R=78;1; 6;1;$[HDR08F];$[gesDBMP]
R=78;2; 6;1;$[HDR08F];$[gesDBFP]
R=84;0; 7;1;$[HDR08F];$[txtZeit]
R=91,0;2,0;9,0;1,0;$[DET08F];$[gesDB1H]
R=91;1; 9;1;$[DET08F];$[recPOS.ABSGP]

#end

#subPOS
* Unterprogramm Positionsausgabe allgemein

* Ebenencheck
IF BOOL($[recPOS.EBENE] > $[AktEbene])
  RETURN

* Position ist ein Titel
IF BOOL($[recPOS.SATZART] = 4)
  SUB #subTitel

* Position ist eine Position
IF BOOL($[recPOS.EBENE] > $[PosEbene])
  RETURN

* Position ist ein Paket oder Leistung
IF BOOL( ($[recPOS.SATZART] = 7) | ($[recPOS.SATZART] = 6) )
  SUB #subLstg


#end

#subTitel
* TODO: beschreiben Sie hier die Verwendung

* Trickreich recPOS nochmals local anlegen
* als recTIT
* sich selbst und Unterpositionen ausgeben

REC recTIT(BELEGPOSITIONEN,0,24)$[FltKey<18]$[recPOS.LFDNR<6]
SUB #CheckPageTitel
OUT ##outTitelStart

REC recPOS(BELEGPOSITIONEN,0,18)$[FltKey<18]
SEEK recPOS($[recTIT.LFDNR<6])
IF EOF(recPOS)
  GOTO :NoPos
SKIP recPOS
IF EOF(recPOS)
  GOTO :NoPos
AktEbene=$[AktEbene] + 1
LOOP recPOS(#loopMAIN_UP)
AktEbene=$[AktEbene] - 1

:NoPos

VAR DBL(d,8,2)
VAR DBM(d,8,2)
VAR DBF(d,8,2)
VAR DBLP(d,8,1)
VAR DBMP(d,8,1)
VAR DBFP(d,8,1)
VAR DB1H(d,8,2)
VAR txtZeit(C,12,0)
VAR numStd(d,9,0)
VAR numMin(d,2,0)
DBL=$[recTIT.VKLOHN] - $[recTIT.EKLOHN]
DBM=$[recTIT.VKMAT]  - $[recTIT.EKMAT]
DBF=$[recTIT.VKFREMD]- $[recTIT.EKFREMD]

numStd= $[recTIT.ZEIT] / 60.00
numMin= $[recTIT.ZEIT] - ( $[numStd] * 60 )
IF BOOL( $[numMin] < 0 )
   GOTO :MinusZeit
GOTO :Zeit_End
:MinusZeit
numStd= $[numStd] - 1
numMin= 60 + $[numMin]
:Zeit_End

txtZeit= $[numStd] : $[numMin]
IF BOOL( $[numMin] < 10 )
   txtZeit= $[numStd] : 0$[numMin]

IF BOOL($[DBM] > 0)
   DBMP= 100 * ($[DBM] / $[recTIT.EKMAT])
IF BOOL($[DBL] > 0)
   DBLP= 100 * ($[DBL] / $[recTIT.EKLOHN])
IF BOOL($[DBF] > 0)
   DBFP= 100 * ($[DBF] / $[recTIT.EKFREMD])
IFNOT BOOL(($[recTIT.ZEIT] / 60.00) = (0))
   DB1H= ($[DBM] + $[DBL]) / ($[recTIT.ZEIT] / 60.00)

OUT ##outLINE
SUB #CheckPage
OUT ##outTitelEnde
IF BOOL($[AktEbene] < 3)
  OUT ##outLINE

#end

#subLstg
* Ausgabe Leistung oder Paket

* Datensatz PREISEINHEITEN
REC recPE(PREISEINHEITEN,0,2)$[recPOS.PE>2]

VAR txtGZeit(C,12,0)
VAR txtABSGP(C,14,0)
VAR txtDB1H(C,14,0)
VAR numDB1H(d,8,2)
VAR numZEIT(d,8,2)
VAR numEKL(d,8,2)
VAR numEKM(d,8,2)
VAR numVKL(d,8,2)
VAR numVKM(d,8,2)
VAR numDBL(d,8,2)
VAR numDBM(d,8,2)
VAR numDBLP(d,8,1)
VAR numDBMP(d,8,1)
VAR numGeb(d,8,3)
VAR numZEITe(d,8,2)
VAR numEKLe(d,8,2)
VAR numEKMe(d,8,2)
VAR numVKLe(d,8,2)
VAR numVKMe(d,8,2)
VAR numDBLe(d,8,2)
VAR numDBMe(d,8,2)
VAR numStd(d,9,0)
VAR numMin(d,2,0)

*------------------ Materialdaten berechnen
numGeb=  $[recPOS.GEBINDE]* $[recPE.FAKTOR]
numVKM=  $[recPOS.VKMAT]  * $[recPOS.MENGE]
numEKM=  $[recPOS.EKMAT] + $[recPOS.EKNE] + $[recPOS.EKZUBE]
numEKM=  $[numEKM] * $[recPOS.ABSMENGE]
IF BOOL($[numGeb] > 0)
  numEKM= $[numEKM] / $[numGeb]
numDBM=  $[numVKM] - $[numEKM]
IF BOOL($[numVKM])
   numDBMP= 100 * ($[numDBM] / $[numEKM])

*------------------ Lohndaten berechnen
numZEIT= $[recPOS.ZEIT]   * $[recPOS.ABSMENGE]
numEKL=  $[numZEIT]       * $[recPOS.MITTELLOHN]
IF BOOL($[recPOS.OldMLohn])
  numEKL= $[numEKL] / 60.00
numVKL=  $[recPOS.VKLOHN] * $[recPOS.MENGE]
numDBL=  $[numVKL] - $[numEKL]

IF BOOL($[numVKL])
   numDBLP= 100 * ($[numDBL] / $[numEKL])

*------------------ DB1 je Stunde berechnen
IF BOOL(($[numZEIT] / 60.00) = (0))
  GOTO :NoDb1H
numDB1H=($[numDBL] + $[numDBM]) / ($[numZEIT] / 60.00)
txtDB1H=$[numDB1H]
:NoDb1H

IF BOOL($[recPOS.BEDARF] | $[recPOS.ALTERNATIV] | $[recPOS.ENTFAELLT])
  txtABSGP=N E P
ELSE
  txtABSGP=$[recPOS.ABSGP]

*==== Einzelwerte berechnen
IF BOOL(($[recPOS.Menge]) = (0))
  GOTO :Kond_C232_end


numStd= $[numZEIT] / 60.00
numMin= $[numZEIT] - ( $[numStd] * 60 )
IF BOOL( $[numMin] < 0 )
   GOTO :MinusZeit
GOTO :Zeit_End
:MinusZeit
numStd= $[numStd] - 1
numMin= 60 + $[numMin]
:Zeit_End

txtGZeit= $[numStd] : $[numMin]
IF BOOL( $[numMin] < 10 )
   txtGZeit= $[numStd] : 0$[numMin]


numZEITe= $[numZEIT] / $[recPOS.Menge]
numEKLe=  $[numEKL]  / $[recPOS.Menge]
numEKMe=  $[numEKM]  / $[recPOS.Menge]
numVKLe=  $[numVKL]  / $[recPOS.Menge]
numVKMe=  $[numVKM]  / $[recPOS.Menge]
numDBLe=  $[numDBL]  / $[recPOS.Menge]
numDBMe=  $[numDBM]  / $[recPOS.Menge]

:Kond_C232_end


SUB #CheckPagePos
OUT ##outLstg

#end

#CheckPagePos
* TODO: beschreiben Sie hier die Verwendung

* Fussbereich ausgeben, wenn letzte Zeile erreicht
IF BOOL($[Zeile] >= ($[ZlMax]-1))
   SUB #Fuss
* Kopfbereich ausgeben, wenn erste Zeile erreicht
IF BOOL($[Zeile] = 0)
   SUB #Kopf

#end

#CheckPageTitel
* Fussbereich ausgeben, wenn letzte Zeile erreicht
IF BOOL($[Zeile] >= ($[ZlMax]-6))
   SUB #Fuss
* Kopfbereich ausgeben, wenn erste Zeile erreicht
IF BOOL($[Zeile] = 0)
   SUB #Kopf


#end

#loopMAIN_UP
* Positionsschleife, bis aktuelle Ebene zurueckgeht

IF BOOL( ($[recPOS.EBENE] = $[AktEbene] ) & ($[recPOS.SATZART] > 0) )
  SUB #subPOS

IF BOOL( $[recPOS.EBENE] < $[AktEbene] )
  BREAK recPOS


#end

