2. Generale

2.1   Arrotondamenti 2.15 Testo viene cambiato automaticamente
2.2   Archiviare Immagini 2.16 #Errore per riferimento ad oggetti vuoti
2.3   Eseguire un suono 2.17 Formattare variabile in memo
2.4   Eliminare i messaggi d'avviso 2.18 Euro - Caratteri e Simboli
2.5   Ricavare nome e percorso dell'MDB in uso 2.19 CAP, ABI, Prefissi
2.6   Ricavare il percorso di Access 2.20 Separare il contenuto in campi diversi
2.7   Calcolare l'età 2.21 Macro "Autokeys" in >=A00
2.8   Primo/Ultimo giorno del mese 2.22 Somma di un controllo calcolato
2.9   Il Lunedì di una data settimana 2.23 Tener traccia delle modifiche ai dati
2.10 Sommare le ore oltre le 24 2.24 Ottenere il nome utente/computer di rete
2.11 Cifre in lettere 2.25 Ottenere il numero della settimana
2.12 Evitare spazi in un campo combinato 2.26 Filtro in base a maschera con la versione runtime
2.13 Un campo vuoto impedisce il risultato della formula 2.27 Drag e Drop con Access
2.14 Inserire interruzioni di riga 2.28 Avvisi di sicurezza
   
2.1 Arrotondamenti
http://www.donkarl.com/it?FAQ2.1 aggiornato 2005-10-13

Problema

Non trovi funzioni per l'arrotondamento commerciale.
Tentando con le funzioni Int() e Fix() riscontri imprecisioni. CDbl() e CInt() non fanno arrotondamenti commerciali ma matematici, cioè sul 5 all'intero pari più vicino. Lo stesso vale per la nuova funzione VBA inserita da A00 Round, che dà risultati tipo Round(1.085,2) 1.08. vedi http://support.microsoft.com/?kbid=225330 o http://support.microsoft.com/?kbid=196652
Anche la funzione Format() arrotonda in modo inaffidabile (almeno fino al A97).

Causa

I calcoli con virgola mobile in generale e i tipi di dati di Access sono imprecisi.
Access stranamente non ha inclusa alcuna funzione di arrotondamento commerciale.

Soluzione

Devi costruirti da solo una funzione. La più breve e sufficientemente precisa a me nota è:

Function fctRound(varNr As Variant, Optional varPl As Integer = 2) As Double
 'by Konrad Marfurt + ("" by) Luke Chung + Karl Donaubauer

    'esce se valore non numerico
    If Not IsNumeric(varNr) Then Exit Function

    fctRound = Fix("" & varNr * (10 ^ varPl) + Sgn(varNr) * 0.5) / (10 ^ varPl)

End Function


Note:
È predefinito l'arrotondamento a due cifre qualora l'argomento non venga passato. (vedi esempio 1)
es1: fctRound(1.025) --> 1.03
es2: fctRound(1.25,1) --> 1.3
es3: fctRound(1250, -2) --> 1300
La stringa vuota "" nella funzione non è un errore ma un trucco per la precisione.

Un'altra possibilità per l'arrotondamento commerciale è:
Qualora sia disponibile Excel, si può usare la funzione spreadsheet di Excel Round (che non è uguale a quella di VBA). Descrizione di Günther Ritter:

Usare un modulo e sotto Strumenti/Riferimenti attivare EXCEL8.0 Library.
Esempio di funzione di arrotondamento:

Function CifraArr(a,b)
  CifraArrl=Excel.Application.Round(a, b)
End Function


Ancora un consiglio per l'arrotondamento al 5:
p.e. gli svizzeri, per evitare monete piccole, arrotondano prezzi ai 5 centesimi (0,00/0,05).
Per questo scopo si può chiamare la funzione descritta sopra in questo modo:

fctRound((CifraoNomeCampo * 20),0)/20

in alto

2.2 Archiviare Immagini
http://www.donkarl.com/it?FAQ2.2 aggiornato 2011-12-16

Problema

Vuoi archiviare e/o visualizzare immagini in Access. Il tuo database si gonfia però in modo sproporzionato all'aumentare delle immagini.

Causa

Access archivia immagini collegate OLE in un formato simile a bitmap che impegna moltissimo spazio.

Soluzione

Dalla versione A07 la MS ha migliorato considerevolmente sia l'archivazione che la visualizzazione delle immagini.

Visualizzazione delle immagini esterne:
- nella tabella salvi il percorso della immagine nel solito campo di testo
- nelle maschere e nei report inserisci un controllo immagine e nella proprietà Origine controllo imposta il nome del campo di testo

