<?xml version="1.0" encoding="UTF-8"?>
<chapter id="details.database">
<chapterinfo>
  <authorgroup>
    <author
>&Tony.Bloomfield; &Tony.Bloomfield.mail;</author>
  </authorgroup>
  <date
>2011-07-21</date>
  <releaseinfo
>4.6</releaseinfo>
</chapterinfo>

<title
>Datenbank</title>

<sect1 id="details.database.usage">
<title
>Relationale Datenbank verwenden</title>

<sect2>
<title
>Einleitung</title>
<para
>Seit der Version 1.0 ermöglicht es &kappname;, Ihre Daten in einer relationalen Datenbank zu speichern. Ein Vorteil der Nutzung dieses Industriestandards ist, dass Sie mit anderen Softwareprodukten auf Ihre Daten zugreifen und sie visualisieren können, z.B. mit OpenOffice<trademark class="copyright"
></trademark
> oder LibreOffice<trademark class="copyright"
></trademark
>, vielleicht in einem Format, das &kappname; derzeit noch nicht bietet. Ein wenig SQL-Kenntnisse (SQL - Structured Query Language, die weltweit verwendete Standardsprache, um auf relationale Datenbanken zuzugreifen) sollten es Ihnen erleichtern, Ihre Daten zu externen Programm zu exportieren, &eg; zu Budgetierungs-Programmen. </para>
<para/>
</sect2>

<sect2
><title
>Vorbereitung</title>

<para
>Um auf die Datenbank zuzugreifen, nutzt &kappname; das SQL-Modul der &Qt; Software als Teil der &Qt;-Bibliotheken. Dieses Modul unterstützt diverse Datenbanksysteme durch eine Auswahl an Datenbanktreibern. Für verbreitete Open-Source Systeme sind diese Treiber verfügbar: MySQL<trademark class="registered"
></trademark
>, SQLite (Nur Version 3 und höher) und PostgreSQL. Das Modul unterstützt ebenso größere, vorwiegend in der Industrie genutzte Systeme, wie Oracle<trademark class="registered"
></trademark
> und IBM DB2<trademark class="registered"
></trademark
>. </para>

<para
>Mit Ausnahme von SQLite arbeiten alle Systeme nach dem Client/Server Modell, wobei die Client-Software auf "Ihrer" Maschine läuft, während der Server auf der gleichen Maschine läuft wie die eigentliche Datenbank, welche aber auch irgendwo anders im Netzwerk platziert werden kann. Natürlich wird Ihr Computer bei &kappname; als "Persönlicher Finanzmanager" in einem normalen Szenario sowohl als Server, als auch Client fungieren. Nachdem Sie sich für ein Datenbankprodukt entschieden haben, ist der Schritt die Installation die Installation der Client und i.d.R. auch Server-Software. </para>

<para
>Zusätzlich zur eigentlichen Datenbanksoftware müssen Sie das entsprechende &Qt;-Treibermodul installieren. Die meisten Distributionen bieten passende Treibermodule für die bekannten Datenbanken an. Ansonsten schauen Sie auf die <ulink url="http://qt-project.org"
>&Qt;-Software-Webseite</ulink
> und suchen Sie dort nach SQL-Treibern. </para>

<note>
  <para
>SQLite arbeitet nicht nach dem Client-/Server-Modell. Jede Datenbank befindet sich in einer herkömmlichen Datei, lokal oder in einem Netzwerk, auf die über die normalen Dateizugriffsfunktionen des Betriebssystem zugegriffen wird. In diesem Fall ist nur ein Softwarepaket und der Datenbanktreiber zu installieren. Weiterhin sind einige der nachfolgenden Informationen, speziell zur Administration, nicht für SQLite relevant. </para>
</note>
</sect2>

<sect2>
<title
>Verwaltung</title>

<para
>Datenbanken sind etwas komplexer als die Verwendung einfacher Dateien. Jedes System hat unterschiedliche Methoden zur Verwaltung der Datenbank, wie das Erzeugen einer neuen Datenbank, die Zuordnung von Zugriffsrechten für verschiedene Datenbankbenutzer, das Erstellen von Datensicherungen, &etc; Diese Dinge werden nicht in diesem Handbuch beschrieben, aber für alle der unterstützten Datenbankprodukte sind im Internet eine Vielzahl an Anleitungen und Handbücher zu finden. </para>

<sect3>
<title
>Die Datenbank erstellen</title>

