← Back to team overview

tinouheb team mailing list archive

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