8.13 Rechnungsschreibung Aufgabenstellung
Eingabedaten
$ cat awk_rechn_dat
100,Schrauben,0.05
20,Bretter,3.89
10,Bohrer,5.85
end
200,Metallschrauben,0.07
50,Winkeleisen,4.6
$ cat awk_rechn_ausg
25.02.97 000001 21.20 162.50
25.02.97 000002 36.60 280.60
$cat awk_rechn_next
3
***** RECHNUNG *****
DATUM : 25.02.97
RECHNUNGSNR: 93
LFDNR STÜCK BEZEICHNUNG E-PREIS BETRAG
1 : 100 Schrauben 0.05 5.00
2 : 20 Bretter 3.89 77.80
3 : 10 Bohrer 5.85 58.50
________________
Zwischensumme : 141.30
Mehrwertsteuer : 21.20
________________
Gesamtsumme : 162.50
***** RECHNUNG *****
DATUM : 25.02.97
RECHNUNGSNR: 94
LFDNR STÜCK BEZEICHNUNG E-PREIS BETRAG
1 : 200 Metallschrauben 0.07 14.00
2 : 50 Winkeleisen 4.60 230.00
________________
Zwischensumme : 244.00
Mehrwertsteuer : 36.60
________________
Gesamtsumme : 280.60
8.13.1 Rechnungschreibung Lösung
#! /bin/ksh
# ---------------------------------------------------------------------------------
# Erzeugt : 25.02.97
# Autor : Detlef Hahn
# Beschreibung : Das Script erzeugt aus einer Datendatei eine Rechnung
# Die Daten liegen in folgender Form vor
# Menge,Artikelbezeichnung,E-Preis
# Trennzeichen ist das Komma
# ----------------------------------------------------------------------------------
# Modif.Log :
#_=============================================================
FPATH=/usr/local/lib/func_lib:/home/hahn/lib/func_lib
autoload kopf pos prompt_jn
# ----------------------------------------------------------------------------------
# Definieren Sie nachfolgend Ihre eigenen Funktionen
# ----------------------------------------------------------------------------------
# ----------------------------------------------------------------------------------
# Mainscript awk_rechnung
# ----------------------------------------------------------------------------------
kopf
awk -f awk_rechn awk_rechn.dat
BEGIN { summe=0 ; zwsumme=0; MWST=15; pos = 0 ;
FS="," # Fieldseparator auf Komma setzen
datum=strftime("%d.%m.%y",systime()) # Tagesdatum
getline renr < "awk_rechn_next" # renr= system(cat awk_rechn_last)
}
/^end/ { abschl() # Rechnungsummen ausgeben
next # nächsten Satz lesen
}
{ # gilt für alle Eingabezeilen
pos++ # Posten hochzählen
if (pos == 1) # wenn 1. Posten dann Kopfzeilen
rechn_kopf() # ausgeben
split($0,zeile) # Splitt Eingabe nach Zeile
wert = zeile[1] * zeile[3] # Index läuft ab 1
# geht natürlich auch über $1 * $3
printf("%3d : %5d %-20s %7.2f %9.2f\n",pos, $1, $2, $3, wert)
zwsumme += wert # Zwischensumme bilden
}
END { if (pos > 0 ) # wenn letzte Rechnung nicht durch end
abschl() # abgeschlossen ist, dann Abschluß
print renr > "awk_rechn_next" # Der Dateiname muß gequoted werden,
# da er sonst vom awk als Variable
# interpretiert wird
}
function rechn_kopf()
{ printf("\f\t\t***** RECHNUNG ***** \n")
printf("\t\t\t\t DATUM : %s\n", datum)
printf("\t\t\t\t RECHNUNGSNR: %8d\n\n", renr)
printf("LFDNR STÜCK BEZEICHNUNG \t\tE-PREIS BETRAG\n")
}
function abschl()
{ mwst = (zwsumme * MWST) / 100
gsumme = zwsumme + mwst
printf "%40s________________\n"," "
printf "%29s Zwischensumme : %9.2f\n"," ",zwsumme
printf "%29s Mehrwertsteuer : %9.2f \n"," ",mwst
printf "%40s________________\n"," "
printf "%29s Gesamtsumme : %9.2f \n"," ",gsumme
total_mwst += mwst # Totalsumme MWST bilden
total_summe+= gsumme # Totalsumme
# Satz für Rechnungsausgangsjournal schreiben
printf "%8s %06d %9.2f %9.2f\n", datum, renr, mwst, gsumme >>
"awk_rechn_ausg"
zwsumme = 0
gsumme = 0
renr++ # erhöhen für nächste Rechnung
pos = 0 # zurücksetzen Postenzähler
}