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

<title
>Database</title>

<sect1 id="details.database.usage">
<title
>Uso di database relazionali</title>

<sect2>
<title
>Introduzione</title>
<para
>Fin dalla versione 1.0, &kappname; ti permette di conservare i tuoi dati in un database relazionale. Uno dei vantaggi dell'uso di questo formato comune è che ti consente di visualizzare i dati usando l'interfaccia grafica di programmi come OpenOffice.org<trademark class="copyright"
></trademark
> o LibreOffice <trademark class="copyright"
></trademark
>, magari in formati che &kappname; ancora non consente. Inoltre, una conoscenza di base di SQL (Structured Query Language, il linguaggio usato comunemente per accedere ai database relazionali) dovrebbe consentirti di esportare più facilmente i dati verso programmi esterni come, ad esempio, applicazioni per la redazione di budget. </para>
<para/>
</sect2>

<sect2
><title
>Preparazione</title>

<para
>Per accedere al database, &kappname; usa il modulo SQL fornito da &Qt; Software nella libreria &Qt;. Questo modulo supporta diversi sistemi di database, attraverso una serie di driver. I più famosi tra i sistemi supportati open-source sono MySQL<trademark class="registered"
></trademark
>, SQLite (solo versione 3 e successive), e PostgreSQL. Questo modulo supporta anche i sistemi «più pesanti», industriali, come Oracle<trademark class="registered"
></trademark
> e DB2<trademark class="registered"
></trademark
> di IBM. </para>

<para
>Con l'eccezione di SQLite, questi sistemi usano un modello client/server, in cui il programma «client» viene eseguito sul proprio computer e il «server» viene eseguito nel computer che contiene il database stesso, che potrebbe essere un altro computer connesso in rete. Ovviamente, nell'uso normale di questa funzione in &kappname;, il computer in uso agisce sia da client sia da server. Il primo passo quindi, dopo aver deciso il sistema da usare, consiste nell'installazione del programma client e, probabilmente, anche di quello server. </para>

<para
>Oltre al programma stesso di gestione del database, è necessario anche installare il modulo di &Qt; con il driver corrispondente. La maggior parte delle distribuzioni includono i moduli dei driver per i database più comuni. Altrimenti, cercare «SQL drivers» nel <ulink url="http://qt-project.org"
>sito web di &Qt;</ulink
> (in inglese). </para>

<note>
  <para
>SQLite non usa un modello client/server; ogni database è memorizzato in un file, locale o remoto, a cui accede attraverso i metodi comuni forniti dal sistema operativo. In questo caso, quindi, c'è da installare un solo programma oltre al driver. Alcune delle informazioni seguenti, in particolare quelle relative all'amministrazione, potrebbero non essere applicabili a SQLite. </para>
</note>
</sect2>

<sect2>
<title
>Amministrazione</title>

<para
>L'amministrazione dei database è più complessa di quella dei file normali. Ogni sistema ha un modo diverso di eseguire le operazioni di amministrazione, come la creazione di database, l'assegnazione di permessi agli utenti, la creazione di copie di sicurezza, &etc;. Questo documento non ha come obiettivo la descrizione di queste operazioni, ma ognuno dei sistemi supportati fornisce una documentazione completa, e basterà una breve ricerca su Internet per trovare queste informazioni. </para>

<sect3>
<title
>Creazione del database</title>

<para
>È stato aggiunto del codice per creare un database iniziale per memorizzare i dati, se non ne esiste già uno. Comunque, si raccomanda vivamente di creare manualmente un database, perché molti di questi sistemi permettono di fornire delle opzioni importanti. Una che potrebbe essere particolarmente importante è l'impostazione della codifica (ad esempio UTF-8) usata per i campi di testo. </para>

<para
>Attualmente, è anche necessario specificare i permessi per i vari utenti relativi alle operazioni consentite sul database. Nella maggior parte dei sistemi vengono assegnati tutti i privilegi all'utente che crea il database, ma è meglio controllare nella documentazione. </para>

<para
>Per usare per la prima volta il database, e in altri casi in cui cambia l'organizzazione del database, sono necessari i permessi (chiamati anche privilegi) di creazione e modifica di tabelle e visualizzazioni (vedere il paragrafo successivo). I vari sistemi possono chiamare i privilegi in modi diversi, ma CREATE e ALTER dovrebbero essere comuni a tutti. Per l'utilizzo normale, è necessario essere in grado di leggere e scrivere record; questi permessi sono normalmente chiamati SELECT, INSERT, UPDATE, e DELETE in SQL. </para>
</sect3>