Da A07 i controlli immagine hanno questa proprietà, così come la possibilità del collegamento di dati. Per questo anche la visualizzazione nelle maschere continue o nei report non è più un problema, al contrario delle versioni precedenti.

Archivazione delle immagini nel database:
Se devi archivare delle immagini nel DB, non usare più il tipo di dati Oggetto OLE ma Allegato. Questo tipo comparso con la versione A07 è molto più efficiente, cioè non gonfia il DB in modo sproporzionato, e si possono anche archivare più immagini (o altri file) in un campo allegato.

Spiegazioni per le versioni più vecchie fino ad A03

1. Variante
Memorizza solo il percorso delle immagini in Access ma non le immagini stesse.
vedi http://support.microsoft.com/?kbid=148463

2. Variante
Se vuoi assolutamente archiviare le immagini nel DB, esiste la possibilità, con l'aiuto dell'istruzione Open e dei metodi AppendChunk e GetChunk (vedi nella guida in linea), di inserire in Access i dati dell'immagine in una tabella ed archiviarli in formato binario. In tal modo le dimensioni aumentano in modo ragionevole. Per visualizzare poi le immagini in una maschera, si possono riportare con gli stessi metodi in una tabella temporanea ed indicare questa come origine dell'immagine.
Codice: http://support.microsoft.com/?kbid=103257

Esempi e documentazione sul tema:

Una documentazione completa (tedesco), che tratti tutte le varianti ed i problemi dell'archiviazione immagini, è lo scritto della presentazione di Harald Langer all'AEK4 (vedi AEK-Downloads).

Di Larry Linson ci sono MDB d'esempio per tutte le varianti, con spiegazione (in inglese):
http://members.tripod.com/accdevel

Per la memorizzazione esterna a volte la finestra di dialogo per il caricamento delle immagini porta alla chiusura di Access o comunque disturba. Si può evitarla tramite modifica di una chiave di registro (consiglio di Harald Langer, aggiornato da Phil Stiefel).

Nelle versioni <=A00:
HKEY_LOCAL_MACHINE\Software\Microsoft\Shared Tools\Graphics Filters\Import\il tuo formato di grafico\Options chiave ShowProgressDialog su No.

Nelle versioni >=AX:
HKEY_CURRENT_USER\Software\Microsoft\Shared Tools\Graphics Filters\Import\il tuo formato di grafico\Options chiave ShowProgressDialog su No

in alto

2.3 Eseguire un suono
http://www.donkarl.com/it?FAQ2.3 aggiornato 2008-06-16

Problema

Su alcuni eventi vuoi eseguire un suono disponibile in formato wav (p.e. i suoni di sistema di Windows).

Soluzione

Funzione con le API. Nella sezione dichiarazione di un modulo standard:

Declare Function sndPlaySound Lib "winmm.dll" _
Alias "sndPlaySoundA" (ByVal lpszSoundName As String, _
ByVal uFlags As Long) As Long


Richiamo nel codice di un'evento:

sndPlaySound "Percorso_e_Nome_del_File_WAV", 0

Se questo non ti è sufficiente allo scopo esiste una versione complessa per l'esecuzione di suoni di Dev Ashish: http://www.mvps.org/access/api/api0011.htm

in alto

2.4 Eliminare i messaggi d'avviso
http://www.donkarl.com/it?FAQ2.4 aggiornato 2006-12-22

Problema

All'esecuzione di query o modifiche ai dati appaiono avvisi.

Soluzione

Questi avvisi possono essere disattivati per l'intero mdb da Strumenti/Opzioni/Modifica-Trova

Via codice con:
Application.SetOption "Confirm Record Changes", False
Application.SetOption "Confirm Document Deletions", False
Application.SetOption "Confirm Action Queries", False


Per disattivare gli avvisi per una singola azione tramite VBA:
DoCmd.SetWarnings False
  'eseguire il codice e poi riattivare i messaggi tramite
DoCmd.SetWarnings True


Quando si tratta di query, c'è un'ulteriore possibilità di impedire richieste di conferma. Si può (e dovrebbe) usare al posto di DoCmd.RunSQL il metodo Execute nel modo seguente:

CurrentDb.Execute "Nome_della_query_o_statement_SQL", dbFailOnError

in alto

2.5 Ricavare nome e percorso dell'MDB in uso
http://www.donkarl.com/it?FAQ2.5

Problema

