![]() |
MINI CORSO DI MICROSOFT ACCESS - parte 4° |
![]() |
Le funzioni disponibili in Visual Basic for Application sono
utilizzabili anche all'interno dei comandi SQL. I comandi così creati non risultano
compatibili con lo standard (SQL ANSI), accettato dalla gran parte dei DB SERVER .
Elenchiamo qui di seguito le funzioni VBA più importanti.
Funzioni per la manipolazione delle stringhe
ASC(Argomento)
La funzione ASC restituisce il codice ascii del carattere passato come Argomento.
ASC("A") ==> 65
In MySQL il comando equivalente è:
ASCII(Lettera)
esempio:
ASCII('A') ==> 65
ASCII('B') ==> 66
CHR(Argomento)
La funzione CHR restituisce il carattere il cui codice ascii è passato come Argomento.
CHR(65) ==> "A"
In MySQL il comando equivalente è:
CHAR(CodiceAscii1,CodiceAscii2,
...)
esempio:
CHAR(65,66) ==> "AB"
LEFT(Argomento, N)
La funzione LEFT vuole 2 argomenti. Il 1° è una stringa (esempio "Ciao") mentre il 2° (N) è un intero. LEFT restituisce i primi N caratteri della stringa passata come 1° argomento.
Left("Questa è una frase",4) ==> "Ques"
In MySQL la funzione è la stessa
RIGHT(Argomento, N)
La funzione RIGHT vuole 2 argomenti. Il 1° è una stringa (esempio "Ciao") mentre il secondo (N) è un intero . RIGHT restituisce gli ultimi N caratteri della stringa passata come 1° argomento.
Right("Questa è una frase",4) ==> "rase"
In MySQL la funzione è la stessa
LEN(Argomento)
La funzione LEN restituisce il numero di caratteri contenuti nella stringa passata come Argomento (spazi compresi).
len("Questa è una frase ") ==> 19
In MySQL il comando equivalente è:
LENGTH(Argomento)/CHAR_LENGTH(Argomento)
esempio:
CHAR_LENGTH("Ciao")
==> 4
MID(Argomento, I, N)
La funzione MID restituisce, partendo dall'I-esimo carattere, N caratteri estratti dalla stringa passata come 1° argomento.
mid("Questa è una frase", 3, 8) ==> "esta è u"
Quando ometto il 3° argomento la funzione MID estrae tutti i caratteri del 1° parametro a partire dalla lettera di posizione I-esima (compresa).
mid("Questa è una frase", 10) ==>
"una frase"
mid("Questa è una frase",len("Questa è una frase")-1)==>"se"
Attenzione: La posizione di un carattere in una stringa va calcolata tenendo presente che la numerazione parte da 1 e non da 0 come solitamente avviene in linguaggi come il javascript,C o php.
In MySQL il comando equivalente è:
MID(Str, pos, len)/SUBSTRING(Str, pos, len)
esempio:
SUBSTRING("Ciao",3,1)
==> "a"
SUBSTRING("Ciao",3) ==> "ao"
INSTR(StringaDoveCerco, StringaCercata)
Restituisce la posizione della prima occorrenza di una stringa (StringaCercata) all'interno di un'altra (StringaDoveCerco). Se non trova niente restituisce 0.
Instr("Questa
è una frase fraintesa", "fra") ==> 14
Instr("Questa
è una frase", "ciao") ==> 0
In MySQL il comando equivalente è:
LOCATE(StringaCercata,DoveCerco)
Esempio: l'utilizzo combinato delle funzioni INSTR,
MID, LEFT consente di separare il cognome dal nome quando sono registrati assieme in un unico campo:Nominativo="Sechi Marco"
Left(Nominativo,Instr(Nominativo," ")-1) ==> "Sechi"
Mid(Nominativo, Instr(Nominativo," ")+1) ==>
Applicando l'esempio all'SQL ottengo:
SELECT Nominativo,
Left(Nominativo,Instr(Nominativo," ")-1)
AS COGNOME,
Mid(Nominativo, Instr(Nominativo," ")+1) AS NOME
FROM Studenti
la cui esecuzione produce questo risultato:
Trim(stringa) LTrim(stringa) RTrim(stringa)
Restituisce l'argomento (di tipo stringa) privo degli spazi iniziali e finali.
Trim(" Questa è bella ") ==> "Questa è bella"
La funzione LTrim elimina dalla stringa passata come argomento gli spazi iniziali.
LTrim(" Questa è bella ") ==> "Questa è bella "
La funzione RTrim elimina dalla stringa passata come argomento gli spazi finali.
RTrim(" Questa è bella ") ==> " Questa è bella"
In MySQL queste funzioni sono identiche
Ucase(Argomento) - Lcase(Argomento)
Ucase restituisce la stringa passata come Argomento in caratteri maiuscoli.
Lcase
restituisce la stringa passata come Argomento in minuscolo.Esempio: combinando le funzioni Ucase e
Lcase possiamo trasformare il contenuto di un campo in modo che venga scritto tutto in minuscolo esclusa la prima lettera (tipico dei nomi propri):Nome="mArCo"
Ucase(left(Nome,1))+lcase(mid(Nome,2))
==>"Marco"
In MySQL queste funzioni sono identiche - esistono comunque dei sinonimi: Lower e Upper
SPACE(N)
Restituisce una stringa composta da N spazi.
Space(5) ==> " "
In MySQL ia funzione è identica.
STRING(N, Carattere)
Restituisce una stringa composta da N repliche del Carattere passato come 2° argomento.
String(5, "*")
==> "*****"
In MySQL il comando equivalente è:
REPEAT
(Stringa,NrVolte)
REPLACE(Stringa, StringaCercata, NewStringa)
Restituisce la stringa ottenuta sostituendo nel 1° argomento tutte le occorrenze della sottostringa StringaCercata con la stringa NewStringa passata come 3° argomento
Replace("Ciao sono Marco", "o", "*")
==> Cia* s*n* Marc*"
In MySQL questa funzione è identica.
La funzione REPLACE non esiste nella versione 97. Può essere comunque implementata mediante VBA. La funzione MyReplace(), presentata in seguito (basata sulle funzioni: INSTR, LEFT, MID, LEN), svolge la stesso compito di REPLACE:
Function
MYREPLACE(ByVal
StringaOriginale As String, _
StringaDaRimpiazzare As String, _
StringaNuova As String) As String
Dim StringaFinale As String
Dim ParteSinistra As String
Dim ParteDestra As String
Dim DoveELaStringaDaRimpiazzare As Long
StringaFinale = ""
DoveELaStringaDaRimpiazzare = InStr(StringaOriginale,
StringaDaRimpiazzare)
While DoveELaStringaDaRimpiazzare > 0
ParteSinistra = Left(StringaOriginale,
DoveELaStringaDaRimpiazzare - 1)
ParteDestra = Mid(StringaOriginale,
DoveELaStringaDaRimpiazzare + Len(StringaDaRimpiazzare))
StringaFinale = StringaFinale + ParteSinistra +
StringaNuova
StringaOriginale = ParteDestra
DoveELaStringaDaRimpiazzare = InStr(StringaOriginale,
StringaDaRimpiazzare)
Wend
MYREPLACE = StringaFinale + StringaOriginale
End Function
Funzioni di conversione
Cstr(Argomento)
Converte l'Argomento passato in stringa
Cstr(1.002) ==> "1,002"
Cstr(#11/26/2005#) ==> "26/11/2005"
Cstr(True) ==> "Vero"
In MySQL esiste la funzione CONVERT(Argomento, Tipo) ma è pressochè inutile poichè a seconda del contesto la conversione avviene automaticamente:
Esempio:
CONCAT('Ciao a tutti e ',2) ==>
CDbl(Argomento)
Converte, se possibile, la stringa passata come Argomento in double (numero in precisione doppia) altrimenti genera un errore
CDbl("1,002") ==> 1.002
CDbl("A") ==> ERRORE: Tipo non corrispondente
In MySQL non esiste un comando equivalente poichè la conversione avviene in modo automatico:
Esempio:
'1.21'+0.2
==> 1.41
CLng(Argomento)
Converte l'Argomento, se è possibile, in un long (numero intero lungo a 32 bit).
CLng(1.002) ==> 1
CLng(#12/31/1899#) ==> 1
In presenza di decimali arrotonda per difetto o per eccesso all'unità più vicina
CLng("1,51") ==> 2
CLng(1.49) ==> 1
In MySQL il comando equivalente è:
ROUND
(Argomento)
Fix(Numero)
Elimina la parte decimale del Numero passato come argomento, senza arrotondare
Fix
(1.51) ==> 1Fix
(1.49) ==> 1In MySQL il comando equivalente è:
TRUNCATE
(Numero,Decimali)/FLOOR(Numero)CDate(Argomento)
Converte l'argomento passato, se è possibile, in data/ora
CDate(1) ==> #12/31/1899#
CDate("01/01/2005") ==> #1/1/2005 0.00#
In MySQL il comando equivalente esiste dalla versione 4.1.1 ed è:
STR_TO_DATE(Argomento,MascheraFormato)
La MascheraFormato
segue le stesse regole di composizione della funzione DATE_FORMAT ()
-
esempio:
STR_TO_DATE('31.03.2003 09.20','%d.%m.%Y %H.%i')
-->
'2003-03-31 09:20:00'
STR_TO_DATE('32.03.2003 09.20','%d.%m.%Y %H.%i') --> NULL
Si ricordi che le
date in mysql sono stringhe dove la data è scritta in maniera ribaltata ovvero anno, mese e giorno.Format(Valore, MascheraFormato)
Trasforma il primo parametro Valore secondo le specifiche indicate in MascheraFormato. Nella tabella sottostante sono elencate le specifiche relative a formati di tipo data/ora
Maschera di formato | Esempio | Risultato | Descrizione | |
In SQL | Nel generatore di query | |||
"d" | "g" | format(#12/02/2005 12.00.23#,"d") | 2 | Visualizza il giorno come numero senza zero iniziale (1 – 31). |
"dd" | "gg" | format(#12/02/2005 12.00.23#,"dd") | 02 | Visualizza il giorno come numero con zero iniziale (01 – 31). |
"ddd" | "ggg" | format(#12/02/2005 12.00.23#,"ddd") | ven | Visualizza il giorno abbreviato (dom – sab). |
"dddd" | "gggg" | format(#12/02/2005 12.00.23#,"dddd") | venerdì | Visualizza il giorno per esteso (domenica – sabato) |
"w" | "i" | format(#12/02/2005 12.00.23#,"w") | 6 | Visualizza il giorno della settimana come numero (1 per domenica-7 per sabato). |
"ww" | "ii" | format(#12/02/2005 12.00.23#,"ww") | 49 | Visualizza la settimana di un anno come numero |
"m" | format(#1/15/2005 12.00.23#,"m") | 1 | Visualizza il mese come numero senza zero iniziale (1 – 12). Se m segue immediatamente h o hh, viene visualizzato il valore relativo ai minuti anziché il mese. | |
"mm" | format(#1/15/2005 12.00.23#,"mm") | 01 | Visualizza il mese come numero con zero iniziale (01 – 12). Se m segue immediatamente h o hh, viene visualizzato il valore relativo ai minuti anziché il mese. | |
"mmm" | format(#1/15/2005 12.00.23#,"mmm") | gen | Visualizza il mese abbreviato (gen – dic). | |
"mmmm" | format(#1/15/2005 12.00.23#,"mmmm") | gennaio | Visualizza il mese con il relativo nome per esteso (gennaio – dicembre). | |
"q" | format(#12/02/2005 12.00.23#,"q") | 4 | Visualizza il trimestre dell'anno come numero (1 – 4). | |
y | "a" | format(#12/02/2005 12.00.23#,"y") | 336 | Visualizza il giorno dell'anno come numero (1 – 366). |
yy | "aa" | format(#12/02/2005 12.00.23#,"yy") | 05 | Visualizza l'anno come numero di due cifre (00 – 99). |
yyyy | "aaaa" | format(#12/02/2005 12.00.23#,"yyyy") | 2005 | Visualizza l'anno come numero di quattro cifre (100 – 9999). |
h | format(#12/02/2005 01.02.03#,"h") | 1 | Visualizza l'ora come numero senza zero iniziale (0 – 23). | |
hh | format(#12/02/2005 01.02.03#,"hh") | 01 | Visualizza l'ora come numero con zero iniziale (00 – 23). | |
n | format(#12/02/2005 01.02.03#,"n") | 2 | Visualizza i minuti come numero senza zero iniziale (0 – 59). | |
nn | format(#12/02/2005 01.02.03#,"nn") | 02 | Visualizza i minuti come numero con zero iniziale (00 – 59). | |
s | format(#12/02/2005 01.02.03#,"s") | 3 | Visualizza i secondi come numero senza zero iniziale (0 – 59). | |
ss | format(#12/02/2005 01.02.03#,"ss") | 03 | Visualizza i secondi come numero con zero iniziale (00 – 59) |
I singoli elementi presentati della tabella precedente possono essere combinati tra loro come nell'esempio seguente
format(#12/02/2005 01.02.03#,"dddd, d mmmm yyyy \o\r\e hh.nn.ss") ==> "venerdì, 2 dicembre 2005 ore 01.02.03"
In MySQL il comando equivalente per il tipo data/ora è:
DATE_FORMAT(Data,MascheraFormato)
esempio:
DATE_FORMAT('2006-03-01 19:59:08','%W, %d/%m/%Y
%T - %j° gg %u° settimana')
==> "Wednesday, 01/03/2006 19:59:08 - 060° gg 09° settimana"
la maschera di formato si basa su queste regole:
%M
|
Nome mese (January ..December )
|
%W
|
Giorno della
settimana (Sunday ..Saturday )
|
%D
|
giorno del
mese con suffisso inglese (1st ,
2nd ,
3rd , etc.)
|
%Y
|
Anno a 4 cifre |
%y
|
Anno a 2 cifre |
%a
|
Giorno della
settimana abbreviato (Sun ..Sat )
|
%d
|
Giorno del
mese con zero iniziale (01, 02,
..31 )
|
%e
|
Giorno del mese
senza zero iniziale (1,2,
..31 )
|
%m
|
Numero mese
con zero iniziale (01 ..12 )
|
%c
|
Numero mese
con zero iniziale (1 ..12 )
|
%b
|
Nome mese
abbreviato (Jan ..Dec )
|
%j
|
Giorno
dell'anno (001 ..366 )
|
%H
|
Ore (00,01,
..23 )
|
%k
|
Ore (0 ,1,..23 )
|
%h
|
Ore (01 ..12 )
|
%l
|
Ore (1 ..12 )
|
%i
|
Minuti, numeric (00 ..59 )
|
%r
|
Orario, 12-hour (hh:mm:ss [AP]M )
|
%T
|
Orario, 24-hour (hh:mm:ss )
|
%S
|
Secondi con zero
iniziale (00 ..59 )
|
%s
|
Secondi senza zero
iniziale (00 ..59 )
|
%p
|
AM
o PM
|
%w
|
Numero giorno
della settimana (0 =Sunday..6 =Saturday)
|
%U
|
Nr. Settimana (0 ..52 ),
dove la domenica è il primo giorno della settimana |
%u
|
Nr. Settimana (0 ..52 ),
dove il lunedì è il primo giorno della settimana |
%%
|
il carattere `%'. |
Nella tabella seguente sono elencati alcuni esempi di specifiche relative a formati di tipo numerico
Maschera di formato | Esempio | Risultato | Descrizione | |
In SQL | Nel generatore di query | |||
"#,##0.00" | "#.##0,00" | format(0.009,""#,##0.00"") | 0,01 | Si osservi: un numero senza parte intera viene visualizzato con lo 0 iniziale. |
"#,###.00" | "#.###,00" | format(1000.014,""#,##0.00"") | 1.000,01 | Se il numero di cifre decimali è superiore a quello indicato nella maschera di formato allora il numero viene arrotondato per difetto o eccesso a seconda. |
format(0.009,""#,###.00"") | ,01 | Si osservi: un numero senza parte intera viene visualizzato senza lo 0 iniziale | ||
00000 | Format(1,"00000") | 00001 | Segnaposto di cifra. Visualizza una cifra o uno zero. Se l'espressione contiene una cifra nella posizione in cui compare lo 0 nella stringa del formato, tale cifra verrà visualizzata; in caso contrario in tale posizione verrà visualizzato uno zero. | |
"#,##0 \L\i\r\e" | "#.##0 \L\i\r\e" | format(1000.014,""#,##0.00 \L\i\r\e") | 1000 Lire | Se voglio scrivere delle frasi per evitare di confonderle con le sigle dellla maschera di formato ogni lettera va scritta facendola precedere con uno \ |
In MySQL il comando equivalente è:
FORMAT(Numero,nr Cifre decimali)
esempio:
FORMAT(12332.123456, 4)
==> '12,332.1235'
FORMAT(12332.1,
4) ==>
'12,332.1000'
Nella successiva tabella sono elencati alcuni esempi di specifiche relative a valori di tipo stringa
Maschera di formato | Esempio | Risultato | Descrizione |
> | format("ciao",">") | "CIAO" | Applica le maiuscole. Visualizza tutti i caratteri in maiuscolo. |
< | format("ciao","<") | "ciao" | Applica le minuscole. Visualizza tutti i caratteri in minuscolo. |
@ | format("ciao","@@@@@@") | "ciao " | Segnaposto di carattere. Visualizza un carattere o uno spazio. Se la stringa include un carattere nella posizione in cui compare @ nella stringa di formato, tale carattere verrà visualizzato, in caso contrario in tale posizione verrà visualizzato uno spazio. I segnaposto vengono riempiti da destra a sinistra, a meno che non vi sia un punto esclamativo (!) nella stringa di formato. |
!@ | format("ciao","!@@@@@@") | " ciao" |
In MySQL i risultati ottenuti con le maschere di formato @ e !@ possono essere replicati con le funzioni LPAD e RPAD:
esempio:
LPAD("ciao",6," ") ==> " ciao"
RPAD("Ciao",6," ") ==> "ciao "
Funzioni di test o logiche
IIF(Condizione, ValoreSeVero, ValoreSeFalso)
Restituisce il 2° parametro se la Condizione è vera altrimenti il 3° parametro.
In SQL posso scrivere ad esempio:
SELECT Nominativo, iif(Voto>=6,'Promosso', 'Bocciato') AS Esito FROM Studenti
In MySQL il comando equivalente è identico:
NZ(Argomento, ValoreSeArgomentoNullo)
Restituisce il 2° parametro ValoreSeArgomentoNullo se il primo Argomento vale Null altrimenti ritorna il valore di Argomento. Corrisponde alla seguente sequenza VBA:
iif(IsNull(Argomento), ValoreSeArgomentoNullo, Argomento)
In SQL posso scrivere ad esempio:
SELECT Nominativo, Nz(Voto,"Non Valutato") AS Esito
FROM Studenti
LEFT JOIN Interrogazioni
ON Studenti.IdStudente=Interrogazioni.IdStudente
In Access 1997 la funzione non era presente per cui occorreva utilizzare in sostituzione la funzione iif:
SELECT Nominativo,
iif(IsNull(Voto),"Non Valutato",Voto) AS Esito
FROM Studenti
LEFT JOIN Interrogazioni
ON Studenti.IdStudente=Interrogazioni.IdStudente
In MySQL il comando equivalente è:
IFNULL(argomento,valore restituito)
esempio:
IFNULL(2/0,"Orrore!!")
ISNULL(Argomento)
Restituisce Vero se l'argomento passato come parametro è Null. Equivale all'espressione:
In MySQL il comando equivalente è identico. Al posto di true restituisce 1 se l'argomento è nullo.
ISNULL(argomento)
esempio:
ISNULL(1) ==> 0
ISNULL(2/0) ==>
1
ISNUMERIC(Argomento)
Restituisce Vero se il parametro passato è trasformabile in un numero altrimenti Falso.
IsNumeric("1,51") ==>
TrueIsNumeric("1a,51") ==> False
ISDATE(Argomento)
Restituisce vero se il parametro passato è trasformabile in un tipo data/ora altrimenti falso.
IsDate("31/02/2005") ==> False
IsDate("31/12/2005") ==> True
IsDate(1) ==> False
In MySQL il comando non esiste ma può essere implementato con questa diseguaglianza:
(IFNULL(STR_TO_DATE(argomento,'%d.%m.%y'),'E')<>'E')
Si noti che l'argomento deve rispettare la maschera di formato e pertanto nell'esempio la data va scritta in questo modo: giorno
mese e anno separati dal punto.Funzioni di tipo cronologico
DATE()
Restituisce la data di oggi
In MySQL il comando equivalente è:
CURDATE()
esempio:
CURDATE() ==> '2005-12-29'
CURDATE()+0 ==> 20051229
NOW()
Restituisce la data e l'ora di questo istante.
In MySQL il comando equivalente è:
NOW()/SYSDATE
esempio:
NOW() ==> "2005-12-29 23:02:23"
NOW()+0 ==> "20051229230223"
TIME()
Restituisce l'ora di questo istante
In MySQL il comando equivalente è:
CURTIME()
esempio:
CURTIME() ==> "23:02:23"
CURTIME()+0 ==> 230223
YEAR(Argomento)
Restituisce l'anno della data passata come Argomento. Ad esempio la query sottostante restituisce l'elenco degli studenti nati nel 1989.
SELECT Nominativo FROM Studenti WHERE Year(NatoIl)=1989
In MySQL il comando equivalente è:
YEAR(Argomento)
esempio:
YEAR("2005-12-01") ==>
MONTH(Argomento)
Restituisce il mese (in numero) della data passata come Argomento. La query successiva restituisce l'elenco degli studenti nati in dicembre o gennaio di un qualsiasi anno
SELECT * FROM Studenti WHERE Month(NatoIl)=1 or Month(NatoIl)=12
Invece la query successiva restituisce l'elenco degli studenti nati l'ultimo giorno del mese:
SELECT * FROM Studenti WHERE Month(NatoIl)<>Month(NatoIl+1)
In MySQL il comando equivalente è:
MONTH(Argomento)
esempio:
MONTH("2005-12-01") ==> 12
DAY(Argomento)
Restituisce il giorno del mese (in numero) della data passata come Argomento. La query sottostante restituisce l'elenco dei nominativi degli studenti nati il 29 febbraio di un qualsiasi anno bisestile.
SELECT * FROM Studenti WHERE Day(NatoIl)=29 AND Month(NatoIl)=2
Lo stesso risultato poteva essere ottenuto con questa query:
SELECT * FROM Studenti WHERE Format(NatoIl,'ddmm')="2902"
In MySQL il comando equivalente è:
DAYOFMONTH(Argomento)
esempio:
DAYOFMONTH("2005-12-01") ==> 1
WEEKDAY(Argomento)
Restituisce il giorno della settimana (in numero) della data passata come Argomento. (1 ==> domenica, 2 ==> lunedì etc.). La query sottostante restituisce l'elenco dei nominativi degli studenti nati di domenica
SELECT Nominativo FROM Studenti WHERE WeekDay(NatoIl)=1
Lo stesso risultato poteva essere ottenuto con questa query:
SELECT Nominativo FROM Studenti WHERE Format(NatoIl,'dddd')="domenica"
In MySQL il comando equivalente è:
DAYOFWEEK(Argomento)/WEEKDAY(Argomento)
(1--> domenica, 2 -->
Lunedì, ...) esempio:
DAYOFWEEK("2005-12-01") ==> 5
(giovedì)
HOUR(Argomento)
Restituisce l'ora dell'istante passato come Argomento.
In MySQL il comando equivalente è:
HOUR
(Argomento)MINUTE(Argomento)
Restituisce i minuti dell'istante passato come Argomento.
In MySQL il comando equivalente è:
MINUTE(Argomento)
esempio:
MINUTE("10:01:32") ==>
1
SECOND(Argomento)
Restituisce i secondi dell'istante passato come Argomento.
In MySQL il comando equivalente è:
SECOND(Argomento)
esempio:
SECOND("10:01:32") ==> 32