Llicčncia de Creative Commons
Aquesta obra estŕ sota una Llicčncia de Creative Commons.

 

Manual de camps calculats en Pilot-DB
Òscar Jiménez i Sánchez, 1 de desembre de 2004

Agraeixo la col·laboració de PalmCAT

Índex

1. Introducció
2. Tipus d’arguments
3. Operands
     De tipus aritmètic
     De comparació de nombres
     De comparació de cadenes
     Operacions d’àlgebra de Boole
     Altres operands
     Operands Mathlib
     Operands inter-registre
4. Exemple Benzina
5. Enllaços

1. Introducció

Aquest manual està destinat al públic en general que utilitzi bases de dades Pilot-DB per a PalmOS, i que vulguin ampliar les seves funcionalitats amb els camps calculats. Per tant he intentat que s’entengui per persones amb mínims coneixements d’informàtica, tot i que és necessari tenir els coneixements bàsics en Pilot-DB, així com els conceptes de “base de dades, “registre” i “camp”.

Les seqüències de Pilot-DB són útils per a crear camps calculats, és a dir, per a fer operacions matemàtiques o operacions amb cadenes, utilitzant els camps d’una base de dades. La sintaxis de les seqüències és semblant a la usada per les calculadores RPN o el llenguatge LISP:

( [operand] [argument1] ... [argument_n] )

On operand és l’operació, i els arguments els camps de la base de dades sobre els quals volem realitzar l’operació. Quan hi ha punts suspensius entre els arguments, significa que se'n poden posar varis. Cal delimitar les operacions amb els parèntesis per evitar problemes.

Amb un exemple ho entendrem ràpidament:

Suposem que tenim una base de dades amb tres camps de tipus Enter.
Creem un quart camp anomenat “Total” i de tipus “Calculat”. En les propietats del camp posem la següent seqüència:

(+ %0 %1 %2)

Aquesta operació ens farà una suma dels tres camps, i ens posarà el resultat al quart camp. Per actualitzar el resultat cal clicar a sobre del camp Total (on inicialment hi ha un interrogant). També podem actualitzar els càlculs quan som en la visualització de tota la base de dades, anant al menú “Registre” -> “Recalcula els camps”.

 

 

El caràcter ‘%’ indica que l’argument es tracta d’una referència a un camp de la base de dades, en aquest cas els camps 0, 1 i 2.

També podem treballar amb constants, suposem que volem sumar 125 al valor que hi hagi al camp 1; en aquest cas posem el valor directament (125) i llestos:

(+ %1 125)

Tornar a l'índex

2. Tipus d’arguments

Les constants són un tipus de dades que tenen un valor concret el qual no canvia mai.
Hi ha varis tipus de constants: enters (125), de coma flotant (125,36), cadenes ("Hola Món"), hores (20:25) i dates(1/1/2005).
Així mateix tenim les referències a altres camps (vist al punt 1), i operacions amb altres clàusules.

Les operacions amb altres clàusules no deixen de ser vàries operacions niades o operacions d’altres operacions. Per exemple, la resta de una multiplicació i una divisió:

( - (* %1 %3) (/ %5 %7) )

Pel que fa a referències a altres camps, cal dir que els camps de tipus booleà es corresponen a la seqüència amb el tipus enter: 0=Fals, 1=Cert.

Quan la referència és a un camp de tipus “Enllaç”, és convenient indicar quin tipus de dades hi ha en aquest camp (amb una instrucció, anomenada “cast” en anglès). Amb això evitarem errors del tipus “Error Compiling Script”.

Exemple: volem crear un camp calculat que li sumi 167 al camp “Enllaç” %1 i ho fem així:

(+ (int %1) 167)

NOTA: “int” és la instrucció que indica el tipus de camp Enter (Integer en anglès). Actualment no hi ha forma d'indicar amb una instrucció “cast” per a tipus de coma flotant en Pilot-DB.

Tornar a l'índex

3. Operands

A continuació veurem els diferents tipus d’operands:

De tipus aritmètic:

Suma: + [arg_1] ... [arg_n]
Resta: - [arg_1] ... [arg_n]
Multiplicació: * [arg_1] ... [arg_n]
Divisió: / [arg_1] ... [arg_n]

