Creare negozio online ASP (IV Parte)
Quarta parte del tutorial: come gestire e confermare gli ordini, ultimo step del carrello, annullare l'ordine.
In questo articolo ci occuperemo della gestione degli ordini, nel precedente avevamo visto la gestione del carrello.
Analisi
La gestione degli ordini può a secondo delle necessità risultare semplice o complicata.
Se prevediamo un numero di ordini non superiore ai 2/3 al giorno, una soluzione veloce ed economica può essere la ricezione dell'ordine via email.
Ma se si hanno o si prevedono di avere decine di ordini al giorno, è necessario una buona gestione degli ordini.
Cosa significa gestire gli ordini?
Poter gestire gli ordini significa possedere un pannello di controllo dove confermare gli ordini (eliminando alcuni pezzi in caso ancora non disponibili), emettere fatture, controllare lo storico di un cliente, o gli ordini evasi in una certa data. Un pannello di controllo permette di annullare gli ordini, gestire le restituzioni, riparazioni o i rifiuti.
Nel nostro progetto ci limiteremo a confermare e annullare gli ordini.
Ultimo step del carrello
Per poter gestire gli ordini nell'ultimo step del carrello è necessario inserire tutti i dati dell'ordine nel database. Quindi quando l'utente conferma che vuole veramente il prodotto ordinato tutti i dati (i prodotti acquistati, nome, cognome, via, città, provincia, email,...) devono essere registrati nel database in una tabella apposita che presenta, oltre tutti i campi necessari per l'invio, la fatturazione e il riconoscimento del prodotto, anche un ID ordine e un campo di tipo boolean conferma che viene impostato di default a false, in modo da poter indicare se un ordine è stato confermato.
Vedremo come effettuare l'inserimento di un nuovo record utilizzando SQL, ma prima dobbiamo risolvere un problema: se un utente ordina 10 prodotti diversi dove vengono indicati? Non possiamo creare n campi prevedendo il numero max di prodotti che è possibile ordinare, quindi dovremmo utilizzare 2 tabelle con una relazione 1 : N. Quindi abbiamo le due tabelle:
- or_dati
- or_prod
In or_dati verranno memorizzati i dati sull'utente, la data dell'ordine e l' ID, mentre in or_prod verranno memorizzati tutti i prodotti, ognuno su un record che contiene l' ID ordine, il prodotto e la quantità scelta di quel prodotto.
Codice 16.1
<%' Cerca se il carrello è esistente, se non lo è lo crea (come un array in una sessione)carre = Session("carrello")' POSIZIONE DELL'ARRAY' 0 = ID prodotto' 1 = Quantità Prodotto%><html><head><title>WebMasterPoint.org</title></head><body><p align="center"><b><font face="Verdana" size="4" color="#FF0000"><i>WebMasterPoint.org </i>e<i>Learning</i></font></b></p><p align="left"><font face="Verdana" size="2"><b>Corso:</b> ASP 3.0 PRO<b><br>Lezione: </b>13/14/15/16/17<br><b>Tutor:</b> Lorenzo Pascucci</font></p><p align="center"><b><font face="Verdana" size="6">CARRELLO</font></b></p><p align="center"> </p><%' CONFERMA ORDINE' Preleva i dati' ID ORDINE, è un codice univoco in quanto è impossibile che avvenga un' ordine nello stesso istante, per eliminare ogni caso è possibile' aggiungere un numero casualeid_ordine = Year(date()) & Month(date()) & Day(date()) & Hour(time()) &_Minute(Time()) & Second(time())' Connessione databaseSet conn = Server.CreateObject("ADODB.Connection")conn.open "provider=microsoft.jet.oledb.4.0;data source=" _& Server.MapPath("ecommerce.mdb")' Stringa SQL per inserimento dati in or_datisql = "INSERT INTO or_dati (id_ordine,nome,cognome,via,città,eta,dataordine,sesso)"sql = sql & " VALUES (" & id_ordine & ",'" & Request("nome") & "','" & Request("cognome")sql = sql & "','" Request("via") & "','" & Request("citta") & "'," & Request("eta") & ","sql = sql & dataordine & ",'" & Request("sesso") & "')Set rs1 = Conn.Execute(sql) totale = 0trov = FalseFor i = 0 to UBound(carre)'Se il prodotto esiste, lo inserisceIf carre(0,i) <> "" then' Stringa SQL per inserimento dati in or_prodsql = "INSERT INTO or_prod (id_ordine,id_p,quantita) VALUES (" & id_ordine & ","sql = sql & carre(0,i) & "," & carre(1,i) & ")"' Esecuzione querySet rs = Conn.Execute(sql) rs.closeSet rs = NothingEnd IfNextconn.closeSet conn = Nothing%><p align="center"><font face="Verdana" size="2">Esempio del corso di ASP 3.0 PRO di Lorenzo Pascucci<br>WebMasterPoint.org eLearning<br>www.webmasterpoint.org</font></p></body></html>
Creare delle query di inserimento (ma anche di aggiornamento, selezione,...) in sql è molto semplice e ci offre un grande vantaggio: la possibilità, cambiando semplicemente la stringa di connessione al database, di poter utilizzare lo stesso script anche su un database MySQL, SQL Server, db2 e molti altri (tutti i database relazionali). Analizziamo quella piu' completa:
sql = "INSERT INTO or_dati (id_ordine,nome,cognome,via,città,eta,dataordine,sesso)"sql = sql & " VALUES (" & id_ordine & ",'" & Request("nome") & "','" & Request("cognome")sql = sql & "','" Request("via") & "','" & Request("citta") & "'," & Request("eta") & ","sql = sql & dataordine & ",'" & Request("sesso") & "')
Da questa query è possibile capire quali sono i campi di una tabella (anche se è possibile che ce ne siano altri nella stessa tabella):
- id_ordine di tipo numerico
- nome di tipo testo
- cognome di tipo testo
- via di tipo testo
- citta di tipo testo
- eta di tipo numerico
- dataordine di tipo numerico
- sesso di tipo boolean (true in caso di maschio)
I valori da inserire a seconda del tipo di campo devono essere compresi tra apici o meno. Nel caso di inserimento di numeri, come per id_ordine, eta, dataordine, non sono necessari gli apici, mentre per il testo, per valori booleani... sono necessari.
sql = "INSERT INTO or_dati (id_ordine,nome,cognome,via,città,eta,dataordine,sesso)"
sql = sql & " VALUES (" & id_ordine & ",'" & Request("nome") & "','" & Request("cognome")
sql = sql & "','" Request("via") & "','" & Request("citta") & "'," & Request("eta") & ","
sql = sql & dataordine & ",'" & Request("sesso") & "')
Nella stessa stringa SQL sono stati evidenziati le parti più importanti: Insert Into permette di indicare che si sta inserendo un nuovo record in or_dati e deve impostare solo i campi indicati tra le parentesi (subito dopo il nome della tabella, nel caso i campi non si indicano, si dovranno impostare tutti), una volta indicati i campi su cui agire, si indicano i valori con Values tra parentesi, qui dovremmo far attenzione all'uso degli apici o meno a secondo del tipo di dato, e ogni valore viene separato dall'altro attraverso la virgola.
Conferma Ordine
Nel Pannello di controllo è necessario confermare o annullare l'ordine in base a delle regole ben precise, che possono essere:
- prodotto terminato
- dati utente non corretti
- pagamento non avvenuto
Quindi è necessario visualizzare tutti gli ordini non confermati facendo una query di selezione sulla tabella or_dati, per poi visualizzar per ogni ordine tutti i prodotti. Queste operazioni si possono effettuare con 2 semplici query, ma grazie alla potenza di SQL è possibile realizzarne anche una sola, utilizzando JOIN, ovvero il comando di congiunzione di 2 o piu' tabelle:
SELECT * FROM or_dati INNER JOIN or_prod ON or_dati.id_ordine = or_prod.id_ordine
In questo modo diciamo di fare una
congiunzione di
or_dati, or_prod
proiezione di
tutti i campi
selezione di
or_dati.id_ordine = or_prod.id_ordine AND
conferma = 'False'
In parole piu' semplici:
unisci le tabelle
or_dati, or_prod
visualizza
tutti i campi
seleziona e unisci i record delle due tabelle che hanno
or_dati.id_ordine = or_prod.id_ordine E CHE HANNO
conferma = 'False'
Per la visualizzazione dei dati non cambia nulla, è come sempre un ciclo Do While NOT rs.EOF. Il problema può avvenire quando ci sono nelle due tabelle campi con lo stesso nome, solitamente sono appunto i codice (ID) che permettono la relazione, in tal caso basterà indicare prima il nome della tabella (in teoria, ma vedremo che con Asp non si può fare). Nel caso, consigliato, si vogliamo visualizzare solo alcuni campi nella proiezione è necessario indicarli. Con Asp poi è possibile richiamarli per la visualizzazione in modo veloce con recordset(numpos) partendo da zero.
Esempio: se vogliamo visualizzare l'id dell'ordine e tutti i codici dei prodotti di quell'ordine:
SELECT or_dati.id_ordine, id_p FROM or_dati INNER JOIN or_prod ON or_dati.id_ordine = or_prod.id_ordine
Abbiamo quindi tolto l'asterisco (*) che indicava la proiezione di tutti i campi, limitandola solo al codice ordine e prodotto. Visto che id_ordine è contenuto in entrambe le tabelle abbiamo indicato anche da quale tabella prenderlo (in tal caso è uguale, quindi era possibile prenderlo anche dalla tabella or_prod), infine visualizziamo il codice prodotto, che è contenuto solo nella tabella or_prod, quindi non la specificheremo. Con ASP per visualizzare i campi sarà necessario utilizzare (ammesso che il recordset si chiami rs):
rs(0) per richiamare il valore di or_dati.id_ordine
rs(1) per visualizzare il codice_prodotto
Una volta effettuata la visualizzazione, a fianco ad ogni id ordine sarà necessario mettere un link per la conferma, ovvero la pagina della conferma dovrà impostare semplicemente il campo conferma a 'True', in quanto di default viene impostato a 'False'. Il motivo per cui non è stato impostato a 'False' nell'inserimento è proprio perchè non è necessario, in quanto viene impostato automaticamente (questo viene deciso attraverso Access o altri database). Per impostare questo campo che si trova in or_dati, possiamo utilizzare questa query sql:
UPDATE or_dati SET conferma = 'True' WHERE id_ordine = " & Request.QueryString("id_ordine")
Dove Request.QueryString("id_ordine") permette di ricavare il codice dell'ordine passato per stringa.
Annullare l'ordine
Per annullare un ordine è necessario utilizzare una semplice query SQL a cui passiamo il codice dell'ordine. Nel caso si voglia annullare un ordine è importante decidere se tenerlo comunque tracciato, per future statistiche, o cancellarlo definitivamente. Nel primo caso sarà necessario impostare il campo conferma a 'False', nel secondo dovremmo utilizzare il comando DELETE di SQL.
DELETE FROM or_dati WHERE id_ordine = " & Request.QueryString("id_ordine")
E' necessario però, ai fini di fare un buon lavoro, cancellare anche i prodotti di quell'ordine, quindi basterà:
DELETE FROM or_prod WHERE id_ordine = " & Request.QueryString("id_ordine")
- Articolo precedente Creare carrello e-commerce (III Parte)
- Articolo successivo Sicurezza ASP, consigli per rendere sicuri i nostri script