mercoledì 4 giugno 2008
Accedere al contenuto di un FRAME
In pratica:
Dim ie As SHDocVw.InternetExplorer '--> Riferimento all'oggetto internet explorer
Dim HTMLDoc As MSHTML.HTMLDocument '--> Riferimento al documento principale
Dim f1 As MSHTML.IHTMLWindow2 '--> Riferimento al frame
If ie Is Nothing Then Set ie = wb.Object '--> wb è l'oggetto web browser della form
Set HTMLDoc = ie.Document --> il documento principale
Set f1 = HTMLDoc.frames.Item(Nome_Frame) 'Nome del frame da verificare
msgbox f1.Document.body.innerHTML 'Il contenuto del frame
In pratica se una pagina ha più frame, oltre alla finestra principale (acceduta con HTMLDoc), sono create tante finestre figlie (una per ogni frame). Queste finestre figlie sono accessibili tramite l'interfaccia classe IHTMLWindow2.
Altri riferimenti
- Forum su MSDN
- Code Project
- Documentazione su MSDN
venerdì 2 maggio 2008
Problemi con query parametriche
Al momento in cui il query viene lanciato viene richiesto l'inserimento del valore del parametro.
Nel caso di esecuzione di query parametriche da VBA è necessario valorizzare i parametri utilizzando l'oggetto QueryDef e la sua collection Parameters.
In pratica:
Dim QueryDaLanciare as QueryDef
Set QueryDaLanciare = CurrentDB.QueryDefs("NomeQuery")
'--> inserire il nome del parametro senza [ e ].
QueryDaLanciare.Parameters("NomeParametro") = Valore
QueryDaLanciare.Execute
Talvolta ho però riscontrato problemi nel caso che il query sia effettuato su tabelle linkate via ODBC: il passaggio dei parametri non è effettuato correttamente ed il driver ODBC ritorna un errore che non sempre è
Per ovviare al problema si può modificare il testo del query sostituendo manualmente al parametro il valore.
Il codice è il seguente:
Dim OldSQL as String 'mantiene il valore dell'SQL originale
Dim QueryDaLanciare as QueryDef
Set QueryDaLanciare = CurrentDB.QueryDefs("NomeQuery")
'Salvo il valore dell'SQL corrente
OldSQL = QueryDaLanciare.SQL
'Rimpiazzo il SQL del query con un SQL modificato sostituendo al parametro
'il valore
QueryDaLanciare.SQL = Replace(QueryDaLanciare.SQL,"[NomeParametro]",Valore)
QueryDaLanciare.Parameters("NomeParametro") = Valore
QueryDaLanciare.Execute
'Reimposto il valore dell'SQL per successivi usi
QueryDaLanciare.SQL = OldSQL
In queso modo si evita di cablare il codice SQL nel codice VBA, lasciando la possibilità di modificare il Query con il designer.
sabato 23 febbraio 2008
Stampare in PDF da Access: ReportToPDF
mercoledì 9 gennaio 2008
Creazione delle tabelle
Per mostrare la creazione delle tabelle in Access userò MSAccess versione 2003.
Dopo aver creato un nuovo database, selezionare Tabelle (o Tables).
E premere Create table (Crea tabella). Comparirà la finestra mostrata in basso:
Supponiamo di creare la tabella corrispondente alla entità Calciatore:
In alto scriveremo i vari attributi ed in basso caratterizzeremo ognuno di essi:
Le informazioni principali per da specificare sono il tipo di dato, la dimensione (se necessaria) ed il testo (Caption) che sarà visualizzato come descrizione della colonna quando la tabella sarà visualizzata in modalità Elenco.
I tipi di dato principali sono:
AutoNumber --> Indica un campo che incrementa di uno ad ogni inserimento
Testo --> è necessario specificare una dimensione massima (cioè il numero massimo di caratteri memorizzabili)
Number --> è necessario indicare il tipo numerico. A seconda del tipo si potranno memorizzare numeri con la virgola in singola o doppia precisione, numeri Interi senza virgola con range variabili. Per avere il dettaglio della dimensione posizionarsi su Field Size e premere F1
Boolean (Yes/No) --> corrisponde ad un flag che indica se il valore del campo è Vero o Falso
Data/Ora --> consente di memorizzare una data e o un orario
Oggetto OLE --> consente di inserire in un campo un oggetto di qualunque tipo (per esempio un documento, una foto, un brano musicale etc.)
Definizione della chiave primaria
Ogni tabella deve contenere una chiave che identifichi UNIVOCAMENTE l'entità (nel nostro caso il calciatore). Nel nostro esempio consideriamo come chiave il campo IDCalciatore. Per indicare che la chiave è questa è sufficiente selezionare il campo (o i campi) e premere la chiave gialla che compare nella toolbar:
Definizione di campi di Lookup
Seguendo i criteri della Normalizzazione, risulta preferibile usare un codice per identificare il ruolo e la squadra di appartenenza del calciatore. Il codice sarà la chiave primaria per della tabella corrispondente alla entità relativa (Ruoli o Squadre). Definiamo quindi due tabelle di anagrafica:
Inseriamo qualche dato dopo aver salvato le due tabelle:
A questo punto posizionamoci sul campo IDRuolo della tabella dei calciatori e nella parte inferiore selezioniamo il tab Lookup e specifichiamo i dati indicati sotto:
In pratica indichiamo che il valore del campo IDRuolo, sarà recuperato dalla tabella tblRuoli. Non sono consentiti valori al di fuori di quelli indicati in tabella (Limit to List = Yes). Il valore memorizzato sarà il primo della (Bound Column = 1) cioè il campo IDRuolo. Il valore mostrato sarà però il NomeRuolo. Questo si ottiene indicando 0 nella larghezza della prima colonna.
Ripetere la stessa attività per il campo IDSquadra.
Salvando la tabella come tblCalciatori il risultato sarà il seguente:
martedì 8 gennaio 2008
Progettare un database: le tabelle
Ms Access è prima di tutto un DBMS: Database Management System.
La fase più importante nella progettazione di un'applicazione Ms Access è l'individuazione della struttura delle tabelle in cui memorizzare i dati.
Si devono tenere presenti alcuni passi:
1. Individuazione delle Entità coinvolte. La parola entità deriva dalla teoria da cui sono derivati gli attuali DBMS. Il modello teorico prende infatti il nome di ER-Model: Entity Relationship Model. Le entità corrispondono alle tabelle del database. Si deve creare una tabella per ogni entità individuata nella realtà che si desidera informatizzare. Per esempio se si desidera realizzare un programma per la gestione di un campionato di calcio, le entità da considerare potrebbero essere: Calciatori, Calendario, Squadre, Classifiche. Il numero delle Entità da considerare dipende da quanto complesso e parametrizzabile si vuole rendere il sistema che stiamo progettando. Esiste un meccanismo, chiamato Normalizzazione, che tenendo fermi alcuni concetti fondamentali (come l'evitare la ridondanza dei dati) consente di razionalizzare la struttura del DBMS. Ad ogni entità corrisponderà una Tabella. Ogni elemento appartenente ad una entità corrisponde ad un Record della tabella.
2. Individuazione delle proprietà di ogni entità. Per proprietà si deve intendere una caratteristica dell'entità. Per esempio, nel caso del campionato di calcio il Nome, il Ruolo, Il Cognome potrebbero essere proprietà della entità chiamata calciatori. Ogni proprietà corrisponderà ad un Campo all'interno della tabella relativa all'entità considerata. Ogni campo è caratterizzato da un Tipo (per esempio numerico o testo).
3. Definire per ogni tabella un Indice primario. Un indice primario è un insieme di campi della tabella che identificano UNIVOCAMENTE quel dato elemento. Per esempio nel caso della entità Squadre, il nome della squadra potrebbe essere l'indice primario.
4. Definire le Relazioni tra le tabelle. Le relazioni consentono di garantire la congruità e la consistenza del database oltre ad evidenziare i "legami" tra le entità.
Perchè Access
Cosa offre Access:
1. Un DBMS basato su file
2. Un linguaggio di programmazione potente (VBA)
3. Un motore di accesso ai dati (DAO) che consente tra l'altro di connettersi a sorgenti dati di diversa origine
4. Un sistema visuale per realizzare query
5. Un sistema di reporting veramente insuperabile
Nel caso di sistemi di una certa dimensione, è consigliabile sfruttare Access come Front End e memorizzare i dati su un Database Server (come MSSQL).
Non sempre è possibile stimare il numero di utilizzatori che potrà avere una certa applicazione. Molte volte si comincia con un piccolo archivio locale usato da un solo utente. Con il passare del tempo questo archivio si amplia includendo magari molte altre funzioni aprendosi ad altri utenti. A questo punto diventa inevitabile adottare una strategia di sviluppo migliore e più facilmente manutenibile. Questo si ottiene mediante i seguenti passaggi:
1. Organizzazione del codice in moduli / classi
2. Separazione tra dati (tabelle = Back End) e resto (Forms, reports, queries = Front End)
3. Mantenimento di una copia del Front End per le modifiche
Tramite questi accorgimenti sarà possibile modificare il Front End (cioè il vero e proprio programma) senza intaccare l'operatività degli utenti.
In effetti una delle peculiarità di un database Access (almeno dalla versione 97) è il blocco delle modifiche nel caso che il database sia aperto da qualche utente. In altre parole nessuna modifica può essere fatta se un utente ha aperto il database.
Tramite la copia di manutenzione noi possiamo effettuare le modifiche necessarie per metterle in linea alla prima occasione.-