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 }