Vuoi ricavare nome e percorso dell'attuale mdb.

Soluzione

Da A00 ci sono le seguenti proprietà dell'oggetto "CurrentProject:
CurrentProject.FullName
CurrentProject.Path
CurrentProject.Name


Funzionano in VBA e si possono usare all'interno anche di controlli (con "=" davanti).
Lo stesso vale per le seguenti varianti, funzionanti in tutte le versioni di Access:

nome e percorso:
CurrentDb.Name

solo percorso:
Left(CurrentDb.Name,Len(CurrentDb.Name)-Len(Dir(CurrentDb.Name)))

solo nome:
Dir(CurrentDb.Name)

in alto

2.6 Ricavare il percorso di Access
http://www.donkarl.com/it?FAQ2.6

Problema

Vuoi ricavare la cartella in cui si trova Access cioè il file msaccess.exe attualmente in uso.

Soluzione

In VBA usa:
SysCmd(acSysCmdAccessDir)

in alto

2.7 Calcolare l'età
http://www.donkarl.com/it?FAQ2.7 aggiornato 2005-09-05

Problema

Vuoi calcolare l'età di una persona tramite la data di nascita.

Soluzione

derivato da Dev Ashish:

DateDiff("aaaa";[DataNascita];Date())+(Format(Date();"mmgg")<Format([DataNascita];"mmgg"))

Spiegazione:
Prima tramite DateDiff vengono calcolati gli anni tra le due date.
Poi verifica se giorno e mese della data attuale sono inferiori alla data di nascita.
In caso positivo un anno dev'essere detratto.
Se il confronto dà Vero, allora Access rappresenta il risultato come -1. Con Falso dà 0.
Quindi si può immediatamente sommare il risultato.

Se ti servono anche i giorni e mesi trascorsi dal compleanno c'è un articolo KB (è da me e in tedesco, ma si vede il codice):
http://support.microsoft.com/default.aspx?scid=kb;de;D37560

vedi anche Creare Elencocompleanni

in alto

2.8 Primo/Ultimo giorno del mese
http://www.donkarl.com/it?FAQ2.8

Problema

Vuoi visualizzare in un controllo il primo o ultimo giorno del mese o dell'anno corrente.

Soluzione

mese corrente:

primo giorno = Date()-Day(Date())+1
ultimo giorno = DateSerial(Year(Date());Month(Date())+1;0)

anno corrente:
primo giorno = DateSerial(Year(Date());1;1)
ultimo giorno = DateSerial(Year(Date());12;31)

in alto

2.9 Il Lunedì di una data settimana
http://www.donkarl.com/it?FAQ2.9 aggiornato 2005-05-16

Problema

Vuoi ricavare la data di un lunedì di una certa settimana dell'anno.

Soluzione

Posta la prima settimana dell'anno con 4 giorni:

'***************** CODE START *********************
Public Function fctKWMon(ArgKW As Byte, Optional ArgJahr)
    ' restituisce il lunedì della settimana di calendario
    ' di Karl Donaubauer

    Dim M As Date
    If IsMissing(ArgJahr) Then ArgJahr = Year(Date)
    M = DateSerial(ArgJahr, 1, 1) + (ArgKW - 1) * 7
    M = M + 1 - WeekDay(M, vbMonday)
    If Format(M, "ww", vbMonday, vbFirstFourDays) <> ArgKW Then M = M + 7
    If (ArgKW = 1 Or ArgKW = 53) And Day(M) > 4 And Day(M) < 8 Then M = M - 7
    fctKWMon = M

End Function

'***************** CODE ENDE *********************

Richiamare fctKWMon(1,2000) dà come risultato il lunedì della prima settimana di calendario del 2000. Senza anno fctKWMon(1) viene restituito quello corrente.

in alto

2.10 Sommare le ore oltre le 24
http://www.donkarl.com/it?FAQ2.10 aggiornato 2007-01-03

Problema

La differenza di tempo o la somma di ore che superano le 24 ore non viene visualizzata "giustamente" nel formato di tempo.

Causa

Un campo data/ora di Access non contiene mai solo il tempo ma sempre una data e il tempo.

Soluzione

per la differenza di tempo
=Format$(Fix(FctRound([MioOrario]*24));"0") & ":" & Format$([MioOrario];"nn")

Nota: Questa espressione, per evitare risultati inesatti a causa dell'arrotondamento impreciso, utilizza la funzione fctRound() che potete trovare nelle FAQ alla voce Arrotondamenti.

