sqlPer motivi vari mi sono ritrovato a dover fare un’operazione di JOIN tra tabelle presenti in database diversi, ovvero in file mdb differenti. La cosa, seppur molto sporca a livello logico, mi era inevitabile e quindi sono dovuto ricorrere a quei trucchi che solo il dialetto SQL di MS Access permette.

È infatti assolutamente possibile fare questa operazione per mezzo di una semplice operazione di SELECT particolare. Supponiamo di avere il database contenente le varie informazioni utente (database.mdb nella tabella users) da mostrare ed in un database separato le politiche di accesso (tabella tbGrants nel database corrente) ai dati divise per utenti.

Per poter avere la lista dei record a cui può accedere l’utente corrente (che supponiamo essere un intero uguale 1), dobbiamo fare quanto segue:

SELECT * FROM tbGrants LEFT OUTER JOIN [;Database=\mdb-database\database.mdb;].users ON users.ID=tbGrants.userId WHERE tbGrants.userId=1

Fatto. Facile no? ok emoticon

sqlPer chi crea siti Web capita prima o poi di trovarsi davanti ad un problema insormontabile: lavorare in ASP+Access, l’accoppiata vincente di Microsoft oramai superata in tutto e per tutto dal binomio PHP+MySQL. Tuttavia non tutto è perduto e ci armiamo di buona pazienza in modo da far funzionare tutto per il meglio, quando ecco sorgere problemi insospettabili. Supponiamo ad esempio di voler caricare dal DB un numero limitato di risultati di una query, caso tipico della LIMIT di MySQL e della TOP per i sistemi Microsoft, ad esempio per un sistema di visualizzazione delle news. Supponendo di avere un codice SQL del tipo:

SELECT TOP 5 * FROM tbEventi ORDER BY Data DESC

Ci aspettiamo che il codice qui sopra carichi dal DB esattamente i primi 5 risultati delle news ordinate per data. Cosa accade però se in lista ci sono più eventi della stessa giornata dei quali non abbiamo definito un ordinamento? Un caso d’esempio della tabella tbEventi è questo qui sotto:

ID	Titolo	Testo	Data
----------------------------------
1	Titolo1	Testo1	19/05/2009
2	Titolo2	Testo2	19/05/2009
3	Titolo3	Testo3	18/05/2009
4	Titolo4	Testo4	17/05/2009
5	Titolo5	Testo5	17/05/2009
6	Titolo6	Testo6	17/05/2009
7	Titolo7	Testo7	16/05/2009
8	Titolo8	Testo8	16/05/2009

In questo caso avrete come risultato della query questo:

ID	Titolo	Testo	Data
----------------------------------
1	Titolo1	Testo1	19/05/2009
2	Titolo2	Testo2	19/05/2009
3	Titolo3	Testo3	18/05/2009
4	Titolo4	Testo4	17/05/2009
5	Titolo5	Testo5	17/05/2009
6	Titolo6	Testo6	17/05/2009
7	Titolo7	Testo7	16/05/2009
8	Titolo8	Testo8	16/05/2009

Che è esattamente la tabella iniziale. Come mai? E’ molto semplice, a date uguali viene data la stessa importanza, si verifica cioè un aexequo che porta come risultato l’uscita di tutte le entry con le prime 5 date disponibili, ed in questo caso avremo il 19, il 18, il 17 ed il 16 maggio.

Come risolvere?

Facile, ci sono 2 modi: o definiamo un secondo modo di ordinamento, come questo:

SELECT TOP 5 * FROM tbEventi ORDER BY Data, Titolo DESC

In modo da permettere all’engine di discriminare tra entry della stessa data, oppure in una maniera più “sporca” facendo una sotto-query:

SELECT TOP 5
FROM (SELECT TOP 5 * FROM tbEventi ORDER BY Data DESC)
ORDER BY Data DESC

Fine. Se vi vengono in mente altre modalità per risolvere il problema, fatemelo sapere!

Logo di Vista

Quante volte ci troviamo a testare i nostri siti web ASP in locale per evitare di mostrarli al pubblico prima del tempo? Direi davvero tante volte e fino a qualche anno fa avevamo la possibilità di farlo per mezzo di IIS 5, che era già pre-installato sul sistema. Con Windows XP avevamo assistito ad un passo indietro non indifferente, ovvero il fatto che sulla maggior parte dei PC portatili era installato Windows XP Home che non aveva ISS installato ed era perciò necessario affidarsi a programmi esterni, come BabyWebServer.

Con Windows Vista invece, la storia cambia e IIS7 arriva già installato nel sistema e per farlo funzionare basta semplicemente attivarlo da Pannello di Controllo.

