&Tony.Bloomfield; &Tony.Bloomfield.mail;
&Jack.H.Ostroff; &Jack.H.Ostroff.mail;
1 de desembre de 2024
5.2.0

# Base de dades

## Usar bases de dades relacionals

### Introducció

Des de la versió 1.0, el &kmymoney; permet mantenir les dades en una base de dades relacional. Un dels avantatges d'utilitzar aquest format estàndard de la indústria és que us permetrà veure les dades emprant un dels frontals com OpenOffice.org o LibreOffice, o potser en algun format que el &kmymoney; actualment no proporciona. A més, una mica de coneixement de SQL («Llenguatge estructurat de consulta», el llenguatge utilitzat a tot el món per a accedir a les bases de dades relacionals) hauria de permetre-us exportar amb més facilitat les dades a un programa extern, per exemple, una aplicació de pressupostos.

Encara que la majoria dels sistemes de bases de dades relacionals permeten l'accés concurrent a una base de dades per més d'un usuari, això no és possible amb el &kmymoney;. Tot i que el &kmymoney; pot emmagatzemar les dades en una base de dades relacional, en realitat utilitza la base de dades com un tipus diferent d'emmagatzematge de fitxers. Quan obriu el fitxer, el programa llegeix totes les dades de la base de dades. A mesura que treballeu amb les vostres dades, els canvis es fan només a l'emmagatzematge intern; no s'escriuen immediatament a la base de dades. Només quan deseu les vostres dades, el &kmymoney; escriurà tot el fitxer a la base de dades.

Hi ha hagut sol·licituds perquè el &kmymoney; actualitzi la base de dades per a cada canvi de les dades, però això requeriria un canvi significatiu en tota la forma en què el programa gestiona les seves estructures de dades internes, de manera que això és extremadament improbable que passi en un futur previsible.

### Preparació

Per a accedir a la base de dades, el &kmymoney; utilitza el mòdul SQL subministrat per les &Qt; com a part del seu sistema de programació en &Qt;. Aquest mòdul admet molts sistemes de bases de dades mitjançant una col·lecció de controladors. Les &Qt; tenen controladors per a un gran nombre de sistemes de bases de dades relacionals de codi obert i propietaris, incloent-hi el MySQL, el PostgreSQL i l'SQLCipher. El mòdul també admet alguns sistemes més «pesats», més industrials, com l'Oracle i el DB2 d'IBM.

Les versions anteriors del &kmymoney; admetien l'SQLite. Això s'ha reemplaçat amb el suport per a l'SQLCipher, que és una bifurcació independent de la biblioteca de base de dades SQLite que afegeix encriptatge AES de 256 bits i altres funcions de seguretat. El controlador SQLCipher llegirà els fitxers SQLite existents. Vegeu la secció següent sobre l'SQLCipher per a més detalls.

Amb l'excepció de l'SQLCipher, aquests sistemes utilitzen un model client/servidor, on el programari «client» es troba a la vostra màquina, mentre que el servidor resideix a la mateixa màquina que la base de dades, la qual podrà estar en una altra part de la xarxa. Per descomptat, a l'escenari normal per a una aplicació de finances personals com el &kmymoney;, la «vostra» màquina pot actuar com a client i servidor. Per tant, la primera tasca, després d'haver decidit quin sistema de base de dades voleu utilitzar, és instal·lar el programari del client i, probablement, del servidor.

A més del programari de la base de dades en si, també haureu d'instal·lar el corresponent mòdul controlador de les &Qt;. La majoria de les distribucions &Linux; inclouran mòduls dels controladors per a les bases de dades més populars. Altrament, consulteu el lloc web de les &Qt; i cerqueu «SQL drivers».

L'SQLCipher i l'SQLite no funcionen en un model client/servidor. Cada base de dades s'emmagatzema en un fitxer normal, local o remot, al qual s'accedeix utilitzant els mètodes normals subministrats pel sistema operatiu subjacent. En aquest cas, per tant, només s'haurà d'instal·lar un paquet de programari i el controlador. A més, part de la informació següent, particularment la relacionada amb l'administració, podria no aplicar-se.

### Administració

Tenir cura de les bases de dades és una mica més complex que tractar amb fitxers normals. Cada sistema té diferents mètodes per a dur a terme les tasques administratives necessàries, com crear les bases de dades, assignar permisos a diversos usuaris o fer còpies de seguretat. La descripció d'aquestes tasques queda fora de l'àmbit d'aquest manual, però tots els productes admesos proporcionen una completa documentació de referència, i una cerca ràpida al web us guiarà a moltes guies d'aprenentatge sobre el tema.