<sect3>
<title
>Creazione di tabelle</title>

<para
>Al primo utilizzo, &kappname; proverà a creare la struttura di tabelle necessaria. Per poter ottenere la massima compatibilità con i vari sistemi di database, vengono usati solo alcuni dei tipi di dato comuni. Comunque, ci potrebbero essere situazioni in cui un certo tipo non è supportato e, in questo caso, viene fornito il codice SQL necessario alla creazione di tabelle. Questo codice può essere modificato come richiesto e usato per la creazione delle tabelle al di fuori di &kappname;. Se ci si trova in questa situazione, è possibile ottenere aiuto dalla lista di distribuzione &devlist;. Vedere <link linkend="details.database.generatesql"
>Creazione manuale del database</link
> per maggiori informazioni. </para>
</sect3>
</sect2>

<sect2 id="details.database.selectdatabase">
<title
>Creazione di un database</title>

<para
>Usando &kappname;, aprire o importare un file di dati esistente, o crearne uno. Poi selezionare <guimenuitem
>Salva come database</guimenuitem
> dal menu <guimenu
>File</guimenu
>. Sarà aperta la finestra seguente: </para>

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

<para
>Completa i campi appropriati per il tipo di database selezionato (come al solito, i campi obbligatori saranno evidenziati) e fai clic su <guibutton
>OK</guibutton
> per creare il database. </para>

<sect3>
<title
>Tipo di database</title>

<para
>Questa casella elenca i driver &Qt; per SQL installati nel computer. Selezionare il driver relativo al tipo di database scelto. Se non viene elencato il driver desiderato, è necessari installarlo. Vedere la documentazione delle distribuzione, o cercare «SQL drivers» nel <ulink url="http://qt-project.org/" type=""
>sito web di &Qt;</ulink
> (in inglese). </para>
</sect3>

<sect3>
<title
>File (solo per SQLite)</title>
<para
>SQLite ha un database per file, quindi inserire il nome del file in cui creare il database. Per sfogliare le cartelle, fare clic sull'icona a destra del nome del file.Per i database SQLite, i campi <guilabel
>Nome host</guilabel
>, <guilabel
>Nome utente</guilabel
> e <guilabel
>Password</guilabel
> non sono rilevanti. Il file SQLite deve avere i corretti permessi in lettura/scrittura, impostati dal sistema operativo, per permettere l'accesso all'utente corrente. </para>
</sect3>

<sect3>
<title
>Nome del database (altri)</title>
<para
>Il nome predefinito del database è KMyMoney, ma è possibile sceglierne un altro se si desidera. Per alcuni tipi di database, &kappname; non è in grado di creare il database, quindi è necessario crearlo in precedenza con la relativa procedura di amministrazione. Comunque, &kappname; creerà le strutture delle tabelle, se necessario. È possibile anche crearle manualmente, vedere <link linkend="details.database.generatesql"
>Creazione manuale del database</link
> per maggiori informazioni. </para>
</sect3>

<sect3
><title
>Nome host</title>
<para
>Comunemente va bene il nome predefinito (<quote
>localhost</quote
>), che si riferisce al computer in uso. Per l'uso di database in rete, inserire il nome dell'host. </para>

</sect3>

<sect3>
<title
>Nome utente e password</title>
<para
>Per sapere i valori da utilizzare controllare i permessi impostati nel database, o contattare l'amministratore del database. Il nome utente inserito deve avere i permessi di selezione, di inserimento, di modifica e di cancellazione sui record. Se il nome utente è quello in uso nel computer, spesso la password non è richiesta. </para>
</sect3>
</sect2>

<sect2>
<title
>Accedere ai dati</title>

<sect3>
<title
>Organizzazione delle tabelle</title>

<para
>Per accedere ai dati in &kappname;, usare il comando <guimenuitem
>Apri database</guimenuitem
> nel menu <guimenu
>File</guimenu
>. Sarà aperta una finestra simile alla precedente. </para>