Tornar a l'índex

De comparació de nombres:

Igualtat: eq [arg_1] [arg_2]
Retorna un 1 (Cert en booleà) si són iguals
Més petit que: lt [arg_1] [arg_2]
Retorna 1 (Cert) si arg_1 és més petit que arg_2
Més gran que: gt [arg_1] [arg_2]
Retorna 1 (Cert) si arg_1 és més gran que arg_2

Tornar a l'índex

De comparació de cadenes:

Igualtat: seq [arg_1] [arg_2]
Retorna 1 (Cert) si són iguals
És sub-cadena: sstr [arg_1] [arg_2]
Retorna 1 (Cert) si la cadena arg_1 conté a la cadena arg_2

Tornar a l'índex

Operacions d’àlgebra de Boole:

Not: ! [arg]
Retorna 1 (Cert) si arg és fals
Or lògica: or [arg_1] ... [arg_n]
Retorna 1 si un o més arguments avaluen a cert.
And lògica: and [arg_1] ... [arg_n]
Retorna 1 si tots els arguments avaluen a cert.
Do All: all [arg_1] ... [arg_n]
Avalua cada argument, i retorna el resultat de l’últim.
Condicional: ? [arg_1] [res_1] [res_2]
Si arg_1 és Cert, retorna [res_1], en cas contrari retorna [res_2].
Util per a fer càlculs de tipus if ... then ...

Tornar a l'índex

Altres operands

Generació de nombres aleatoris: rand
Retorna un enter més gran que cero. No té arguments
Data: gcd
Retorna la data actual. No té arguments
Cast a enter: int [arg]
Converteix l’argument a enter. Funciona amb dates i hores
Cast a dur: dur [arg]
Converteix l’argument a tipus duració: nombre de dies, hores i minuts des de l’1 de gener del 1904.
Branch: br [arg] [res_0] ... [res_n]
Si [arg] <=0 retorna [res_0]. En cas contrari retorna el resultat [res_x] indexant amb [arg].

Tornar a l'índex

Operands Mathlib

Instal·lant la llibreria Mathlib per PalmOs és possible utilitzar operadors addicionals. Alguns d’aquests operands semblen funcionar de manera incorrecta en la última versió MathLib 1.1 amb Pilot-DB 1.1.0.

Aconsello fer una prova de l’operand per veure que funciona correctament abans d’integrar-lo en una funció més complexa.

Operands:

Sqrt (arrel quadrada), cbrt (arrel cúbica), log (logaritme), ln (logaritme natural), lg (logaritme binari), hypo (hipotenusa, retorna un valor incorrecte), pow[n] i exp[n] (retornen n^n), ceil (part entera d’un flotant), fabs (valor absolut), Rnd (arrodonir un flotant cap a l’enter superior), flr (aparentment fa el mateix que rnd).

Per utilitzar un operand Mathlib hem d’utilitzar l’indicador “ml”. Per exemple, si volem fer l’arrel quadrada del camp 0, ho farem així:

(ml sqrt %0)

Tornar a l'índex

Operands inter-registre

Fins ara hem vist operands que treballen amb camps d’un sol registre. Ara veurem com treballar amb camps de varis registres d’una base de dades.

Utilitzant els dos operands “ffr” i “sort”, i combinant-los amb qualsevol dels operands vistos fins ara, obtenim un operand inter-registre:

sort [camp] [dir]: ordena la base de dades per [camp]. Posant un “1” a [dir] indiquem que volem ordenar en sentit descendent.

ffr [c] [d] [valor]: obté el camp [c] del registre definit pel desplaçament [d] a partir del registre actual. L’argument [valor] és opcional, i és el valor per defecte que retorna l’operand si el registre al qual es vol accedir no existeix.

Tornar a l'índex

4. Exemple Benzina

Ara ens mirarem la base de dades Benzina, per acabar d’entendre els operands inter-registre.

 

 

Observem el camp distància, que calcula els quilometres que hem fet des de l’ultima emplenada de benzina fins a l’actual:

(sort 2 0) (- %2 (ffr 2 1))

L’operand (sort 2 0) ordena la base de dades per quilometratge (camp 2) de manera descendent.

