2.1 Arrotondamenti |
https://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
2.2 Archiviare Immagini |
https://www.donkarl.com/it?FAQ2.2 | aggiornato 2020-08-03 |
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 Articolo KB 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: Articolo KB 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
2.3 Eseguire un suono |
https://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
2.4 Eliminare i messaggi d'avviso |
https://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
2.5 Ricavare nome e percorso dell'MDB in uso |
https://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)
2.6 Ricavare il percorso di Access |
https://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)
2.7 Calcolare l'età |
https://www.donkarl.com/it?FAQ2.7 | aggiornato 2021-10-25 |
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.
vedi anche Creare Elencocompleanni
2.8 Primo/Ultimo giorno del mese |
https://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)
2.9 Il Lunedì di una data settimana |
https://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.
2.10 Sommare le ore oltre le 24 |
https://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)))
2.11 Cifre in lettere |
https://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.
2.12 Evitare spazi in un campo combinato |
https://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.
2.13 Un campo vuoto impedisce il risultato della formula |
https://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.
2.14 Inserire interruzioni di riga |
https://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/>
2.15 Testo viene cambiato automaticamente |
https://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
2.16 #Errore per riferimento ad oggetti vuoti |
https://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.
2.17 Formattare variabile in memo |
https://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.
2.18 Euro - Caratteri e Simboli |
https://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.
2.19 CAP, ABI, Prefissi |
https://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
2.20 Separare il contenuto in campi diversi |
https://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.
2.21 Macro "Autokeys" in >=A00 |
https://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.
2.22 Somma di un controllo calcolato |
https://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)
2.23 Tener traccia delle modifiche ai dati |
https://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
2.24 Ottenere il nome utente/computer di rete |
https://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
2.25 Ottenere il numero della settimana |
https://www.donkarl.com/it?FAQ2.25 | aggiornato 2019-11-07 |
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:
https://docs.microsoft.com/office/troubleshoot/access/functions-return-wrong-week-number
Se questo potrebbe essere importante per la tua applicazione, dovresti utilizzare l'artificio presentato nell'articolo.
2.26 Filtro in base a maschera con la versione runtime |
https://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
2.27 Drag e Drop con Access |
https://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
2.28 Avvisi di sicurezza |
https://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).