<?xml version="1.0" encoding="UTF-8"?>
<chapter id="details.database">
<chapterinfo>
  <authorgroup>
    <author
>&Tony.Bloomfield; &Tony.Bloomfield.mail;</author>
    <author
>&Jack.H.Ostroff; &Jack.H.Ostroff.mail; </author>
  </authorgroup>
  <date
>2024-12-01</date>
  <releaseinfo
>5.2.0</releaseinfo>
</chapterinfo>
<title
>Databas</title>

<sect1 id="details.database.usage"
><title
>Använda relationsdatabaser</title>

<sect2
><title
>Inledning</title>
<para
>Sedan utgåva 1.0 tillåter &kmymoney; lagring av data i en relationsdatabas. En av fördelarna med att använda det branschstandardformatet är att det kan göra det möjligt att visa data med hjälp av ett av de grafiska gränssnitten som <trademark
>OpenOffice.org</trademark
> eller <trademark
>LibreOffice</trademark
>, eller kanske i något format som &kmymoney; för närvarande inte erbjuder. Dessutom bör lite kunskap om språket <acronym
><ulink url="https://en.wikipedia.org/wiki/SQL"
>SQL</ulink
> </acronym
> (<quote
>Structured Query Language</quote
>, som används världen över för att komma åt relationsdatabaser) göra det lättare att exportera data till ett externt program, till exempel ett budgetprogram. </para>

<note>
  <para
>Även om de flesta relationsdatabassystem tillåter samtidig åtkomst till en databas av mer än en användare, är det inte möjligt med &kmymoney;. Även om &kmymoney; kan lagra data i en relationsdatabas, använder den faktiskt databasen bara som en annan typ av fillagring. När filen öppnas läser programmet all data från databasen. Under arbetar med data görs ändringarna endast i den interna lagringen; de skrivs inte omedelbart tillbaka i databasen. Först när data sparas skriver &kmymoney; hela filen tillbaka i databasen. </para>

  <para
>Det har förekommit förfrågningar om att &kmymoney; ska uppdatera databasen för varje dataändring, men det skulle kräva en betydande förändring av hur hela programmet hanterar sina interna datastrukturer, så det är extremt osannolikt att det kommer att ske inom överskådlig framtid. </para>
</note>
</sect2>

<sect2
><title
>Förberedelse</title>
<para
>För att komma åt databasen använder &kmymoney; SQL-modulen som tillhandahålls av &Qt; Software som en del av deras &Qt; programmeringssystem. Modulen stöder många databassystem genom en samling drivrutiner. &Qt; har drivrutiner för ett stort antal relationsdatabassystem med öppen källkod och proprietära relationsdatabassystem, inklusive <trademark
>MySQL</trademark
>, PostgreSQL och SQLCipher. Modulen stöder också några "tyngre", mer industriella system som <trademark class="registered"
>Oracle</trademark
> och IBM <trademark class="registered"
>DB2</trademark
>. </para>

<para
>Tidigare versioner av &kmymoney; stödde <ulink url="https://www.sqlite.org"
>SQLite</ulink
>. Det har ersatts med stöd för <ulink url="https://www.zetetic.net/sqlcipher"
>SQLCipher</ulink
>, vilket är en fristående gren av databasbiblioteket SQLite som lägger till 256-bitars AES-kryptering och andra säkerhetsfunktioner. Drivrutinen SQLCipher läser befintliga filer från SQLite. Se avsnittet nedan om <link linkend="details.database.sqlcipher"
>SQLCipher</link
> för mer information. </para>

<para
>Med undantag för SQLCipher använder systemen en klient/server-modell, där "klient"-programvaran finns på "din" dator, medan servern finns på samma dator som själva databasen, vilken kan finnas någon annanstans i ett nätverk. Naturligtvis, i det normala scenariot för ett personligt ekonomiprogram som &kmymoney;, kan "din" dator fungera som både klient och server. Den första uppgift, efter att ha bestämt vilket databassystem som ska användas, är därför att installera klient-, och troligtvis server-, programvaran. </para>

<para
>Förutom själva databasprogramvaran måste också motsvarande &Qt;-drivrutinsmodul installeras. De flesta &Linux;-distributioner inkluderar drivrutinsmoduler för de mer populära databaserna. Annars kan du titta på <ulink url="https://www.qt.io/"
>&Qt;-programvarans webbplats</ulink
> och söka efter <quote
>SQL drivers</quote
>. </para>