per la somma di ore
Inserisci la seguente funzione (di Uwe Weineck) in un modulo VBA:

Function fctTimeSum(ByVal lngHour As Long, _
ByVal lngMin As Long, ByVal lngSec As Long) As String

    fctTimeSum = Format$(lngHour + (lngMin + lngSec \ 60) \ 60, "00") _
    & ":" & Format$((lngMin + lngSec \ 60) Mod 60, "00") _
    & ":" & Format$(lngSec Mod 60, "00")

End Function


Richiamare ad esempio da una casella di testo (tutto su un riga)
=fctTimeSum(Sum(Hour(MiaSommaTempo));Sum(Minute(MiaSommaTempo));Sum(Second(MiaSommaTempo)))

in alto

2.11 Cifre in lettere
http://www.donkarl.com/it?FAQ2.11

Problema

Vuoi trasformare una cifra in una parola scritta.
Esempio: 4321 --> quattromilatrecentoventuno

Soluzione

Per una versione italiana (che funziona anche per inglese, francese e tedesco) vedi l'articolo
"Convertire numeri in testo (12 = dodici)" di Federico Luciani nella sezione General di www.sitocomune.com.

in alto

2.12 Evitare spazi in un campo combinato
http://www.donkarl.com/it?FAQ2.12

Problema

Per esempio inserisci in un report una casella di testo formata da più campi uniti da "&" e inserisci degli spazi tra i campi. Esempio:
[Titolo] & " " & [Nome] & " " & [Cognome]

Se uno dei tre campi è vuoto lo spazio rimane lo stesso e disturba.

Soluzione

Usa per unire gli spazi "+" al posto di "&":

([Titolo]+ " ") & ([Nome]+ " ") & [Cognome]

Per l'operatore stringa & non importa se manca una delle parti. L'operatore matematico + invece solo dà un risultato se ci sono tutte e due. Per questo la combinazione dei due operatori dà il risultato desiderato.

in alto

2.13 Un campo vuoto impedisce il risultato della formula
http://www.donkarl.com/it?FAQ2.13

Problema

Usi un'espressione da qualche parte in Access. Se uno dei campi è vuoto tutta l'espressione non dà risultato. P.e. in un controllo hai il seguente calcolo:
=[CampoX] + [CampoY] + [CampoZ]
Se p.e. solo il [CampoY] è vuoto, non avrai risultato.

Soluzione

Per impedire ciò esiste da A95 la funzione Nz (v. help Online)
Per l'esempio precedente varrebbe la sintassi:
=Nz([CampoX]) + Nz([CampoY]) + Nz([CampoZ])
Così otterrai sempre un risultato, persino se tutti e tre i campi fossero vuoti il risultato sarebbe 0.

Si può anche assegnare un valore alla funzione Nz nel caso il campo sia vuoto, p.e. restituisce:
Nz([TuoCampoNumerico],1) la cifra 1
Nz([TuoCampoTesto],"Tizio") il testo "Tizio", nel caso i campi siano vuoti.

La funzione Nz è utilizzabile in tutte le espressioni e in VBA.

