SQLite - Amateurfunk-Station DK1IO

Direkt zum Seiteninhalt

Hauptmenü

SQLite

SQLite ist eine textbasierte Datenbank. Sie ist schlank und schnell; und außerdem ist sie kostenlos. Damit lassen sich alle denkbaren Datenbankanwendungen realisieren.
Bei der Übernahme von Daten in eine Datenbank müssen diese in Stringform vorliegen. Numerische Daten sind also in Strings umzuwandeln.
Echte Strings sind in einfache Anführungszeichen einzufassen, bei in Strings umgewandelte numerische Daten entfällt das.

Log-Datenbank

Tabellen
Die Daten einer Datenbank sind in einer oder mehreren Tabellen gespeichert. Die wichtigste und umfangreichste Tabelle ist die Log-Tabelle, in der die relevanten QSO-Daten enthalten sind. Warum es erforderlich sein kann, Daten in anderen Tabellen abzulegen, soll folgendes Beispiel verdeutlichen.
Eine oder mehrere Tabellen?
Für eingehende SWL-Berichte hatte ich in der Log-Tabelle entprechende Spalten angelegt. Das funktionierte so lange gut, bis ich für ein QSO einen zweiten SWL-Bericht erhalten habe.
Diesen konnte das System nicht verarbeiten.
Also habe ich eine SWL-Tabelle angelegt, in der SWL-Rufzeichen, Datum und UTC abgespeichert werden. Zur Verknüpfung mit dem Ursprungs-QSO in der Log-Tabelle dienen Datum/UTC.
In der Log-Tabelle existiert eine Spalte "SWL", die bei Ankreuzen aussagt, dass ein oder mehrere SWL-Berichte für dieses QSO vorliegen.
Log-Tabelle
Wieviele Spalten diese Tabelle hat, hängt von den persönlichen Vorlieben des Operators ab. Das ist auch bei mir der Fall.
Neben den Daten der Gegenstation gibt es Spalten für den eigenen Locator, die eigenen Referenzen für COTA, ETPA und SOTA sowie für Prefix (bei Auslandaktivitäten) und "/m" bzw. "/p" Zusätze.
Für das benutzte eigene Rufzeichen gibt es auch eine Spalte, denn neben "DK1IO" kann ich auch das Klubrufzeichen unseres OV benutzen, "DL0NRU". Und für fast ein Jahr hatte ich das Sonderrufzeichen "DL100OUI" zu Verfügung.
Neuerdings habe ich auch ein Ausbildungsrufzeichen zur Verfügung, "DN3IO".
Aus Platzgründen werden statt der einzelnen Rufzeichen die Buchstaben "A", "B", "C" und "D" verwendet.
Prefix-Tabelle
Diese Tabelle ermöglicht es, aus dem Rufzeichen der Gegenstation das Land zu ermitteln.
Grundlage dafür ist Prefixzuteilung der ITU. Damit ist sichergestellt, dass auch Sonderrufzeichen einem Land zugeordnet werden können.
Es gibt jedoch Problemfälle, bei denen das nicht so ohne Weiteres möglich ist:
    -der Prefix "GB" wird im Vereinigten Königreich an alle britischen "Funkländer" vergeben. Eine Zuordnung zu
     einem Land ist nur mit dem QSO-Text oder Internet-Recherche möglich.
    -bei SWL-Rufzeichen wird die ITU-Konvention nicht immer eingehalten, so z. B. "NL" für die Niederlande.
     Der Rufzeichenblock "N" ist jedoch den USA zugeteilt. Dieses Problem kann aber programmtechnisch gelöst
     werden.
In der Prefix-Tabelle sind noch Informationen über die DXCC-Nr, die Kontinentzugehörigkeit und die Zeitzone enthalten.
Power-Tabelle
In meiner Heimstation wird ab einer Leistung von 50W die PA zugeschaltet. In der Tabelle sind die Werte der Steuerleistungen für die in Stufen veränderbaren Ausgangsleistungen enthalten.
Band-Freq-Tabelle
Diese Tabelle enthält die für die einzelnen Bänder in den jeweiligen Betriebsarten vorgesehenen Frequenzen.
Sie kann auch für die Konversion Frequenz <-> Band verwendet werden.
Speichertext-Tabelle
Hier sind die Standardtexte für CW und PSK gespeichert, die durch Buttonklick abgerufen werden.
Start-Tabelle
In dieser Tabelle gibt es nur eine Zeile. Die Spalten enthalten Daten für die Initialisierung des Funkgerätes sowie für bestimmte Aktivitäten.

SQLite Expert
Ein sehr nützliches Werkzeug für den Umgang mit SQLite-Datenbanken ist SQLite Expert. Damit kann man Datenbanken anlegen und verwalten.
In der Personal Edition ist SQLite Expert auch kostenlos. Kann ich allen SQLite-Nutzern nur empfehlen.



In SQLite Expert kann man direkt SQL-Abfragen eingeben und ausführen. Oder eine neue Tabelle erstellen.
Wenn man, aus welchen Gründen auch immer, ein QSO nachträglich eingibt, passt das nicht in die zeitliche Reihenfolge, denn neue Datensätze werden am Tabellenende angefügt.
Wer nun in der Logtabelle die zeitliche Reihenfolge gewahrt haben möchte, kann eine neue Tabelle anlegen, in der diese Bedingung erfüllt ist.
Ist ganz einfach:      
CREATE TABLE Tab_Log1 AS SELECT * FROM Tab_Log ORDER BY Datum, UTC.
Damit wird aus der Logtabelle
Tab_Log eine neue Tabelle Tab_Log1 generiert, die nach Datum und UTC sortiert ist. Wenn man die neue Tabelle für gut befunden hat, kann die alte gelöscht werden und Tab_Log1 in Tab_Log umbenannt werden.
Es ist empfehlenswert, danach
VACUUM auszuführen, um ein Aufblähen der Datenbank zu vermeiden.