<note>
  <para
>SQLCipher och SQLite fungerar inte på en klient/server-modell; varje databas lagras i en vanlig fil, lokal eller fjärransluten, som nås med de normala metoder som tillhandahålls av det underliggande operativsystemet. I det fallet finns det därför bara ett programpaket och drivrutinen att installera. Dessutom kanske en del av följande information, särskilt den som rör administration, inte gäller. </para>
</note>
</sect2>

<sect2
><title
>Administration</title>
<para
>Att hantera databaser är lite mer komplext än att hantera vanliga filer. Varje system har olika metoder för att utföra nödvändiga administrativa uppgifter, som att skapa databaser, tilldela behörigheter till olika användare eller skapa säkerhetskopior. Att beskriva uppgifterna ligger utanför ramen för den här handboken, men alla produkter som stöds tillhandahåller omfattande referensdokumentation, och en snabb sökning på webben kommer att leda dig till många handledningar i ämnet. </para>

<sect3
><title
>Skapa databasen</title>
<para
>&kmymoney; innehåller SQL-kod för att skapa en initial databas för att lagra data om en sådan inte finns. Det rekommenderas dock starkt att skapa en databas i förväg, eftersom de flesta produkterna erbjuder ett antal alternativ som kan vara relevanta. Ett alternativ som kan vara av särskild betydelse för vissa är tilldelning av teckenuppsättningen (t.ex. UTF-8) som ska användas för textfält. </para>

<para
>Vid denna tidpunkt måste du också ange rättigheter för diverse användare att utföra olika åtgärder med databasen. I de flesta system, blir användaren som skapar databasen automatiskt tilldelad fullständiga rättigheter, men det är ett område där man bör rådfråga dokumentationen. </para>

<para
>För första gången databasen används, och ibland vid andra tillfällen när databasens layout ändras, behövs behörighet (även kallad privilegier) för att skapa och ändra tabeller och vyer (se nästa stycke). Det kan finnas olika namn på behörigheten/privilegiet i olika system, men något i stil med <literal
>CREATE</literal
> och <literal
>ALTER</literal
> borde vara vanligt förekommande. För normal körning behövs möjlighet att läsa och skriva poster; de definieras normalt i SQL som behörigheterna <literal
>SELECT</literal
>, <literal
>INSERT</literal
>, <literal
>UPDATE</literal
> och <literal
>DELETE</literal
>. </para>
</sect3>

<sect3
><title
>Skapa tabeller</title>
<para
>Vid första användning försöker &kmymoney; skapa de nödvändiga tabellstrukturerna. För att uppnå maximal kompatibilitet mellan olika databastyper används endast en delmängd av vanliga datatyper. Det kan dock finnas situationer där en viss typ inte stöds, och för det fallet har möjligt att generera den SQL-kod som krävs för att skapa tabellerna lagts till. Koden kan sedan modifieras efter behov och användas för att skapa tabellerna utanför &kmymoney;. Om den situationen skulle uppstå är det vanligtvis möjligt att få hjälp från en av kanalerna som listas i avsnittet <link linkend="firsttime.contact"
>Skaffa hjälp</link
>. Se <link linkend="details.database.generatesql"
>Skapa en databas för hand</link
> för mer information. </para>
</sect3>
</sect2>

<sect2 id="details.database.selectdatabase"
><title
>Skapa en databas</title>
<para
>Använd &kmymoney; för att öppna eller importera en befintlig datafil, eller skapa en ny. Välj sedan menyalternativet <menuchoice
><guimenu
>Arkiv</guimenu
><guimenuitem
>Spara som databas</guimenuitem
></menuchoice
>. Välj <guilabel
>SQL</guilabel
> från kombinationsmenyn <guilabel
>Lagringstyp som ska användas för data</guilabel
> och klicka på <guibutton
>Ok</guibutton
>. Då visas följande dialogruta: </para>

<screenshot>
  <screeninfo
>skapa en databas</screeninfo>
  <mediaobject>
    <imageobject>
      <imagedata fileref="select_database.png" format="PNG"/>
    </imageobject>
    <textobject>
      <phrase
>skapa en databas</phrase>
    </textobject>
  </mediaobject>
</screenshot>