<note>
<para
>Se hai creato il tuo database aprendo prima un file e selezionando quindi <guimenuitem
>Salva come database</guimenuitem
>, come descritto sopra, ogni successiva modifica ai tuoi dati sarà memorizzata solo nel database, non nel file. Ciò significa che puoi utilizzare il file come una copia di sicurezza o un'immagine dei tuoi dati ad una certa data. Per fare una nuova copia di sicurezza come questa, apri il tuo database, seleziona <menuchoice
><guimenu
>File</guimenu
><guimenuitem
>Salva come...</guimenuitem
></menuchoice
> ed indica un nome appropriato per il file. Ricordati di riaprire quindi il tuo database, così che &kappname; non continui a usare il file. </para>
</note>

<para
>Per accedere ai dati in altri formati, è necessario sapere i dettagli con cui vengono memorizzati nei database relazionali. Il modo migliore di capirli è aprire il database in un programma come OpenOffice.org. Verrà visualizzata una lista delle tabelle che compongono il database, e si potrà vedere la loro struttura. </para>

<para
>Per estrarre dati, ad esempio in un foglio di calcolo o in un file esterno, è quasi sempre necessario selezionare dati correlati da più tabelle, Questo viene fatto «associando» le tabelle usando un campo comune. È possibile trovare sul web maggiori informazioni sull'associazione delle tabelle. La tabella seguente elenca i campi usati per definire queste relazioni tra le tabelle. </para>

<informaltable>
  <tgroup cols="3">
    <thead>
      <row>
        <entry valign="top">
          <para
>Relazione</para>
        </entry>
        <entry valign="top">
          <para
>Campo</para>
        </entry>
        <entry valign="top">
          <para
>Campo corrispondente</para>
        </entry>
      </row>
    </thead>
    <tbody>
      <row>
        <entry valign="top">
          <para
>Istituti e conti</para>
        </entry>
        <entry valign="top">
          <para
>kmmInstitutions.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmAccounts.institutionId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Contenimento tra conti</para>
        </entry>
        <entry valign="top">
          <para