#### Crear la base de dades

El &kmymoney; inclou un codi SQL per a crear una base de dades inicial per a emmagatzemar les dades, si no existeix. No obstant això, es recomana fermament que creeu prèviament una base de dades, ja que la majoria dels productes ofereixen una sèrie d'opcions que poden ser rellevants. Quelcom que podria ser de particular importància per a alguns seria la designació del joc de caràcters (&pex;, UTF-8) que s'utilitzarà per als camps de text.

En aquest moment, també haureu d'especificar els permisos perquè diversos usuaris realitzin diferents operacions a la base de dades. En la majoria dels sistemes, a l'usuari que crea la base de dades se li assignaran automàticament tots els permisos, però aquesta és una àrea en la qual s'haurà de consultar la documentació.

Per al primer ús de la base de dades, i ocasionalment en altres ocasions quan canviï el disseny de la base de dades, necessitareu permís (també anomenat privilegis) per a crear i modificar taules i vistes (vegeu el paràgraf següent). Poden haver-hi diferents noms per als permisos/privilegis en sistemes diferents, però quelcom com `CREATE` (crea) i `ALTER` (altera) hauria de ser comuna. Per a una execució normal, haureu de poder llegir i escriure els registres, aquests es defineixen normalment a l'SQL com permisos `SELECT` (selecciona), `INSERT` (insereix), `UPDATE` (actualitza) i `DELETE` (suprimeix).

#### Crear taules

En el primer ús, el &kmymoney; intentarà crear les estructures necessàries de taules. Per a aconseguir la màxima compatibilitat entre diversos tipus de bases de dades, només s'utilitzarà un subconjunt de tipus de dades habituals. No obstant això, poden haver-hi situacions en què no s'admetrà un tipus en particular, i en aquest cas, s'ha previst generar el codi SQL necessari per a crear les taules. Aquest codi podrà modificar-se segons sigui necessari i emprar-se per a crear les taules fora del &kmymoney;. Si esteu en aquesta situació, generalment podreu obtenir ajuda mitjançant un dels canals llistats a la secció com obtenir ajuda. Per a més informació consulteu Crear manualment la base de dades.

### Crear una base de dades

Amb el &kmymoney;, obriu o importeu un fitxer de dades existent o creeu-ne un de nou. Després seleccioneu l'element de menú Fitxer Desa com a base de dades. Seleccioneu SQL des del menú desplegable Tipus d'emmagatzematge a usar per a les dades, i feu clic a D'acord. Després veureu el diàleg següent:

Crear una base de dades
Crear una base de dades

Completeu els camps apropiats per al tipus de base de dades que heu seleccionat (com de costum, els camps obligatoris estaran ressaltats) i premeu D'acord per a crear la base de dades.

#### Tipus de base de dades

Aquest menú desplegable llista tots els controladors SQL de les &Qt; instal·lats al sistema. Seleccioneu el controlador per al vostre tipus de base de dades. Si el que voleu no es troba a la llista, haureu d'instal·lar el controlador apropiat. Consulteu la documentació de la distribució o visiteu el lloc web de les &Qt; i cerqueu «SQL drivers».

#### Fitxer (només SQLite/SQLCipher)

L'SQLCipher té una base de dades per fitxer, així que introduïu el nom del fitxer en el qual voleu crear la base de dades. Per a explorar el sistema de fitxers, feu clic sobre la icona que hi ha a la dreta del nom de fitxer. Per a les bases de dades SQLCipher, els camps Nom de la base de dades, Nom de la màquina i Nom d'usuari no són rellevants. El fitxer SQLCipher haurà de tenir definits els permisos adequats de lectura/escriptura al sistema de fitxers subjacent per a permetre l'accés apropiat a l'usuari que actualment connectat.

Els creadors de l'SQLCipher van llançar la versió 4.0 el novembre de 2018. No obstant això, molts usuaris del &kmymoney;, especialment aquells que no actualitzen molt sovint, o que utilitzen distribucions LTS (Long Term Support) del &Linux;, encara poden estar utilitzant una base de dades creada amb la versió 3 de l'SQLCipher. En algun moment, normalment després d'actualitzar el &kmymoney; o la seva distribució, troben que no poden obrir la seva base de dades, amb un error que no és especialment informatiu o útil. El que es requereix en aquest cas és actualitzar la base de dades mateixa de la versió 3 a la versió 4. Les instruccions per a fer això es poden trobar al lloc web SQLCipher.