(Vediamo insieme come fare.)

Continua a leggere "Attivare l’interprete ASP su IIS7 in Windows Vista"

MAR
10

sql

Primo articolo per quanto riguarda l’SQL, il più famoso linguaggio di interrogazione per database. Il problema riguarda l’ordinamento casuale dei record di una qualsiasi tabella su un database Access. Su SQLServer risolvere il problema è abbastanza semplice, basta infatti specificare un ordinamento del tipo:

SELECT * FROM tabella ORDER BY NEWID();

ed il gioco è fatto. Questo tipo di approccio invece non è possibile se il database che stiamo usando è un database Access.

Ecco perciò come ho risolto:

SELECT * FROM tabella ORDER BY Rnd((ID+Timer())*-1);

e quindi nel complesso:

set conn=Server.CreateObject("ADODB.Connection")
conn.Provider="Microsoft.Jet.OLEDB.4.0"
conn.Open Server.MapPath("/mdb-database/accademia.mdb")
set rs = Server.CreateObject("ADODB.Recordset")
rs.Open "SELECT * FROM tabella ORDER BY Rnd((ID+Timer())*-1)", conn

Essendo la funzione Timer() precisa al centesimo di secondo, è praticamente impossibile ottenere due query ordinate nello stesso modo. Il campo ID deve essere ovviamente numerico e nel mio caso è autoincrementale. Grazie a questo tip ho risparmiato ore di lavoro inutile, devo perciò ringraziare la fonte dell’informazione, il blog di Lorenzo Benaglia e soprattutto il commentatore Giorgio Rancati che ha proposto questa soluzione. ok emoticon

DIC
22

webserver

Ciao a tutti cari visitatori! Proprio ieri mattina ho dovuto affrontare l’esame di Tecnologie Web, superato tranquillamente tongue emoticon Il mio progetto, da realizzare con le tecnologie JSP/JSF, non voleva saperne di funzionare, un pò per la mancanza di tempo per eseguire il debug delle pagine, un pò per i vari bug che ancora affliggono questa neo-tecnologia. Ho deciso così di portare all’esame un progetto identico, però realizzato su piattaforma ASP + ASP.NET, linguaggi a me più familiari, anche se questo, per via della scarsa conoscenza in materia (???) del prof, mi avrebbe tolto comunque qualche punto. Sempre meglio che una bocciatura (che non posso permettermi), quindi mi sono attrezzato di tutto punto ed ho installato nel PC il MySQL per gestire il database, i driver ODBC per ASP, ho creato le mie pagine riutilizzando il mio vecchio codice ed in un paio d’ore il sito era bello che pronto. Finito questo è sorto il problema: dove testo le pagine? E’ doveroso sapere che il mio portatile su cui lavoro tutti i giorni e che mi porto praticamente sempre in giro ha installato Windows XP Home Edition, quindi niente IIS. L’ultima volta che ho tentato di seguire le procedure per l’installazione di IIS su XP Home avendo a disposizione un cd di Windows 2000, avevo un pc con XP Home ma con Service Pack 1, quindi potei installarlo tranquillamente. Attualmente ho il Service Pack 2, che è noto crea diversi conflitti con IIS e quindi ho dovuto rinunciare. Ho dovuto quindi cercare in rete per poter risolvere questo problema. Uno tra i pochi programmi veramente gratuiti (la versione base) ma semplici da utilizzare è stato Baby Web Server. Continua a leggere "BabyWebServer: un WebServer ASP gratuito"

dotnet

Mi è capitato ultimamente di avere dei grossi problemi di spamming in un guestbook che gestisco personalmente. In pratica ogni giorno qualche burlone d’oltremanica si divertiva ad inserire nel guestbook link di siti che gestivano la vendita di prodotti come il tramadol, il viagra e altro. Essendo che per fortuna non ho bisogno di alcun farmaco (tantomeno di questi!), e che il guestbook non aveva di certo alcun bisogno di essere pieno di messaggi completamente fuori luogo, ho deciso di aggiungere una validazione al form preesistente con l’aiuto di asp.net tramite un controllo CAPTCHA, che rende la gestione dei meta type (le immagini in particolare!) particolarmente semplice da gestire. C’è da dire che essendo il sito creato completamente in asp, non ho avuto né tempo né voglia di convertirlo ad asp.net, anche perchè essendo un sito amatoriale non mi paga nessuno per farlo tongue emoticon , ecco perchè ho voluto integrare semplicemente le due tecnologie.

Continua a leggere "Guide ASP.NET – Create un validatore CAPTCHA compatibile con ASP 3.0"