<para
>Es wird Code bereitgestellt, um eine initiale Datenbank, die Ihre Daten aufnehmen wird, zu erzeugen, wenn noch keine existiert. Es wird dringend angeraten, dass Sie vorher eine Datenbank erstellen, da die meisten Datenbankprodukte eine Vielzahl an Optionen verwendet, die relevant sein können. Eine solche wichtige Eigenschaft ist der verwendete Zeichensatz (&eg; UTF-8) für Textfelder. </para>

<para
>Zum gleichen Zeitpunkt müssen Sie auch Zugriffsrechte für verschiedene Datenbanknutzer definieren, um unterschiedliche Datenbankoperationen durchführen zu können. Bei den meisten Systemen wird dem Benutzer, der die Datenbank anlegt, automatisch sämtliche Rechte auf die Datenbank eingeräumt, aber näheres hierzu finden Sie in der Dokumentation der von Ihnen verwendeten Datenbank. </para>

<para
>Beim ersten Zugriff auf die Datenbank, und evtl. zu einem späteren Zeitpunkt wenn sich die Datenbankstruktur ändert, benötigen Sie Rechte (auch Privilegien, eng. "privileges" genannt), um Tabellen und Ansichten (views) anzulegen und zu ändern. Es können verschiedene Bezeichnung für diese Rechte bei den unterschiedlichen Datenbankprodukten verwendet werden, aber meist ist die Rede von CREATE und ALTER. Für die tägliche Arbeit benötigen Sie Zugriffsrechte zum Lesen und Schreiben von Datensätzen. Diese werden in SQL als SELECT, INSERT, UPDATE und DELETE Berechtigungen bezeichnet. </para>
</sect3>

<sect3>
<title
>Tabellen erstellen</title>

<para
>Bei der ersten Verwendung wird &kappname; versuchen, die benötigten Tabellenstrukturen anzulegen. Um eine größtmögliche Kompatibilität zu möglichst vielen Datenbanken zu erreichen, wird nur eine Teilmenge von gängigen Datentypen verwendet. Nichtsdestotrotz kann es vorkommen, dass ein bestimmter Datentyp von Ihrem Datenbankprodukt nicht unterstützt wird. In diesem Fall müssen Sie den notwendigen SQL-Code zur Erzeugung der Tabellen selbst bereitstellen. Dieser Code kann dann nach den eigenen Bedürfnissen modifiziert werden und außerhalb von &kappname; zur Erzeugung der Tabellen verwendet werden. Sollten Sie sich in einer solchen Situation befinden, wird Ihnen in der &devlist; sicherlich geholfen. Weitere Informationen finden Sie unter <link linkend="details.database.generatesql"
>Manuelle Erstellung der Datenbank</link
>. </para>
</sect3>
</sect2>

<sect2 id="details.database.selectdatabase">
<title
>Erstellen einer Datenbank</title>

<para
>Öffnen oder importieren Sie eine existierende Datei in &kappname;, oder erzeugen Sie eine Neue. Anschließend wählen Sie <guimenuitem
>Speichern in Datenbank</guimenuitem
> aus dem Menü <guimenu
>Datei</guimenu
>. Dann öffnet sich folgendes Dialogfenster: </para>

<screenshot>
  <mediaobject>
  <imageobject>
  <imagedata fileref="select_database.png" format="PNG"/>
  </imageobject>
  </mediaobject>
</screenshot>

<para
>Vervollständigen Sie die Eingaben für den ausgewählten Datenbanktyp, Pflichtfelder werden hervorgehoben. Klicken Sie dann auf <guibutton
>OK</guibutton
>, um die Datenbank zu erstellen. </para>

<sect3>
<title
>Datenbank-Typ</title>

<para
>Dieses Auswahlfeld zeigt alle &Qt;-SQL-Treiber, die auf Ihrem System installiert sind, Wählen Sie den für Ihre Datenbank passenden Treiber aus. Wenn ein passender Treiber nicht in der Liste aufgeführt wird, müssen Sie ihn installieren. Schauen Sie in der Dokumentation zu Ihrer Distribution, oder besuchen Sie die <ulink url="http://qt-project.org/" type=""
>&Qt;-Software-Webseite</ulink
> und suchen Sie nach "SQL drivers". </para>
</sect3>