In A2 non esisteva ancora Nz, ma si può utilizzare IIF:
=IIF(IsNull([CampoX];0;[CampoX]) + IIF(IsNull([CampoY];0;[CampoY]) ecc.

in alto

2.14 Inserire interruzioni di riga
http://www.donkarl.com/it?FAQ2.14 aggiornato 2010-02-02

Problema

Vuoi inserire un'interruzione di riga in un controllo.

Soluzione

In un'espressione p.e. in un origine controllo:
=PrimaParteTesto & Chr(13) + Chr(10) & SecondaParteTesto

In VBA invece di Chr(13) + Chr(10) puoi anche usare le costanti vbCrLf e vbNewLine.

A partire da A07 per i campi memo e le caselle di testo c'è la proprietà FormatoTesto. Se questa proprietà è impostata a RTF si deve usare il comando di HTML per un'interruzione di riga: <br> o <br/>

in alto

2.15 Testo viene cambiato automaticamente
http://www.donkarl.com/it?FAQ2.15 aggiornato 2018-06-11

Problema

Inserisci in un campo/controllo di una tabella, query o maschera un testo. Dopo la digitazione o nell'uscita dal campo una parola di questo testo viene cambiata, p.e. "Mario Rossi" diventa "Mario Rosso".

Causa

Ha colpito l'autocorrezione.

Soluzione

Nel menù Strumenti/Opzioni/Controllo Ortografia/Correzione Automatica o nel ribbon File - Opzioni - Strumenti di correzione - Opzioni correzione automatica disattiva le voci che non ti interessano come correggi durante la digitazione. Queste impostazioni valgono per Access, quindi per tutti i database.

Nei campi delle maschere puoi impostare a No la proprietà Consenti correz. autom. Allora solo quel campo non verrà corretto automaticamente. Questa variante aiuta anche in situazioni dove non puoi controllare le opzioni di Access p.e. se usi la versione Runtime. In più si puo impostare questa proprietà del controllo con VBA:

Me!MiaCasella.AllowAutoCorrect = False

in alto

2.16 #Errore per riferimento ad oggetti vuoti
http://www.donkarl.com/it?FAQ2.16

Problema

Un controllo contiene un riferimento ad un campo o controllo di una (sotto-)maschera o (sotto-)report. Qualora questo sia vuoto e non viene visualizzato il controllo conterrà: #Errore

Soluzione

Scrivi al posto del semplice riferimento come:
=[NomeControlloSottomaschera]![NomeControllo]

un Iif() con il trattamento del'errore:
=Iif(IsError([NomeControlloSottomaschera]![NomeControllo]);Null;[NomeControlloSottomaschera]![NomeControllo])

Al posto di Null puoi usare anche "" per campi testo e 0 per campi numerici.

in alto

2.17 Formattare variabile in memo
http://www.donkarl.com/it?FAQ2.17 aggiornato 2010-02-02

Problema

Vuoi formattare in modi diversi, parti diverse di un campo memo o testo. Le formattazioni in Access valgono però sempre per tutto il campo cioè controllo.

Soluzione

A partire da A07 per i campi memo e le caselle di testo c'è la proprietà FormatoTesto che si puo impostare a RTF. Questo offre diverse possibilità di formattazione, che si possono gestire tramite i ribbon e una barra di formattazione rapida. Access usa come codice di formattazione una scelta limitata di HTML. Per dettagli vedi http://office.microsoft.com/it-it/access/HA100140971040.aspx?pid=CH100645681040

Alternative e soluzioni per versioni più vecchie di Access:

Per le caselle di testo in report e diverse modalità semplici di formattazione ci sono trucchi di programmazione relativamente semplici con l'uso di strumenti Access. Vi sono esempi di Stephen Lebans: http://www.lebans.com/mixbold-plain.htm

Per maschere o formattazioni più complesse si possono utilizzare controlli esterni che supportano il Rich Text Format (RTF):

MS offre nella Office Developers Edition (vedi FAQ 1.3) il Rich Text Control. Ma questo non funziona nei report.

Un ActiveX consigliabile e gratuito di Rich Text esiste ancora di Stephen Lebans:
http://www.lebans.com/richtext.htm
Ha meno problemi e più prestazioni del controllo di MS.

Inoltre esiste il commerciale, ma molto comodo "Total Access Memo" di http://www.fmsinc.com.

Se avete MS Internet Explorer, anche DHTML EDIT ed il controllo Webbrowser di IE rappresentano un'alternativa gratuita.

in alto

2.18 Euro - Caratteri e Simboli
http://www.donkarl.com/it?FAQ2.18

Problema

Nei caratteri manca il simbolo dell'Euro €; nei campi valuta non si modifica il simbolo al cambio delle impostazioni di sistema di Windows.

Soluzione

Font per l'Euro (Arial, Times, Courier) per Win95 e altre info
http://officeupdate.microsoft.com/downloadDetails/offeurofonts.htm
http://www.eu.microsoft.com/windows/euro.asp
http://www.microsoft.com/technet/topics/euro/default.htm

Campi valuta con simboli di valuta (da Christa Schwanke):

In controlli di maschere e report legati a campi valuta puoi eliminare totalmente il formato valuta dai campi dei report e maschere. Così verrà utilizzato il formato valuta impostato nelle impostazioni internazionali.

Per i campi calcolati o non collegati puoi ugualmente lavorare senza formati valuta, devi però in questo caso all'apertura o caricamento del campo riformattarlo.

Esempio:
Me.Controls("SommaLire").Format = "Currency"
Me.Controls("SommaEuro").Format = "Currency"


Anche così viene utilizzata l'impostazione internazionale.

in alto

2.19 CAP, ABI, Prefissi
http://www.donkarl.com/it?FAQ2.19 aggiornato 2010-04-23

Problema

Cerchi banche dati di CAP o prefissi ed altro.

Soluzione

Finora conosco un solo link per dati italiani:

http://www.tkk.it/tabelle/index.html

in alto

2.20 Separare il contenuto in campi diversi
http://www.donkarl.com/it?FAQ2.20 aggiornato 2010-01-15

Problema

Hai campi in tabelle in cui si trovano informazioni complesse come nome e cognome, via e numero ecc. Per utilizzi ulteriori vuoi separarli in campi singoli.

Soluzione

In origine dovresti fare attenzione a memorizzare nei campi di tabelle informazioni non ulteriormente scomponibili (--> in prima forma normale). Il concatenamento successivo è normalmente più semplice della separazione.

Se esistono criteri di separazione utilizzabili, ad esempio spazi o virgole, puoi fare gran parte del lavoro tramite query di aggiornamento o funzioni VBA. Un Esempio:

Ammettendo che nel campo cliente ci siano nome e cognome separati da uno spazio (es. "Bill Gates").
1. Inserisci nella tabella due campi nuovi "Nome" e "Cognome".

2. Crea sulla tabella una query di aggiornamento.

3. Scrivi nella query di aggiornamento sulla riga "Aggiorna" sotto il campo "Nome":
Left([Cliente];InStr([Cliente];" ")-1)
sotto il campo "Cognome":
Mid([Cliente];InStr([Cliente];" ")+1)

Altra ipotesi frequente è che si presenti il cognome seguito da virgola e spazio ("Gates, Bill"). Le formule saranno:
Left([Cliente];InStr([Cliente];",")-1)
Mid([Cliente];InStr([Cliente];",")+2)
Altre informazioni le trovate nell'editor VBA con <F1> alle voci usate nelle strighe.

4. Lancia la query e spera di essere fortunato ......
Con questi metodi possono esserci errori dovuti ad esempio a nomi o cognomi multipli, o perchè il formato non è stato sempre rispettato. Per questo dovresti sempre controllare i risultati, o tramite una query di selezione con campi calcolati per testarli o modificando a mano successivamente i dati.

in alto

2.21 Macro "Autokeys" in >=A00
http://www.donkarl.com/it?FAQ2.21 aggiornato 2009-12-18

Problema

Nella versione tedesca la MS ha cambiato il nome della macro. Questo problema non esiste nella versione italiana di Access.

in alto

2.22 Somma di un controllo calcolato
http://www.donkarl.com/it?FAQ2.22

Problema

In una maschera o report, cerchi di creare la somma di un controllo calcolato. Access, o apre una finestra di dialogo parametrica e chiede il valore del controllo calcolato, o visualizza un errore, oppure non fa comparire nulla nel controllo somma.

Soluzione

Per creare la somma di un controllo calcolato, devi ripetere la formula del controllo calcolato. Un esempio:

Il controllo calcolato "IVA" ha come Origine controllo: =[Netto]*0,20
Un campo somma, con il seguente valore nell'Origine controllo non funziona: =Sum([IVA])
Il corretto valore nell'Origine controllo per il campo somma è: =Sum([Netto]*0,20)

in alto

2.23 Tener traccia delle modifiche ai dati
http://www.donkarl.com/it?FAQ2.23

Problema

Vuoi tener traccia, su quando e da chi i record sono creati, o modificati. Però, a dispetto di altri DBMS, Access non ha alcuna funzionalità incorporata, timestamp, trigger, o altro per compiere ciò.

Soluzione

Se vuoi soltanto protocollare la data/ora di creazione di un record, puoi farlo direttamente nella tabella. Crea un campo di tipo Data/Ora ed utilizza quanto segue, nella proprietà Valore predefinito del campo: Now()

Allo stesso modo, puoi utilizzare il valore predefinito dei controlli della maschera per ottenere la data e l'orario della creazione del record.

Per quanto concerne l'utente corrente, non puoi utilizzare, in una tabella, lo stesso metodo (v. FAQ 3.3). Puoi usare, invece, come valore predefinito di un controllo in una maschera, quanto segue: CurrentUser()

Per protocollare le modifiche di record esistenti, devi anche usare una maschera, poiché in questo caso è necessario programmare. Vi sono due "correnti di pensiero": Quella comune utilizza il codice d'evento Before Update della maschera, per aggiungere la data/ora e l'utente, in questo modo:

Me!MioCampoData = Now
Me!MioCampoUtente = CurrentUser


L'altro gruppo degli sviluppatori vuole assicurarsi che i campi protocollo siano popolati dopo che l'aggiornamento è realmente avvenuto, e non rifiutato a causa di qualche restrizione. Pertanto, si utilizza del codice come questo, nell'evento After Update della maschera:

Dim rs As DAO.Recordset
Set rs = Me.RecordsetClone

rs.Bookmark = Me.Bookmark
rs.Edit
rs!MioCampoData = Now
rs!MioCampoUtente = CurrentUser
rs.Update

Set rs = Nothing

in alto

2.24 Ottenere il nome utente/computer di rete
http://www.donkarl.com/it?FAQ2.24

Problema

Vuoi ottenere il nome del corrente utente, computer o dominio in una rete Windows.

Soluzione

Ciò è possibile con API. Qui di seguito, alcuni link con dei codici di esempio.

utente, computer, dominio, gruppo-di-lavoro
http://support.microsoft.com/?kbid=210088

nome utente
http://www.mvps.org/access/api/api0008.htm
http://support.microsoft.com/?kbid=161394

nome completo dell'utente
http://www.mvps.org/access/api/api0066.htm

nome computer
http://www.mvps.org/access/api/api0009.htm

dominio NT
http://www.mvps.org/access/api/api0040.htm

percorso UNC di un drive di rete
http://support.microsoft.com/?kbid=160529

in alto

2.25 Ottenere il numero della settimana
http://www.donkarl.com/it?FAQ2.25

Problema

Hai una data (o un campo data), e vuoi ottenerne il numero della settimana.

Soluzione

Puoi utilizzare la seguente espressione, p. e., come Origine controllo di un controllo calcolato:
=DatePart("ii"; MioCampoData)

In VBA:
DatePart("ww", MioCampoData)

Nell'help online puoi trovare la descrizione di ulteriori parametri della funzione DatePart, che ti permette di definire il primo giorno della settimana, e la prima settimana dell'anno relativi ai tuoi standard.
In Europa lo standard è dato dall'ISO 8601:
=DatePart("ii";MioCampoData;2;2)
in VBA:
DatePart("ww", MioCampoData, vbMonday, vbFirstFourDays)

Uguali possibilità, per ottenere il numero della settimana sono offerte dalla funzione Format:
Format(MioCampoData, "ww")

Attenzione!
Vi è un bug conosciuto che su certi anni, produce un numero di settimana errato per l'ultimo lunedì dell'anno. Vedi la descrizione su:
http://support.microsoft.com/?kbid=200299
Se questo potrebbe essere importante per la tua applicazione, dovresti utilizzare l'artificio presentato nell'articolo della KB.

in alto

2.26 Filtro in base a maschera con la versione runtime
http://www.donkarl.com/it?FAQ2.26

Problema

Nella tua applicazione, utilizzi la funzionalità filtro in base a maschera. Se la tua applicazione viene eseguita con la versione runtime di Access, questi filtri non funzionano più.

Causa

Nella versione runtime, non esiste alcun filtro in base a maschera:
http://support.microsoft.com/?kbid=172090

Soluzione

Puoi scaricare i seguenti esempi, per aggirare l'ostacolo:
per A97: http://support.microsoft.com/?kbid=166634
per A00: http://download.microsoft.com/download/access2000/sample/1.0/win98me/en-us/qbf2k.exe

in alto

2.27 Drag e Drop con Access
http://www.donkarl.com/it?FAQ2.27

Problema

Vuoi avere nella tua applicazione in Access, la funzionalita di drag e drop, così come è possibile in molte applicazioni Windows ed ambienti di programmazione.

Soluzione

Access non fornisce alcun evento per ciò, (diversamente, p. e. da VB). Esistono soltanto delle scappatoie per l'uso nelle maschere.
Vedi: http://support.microsoft.com/?kbid=287642

Esiste anche del software di tipo commerciale, da Peter De Baets:
http://www.peterssoftware.com/dd.htm

in alto

2.28 Avvisi di sicurezza
http://www.donkarl.com/it?FAQ2.28 aggiornato 2015-12-15

Problema

Quando apri un database con Access 2003, ottieni dei messaggi come:
"Avviso di sicurezza: Le espressioni non sicure non sono bloccate ... Vuoi bloccare l'espressioni non sicure ?"
"Questo file potrebbe non essere sicuro ... Vuoi aprire questo file, o annullare l'operazione ?"
"Access non può aprire il file per limitazioni di sicurezza ..."
Potrebbero esservi ulteriori messaggi, che indicano che è necessario installare il SP 8 di Office etc.
Vuoi liberarti di questi messaggi di avviso.

Causa

Nella versione 2003 di Access, MS ha incluso simili avvisi di sicurezza e meccanismi di certificazione, come quelli che già, prima, esistevano in Word ed Excel. Per quanto riguarda Access, l'obiettivo principale è quello di bloccare le cosiddette "espressioni non sicure" nei database che non sono certificati (ciò è chiamato "Modalità Sandbox"). Le espressioni non sicure sono i comandi VBA come: Shell, Kill, CurDir, e in più molti altri che consentono l'accesso al file system. Puoi ottenere una lista dei comandi, ed ulteriori informazioni se fai click sul pulsante dell'Help, nelle varie finestre dei messaggi. Vi è anche un grande sito web di informazione della MS circa l'argomento della sicurezza, con tanti articoli su i messaggi di avviso, certificati, Sandbox etc.

Soluzione

1. Impostare la sicurezza a "Basso"

Il metodo più facile, per liberarsi dei messaggi di avviso, è quello di abbassare il livello di sicurezza nel menù Strumenti/Macro/Sicurezza. Se modifichi l'impostazione, a "Basso", non otterrai più alcun messaggio. Questo è valido in tutti i database, per questo utente su questo PC, ed è equivalente all'impostazione di tutte le versioni di Access prima di A03, perché esse non prevedono alcun livello di sicurezza.

In alcune installazioni la voce di menù Strumenti/Macro/Sicurezza potrebbe mancare, specialmente se il db è stato convertito.
Vedi http://support.microsoft.com/?kbid=833219.
Puoi rimediare a ciò, come segue:

- fai click destro su una barra di menù o degli strumenti, e scegli Personalizza
- nella scheda Comandi scegli la categoria Strumenti
- trascina la voce Sicurezza... dall'elenco sul lato destro e rilasciala nella giusta posizione nel menù Strumenti.

La voce di menù descritta modifica due valori nel registro. Quindi un altro metodo per liberarsi dei messaggi di avviso è quello di modificare le impostazioni del livello di sicurezza e della modalità Sandbox, direttamente nel registro.

Il livello di sicurezza è di pertineneza dell'utente. La chiave è:

\\HKEY_CURRENT_USER\Software\Microsoft\Office\11.0\Access\Security

Per evitare messaggi il valore dovrebbe essere: 1

Ed invece, la modalità Sandbox è valida per tutta la macchina. La chiave del registro è:

\\HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\Engines\SandboxMode

Questo valore dovrebbe essere 2 o 0, se vuoi che siano eseguite tutte le funzioni (includendo quelle "non sicure").
2 = Sandbox soltanto attiva per applicazioni-non-Access che utilizzano JET
0 = Sandbox completamente disattivata
Vi sono ulteriori informazioni ad: http://support.microsoft.com/?id=294698

Se è installata soltanto la versione runtime di Access, le impostazioni del registro sono diverse. (informazioni da Albert Kallal). Devi creare due nuove chiavi.

Per il livello di sicurezza:
\\HKEY_LOCAL_MACHINE\Software\Microsoft\Office\11.0\Access\Security
Nuova chiave: level
Valore: #00000001

Per la modalità Sandbox:
\\HKEY_LOCAL_MACHINE\Software\Microsoft\Jet\4.0\Engines
nuova chiave: SandBoxMode
valore: #00000002

2. Creare un certificato

Il livello di sicurezza "Basso" è espressamente "non raccomandato" da Microsoft, poiché qualcuno potrebbe commettere operazioni dannose tramite le sopracitate espressioni non sicure. In aggiunta, queste impostazioni non saranno di aiuto su un computer dove non sei abilitato o non hai i diritti ad abbassare il livello di protezione. In questo caso vengono proposti i Certificati digitali.

La versione facile è un certificato auto firmato. Vi è un tool in Office 2003 che puoi trovare nel menù di Avvio di Windows in Programmi/Office/Strumenti/Certificati Digitali per Progetti VBA. In alternativa puoi avviare direttamente il programma Selfcert.exe nella cartella di Office. Comunque, un certificato auto firmato è valido soltanto sul tuo computer.

Puoi comprare altre versioni di certificati da aziende accreditate come enti di certificazione. Vi sono i cosiddetti certificati di classe 3 per le aziende od organizzazioni più grandi, ed i certificati di classe 2 per le persone fisiche. Questi ultimi finora, però, sono molto difficili da trovare ed ottenere e, pertanto, non c'è molta esperienza in merito (come per tutte le cose riguardanti la certificazione).

in alto