Uso di una struttura dati Array Associativo. Un Array Associativo, detto anche Dictionary, permette di memorizzare una collezione di oggetti accessibili mediante una parola-chiave invece che con il solo numero d'ordine, come accade negli array convenzionali. Un esempio di dictionary si puo' trovare anche in ASP: il metodo Request.QueryString("NomeParametro") rappresenta a tutti gli effetti un array associativo, al quale si accede appunto usando dei nomi simbolici anziche' gli indici. Ecco un esempio che mette in eveidenza le differenze: Array convenzionale: myArray(0) = request("LastAccess") myArray(1) = request("Username") Array associativo: dictArray("Username") = request("Username") myArray("LastAccess") = request("LastAccess") Con Windows Scripting Host, la Microsoft mette a disposizione un semplice oggetto Dictionary, meno intuitivo da usare rispetto ad un normale array; inoltre non permette di usare la struttura come se fosse un normale array (e quindi accedere con gli indici); ne' di salvare il contenuto su file. Per questo ho deciso di scrivere un Componente ActiveX che implementasse un Dictionary più evoluto. Tale componente, gratuito, dovrebbe essere allegato a questo articolo, e comprende anche altri oggetti che presentero' in un altro momento. La documentazione online completa ed il componente stesso si trovano su: http://www.paipai.net/texts/components.htm Un array associativo puo' essere utile in molte circostanze; ad esempio e' molto comodo quando si deve creare una struttura simile ad un "carrello elettronico" (come nei negozi online). E' infatti sufficiente associare un nuovo Dictionary ad ogni utente che si collega , usare il codice del prodotto come chiave di accesso e la quantita' di prodotto come valore associato alla chiave. Il codice necessario a creare l'oggetto, che va messo nel file global.asa dell'applicazione ASP, e' il seguente: <% REM creazione e distruzione dell'oggetto dictionary, che va messo nel global.asa sub session_onStart set Session("objDict") = Server.CreateObject("midori.dictionary") end sub sub session_onEnd set Session("objDict") = nothing end sub %> Questa che segue e' una pagina che gestisce il carrello (lo modifica, aggiorna e visualizza): <% Il nome di questo file è car.asp if isNull(Session("objDict")) or isEmpty(Session("objDict")) then set Session("objDict") = Server.CreateObject("midori.dict") end if set objDict = Session("objDict") if request("submit") <> "" then REM aggiorna il carrello strProductID = request("PID") intQuantity = request("Quantity") delete = request("delete") if delete = "ok" then objDict.remove(strProductID) else objDict(strProductID) = objDict(strProductID) + cint(intQuantity) end if end if %> Carrello

Selezionare un prodotto e la quantità da aggiungere (o sottrarre) al carrello.


Contenuto del carrello: <% REM Visualizzazione carrello: if objDict.count > 0 then %> <% for i=1 to objDict.count response.write("") response.write("") next %>
Nome:" & objDict.key(i) &"Quantità:" & objDict.datai(i) &"
<% else response.write("Il Carrello è vuoto.") end if %>
Anche se e' possibile in linea di principio usare qualsiasi tipo di dati per la chiave, e' meglio usare solamente stringhe, numeri o date; qualsiasi altro tipo potrebbe funzionare, ma non e' garantito. Come valori, invece, si puo' usare qualsiasi tipo, anche degli oggetti! Inoltre, non è necessario che i dati siano "omogenei": nulla vieta che nello stesso dictionary ci siano contemporaneamente elementi di tipo data, stringa, intero, oggetto, etc. Una prima modifica a questo script, che permetterebbe di renderlo piu' flessibile, potrebbe essere quella di usare un altro dictionary come valore. In tal modo sarebbe possibile usare un numero illimitato di attributi del prodotto, invece della sola quantita'. Una caratterirtica del dictionary che ho scritto e' la possibilita' di salvarne il contenuto su file. Questo permette di salvare ad esempio lo ststo di una sessione per poi ripristinarla in seguito. Oppure Permette di caricare in fase di inizializzazione di una applicazione ASP dei dati di default da file che serviranno per tutte le sessioni dell'applicazione. Il motivo per cui ho scritto il componente e' che mi serviva per poter analizzare i log di Internet Information Server 4.0. Dovevo contare gli accessi per singolo file e gli accessi per singolo IP. L'array associativo mi e' servito per semplificare notevolmente il codice. Lo script per effettuare questo lavoro analizza ogni riga dei log di IIS4. Ogni nome di file rappresenta la Chiave di accesso all'array, mentre il valore memorizzaro rappresenta il numero di accessi. Per gli accessi per IP e' lo stesso: usi gli IP come chiave di accesso, ed il numero di files scaricati come valore associato. Insieme all'articolo dovrebbe essere allegato anche lo script che fa le statistiche. Potete vederlo all'opera su: http://www.paipai.net/stats.asp?WS=4 In seguito parlero' degli altri oggetti presenti nel componente: un codec Base64 ed un convertitore di array a stringa e viceversa.