<sect3>
<title
>Datei (nur SQLite)</title>
<para
>SQLite speichert eine Datenbank in einer Datei, geben Sie daher den Dateinamen für die Datenbank an. Klicken Sie auf das Symbol rechts neben dem Eingabefeld, damit öffnen Sie den Dateidialog, mit dessen Hilfe Sie eine bestehende Datei auswählen oder eine neue Datei erzeugen können. Für SQLite Datenbanken sind die Felder <guilabel
>Rechnername</guilabel
>, <guilabel
>Benutzername</guilabel
> und <guilabel
>Passwort</guilabel
> nicht relevant. Die SQLite-Datei muss die entsprechenden Schreib-/Leserechte auf der Betriebssystemebene besitzen, damit der gerade angemeldete Benutzer darauf zugreifen kann. </para>
</sect3>

<sect3>
<title
>Datenbank-Name (Andere)</title>
<para
>Der Datenbankname ist in der Voreinstellung "KMyMoney", aber Sie können auch einen anderen wählen. Für einige Datenbanken ist &kappname; eventuell nicht in der Lage, die Datenbank zu erzeugen, sodass sie vorher mit den zugehörigen Programmen erstellt werden muss. Normalerweise kann &kappname; die benötigten Tabellenstrukturen generieren. Funktioniert es doch einmal nicht, müssen Sie dies manuell durchführen. Weitere Informationen dazu finden Sie im Abschnitt <link linkend="details.database.generatesql"
>Manuelle Erstellung der Datenbank</link
>. </para>
</sect3>

<sect3
><title
>Rechnername</title>
<para
>Für den normalen Benutzer ist der vorgegebene Name <quote
>localhost</quote
>, der für Ihren Rechner steht an dem Sie gerade arbeiten, korrekt. Für eine Datenbank im Netzwerk müssen Sie den entsprechenden Rechnernamen eingeben. </para>

</sect3>

<sect3>
<title
>Benutzername und -passwort</title>
<para
>In den Einstellungen der Zugriffsrechte in Ihrer Datenbank finden Sie die notwendigen Informationen, die Sie hier eintragen müssen, oder kontaktieren Sie Ihren Datenbankadministrator. Der hier eingegebene Datenbankbenutzer muss die Berechtigungen für SELECT, INSERT, UPDATE und DELETE haben. Wenn der Benutzername der gleiche ist wie Ihr Anmeldungs-Name, ist ein Passwort normalerweise nicht notwendig. </para>
</sect3>
</sect2>

<sect2>
<title
>Auf Ihre Daten zugreifen</title>

<sect3>
<title
>Tabellenentwurf</title>

<para
>Um auf Ihre Daten in &kappname; zuzugreifen, wählen Sie aus dem Menü <guimenu
>Datei</guimenu
> den Menüpunkt <guimenuitem
>Datenbank öffnen ...</guimenuitem
>. Es öffnet sich ein ähnliches Dialogfenster wie oben beschrieben. </para>

<note>
<para
>Haben Sie Ihre Datenbank erstellt, indem Sie zuerst eine Datei geöffnet haben und dann wie vorher beschrieben die Funktion <guimenuitem
>Speichern in Datenbank</guimenuitem
> benutzt haben, dann werden alle nachfolgenden Änderungen nur noch in der Datenbank, aber nicht mehr in der Datei gespeichert. Damit können Sie die Datei als Sicherung oder Momentaufnahme Ihrer Daten zu einem bestimmten Zeitpunkt verwenden. Um wie vorher eine neue Sicherung zu erstellen, öffnen Sie die Datenbank, benutzen die Aktion <menuchoice
><guimenu
>Datei</guimenu
><guimenuitem
>Speichern unter ...</guimenuitem
></menuchoice
> und vergeben einen passenden Dateinamen. Öffnen Sie dann wieder die Datenbank, damit &kappname; alle Änderungen darin und nicht in der Datei speichert. </para>
</note>

<para
>Um auf Ihre Daten in anderen Formaten zuzugreifen, müssen Sie wissen, wie sie in der relationalen Datenbank gespeichert sind. Am einfachsten ist es, die Datenbank mit einem Programm wie OpenOffice zu öffnen. Sie werden eine Liste der verschiedenen Tabellen sehen, aus denen die Datenbank besteht. Weiterhin können Sie sich die Tabellenstrukturen anschauen. </para>

<para
>Um Daten &eg; in eine Tabellenkalkulation oder eine externe Datei zu extrahieren ist es meist unausweichlich, die Daten nicht nur aus einer, sondern aus mehreren Tabellen auszulesen. Dies wird erreicht, in dem die Tabellen miteinander Verknüpft werden (engl. JOIN). Die verknüpften Tabellen müssen jeweils Felder mit identischen Inhalten haben. Viele weitere Informationen über diese grundlegenden Themen finden Sie in den weiter oben schon erwähnten Anleitungen. Die nachfolgende Tabelle listet alle Felder auf, die für die Tabellenverknüpfungen verwendet werden. </para>

