dissabte, 19 de maig de 2012

Creació d'un informe en Access (2). VBA + gestió d'errors.

Objectiu: Crear un informe a partir dels resultats de 4 consultes que no existeixen en la base de dades.

Per tant, caldrà fer-ho amb VBA.

Partim de una BBDD anomenada IneIberia
Una de les seves taules es diu Municipios.
Un dels camps de Municipios és Nombre

Fem quatre consultes (que esborrarem al final) per saber els municipis que comencen per A,per K, per Ñ i per W.

Els resultat és:

A: 870
K: 4
Ñ: 0, però la consulta no ens retorna cap resultat.
W: 1

Per saber-ho hem creat les consultes

qryFreqA
qryFreqK
qryFreqÑ
qryFreqW



La FreqÑ ha estat creada amb "AgruparPor" i és la causa que no doni cap valor. Si haguessim fet servir "Dónde" ens haguessim estalviat molts problemes ja que ens haguès donat resultat "0", però ...



El primer que fem es crear el Informe amb Crear/Diseño de Informe.
Afegirem 4 "cuadros de texto".



Com queda explicat en "Creació d'un informe (1)" és molt important donar nom als objectes. En aquest cas:

txtA
txtK
txtÑ
txtW

Li donem nom un nom significatiu al informe. Es dirà infFreqNomMunicipis

Passem a "Ver código"

Com és habitual declarem el recordset i la base de dades dins General/Declaraciones



Passem a la combinació Objecte/Procediment Report/Activate

Assignem a la variable dbs la nostra base de dades:

Set dbs = Currentdb

Ara omplim el nostre recordset -des de la base ja assignada a la variable dbs- amb un mètode -Openrecordset- que obre la consulta qryFreqA

Set rs = dbs.OpenRecordset("qryFreqA")

Ens movem al primer i únic registre:

rs.movefirst

Ara, carreguem les dades del primer registre del recordset indicant el camp on són les dades

Me!txtA = rs![FreqA]

El primer recuadre ja està. Però la gràcia està en fer-ho sense que existeixi la consulta.

Ara guardarem el informe i anirem a la consulta entrant en mode SQL.
Copiem el texte del SQL, tanquem la consulta i tornem al informe en mode codi.

Al copiar-ho, com que està en diferents línies, ens donarà errors.



Deixem-ho en una única línia.

Cada vegada que eliminem un separador de línia ens donarà error. Aguantem fins al final i sembla que simplement hem deixat una línia però també amb error:



El problema el tenim en dos aspectes:
en les cometes. Arreglem-les tancant-les novament entre cometes
cal afegir-ho dins una variable

Com sempre, la estructura d'una variable string serà Alfa="x", es a dir, el valor que s'assigna entre cometes.



El recordset ja no ha d'anar a buscar la consulta (que ja deuriem haver esborrat). El recordset ara ha d'anar a buscar la variable.



Ja funciona el primer resultat. Anem fent el mateix amb els altres.



Hem deixat la càrrega del botó de la Ñ comentada perquè no s'executi. Els altres tres botons funcionen perfectament sense les consultes.
Si "descomentem" l'error farà que no funcioni res. Per tant ens cal gestionar els errors.

El mòdel seria aquest:

Set rs = dbs.OpenRecordset(VolumA)
On Error GoTo Zero
Me!txtA = rs![FreqA]

Sortir:
Exit Sub
Zero:
Me!txtA = "0"
Resume Sortir

En assegurem que al carregar Me!txtA no es pugui causar un error al no haver-hi res per escriure.
Aquesta prevenció, si hi ha error, farà que el programa salti a la línia Zero: (atenció als dos puntets) i tot seguit escrigui 0. Acabarà anant a la línia Sortir: que li farà sortir del procediment.

Atenció, hem dit sortir del procediment. Si sortim del procediment en el primer error que hagi s'acabarà el programa. La solució es fer un procediment per cada cas:

Private Sub CasoA()
Set rs = dbs.OpenRecordset(VolumA)
On Error GoTo Zero
Me!txtA = rs![FreqA]

Sortir:
Exit Sub
Zero:
Me!txtA = "0"
Resume Sortir

End Sub

Nota: Es més habitual trobar el On Error GoTo com a primera línia, es a dir:

Private Sub CasoA()
On Error GoTo Zero
Set rs = dbs.OpenRecordset(VolumA)
Me!txtA = rs![FreqA]

Sortir:
Exit Sub
Zero:
Me!txtA = "0"
Resume Sortir

End Sub


Per tant, el procediment final funcionant:

Cap comentari:

Publica un comentari a l'entrada