<para
>Fyll i lämpliga fält för typen av databas du har valt (som vanligt är nödvändiga fält markerade) och klicka på <guibutton
>Ok</guibutton
> för att skapa databasen. </para>

<sect3
><title
>Databastyp</title>
<para
>Kombinationsmenyn listar alla &Qt; SQL-drivrutiner som är installerade på systemet. Välj drivrutinen för databastypen. Om den du vill ha inte finns i listan måste du installera lämplig drivrutin. Se distributionsdokumentationen eller besök <ulink url="https://www.qt.io/"
>&Qt;-programvarans webbplats</ulink
> och sök efter 'SQL drivers'. </para>
</sect3>

<sect3 id="details.database.sqlcipher"
><title
>Fil (bara SQLite och SQLCipher)</title>
<para
>SQLCipher har en databas per fil, så ange filnamnet som databasen ska skapas i. För att bläddra i filsystemet klicka på ikonen till höger om filnamnet. För databaser med SQLCipher är fälten <guilabel
>Databasnamn</guilabel
>, <guilabel
>Värdnamn</guilabel
> och <guilabel
>Användarnamn</guilabel
> inte relevanta. Filen i SQLCipher måste ha lämpliga läs- och skrivrättigheter inställda av det underliggande filsystemet för att möjliggöra lämplig åtkomst för den inloggade användaren. </para>

<para
>Skaparna av <ulink url="https://www.zetetic.net/sqlcipher"
>SQLCipher</ulink
> släppte version 4.0 i november 2018. Många användare av &kmymoney;, särskilt de som inte uppgraderar särskilt ofta, eller som använder LTS (Long Term Support) &Linux;-distributioner, kan dock fortfarande använda en databas skapad med version 3 av SQLCipher. Vid någon tidpunkt, vanligtvis efter att ha uppgraderat &kmymoney; eller distributionen, upptäcker de att de inte kan öppna databasen, med ett fel som inte är särskilt informativt eller användbart. Det som krävs i det fallet är att uppgradera själva databasen från version 3 till version 4. Instruktioner för det finns på <ulink url="https://discuss.zetetic.net/t/upgrading-to-sqlcipher-4/3283"
>SQLCiphers webbplats</ulink
>. </para>
</sect3>

<sect3>
<title
>Databasnamn (övriga)</title>
<para
>Standardnamnet på databasen är <literal
>KMyMoney</literal
>, men du kan välja något annat namn om du vill. För vissa typer av databas, kanske &kmymoney; inte klarar av att skapa databasen, så den måste skapas i förväg genom att använda lämplig administrationsprocedur. &kmymoney; klarar dock oftast av att skapa alla tabellstrukturer när det behövs. Om inte, kan du skapa dem själv. Se <link linkend="details.database.generatesql"
>Skapa en databas för hand</link
> för mer information. </para>
</sect3>

<sect3
><title
>Värddatornamn</title>
<para
>För den genomsnittliga användaren är standardnamnet <quote
>localhost</quote
>, det vill säga den dator som för närvarande används, korrekt. För nätverksanslutna databaser ange den anslutna databasserverns värddatornamn. </para>
</sect3>

<sect3
><title
>Användarnamn och lösenord</title>
<para
>Kontrollera inställda rättigheter för databasen, eller kontakta administratören av databasen, för riktiga värden att använda här. Användarnamnet måste ha möjlighet att välja, ta bort, infoga och uppdatera poster. Om användarnamnet är samma som inloggningsnamnet behövs i allmänhet inte något lösenord. </para>
</sect3>
</sect2>

<sect2
><title
>Komma åt data</title>

<sect3
><title
>Tabellkonstruktion</title>
<para
>För att komma åt data i &kmymoney;, använd menyalternativet <menuchoice
> <guimenu
>Arkiv</guimenu
> <guimenuitem
>Öppna databas</guimenuitem
> </menuchoice
>. Det öppnar en dialogruta som liknar den ovan. </para>

<note>
  <para
>Om du skapade databasen genom att först öppna en fil och sedan använda <guimenu
>Arkiv</guimenu
> <guimenuitem
>Spara</guimenuitem
> och välja <guilabel
>SQL</guilabel
> som beskrivits ovan, sparas alla efterföljande ändringar av data endast i databasen, inte i filen. Det betyder att filen kan användas som en säkerhetskopia eller ögonblicksbild av data vid en viss tidpunkt. För att göra en ny säkerhetskopia som denna, öppna databasen, välj menyalternativet <menuchoice
> <guimenu
>Arkiv</guimenu
> <guimenuitem
>Spara som...</guimenuitem
></menuchoice
>, välj <guilabel
>XML</guilabel
> som lagringstyp och ange ett lämpligt filnamn. Kom ihåg att öppna databasen igen, så att &kmymoney; inte fortsätter att använda filen. </para>
</note>