<informaltable>
  <tgroup cols="3">
    <thead>
      <row>
        <entry valign="top">
          <para
>Beziehung</para>
        </entry>
        <entry valign="top">
          <para
>Übereinstimmung</para>
        </entry>
        <entry valign="top">
          <para
>mit</para>
        </entry>
      </row>
    </thead>
    <tbody>
      <row>
        <entry valign="top">
          <para
>Geldinstitute und Konten</para>
        </entry>
        <entry valign="top">
          <para
>kmmInstitutions.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmAccounts.institutionId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Über-/untergeordnete Konten</para>
        </entry>
        <entry valign="top">
          <para
>kmmAccounts.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmAccounts.parentId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Buchungen und Split-Buchungen (siehe Fußnote 1)</para>
        </entry>
        <entry valign="top">
          <para
>kmmTransactions.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmSplits.transactionId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Konten und Split-Konten</para>
        </entry>
        <entry valign="top">
          <para
>kmmAccounts.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmSplits.accountId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Empfänger und Split-Buchungen</para>
        </entry>
        <entry valign="top">
          <para
>kmmPayees.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmSplits.payeeId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Geplante Buchungen und Buchungen</para>
        </entry>
        <entry valign="top">
          <para
>kmmSchedules.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmTransactions.id</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Buchungen und Währungen</para>
        </entry>
        <entry valign="top">
          <para
>kmmTransactions.currencyId</para>
        </entry>
        <entry valign="top">
          <para
>kmmCurrencies.ISOCode</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Konten und Wertpapiere (siehe Fußnote 2)</para>
        </entry>
        <entry valign="top">
          <para
>kmmAccounts.currencyId</para>
        </entry>
        <entry valign="top">
          <para
>kmmSecurities.id</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Wertpapiere und Preise</para>
        </entry>
        <entry valign="top">
          <para
>kmmSecurities.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmPrices.fromId oder kmmPrices.toId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Währungskurse</para>
        </entry>
        <entry valign="top">
          <para
>kmmCurrencies.ISOCode</para>
        </entry>
        <entry valign="top">
          <para
>kmmPrices.fromId oder kmmPrices.toId</para>
        </entry>
      </row>
    </tbody>
  </tgroup>
</informaltable>

<para
>Fußnoten: </para>

<para
>1 &#x2013; txType = &#x201C;N&#x201D; für normale Buchungen, &#x201C;S&#x201D; für geplante Buchungen </para>

<para
>2 &#x2013; wenn kmmAccounts.isStockAccount = &#x201C;Y&#x201D; </para>
</sect3>

<sect3>
<title
>Feldformate</title>

<para
>Einige Datenfelder werden in einem internen Datenformat vorgehalten, welche nicht direkt für externe Programme nutzbar sind. In diesen Fällen werden die Informationen doppelt, einmal im internen und externen Format, vorgehalten. </para>

<para
>Geldbeträge und Aktienkurse werden beide im Format Zähler/Nenner und zusätzlich, wenn der Feldname mit dem Suffix "Formatted" beginnt, in dem Format wie Sie es am Bildschirm sehen, gespeichert. </para>
  
<para
>Ebenso werden einige Felder, wie &eg; der Kontotyp, sowohl als numerische ID als auch zusätzlich in einem Feld mit der Nachsilbe "String" im Format und Sprache der Anwendung gespeichert. </para>
</sect3>

<sect3>
<title
>Ihre Daten aktualisieren</title>

<para
>Da Ihre Daten in einem Standardformat gespeichert sind, können Sie diese auch mit anderen Programmen als &kappname; bearbeiten. Möchten Sie das wirklich tun, sollten Sie stets eine Sicherung Ihrer Daten erstellen. Wenn etwas schiefgeht, wird &kappname; nicht mehr in der Lage sein, Ihre Daten zu lesen und im schlimmsten Fall wären diese komplett verloren. </para>
</sect3>

<sect3>
<title
>Gespeicherte Abfragen</title>

<para
>Viele Datenbanksysteme erlauben es, gemeinsam genutzte Abfragen und Prozeduren zu hinterlegen. In einigen Fällen werden diese als Tabellen oder andere Objekte innerhalb der Datenbank vorgehalten. Wie Sie sicherlich aus dem oben genannten schon sehen, beginnen die Namen aller von &kappname; verwendeten Tabellen mit den Kleinbuchstaben "kmm".  Dieser Standard wird gepflegt und nur solche Tabellen, die damit beginnen, werden aktualisiert. Wenn Sie sich bei der Benennung Ihrer eigenen Abfragen, etc. an diese Konvention halten, sind keine Probleme zu erwarten. </para>
</sect3>
</sect2>

