tinouheb team mailing list archive
-
tinouheb team
-
Mailing list archive
-
Message #00049
Test auf Überschneidung bei Besuchszeiten
Hallo Tinyheber,
jetzt, wo bei allen Besuchen die Anfangs und Endzeiten der Besuche
angegeben werden müssen, hat sich bei uns herausgestellt, dass es ganz
hilfreich ist, wenn man die Zeiten auf Überschneidungen prüfen kann.
Vielleicht kommt es wegen Tippfehlern oder aus anderen Gründen zu
Überschneidungen.
Ich habe ein kleines Script geschrieben das eine Liste aller Besuchsdaten
und Zeiten erstellt und auf solche Fehler hinweist. Ich benutze
Linux und habe keine Ahnung von Windows, weiss also nicht, wie man
das für Windows anpassen kann. Linux Nutzer können es unverändert laufen
lassen. Bei mir läuft es als root wegen des Zugriffs auf die Datenbank.
Gebraucht werden die GNU Utilities grep, sort und awk
Im Script steht in Zeile 11 das Datum (20160101 = 01,01,2016). Alle in der
Datenbank von TinyHeb vorhandenen Besuchsdaten werden ab diesem Datum
ausgelesen und erscheinen dann in der Liste.
Damit bereits bezahlte Rechnungen nicht auch noch gelistet werden, kann
man die Namen dieser Fälle in das File 'erledigt.lst' eintragen. Dieses
File muss existieren, darf aber auch leer sein.
Wenn es nicht leer ist, steht in jeder Zeile ein Name, auch mit
Leerzeichen oder Bindestrich:
Merkel
Dobrind
Seehofer
Schulz
Scholz
usw.
Die Liste (Liste.txt), die schliesslich herauskommt besteht aus Zeilen wie
diesen (Datum, Anfangszeit, Endzeit des Besuchs):
2016-01-02 16:00:00 16:45:00 Merkel
2016-01-04 14:00:00 14:45:00 Dobrind
2016-01-04 17:00:00 18:00:00 Merkel
2016-01-05 18:00:00 19:00:00 Scholz
Das File (Fehlerliste.txt), in dem auf Überschneidungen hingewiesen wird,
sieht so aus:
Fehler bei 2017-05-06 13:00:00
Hoffentlich kommt das Attachment mit an.
Vielleicht kann ja jemand das gebrauchen, hier jedenfalls ist es ganz
nützlich.
Gruss
Rolf
# Hebammen-Besuchszeiten auf Überschneidung testen:
#
# ------------------- HIERBEI IST HANDARBEIT NÖTIG --------------------
# ---- um die Liste mit Namen bereits erledigter Fälle zu erstellen ---
#
# FK_STAMMDATEN ist die ID, die später durch den Namen ersetzt wird
mysql -e"
use PRD_Hebamme;
select DATUM, ZEIT_VON, ZEIT_BIS, FK_STAMMDATEN from Leistungsdaten where
DATUM > 20160101;" > Zeit.tmp
# Die Daten ab dem hier angegebenen Datum (01.01.2016) werden berücksichtigt
# Überschriftszeile entfernen
grep -v DATUM Zeit.tmp > Zeit.txt
# nach Anfangszeit (2. Spalte) sortieren
sort -k 2 Zeit.txt > Zeit-sort-2.txt
# Einträge mit Anfangszeit 00:00:00 löschen
grep -v 00:00:00 Zeit-sort-2.txt > Zeit-clean-2.txt
# dann nach Datum (1. Spalte) sortieren
sort Zeit-clean-2.txt > Zeit-sort-1.txt
# -------------------------------------------------------------------------
# erzeugt Liste aller IDs und Nachnamen
mysql -e"
use PRD_Hebamme;
select ID, NACHNAME from Stammdaten" > Namen-ID.lst
# --------------------------------------------------------------------------
# sucht zu gegebenen IDs aus vorher erzeugter Liste die Nachnamen
grep "$(cat Zeit-sort-1.txt | awk '{print $4}')" Namen-ID.lst > ID-Namen
# --------------------------------------------------------------------------
# ersetzt in Zeit-sort-1.txt IDs durch die Namen aus ID-Namen
awk -F "[\t]" 'FNR==NR{a[$1]=$2;next} {for (i in a)sub(i, a[i]);print}' ID-Namen Zeit-sort-1.txt > Liste-aller.txt
# --------------------------------------------------------------------------
# ------------------ Hier kommt die Handarbeit -----------------------------
# entfernt die Namen bereits erledigter Fälle. Muss von Hand erstellt werden
# und heisst hier 'erledigt.lst' und kann auch leer sein
# in 'Liste.txt' stehen dann zeitlich sortiert alle Besuchszeiten mit den Namen
# bei denen eine Anfangszeit eingetragen ist
grep -Fvf erledigt.lst Liste-aller.txt > Liste.txt
# tempräre Files löschen
rm ID-Namen Liste-aller.txt Namen-ID.lst Zeit-sort-1.txt Zeit-sort-2.\
txt Zeit.txt Zeit.tmp
# Damit man Überschneidungen nicht von Hand in der Liste suchen muss,
# geht es jetzt wieder weiter mit awk
# ---------------------------------------------------------------------------
# um mit awk Überlappungen zu finden muss aus Liste.txt Liste-2.txt generiert
# werden. Daraus dann Liste-2-mktime.txt, um alle Felder in eine Zeile zu
# bringen. Die Eingabe für mktime muss aus durch Leerraum getrennten Angaben
# Jahr Monat Tag Std Min Sek bestehen, also - und : entfernen.
cat Liste.txt | sed 's/-/ /'g | sed 's/:/ /'g > Liste-2.txt
# dann wird die Zeitangabe zur Unix Zeit (Sekunden seit 01.01.1970) gewandelt
awk -F"[\t]" 'BEGIN {ORS=" "}{print mktime ($1" "$2)} {print mktime ($1" "$3)}' Liste-2.txt > Liste-2-mktime.txt
# daraus wird ein File erstellt, in dem Anfangs und Endzeiten verglichen werden
# Ist die Anfangszeit später oder gleich der vorangehende Endzeit, wird "Fehler ?"
# ausgegeben. Allerdings passiert das auch bei fehlender Zeitangabe (00:00:00)
# deshalb sind zuvor alle Einträge mit Anfangszeit 00:00:00 entfernt worden.
# Die Zeitangabe in Sekunden wird nun wieder in lesbare Form gebracht
# hier wird in 'Fehlerliste.txt' jeweils eine der fehlerhaften Zeitangaben
# ausgegeben
awk '{for (i=2; i<NF; ++i) {s=$i; e=$(i+1);if (s >= e) print \
"Fehler bei "strftime("%Y-%m-%d %H:%M:%S", (e))}}' \
Liste-2-mktime.txt > Fehlerliste.txt
# und aufräumen
rm Liste-2-mktime.txt Liste-2.txt Zeit-clean-2.txt
chown rolf.users *
Möller
Meier
Schulz
Nahles
Merkel
Scholz
Pofalla
Mutter Theresa