<para
>För att komma åt data på andra format, måste du känna till en del om hur den lagras i relationsdatabaser. Det allra enklaste sättet att få en känsla för det är att öppna databasen i ett gränssnitt som <trademark
>OpenOffice.org</trademark
>. Det tillhandahåller en lista med de olika tabellerna som utgör databasen, och gör det möjligt för dig att se layouten för var och en av dem. </para>

<para
>För att extrahera data, t.ex., till ett kalkylblad eller en extern fil är det nästan alltid nödvändigt att välja länkade data från mer än en tabell. Det görs genom att <quote
>sammanfoga</quote
> tabellerna med hjälp av ett fält som är gemensamt för dem. Det finns mycket mer information om hur det görs i de ovan nämnda handledningarna för databaser på nätet. Följande tabell listar de fält som används för att definiera relationerna mellan tabeller. </para>

<informaltable pgwide="1">
  <tgroup cols="3">
    <thead>
      <row>
        <entry valign="top">
          <para
>Relation</para>
        </entry>
        <entry valign="top">
          <para
>Matchar</para>
        </entry>
        <entry valign="top">
          <para
>Med</para>
        </entry>
      </row>
    </thead>
    <tbody>
      <row>
        <entry valign="top">
          <para
>Institutioner och konton</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmInstitutions.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmAccounts.institutionId</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Överliggande konton och delkonton</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmAccounts.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmAccounts.parentId</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Transaktioner och delningar (se anmärkning 1)</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmTransactions.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmSplits.transactionId</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Konton och delningar</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmAccounts.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmSplits.accountId</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Betalare och delningar</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmPayees.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmSplits.payeeId</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Schemaläggningar och transaktioner</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmSchedules.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmTransactions.id</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Transaktioner och valutor</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmTransactions.currencyId</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmCurrencies.ISOCode</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
><literal
>Konton och värdepapper (se anmärkning 2)</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmAccounts.currencyId</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmSecurities.id</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Värdepapper och kurser</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmSecurities.id</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmPrices.fromId</literal
> eller <literal
>kmmPrices.toId</literal
></para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Valutakurser</para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmCurrencies.ISOCode</literal
></para>
        </entry>
        <entry valign="top">
          <para
><literal
>kmmPrices.fromId</literal
> eller <literal
>kmmPrices.toId</literal
></para>
        </entry>
      </row>
    </tbody>
  </tgroup>
</informaltable>

<para
>Anmärkningar: </para>

<!-- For ndash and right and left double quotes I switched from Unicode &#x2013,
     &#x201C, and &#x201D. to direct names, but couldn't find one for left double
     quote.  JHO -->
<para
>1 &ndash; txType = "N&rdquor; för normala transaktioner, "S&rdquor; för schemalagda transaktioner </para>

<para
>2 &ndash; if kmmAccounts.isStockAccount = "Y&rdquor; </para>
</sect3>

<sect3
><title
>Fältformat</title>
<para
>Flera av datafälten lagras med ett internt format, vilket kanske inte är omedelbart användbart för externa program. I dessa fall, har informationen duplicerats med både internt och externt format. </para>

<para
>Monetära belopp och aktievärden visas både i bråkformat och, med ett fältnamn med suffixet <quote
> <literal
>Formatted</literal
> </quote
>, i den form som vanligtvis anges. </para>

<para
>På liknande sätt, anges fält som kontotyp både som en numerisk kod, och på programmets form och språk i ett fält som slutar med '<literal
>String</literal
>' (sträng) </para>
</sect3>

<sect3
><title
>Uppdatera data</title>
<para
>Att ha data på ett industristandardformat ger möjlighet att ändra det utanför programmet &kmymoney;. GÖR INTE DET, om du inte verkligen vet vad du gör, och försäkra dig alltid om att först skapa en säkerhetskopia av data. Om du gör fel, kanske &kmymoney; inte kan komma åt data, och du kan till och med bli av med det helt och hållet. Du har fått en varning. </para>
</sect3>