Després, al camp 2 actual, es resta el resultat de l’operand (ffr 2 1), que consisteix en agafar el camp 2 del registre següent a l’actual.

Per acabar-ho d’entendre, si enlloc de restar els quilometres de l’ultima emplenada, volguéssim restar els quilometres de fa 3 emplenades, utilitzaríem (ffr 2 3).

Ara veurem com es fa per calcular el consum del nostre vehicle:

(sort 2 0) (* (/ %3 (- %2 (ffr 2 1))) 100)

Com podem veure, la base de dades s’ordena igualment a partir del quilometratge del vehicle. A continuació agafa la distància que hem recorregut. Després divideix els litres que acabem de posar "%3" amb la distància recorreguda i multiplica el resultat per 100.

Una manera més ràpida de fer això, aprofitant que la distància està calculada al camp 6, seria: (* (/ %3 %6) 100). El problema és que Pilot-DB no permet referències a camps inter-registre, de manera que “%6” no és possible.

Hi ha una manera de poder-ho fer, que és utilitzant el valor per defecte de l’operand ffr:

(sort 2 0) (* (/ %3 (ffr 6 0 0) 100).

Com que el desplaçament és 0, accedim al camp 6 del registre actual, i ens estalviem tornar a calcular la distància recorreguda. Utilitzant el valor per defecte de l’operand ffr, es pot accedir a qualsevol camp d’una base de dades.

Amb aquesta seqüència obtenim el consum del nostre vehicle des de l’última emplenada. Aquesta forma de calcular el consum funciona sempre i quan cada cop que anem a la benzinera, omplim el dipòsit fins dalt. Si no ho fem així, ens podem trobar amb el següent: suposem que des de l’anterior emplenada hem fet 500 qm i que a l’actual emplenada, com que és final de mes, posem 5€ al dipòsit. Al dividir uns 5 litres entre 500 i multiplicar-ho per 100, ens sortiria un extraordinari consum de 1 litre cada 100 quilòmetres.

Si no acostumem a omplir el dipòsit fins dalt, podem calcular l’acumulat dels quilometres i litres que fem al llarg del temps, i finalment fer el càlcul sobre els acumulats, obtenint el consum mitjà del nostre vehicle.

Per calcular l’acumulat de la distància en el nou camp nº 8, ordenem la BD per quilometratge en sentit ascendent, i sumem el camp distància actual (ffr 6 0 0) amb l’acumulat anterior (ffr 8 -1 0):

(sort 2 1)(+ (ffr 8 -1 0) (ffr 6 0 0))

Fem el mateix amb els litres, però sumant fins a l'últim emplenat:

(sort 2 1)(+ (ffr 9 -1 0) (ffr 3 -1 0))

I ara sí, fem el càlcul del consum del nostre vehicle:

(sort 2 1)(* (/ (ffr 9 0 0) (ffr 8 0 0)) 100)

Finalment dir que si ordenem la BD en sentit descendent, accedim al registre anterior amb signe positiu a l’operand (ffr 2 1).
En canvi si s’ha ordenat en sentit ascendent, accedim amb signe negatiu (ffr 8 -1). En aquest cas, si poséssim signe positiu, accediríem al registre posterior.

Tornar a l'índex

5. Enllaços:

Pàgina general de PalmCAT:
http://www.palmcat.cat

Pàgina de descàrrega de la llibreria Mathlib:
http://www.radiks.net/~rhuebner/mathlib.html

Pàgina oficial de Pilot-DB:
http://pilot-db.sourceforge.net

Manual en anglès de Pilot-DB:
http://pilot-db.sourceforge.net/doc.htm

Tornar a l'índex

 

Reconeixement-NoComercial-SenseObraDerivada 2.0 Espanya

Sou lliure de:

Sota les condicions següents:

by
Reconeixement. Heu de reconèixer i citar l'autor original.
nc
No comercial. No podeu utilizar aquesta obra per a finalitats comercials.
nd
Sense obres derivades. No podeu alterar, transformar o generar una obra derivada d'aquesta obra.

Els drets derivats d'usos legítims o altres limitacions no queden afectats per l'anterior.

Això és un resum llegible per humans del text legal (la llicència completa) disponible en els idiomes següents:
Català

Tornar a l'índex