#### Nom de la base de dades (altres)

El nom predeterminat de la base de dades és `KMyMoney`, però si voleu podreu triar un altre nom. Per a alguns tipus de bases de dades, el &kmymoney; podria no ser capaç de crear la base de dades, de manera que s'haurà de crear prèviament mitjançant el procediment administratiu apropiat. No obstant això, el &kmymoney; generalment podrà crear totes les estructures de taula quan sigui necessari. Si no, podreu crear-les vosaltres mateixos. Per a més informació consulteu Crear manualment la base de dades.

#### Nom de la màquina

Per a l'usuari mitjà, el nom predeterminat de localhost -el qual és la màquina que esteu utilitzant- és correcte. Per a les bases de dades en xarxa, introduïu el nom de la màquina del servidor de base de dades.

#### Nom d'usuari i contrasenya

Comproveu els permisos configurats a la base de dades, o poseu-vos en contacte amb l'administrador de la base de dades, per a obtenir els valors correctes per a utilitzar-los aquí. El nom d'usuari haurà de ser capaç de seleccionar, inserir, actualitzar i suprimir registres. Si el nom d'usuari és el mateix que el nom per a iniciar la sessió, normalment no es requerirà cap contrasenya.

### Accedir a les dades

#### Dissenyar la taula

Per a accedir a les dades al &kmymoney;, utilitzeu l'element de menú Fitxer Obre la base de dades . Això obrirà un diàleg similar a l'anterior.

Si heu creat la base de dades obrint primer un fitxer i després fent Fitxer Desa i triant SQL com s'ha descrit anteriorment, els canvis posteriors a les dades només es desaran a la base de dades, no al fitxer. Això vol dir que podreu utilitzar el fitxer com una còpia de seguretat o una instantània de les dades en un moment determinat. Per a crear una còpia de seguretat nova com aquesta, obriu la base de dades, trieu l'element de menú Fitxer Desa com a..., trieu XML com el tipus d'emmagatzematge, i proporcioneu un nom de fitxer apropiat. Recordeu tornar a obrir la base de dades, perquè el &kmymoney; no continuï utilitzant el fitxer.

Per a accedir a les dades en altres formats, necessitareu saber una mica sobre com es desen en les bases de dades relacionals. De molt, la forma més fàcil d'entendre-ho és obrir la base de dades en un frontal com OpenOffice.org. Això proporcionarà una llista de les diverses taules que componen la base de dades i us permetrà veure el disseny de cadascuna d'elles.

Per a extreure dades, &pex;, a un full de càlcul o a un fitxer extern, gairebé sempre cal seleccionar dades vinculades des de més d'una taula. Això es fa «unint» les taules, emprant un camp que sigui comú entre elles. Trobareu molta més informació sobre com es fa això a les guies d'aprenentatge en línia per a bases de dades esmentades anteriorment. La taula següent llista els camps utilitzats per a definir aquestes relacions entre taules.

Relació | Coincidència | Amb
--- | --- | ---
Institucions i Comptes | `kmmInstitutions.id` | `kmmAccounts.institutionId`
Comptes pare/fill | `kmmAccounts.id` | `kmmAccounts.parentId`
Operacions i Desglossaments (vegeu la nota 1) | `kmmTransactions.id` | `kmmSplits.transactionId`
Comptes i desglossaments | `kmmAccounts.id` | `kmmSplits.accountId`
Beneficiaris i desglossaments | `kmmPayees.id` | `kmmSplits.payeeId`
Planificacions i Operacions | `kmmSchedules.id` | `kmmTransactions.id`
Operacions i divises | `kmmTransactions.currencyId` | `kmmCurrencies.ISOCode`
`Comptes i Títols (vegeu la nota 2)` | `kmmAccounts.currencyId` | `kmmSecurities.id`
Títols i Preus | `kmmSecurities.id` | `kmmPrices.fromId` o `kmmPrices.toId`
Tipus de canvi | `kmmCurrencies.ISOCode` | `kmmPrices.fromId` o `kmmPrices.toId`

Notes:

1 – txType = «N”» per a les operacions normals, «S”» per a les operacions planificades