<sect2 id="details.database.generatesql">
<title
>Manuelle Erstellung der Datenbank</title>
<note>
  <para
>Dieser Abschnitt bietet weitere Informationen für erfahrene Datenbank-Benutzer und kann im allgemeinen übersprungen werden. </para>
</note>

<sect3>
<title
>Anwendungsfälle</title>
<para
>Manchmal ist &kappname; nicht in der Lage, die Datenbank automatisch richtig zu erstellen oder erstellt sie ohne von Benutzer gewünschte Optionen. Das verwendete Datenbanksystem ist zum Beispiel nicht vollständig kompatibel zum SQL-Standard oder es gibt neue Systeme, die in &kappname; noch nicht umfassend getestet wurden. </para>
<para
>Dann sollten Sie versuchen, nur die Datenbank selbst mit der Anweisung CREATE DATABASE zu erzeugen. Wenn die Datenbank existiert, kann &kappname; möglicherweise die Tabellen &etc; mit der normalen vorher beschriebenen Speicherprozedur der Datenbank generieren. </para>
</sect3>

<sect3>
<title
>SQL-Befehle für die Erstellung der Datenbank</title>
<para
>Gelingt die automatische Erstellung der SQL-Datenbank nicht, dann können die grundlegenden SQL-Befehle zur Anlage der verschiedenen Tabellen, Ansichten und Indizes für das Programm direkt eingegeben werden. Wählen Sie <guimenuitem
>SQL-Datenbank erzeugen</guimenuitem
> aus dem Menü <guimenu
>Extras</guimenu
>. Dann öffnet sich folgendes Dialogfenster: </para>
<screenshot>
  <mediaobject>
  <imageobject>
  <imagedata fileref="generate_sql.png" format="PNG"/>
  </imageobject>
  </mediaobject>
</screenshot>

<para
>Nach Auswahl des Datenbanktyps werden die zugehörigen <guilabel
>SQL-Befehle für die Erstellung der Datenbank</guilabel
> im Textfeld angezeigt. Diese Befehle können bearbeitet oder mit <guibutton
>SQL speichern</guibutton
> in eine Textdatei geschrieben werden. Mit den Befehle in der Textdatei kann die Datenbank mit den Verwaltungsfunktionen des Datenbanksystems erzeugt werden. </para>
<para
>Nach der Bearbeitung des SQL-Befehle müssen Sie noch die anderen Felder im Dialog ausfüllen. Informationen dazu finden Sie im vorherigen Abschnitt <link linkend="details.database.selectdatabase"
>Erstellen einer Datenbank</link
>. Dann kann &kappname; die Datenbank erzeugen. Klicken Sie dazu auf den Knopf <guibutton
>Tabellen erzeugen</guibutton
>. Für alle Datenbanken außer SQLite müssen Sie entweder eine Anweisung CREATE DATABASE als ersten Befehl einfügen oder diesen Befehl vorher unabhängig von &kappname; bereits ausgeführt haben. </para>
</sect3>

<sect3>
<title
>Warnung</title>
<para
>Sie sollten bei der Bearbeitung der Definitionen aller grundlegenden Tabellen und Ansichten, deren Namen mit „kmm“beginnt, sehr vorsichtig sein. Einige Änderungen wie die Vergrößerung der Länge eines Felds für ein ganze Zahl haben nur geringe Auswirkungen. Sie sollten die Reihenfolge aller Felder aber auf keinen Fall verändern, da &kappname; dann möglicherweise nicht mehr richtig arbeitet oder Ihre Daten zerstört. </para>
<para
>Während das Hinzufügen oder Entfernen von Indizes manchmal die Arbeitsgeschwindigkeit verbessert, kann aber auch das Gegenteil eintreten. Es sind Kenntnisse der internen Funktionsweise von &kappname; nötig, um unter diesen Bedingen die beste Arbeitsgeschwindigkeit zu erreichen. </para>
</sect3>

</sect2>

<sect2>
<title
>Verschlüsselung</title>

<para
>Eine Verschlüsselung Ihrer Daten in der Datenbank wird derzeit nicht unterstützt. </para>
</sect2>
</sect1>
</chapter>