>kmmAccounts.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmAccounts.parentId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Transazioni e suddivisioni (vedere la nota 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
>Conti e suddivisioni</para>
        </entry>
        <entry valign="top">
          <para
>kmmAccounts.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmSplits.accountId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Beneficiari e suddivisioni</para>
        </entry>
        <entry valign="top">
          <para
>kmmPayees.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmSplits.payeeId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Pianificazioni e transazioni</para>
        </entry>
        <entry valign="top">
          <para
>kmmSchedules.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmTransactions.id</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Transazioni e valute</para>
        </entry>
        <entry valign="top">
          <para
>kmmTransactions.currencyId</para>
        </entry>
        <entry valign="top">
          <para
>kmmCurrencies.ISOCode</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Conti e titoli (vedere la nota 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
>Titoli e prezzi</para>
        </entry>
        <entry valign="top">
          <para
>kmmSecurities.id</para>
        </entry>
        <entry valign="top">
          <para
>kmmPrices.fromId or kmmPrices.toId</para>
        </entry>
      </row>
      <row>
        <entry valign="top">
          <para
>Tassi di cambio</para>
        </entry>
        <entry valign="top">
          <para
>kmmCurrencies.ISOCode</para>
        </entry>
        <entry valign="top">
          <para
>kmmPrices.fromId or kmmPrices.toId</para>
        </entry>
      </row>
    </tbody>
  </tgroup>
</informaltable>

<para
>Note: </para>

<para
>1 &#x2013; txType = &#x201C;N&#x201D; per le transazioni normali, &#x201C;S&#x201D; per le transazioni pianificate </para>

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

<sect3>
<title
>Formato dei campi</title>

<para
>Diversi campi dati sono memorizzati in un formato interno che potrebbe non essere immediatamente utilizzabile da altri programmi. In questi casi, le informazioni sono duplicate in formati interni ed esterni. </para>

<para
>Gli importi e le quotazioni sono visualizzate sia nel formato numeratore/denominatore e, in un campo il cui nome termina con «Formatted», nella forma visualizzata sullo schermo. </para>
  
<para
>In modo simile, alcuni campi (ad esempio il tipo di conto) sono memorizzati sia come codice numerico sia in un campo il cui nome termina con «String» usando il formato e la lingua del programma. </para>
</sect3>

<sect3>
<title
>Aggiornamento dei dati</title>

<para
>Avere i dati in un formato standard dà la possibilità di modificarli con un programma esterno. NON FARLO a meno che non si sappia veramente quello che si sta facendo, e fare sempre una copia di sicurezza dei dati prima della modifica. Se si sbaglia, &kappname; potrebbe non essere più in grado di accedere ai dati, e si potrebbe persino perderli tutti. Sei stato avvisato! </para>
</sect3>

<sect3>
<title
>Query memorizzate</title>

<para
>La maggior parte dei sistemi di database permette di memorizzare le query e le procedure utilizzate più spesso; in alcuni casi, potrebbero essere memorizzate come tabelle o altri oggetti nel database stesso. Come si può intuire dalla tabella sopra, tutte le tabelle usate da &kappname; iniziano con le lettere minuscole «kmm». Questo standard verrà mantenuto, e verranno aggiornate solo le tabelle che iniziano con queste lettere. Quindi, se si evitano queste lettere nei nomi delle query, &etc;, non si dovrebbero avere problemi. </para>
</sect3>
</sect2>

<sect2 id="details.database.generatesql">
<title
>Creazione manuale del database</title>
<note>
  <para
>Questa sezione tratta l'utilizzo avanzato del database; la maggior parte degli utenti può evitare di leggerla. </para>
</note>

<sect3>
<title
>Quando usarla</title>
<para
>Ci sono casi in cui &kappname; non riesce a creare automaticamente un database, o lo crea senza utilizzare delle opzioni richieste dall'utente. Ad esempio, il sistema di database in uso potrebbe non rispettare completamente lo standard SQL, o non essere stato testato completamente con &kappname;. </para>
<para
>Prima di usare questa funzione, si dovrebbe provare a creare il database stesso (con l'istruzione CREATE DATABASE). Una volta creato il database, &kappname; potrebbe essere in grado di creare le tabelle, &etc; nella procedura normale di salvataggio come database, descritta sopra. </para>
</sect3>

<sect3>
<title
>Generazione dei comandi SQL</title>
<para
>Se non riesce, è possibile generare i comandi SQL di base necessari per creare le varie tabelle, viste e indici richiesti dall'applicazione. Selezionare <guimenuitem
>Genera SQL del database</guimenuitem
> dal menu <guimenu
>Strumenti</guimenu
>. Verrà aperta la seguente finestra di dialogo: </para>
<screenshot>
  <mediaobject>
  <imageobject>
  <imagedata fileref="generate_sql.png" format="PNG"/>
  </imageobject>
  </mediaobject>
</screenshot>

<para
>Selezionando il tipo di database, apparirà il codice SQL corrispondente nella casella di testo <guilabel
>SQL per la creazione</guilabel
>; può essere modificato dall'utente o salvato in un file di testo facendo clic sul pulsante <guibutton
>Salva SQL</guibutton
>. In quest'ultimo caso, si deve creare database usando le funzioni di amministrazione fornite dal sistema di database. </para>
<para
>Se, dopo aver modificato il testo nella finestra, si vuole che &kappname; crei il database, è necessario completare gli altri campi della finestra, spiegati in sopra nel capitolo <link linkend="details.database.selectdatabase"
>Creazione di un database</link
>, e fare clic su <guibutton
>Crea tabelle</guibutton
>. È bene notare che, a parte nel caso di SQLite, bisogna aggiungere un'istruzione CREATE DATABASE come primo comando, se non si è già eseguito questo comando all'esterno di &kappname;. </para>
</sect3>

<sect3>
<title
>Attenzione</title>
<para
>Bisogna stare molto attenti nella modifica delle definizioni delle tabelle e viste di base (quelle i cui nomi iniziano con «kmm»). Alcune modifiche, come l'aumento della larghezza di un campo intero, possono non creare danni, ma non si dovrebbe rimuovere o modificare l'ordine dei campi, altrimenti &kappname; potrebbe non funzionare più o danneggiare i dati. </para>
<para
>L'aggiunta e la rimozione di indici potrebbero migliorare le prestazioni, ma potrebbe accadere anche l'opposto. In questi casi, conoscere il funzionamento interno di &kappname; può aiutare a ottenere le massime prestazioni. </para>
</sect3>

</sect2>

<sect2>
<title
>Cifratura</title>

<para
>La cifratura dei dati nel database non è attualmente supportata. </para>
</sect2>
</sect1>
</chapter>