<sect3
><title
>Lagrade förfrågningar</title>
<para
>De flesta databassystem låter dig lagra ofta använda förfrågningar och procedurer, och i vissa fall kan de lagras som tabeller i själva databasen. Som du kanske gissat från det ovanstående, börjar alla tabeller som &kmymoney; använder med '<literal
>kmm</literal
>', med små bokstäver. Den standarden kommer att upprätthållas, och bara tabeller som börjar med dessa bokstäver kommer att uppdateras. Under förutsättning att du undviker dessa när du namnger förfrågningar, etc., bör du sålunda inte uppleva några problem. </para>
</sect3>
</sect2>

<sect2 id="details.database.generatesql"
><title
>Skapa en databas för hand</title>
<note>
  <para
>Det här avsnittet beskriver mer avancerad användning av databaser, och kan hoppas över av vanliga användare. </para>
</note>

<sect3
><title
>När det bör användas</title>
<para
>Det kan finnas tillfällen då &kmymoney; inte klarar av att skapa databasen automatiskt, eller skapar den utan vissa alternativ som krävs av användaren. Exempelvis kanske inte databassystemet som används är fullständigt anpassat för vanlig användning av SQL, eller stöd kan ha lagts till för nya system som inte har utprovats fullständigt i &kmymoney;. </para>

<para
>Innan funktionen används, bör du försöka att skapa själva databasposten själv (dvs. med satsen <literal
>CREATE DATABASE</literal
>). Under förutsättning att databasen finns, kan &kmymoney; mycket väl klara av att skapa tabeller, etc. med den normala proceduren för att spara i en databas, som beskrivs ovan. </para>
</sect3>

<sect3
><title
>Skapa SQL-koden</title>
<para
>Om det misslyckas är det möjligt att generera de grundläggande SQL-kommandon som behövs för att skapa de olika tabeller, vyer och index som krävs av programmet. Välj menyalternativet <menuchoice
> <guimenu
>Verktyg</guimenu
> <guimenuitem
>Generera SQL för databas</guimenuitem
> </menuchoice
>. Det visar följande dialogruta: </para>

<screenshot>
  <screeninfo
>generera SQL för att skapa en databas</screeninfo>
  <mediaobject>
    <imageobject>
      <imagedata fileref="generate_sql.png" format="PNG"/>
    </imageobject>
    <textobject>
      <phrase
>generera SQL för att skapa en databas</phrase>
    </textobject>
  </mediaobject>
</screenshot>

<para
>När typ av databas väljes, visas lämplig SQL i textrutan <guilabel
>SQL för att skapa databas</guilabel
>. Den kan redigeras av användaren, eller sparas i en textfil genom att klicka på <guibutton
>Spara SQL</guibutton
>. I det senare fallet, måste databasen skapas med de administrativa funktionerna som tillhandahålls av databassystemet. </para>

<para
>Om du vill att &kmymoney; ska skapa databasen efter att du har redigerat texten i dialogrutan, måste fylla i övriga fält i dialogrutan, som beskrivs under <link linkend="details.database.selectdatabase"
>Skapa en databas</link
> ovan, och klicka på <guibutton
>Skapa tabeller</guibutton
>. Observera att utom för fallet med SQLite, måste du antingen inkludera en lämplig <literal
>CREATE DATABASE</literal
>-sats som första kommando, eller tidigare ha utfört ett sådant kommando utanför &kmymoney;. </para>
</sect3>

<sect3
><title
>Varning</title>
<para
>Du bör vara mycket försiktig när du redigerar definitionerna för någon av de grundläggande tabellerna eller vyerna (de med namn som börjar med '<literal
>kmm</literal
>'). Vissa ändringar, som att öka längden på ett heltalsfält, kan ha liten inverkan, men du bör inte ta bort eller ändra följden av några fält, annars kan &kmymoney; vägra fungera, eller skada data. </para>

<para
>Även om prestanda kan förbättras genom att lägga till eller ta bort index, bör man också vara medveten om att det motsatta kan inträffa. Viss kunskap om &kmymoney;s interna funktion kan hjälpa till att få bästa möjliga prestanda under sådana omständigheter. </para>
</sect3>
</sect2>

<sect2
><title
>Kryptering</title>
<para
>Kryptering av data i databasen stöds för närvarande inte. </para>
</sect2>
</sect1>
</chapter>