2 – si kmmAccounts.isStockAccount = «Y”»

#### Formats de camp

Diversos dels camps de dades es mantenen en un format intern que pot no ser immediatament útil per als programes externs. En aquests casos, la informació s'ha duplicat en ambdós formats, intern i extern.

Els imports monetaris i els valors compartits es mostren en format numerador/denominador i, amb un nom de camp amb el sufix «`Formatted`» (amb format), en la forma que es visualitza normalment.

De la mateixa manera, alguns camps, com el tipus de compte, apareixen com un codi numèric i en un camp amb el sufix «`String`» (cadena) en la forma i l'idioma de l'aplicació.

#### Actualitzar les dades

Tenir les dades en un format estàndard de la indústria permet modificar-los des de fora de l'aplicació &kmymoney;. NO HO FEU a menys que realment sapigueu el que esteu fent, i primer creeu sempre una còpia de seguretat de les dades. Si us equivoqueu, és possible que el &kmymoney; no pugui accedir a les dades i, fins i tot podria acabar perdent-ho tot. Quedeu avisats!

#### Consultes emmagatzemades

La majoria dels sistemes de bases de dades permeten emmagatzemar consultes i procediments d'ús habitual, i en alguns casos, aquests es poden mantenir com a taules o altres objectes dins de la base de dades. Com haureu endevinat per l'anterior, totes les taules utilitzades pel &kmymoney; comencen amb les lletres minúscules «`kmm`». Aquest estàndard es mantindrà i només s'actualitzaran les taules que comencin amb aquestes lletres. Per tant, sempre que proporcioneu aquestes lletres en les consultes, &etc;, no hi haurà cap problema.

### Crear manualment la base de dades

Aquesta secció cobreix l'ús més avançat de la base de dades i pot ser omesa per l'usuari general.

#### Quan emprar-ho

Hi poden haver ocasions en què el &kmymoney; no pot crear la base de dades automàticament, o la crea sense algunes opcions requerides per l'usuari. Per exemple, el sistema de base de dades utilitzat pot no ajustar-se completament a l'ús estàndard de l'SQL, o es pot introduir suport per a sistemes nous que no s'han provat completament al &kmymoney;.

Abans d'utilitzar aquesta facilitat, haureu d'intentar crear l'entrada de la base de dades en si (&ead;, amb la instrucció `CREATE DATABASE`). Sempre que existeixi la base de dades, el &kmymoney; podrà crear les taules, seguint el procediment normal descrit anteriorment per a desar la base de dades.

#### Generar l'SQL

Si això falla, és possible generar les ordres SQL bàsiques necessàries per a crear les diverses taules, vistes i índexs requerits per l'aplicació. Seleccioneu l'element de menú Eines Genera la base de dades SQL. Això presentarà el diàleg següent:

Generació de l'SQL per a crear una base de dades
Generació de l'SQL per a crear una base de dades

En seleccionar el tipus de la base de dades, apareixerà l'SQL apropiat al quadre de text SQL per a la creació. L'usuari la podrà editar o desar en un fitxer de text fent clic a Desa com a SQL. En l'últim cas, la base de dades s'haurà de crear utilitzant les funcions administratives proporcionades pel sistema de la base de dades.

Si després d'editar el text al diàleg, voleu que el &kmymoney; creï la base de dades, haureu de completar els altres camps al diàleg, com es detalla a Crear una base de dades, i feu clic a Crea les taules. Recordeu que, excepte en el cas de l'SQLite, haureu d'incloure una instrucció `CREATE DATABASE` adequada com a primera ordre, o haver executat prèviament l'ordre esmentada, de manera externa al &kmymoney;.

#### Avís

Cal tenir molta cura en editar les definicions de qualsevol de les taules o vistes bàsiques (aquelles amb noms que comencen amb «`kmm`»). Alguns canvis com ara augmentar la longitud d'un camp de nombre enter, poden tenir poc impacte, però no haureu d'eliminar ni canviar la seqüència de cap camp, o el &kmymoney; podria negar-se a funcionar, o podríeu corrompre les dades.

Si bé afegir o eliminar índexs pot millorar el rendiment, també haureu de tenir en compte que pot succeir tot el contrari. Alguns coneixements sobre el funcionament intern de &kmymoney; podrien ajudar a obtenir el millor rendiment en aquestes circumstàncies.

### Encriptatge

En l'actualitat no s'admet l'encriptatge de les dades a la base de dades.