Abfragen
Abfragen sind das Salz in der Datenbanksuppe. Damit können Daten aus verschiedenen Tabellen verknüpft und angezeigt werden.
Eine einfache Abfrage sieht prinipiell so aus:   
SELECT Spaltenauswahl FROM Tabelle WHERE Bedingung
Spaltenauswahl
bestimmt die Anzahl der Ergebnispalten und steht für einzeln genannte Spalten, getrennt durch Komma,  oder * für alle Spalten der Tabelle.
Bedingung bestimmt die Anzahl der Ergebniszeilen. Es können mehrere Bedingungen eingesetzt werden, vebunden durch AND oder OR.
Fehlt
WHERE Bedingung, werden alle Zeilen der Tabelle angezeigt.
Um z. B. aus der Logtabelle alle QSOs mit deutschen Stationen anzuzeigen, kann folgende Abfrage gestartet werden:
                                                                 
SELECT * FROM Tab_Log WHERE DXCC = 230




Wer nur die Anzahl der QSOs mit deutschen Stationen wissen möchte, startet diese Abfrage:
                                                                     
SELECT COUNT(*) FROM Tab_Log WHERE DXCC = 230



Es erscheint nur eine Zeile mit dem Ergebnis.
In dieser Zahl sind natürlich auch Doppel-QSOs enthalten.
Um die Anzahl der unterschiedlichen deutschen Stationen zu erhalten, muss die SQL-Anweisung so aussehen:
                                                                     
SELECT COUNT(DISTINCT Rufzeichen) FROM Tab_Log WHERE DXCC = 230



Jetzt noch ein Beispiel für die Verknüpfung von zwei Tabellen. Es soll ermittelt werden, wieviele der Stationen der letzten Abfrage Mitglied im EPC sind.
                                                                      
SELECT COUNT(*) FROM
                                                                      (SELECT DISTINCT Rufzeichen FROM Tab_Log WHERE DXCC = 230) AS A,
                                                                      (SELECT Rufzeichen FROM Tab_EPC_Members) AS B
                                                                      ON A.Rufzeichen = B.Rufzeichen
   


Jetzt noch ein Beispiel für die Outdoorleute, die Digimodes betreiben. Wenn man z. B. SOTA gemacht hat, möchte man ja die QSOs, die wahrscheinlich auf einem Tablet oder Laptop gespeichert sind, in das Hauptlog der Heimstation übernehemn.
Dafür gibt zwei Möglichkeiten:
1. Man kopiert die mobile/portable Datenbank auf einen USB-Speicherstick
2. Man meldet beide Computer in einer Heimnetzgruppe an
Das weitere Vorgehen ist für beide Varianten gleich:
Zusätzlich zu der Heimdatenbank wird unter dem Menüpunkt "File" die mobil/portabel-Datenbank mit <Open Database> oder <Open Recent Database> geöffnet (Recent steht für kürzlich schon geöffnet).
Die m/p-Datenbank markieren und eine Abfrage (nach Klick auf SQL) eintippen, z. B.
                                
SELECT * FROM Tab_Log WHERE Datum = '2017-11-23'
Dann werden alle QSOs des betreffenden Datums angezeigt. Diese Zeilen markieren und nach Rechtsklick mit <Copy Records> in die Zwischenablage kopieren.
Anschließend die Logtabelle in der Heimdatenbank markieren, zum letzten Datensatz springen, mit Klick auf <+> einen neuen (leeren) Datensatz einfügen, diesen markieren und nach Rechtsklick mit <Paste Records> die in der Zwischenablage gespeicherten Zeilen einfügen.
Nach Klick auf "OK" dauert es einen Moment, dann sind die Datensätze übernommen.

Neben den vom Benutzer angelegten Spalten einer Datenbanktabelle gibt es noch eine Spalte, die von
SQLite angelegr wird: rowid. Es werden alle Zeile einer Tabelle durchnumeriert, beginnend mit 1.Das kann man sich für verschiedene Zwecke zu Nutze machen.
Ich ziehe es vor, bei Datumsanzeigen statt der numerischen Monatsanzeige den abgekürzten Monatsnamen anzuzeigen,
z. B. "7 Sep 2019" statt "7.9.2019". In einer neuen oder vorhandenen Tabelle mit mindestens 12 Zeilen wird eine zusätzliche Spalte eingerichtet, in die die Monate eingetragen werden, "Jan" in Zeile 1 und "Dez" in Zeile 12. Mit der Abfrage
                                
SELECT Monat FROM Tab_XXX WHERE rowid = Monatszahl
wird eine Konversion von Monatszahl in Monatsnamen erreicht.
Außerdem benutze ich
rowid für die Auswahl von Werten mit dem Mausrad, z. B. Band und Leistung.
Es ließen sich noch viele Beispiele anführen, die gezeigten sollten aber ausreichen, um das Interesse für die Beschäftigung mit Datenbanken zu wecken.

Zurück zum Seiteninhalt | Zurück zum Hauptmenü