Часть 4. Реклама
Ознакомившись с основными функциями управления и хранения товаров, мы переходим к рассмотрению некоторых средств продвижения товаров нашего магазина на рынок. В главе 13 рассматриваются горизонтальные и вертикальные связи между товарами. Наличие этих связей способствует привлечению внимания покупателя к более широкому ассортименту товаров. В частности, покупатель всегда может выбрать наиболее современный вариант интересующих его товаров.
В главе 14 рассматриваются возможности рекламирования определенных товаров на различных 'стадиях процесса покупки. Это позволит продвигать новые товары, проводить распродажи и т. д.
Наконец, в главе 15 исследуются способы организации распродаж в нашем магазине. При этом необходимо обеспечить такие функциональные возможности, как определение дат начала и окончания распродажи, выбор цен и т. д.
В этом разделе затронут лишь небольшой круг многочисленных творческих возможностей, используемых при проведении Web-маркетинга.

Глава 13. Вертикальные и горизонтальные связи
Мы должны предоставить покупателям возможность поиска аналогичных или усовершенствованных товаров. Это поможет нам продать больше товаров, а покупателю - найти те товары, которые необходимо или желательно приобретать в комплекте. В этой главе мы рассмотрим построение таких механизмов в пользовательском интерфейсе, а также дополнительные элементы интерфейса управления, используемые для установления связей внутри определенных групп товаров.

Проектирование связей между товарами
В нашей базе данных встречаются связи двух типов. Связи первого типа - горизонтальные - объединяют товары, дополняющие друг друга. В качестве примера можно привести брюки, приобретаемые в комплекте с рубашкой, или монитор, приобретаемый одновременно с компьютером.
Второй тип связи - вертикальный - призван привлечь внимание покупателя к альтернативным товарам, аналогичным по назначению тем, которые он рассматривает в данный момент, но более высокого качества или же представленным в наборе. Примером может служить 21-дюймовый монитор вместо 15-дюймового, или комплект компакт-дисков вместо одного диска.
В качестве примера построим пару связей, которые пригодятся при создании пользовательского интерфейса нашего Web-магазина. В листинге 13.1 представлены три команды SQL INSERT. Таблица состоит из трех столбцов. Первый столбец, idProductA, содержит идентификатор первого товара; второй столбец, id-ProductВ, содержит идентификатор второго товара, связанного с первым. Третий столбец, idRelationType, определяет тип связи: значение 1 соответствует горизонтальной связи, 2 - вертикальной. Конечно, один товар может участвовать как в горизонтальных, так и в вертикальных связях, и информацию об этом можно сохранить путем создания дополнительных записей в таблице RelatedProducts.
Листинг 13.1. Команды SQL для создания связей между товарами
insert into RelatedProducts(idProductA, idProductB, idRelationType)
values(9, 10, 1)
insert into RelatedProducts(idProductA, idProductB, idRelationType)
values(10, 9, 1)
insert into RelatedProducts(idProductA, idProductB, idRelationType)
values(4, 3, 2)
Построение связей
Интерфейс для работы со связями будет использоваться в двух местах. Во-первых, на странице каждого товара будет выводиться перечень сопутствующих ему товаров, объединенных с ним горизонтальными связями.
Во-вторых, когда покупатель добавляет в свою корзину какой-либо товар, объединенный вертикальными связями с другими товарами, на странице корзины появится сообщение о наличии альтернативных товаров.
Когда в корзину покупателя добавляется товар, объединенный с другим товаром вертикальной связью, появляется ссылка на этот альтернативный товар. Если щелкнуть на ссылке, появляется подробная информация об этом товаре. Если покупатель решает заказать этот товар, то он добавляется в корзину, а предыдущий товар удаляется из нее.
Необходимо проследить за тем, чтобы при такой замене общее количество единиц товара в корзине не изменилось, то есть все удаленные товары были заменены соответствующими альтернативными товарами. Начнем с рассмотрения программного кода, управляющего выводом информации о сопутствующих товарах, объединенных с данным товаром горизонтальными связями.
Сопутствующие товары (горизонтальные связи)
Мы преобразуем страницу Product.asp таким образом, чтобы она выводила ссылки на связанные товары. Эти ссылки будут размещаться в нижней части страницы, под информацией об исходном товаре. Для этого необходимо открыть подключение к базе данных.
Для поиска сопутствующих товаров будет использоваться хранимая процедура sp_RetrieveRelatedProducts, которой при вызове передается идентификатор текущего товара. Если процедура найдет связанные товары, на странице будет построена ссылка к каждому из них.
ПРИМЕЧАНИЕ
В листинге приводится только та часть программного кода, которая связана с выводом информации о связанных товарах. Предполагается, что остальной код страницы остался без изменений.

Листинг 13.2. Product.asp
<%
' Create an ADO database connection
set dbRetrieveRelatedProducts = server.createobject("adodb.connection")
' Create a record set
set rsRetrieveRelatedProducts = server.CreateObject("adodb.recordset")
' Open the connection using our ODBC file DSN
dbRetrieveRelatedProducts.open("filedsn=WildWillieCDs")
' Call the appropriate stored procedure
sql = "execute sp_RetrieveRelatedProducts " & request("idProduct")
' Execute the stored procedure to retrieve
' related products.
set rsRetrieveRelatedProducts = dbRetrieveRelatedProducts.Execute(sql)
' Check to see if there are any related products for
' a cross sell.
if not rsRetrieveRelatedProducts.EOF then
%>
<B>Related Products:</B><BR><BR>
<%
end if
После получения набора записей происходит циклический перебор всех найденных товаров. На странице Product.asp строится ссылка, содержащая идентификатор товара. После приведенного фрагмента следует остальной код страницы Product.asp, описанный в главе 6.
Листинг 13.3. Product.asp (продолжение)
' Loop through the related products
do until rsRetrieveRelatedProducts.EOF
%>
<!-- Build a link to the product -->
<a href="product.asp?idProduct=
<%=rsRetrieveRelatedProducts("idProduct")%>">
<%=rsRetrieveRelatedProducts("chrProductName")%></a>
<%
' Move to the next row.
rsRetrieveRelatedProducts.MoveNext
' Loop back
loop
%>
Хранимая процедура sp_RetrieveRelatedProducts получает идентификатор того товара, который мы собираемся проверять на наличие связей. Переданный идентификатор сравнивается с содержимым столбца idProductA таблицы RelatedProducts. Обратите внимание: тип связи (в данном случае 1) задается внутри хранимой процедуры.
Листинг 13.4. Хранимая процедура sp_RetrieveRelatedProducts
/* Хранимая процедура для поиска товаров, связанных с данным */
CREATE PROCEDURE sp_RetrieveRelatedProducts
/* При вызове процедуре передается идентификатор товара */
@idProduct int
AS
/* Выборка связанных товаров. Обратите внимание: горизонтальный тип связи определяется значением 1. */
select * from relatedproducts, products
where relatedproducts.idProductb = products.idproduct and
relatedproducts.idProducta = @idProduct and
idRelationType = 1
Альтернативные товары (вертикальные связи)
Рассмотрение вертикальных связей начнется с программного кода страницы Basket.asр. При каждой итерации мы рассматриваем определенный товар в корзине и проверяем, имеются ли какие-либо альтернативные товары, объединенные с данным вертикальными связями. Если это так, то сразу же после информации о выбранном товаре на странице выводится соответствующее сообщение.
Из текста сообщения покупатель узнает, что в магазине имеется товар, который, возможно, представляет для него интерес.
Программный код вставляется в цикл перебора товаров в файле Basket, as р. Начало вставляемого фрагмента приведено в листинге 13.5. Сначала мы создаем подключение к базе данных для поиска товаров, объединенных вертикальными связями с текущим товаром, который рассматривается в данный момент.
Листинг 13.5. Basket.asp
<!-- Проверка наличия альтернативных товаров -->
<%
' Создать объект подключения к базе данных
set dbUpSell = server.createobject("adodb.connection")
' Создать объект набора записей
set rsUpSell = server.CreateObject("adodb.recordset")
' Открыть подключение, используя файловый DSN ODBC
dbUpSell.open("filedsn=WildWillieCDs")
' Построить команду вызова хранимой процедуры sp_RetrieveUpSell
' для проверки наличия вертикальных связей у данного товара.
sql = "execute sp_RetrieveUpSell " & rsBasketItem("idProduct")
' Выполнить команду SQL
set rsUpSell = dbUpSell.Execute(sql)
Если результат проверки окажется положительным, мы создаем в таблице строку, распространяющуюся на всю ее ширину. В ней выводится стандартный текст, свидетельствующий о наличии альтернативного товара.
Затем мы создаем ссылку на страницу UpgradeProduct.asp, на которой можно будет заказать этот товар (см. листинг 13.6).
СОВЕТ
Возможно, для каждой связи в базе данных следует сохранить отдельное сообщение с рекламой альтернативного товара - это позволит выбрать наиболее подходящий текст для каждой из вертикальных связей.

Листинг 13.6. Basket.asp (продолжение)
' Сообщить покупателю о существовании альтернативного товара.
if rsUpSell.EOF <> true then
%>
<!-- Build a row to show the message -->
<tr>
<td></td>
<td colspan="6">
<!-- Build a link ot the UpgradeProduct.asp page -->
<b>Why not try buying
<a href="UpgradeProduct.asp?intQuantity=<%=rsBasketItem("intQuantity")%>
&idBasketItem=<%=rsBasketItem("idBasketItem")%>

&idProduct=<%=rsUpSell("idProduct")%>"><%=rsUpSell("chrProductName")%></a>
instead?</b>
</td>
</tr>
<%
end if
' Move to the next row
rsBasketItem.MoveNext
' Loop back
loop
%>
Для загрузки информации об альтернативных товарах используется хранимая процедура sp_RetrieveUpSell (см. листинг 13.7). Переданный ей идентификатор товара сравнивается с содержимым столбца idProductA таблицы RelatedProducts. На этот раз ищутся записи с типом связи 2 (вертикальная связь).
ПРИМЕЧАНИЕ
В данном примере типы связи 1 и 2 жестко программируются в двух разных, хотя и очень похожих, хранимых процедурах. Такое решение обеспечивает максимальную свободу при изменении типов связи в базе данных.

Листинг 13.7. Хранимая процедура sp_RetrieveUpSell
/* Хранимая процедура для поиска альтернативных товаров */
CREATE PROCEDURE sp_RetrieveUpSell
/* При вызове процедуре передается идентификатор товара */
@idProduct int
AS
/* Выборка записей альтернативных товаров. Вертикальный тип связи обозначается типом 2, а значение 1 соответствует горизонтальному типу. */
select * from relatedproducts, products
where products.idproduct = relatedproducts.idproductb and
relatedproducts.idProducta = @idProduct and
idRelationType = 2
Далее мы переходим к странице UpgradeProduct.asp, предназначенной для демонстрации альтернативного товара. Хотя эта страница и похожа на страницу Product.asp, все же между ними имеются существенные различия. Страница UpgradeProduct.asp начинается с включения стандартных заголовочных файлов.
Затем мы открываем подключение к базе данных для поиска информации о товарах. Искомые данные загружаются из базы хранимой процедурой sp_RetrieveProduct (см. листинг 13.8).
Листинг 13.8. UpgradeProduct.asp
<%@ Language=VBScript %>
<HTML>
<!--
UpgradeProduct.asp - This page allows the user to upgrade
the product they have purchased. It is linked to from the
shopping basket.
-->
<!-- #include file="include/header.asp" -->
<%
' Create an ADO database connection
set dbProduct = server.createobject("adodb.connection")
' Create a record set
set rsProduct = server.CreateObject("adodb.recordset")
' Open the connection using our ODBC file DSN
dbProduct.open("filedsn=WildWillieCDs")
' Call the Retrieve Product stored procedure to get
' the product data.
sql = "execute sp_RetrieveProduct " & request("idProduct")
' Execute the SQL statement
set rsProduct = dbProduct.Execute(sql)
' Retrieve the description, product image and
' product name.
txtDescription = rsProduct("txtDescription")
chrProductImage = rsProduct("chrProductImage")
chrProductName = rsProduct("chrProductName")
%>
Далее мы создаем форму для добавления товара в корзину. Заметим, что форма передает данные странице AddUpgradeItem.asp, а не AddItem.asp, в отличие от страницы с обычным заказом.
Страница выводит стандартную информацию об альтернативном товаре. Количество единиц текущего товара в корзине передается в URL; это значение по умолчанию присваивается соответствующему параметру альтернативного товара. Также следует учитывать, что идентификатор товара, помещенного в корзину, хранится в скрытом поле, поэтому мы сможем удалить его из корзины, если будет заказан альтернативный товар.
Страница завершается стандартным образом - выводом атрибутов товаров, включением заголовочного файла Footer.asp и т. д. (см. листинг 13.9).
Листинг 13.9. UpgradeProduct.asp (продолжение)
<!-- Form to post the upgrade request -->
<form method="post" action="addupgradeitem.asp" id=form1 name=form1>
<!-- Table to display the product information -->
<table border="0" cellpadding="3" cellspacing="3">
<!-- Show the product image, name and description. -->
<TR>
<td><img src="images/products/<%=chrProductImage%>"></td>
<td valign="top">
<CENTER><b><font size="5">
<%=chrProductName%></font></b>
</center><BR><BR>
<%=txtDescription%><BR><BR>
</td>
</TR>
<!-- Show the price -->
<TR>
<TD align="center">
<B>Price:
<%=formatcurrency(rsProduct("intPrice")/100, 2)%></b>
</td>

<TD align="center">
<!-- Show the quantity of items already selected for the other product. -->
<B>Quantity: <input type="text"
value="<%=request("intQuantity")%>" name="quantity" size="2"></b>
<!-- Hidden variables to keep the product information -->
<input type="hidden"
value="<%=request("idProduct")%>" name="idProduct">

<input type="hidden"
value="<%=rsProduct("chrProductName")%>" name="ProductName">

<input type="hidden"
value="<%=rsProduct("intPrice")%>" name="ProductPrice">

<!-- Pass along the basket item to indicate which
product is to be upgraded. -->
<input type="hidden" value="<%=request("idBasketItem")%>"
name="idBasketItem">

</td>
</TR>
<%
' Create an ADO database connection
set dbAttributes = server.createobject("adodb.connection")
' Create a record set
set rsAttributes = server.CreateObject("adodb.recordset")
' Open the connection using our ODBC file DSN
dbAttributes.open("filedsn=WildWillieCDs")
' Call the stored procedure to retrieve the
' product attributes.
sql = "execute sp_Attributes " & request("idProduct")
' Execute the SQL statement
set rsAttributes = dbProduct.Execute(sql)
' Check to see if attributes should be displayed
if not rsAttributes.EOF then
%>
<!-- Display the color and size attributes. -->
<TR>
<TD>
<!-- Display the color attributes -->
Color:
<SELECT name="color">

<%

' Loop through the attributes
do until rsAttributes.EOF

%>

<!-- Show the color options -->
<option value="<%=rsAttributes("chrAttributeName")%>">
<%=rsAttributes("chrAttributeName")%>

<%

' Check to see if we have reached the end of the
' attributes category.
if rsAttributes("chrCategoryName") <> "Color" then

' Exit the do loop
exit do

end if

' Move to the next row.
rsAttributes.MoveNext

loop

%>

</select>

</TD>
<TD>
<!-- Display the size attributes -->
Size:
<SELECT name="color">

<%
' Loop through the attributes.
do until rsAttributes.EOF

%>

<!-- Option to display the attribute. -->
<option value="<%=rsAttributes("chrAttributeName")%>">
<%=rsAttributes("chrAttributeName")%>

<%

' Move to the next row.
rsAttributes.MoveNext
' Loop back.
loop

%>

</select>
</TD>
</TR>
<%
end if
%>
<!-- Show the submit button -->
<TR>
<td colspan="2" align="center">
<input type="submit" value="Order" name="Submit">
</td>
</tr>
</table>
</form>
<!-- #include file="include/footer.asp" -->
</BODY>
</HTML>
Когда покупатель выбирает товар, чтобы добавить его в корзину, происходит обращение к странице Addllpgradeltem.asp. Эта страница, как и AddItem.asp, добавляет товар в корзину, но при этом она еще и удаляет из корзины исходный товар.
Прежде всего страница проверяет то, что количество заказанных товаров не равно 0. Затем из полей формы читаются различные параметры (цена, размер, цвет) того товара, который добавляется в корзину (см. листинг 13.10).
Листинг 13.10. AddUpgradeItem.asp
<%@ Language=VBScript %>
<%
' ****************************************************
' AddUpgradeItem.asp - This page will upgrade an item
' in the basket to the up-sell item.
' ****************************************************
' Check to ensure a quantity was set.
if request("quantity") = "0" then
' Send the user back to the upgrade page.
Response.Redirect("upgradeproduct.asp?idProduct=" & _
request("idProduct"))

end if
' Get the product values
intQuantity = request("quantity")
idProduct = request("idProduct")
chrName = replace(request("productname"), "'", "''")
intPrice = request("productprice")
chrSize = request("size")
chrColor = request("color")
Для включения товара в корзину используется хранимая процедура sp_InsertBasketItem. После вызова этой процедуры все готово к удалению исходного товара из корзины.
Эта задача решается при помощи хранимой процедуры sp_RemoveBasketItem. При вызове процедуре передается идентификатор исходного товара, удаляемого из корзины, после чего пользователь возвращается на страницу Basket.asp (см. листинг 13.11).
Листинг 13.11. AddUpgradeItem.asp (продолжение)
' Create an ADO database connection
set dbBasketItem = server.createobject("adodb.connection")
' Create a record set
set rsBasketItem = server.CreateObject("adodb.recordset")
' Open the connection using our ODBC file DSN
dbBasketItem.open("filedsn=WildWillieCDs")
' Call the appropriate stored procedure to insert
' the new item.
sql = "execute sp_InsertBasketItem " & _
session("idBasket") & ", " & _
intQuantity & ", " & _
intPrice & ", '" & _
chrName & "', " & _
idProduct & ", '" & _
chrSize & "', '" & _
chrColor & "'"

' Execute the SQL statement
set rsBasketItem = dbBasketItem.Execute(sql)

' Call the stored procedure to remove an item from the basket
' Note the id of the basket item is utilzed
sql = "execute sp_RemoveBasketItem " & _
session("idBasket") & ", " & _
request("idBasketItem")
' Execute the SQL statement
dbBasketItem.Execute(sql)
' Send the user to the basket
Response.Redirect "basket.asp"
%>
На этом мы заканчиваем разговор о программировании пользовательского интерфейса. Давайте теперь посмотрим, как все это действует. Страницу товара под названием "T-Shirt Rip" (рваная футболка). В нижней части страницы расположены ссылки на товары, так или иначе связанные с этим. В данном случае это майка, которая одевается под футболку (Undershirt).
Корзина с сообщением о наличии альтернативного товара. Чтобы получить это сообщение, включите в корзину товар Circle Sax. Затем выберите товар Candle Sticks are Falling и добавьте его в корзину.
Страница с корзиной, в которой исходный товар заменен альтернативным. При этом магазин получает больше денег, а покупатель находит товар лучшего качества!
Управление связями
Помимо пользовательского интерфейса, нам потребуется механизм управления связями между товарами. Здесь возможны два различных подхода. Во-первых, можно создать отдельный интерфейс управления для выбора пары товаров и установки связи между ними. В этом случае мы получим систему управления, основными элементами которой являются связи.
Также можно сконструировать систему управления, в которой основными элементами являются сами товары. При этом каждому товару может соответствовать несколько различных связей. В приведенных ниже примерах используется именно этот подход. Конечно, ничто не мешает применить оба подхода одновременно.
Для работы вспомогательных средств управления необходимо отредактировать файл ManageProduct.asp. Возможность добавления, обновления и удаления связей будет обеспечиваться дополнительным кодом, который мы вставим в этот файл.
СОВЕТ
Начнем с отображения существующих связей. Для каждой связи необходимо вывести названия и идентификаторы обоих товаров, а также тип связи, существующей между ними. Таким образом, для поиска и отображения существующих связей мы открываем подключение ADO к базе данных и создаем новый столбец для удаления существующих связей (см. листинг 13.12).

Листинг 13.12. ManageProduct.asp
<HR>
<table border="1" cellpadding="3" cellspacing="3">
<tr>
<th>ID</th>
<th>Related<BR>Product ID</th>
<th>Related<BR>Product</th>
<th>Relation<BR>Type</th>
<th>Delete</th>
</tr>
<%
' Create an ADO database connection
set dbRelated = server.createobject("adodb.connection")
' Create a record set
set rsRelated = server.CreateObject("adodb.recordset")
' Open the connection using our ODBC file DSN
dbRelated.open("filedsn=WildWillieCDs")
' Execute the stored procedure to retrieve the
' related products.
sql = "execute sp_RetrieveProductRelations " & _
request("idProduct")
' Execute the SQL statement
set rsRelated = dbRelated.Execute(sql)
' Loop through the related products
do until rsRelated.EOF
%>
<!-- Build each row to display the related
product information and an option to
delete the product. -->
<tr>
<td><%=rsRelated("idRelatedProduct")%></td>
<td><%=rsRelated("idProductB")%></td>
<td><%=rsRelated("chrProductName")%></td>
<td><%=rsRelated("idRelationType")%></td>
<td><a href="DeleteRelated.asp?idProduct=<%=request("idProduct")%>&idRelatedProduct=
<%=rsRelated("idRelatedProduct")%>">
Delete</a></td>
</tr>
<%
' Move to the next row
rsRelated.MoveNext
' Loop back
Loop
%>
</table>
<BR><BR>
Затем мы выводим список имеющихся в наличии товаров. Из этого списка можно выбрать какой-нибудь товар и построить связь между ним и другими товарами. Все сведения о товарах, полученные из базы данных, выводятся в поле списка.
Передача данных о связи странице AddRelation.asp, предназначенной для сохранения связи в базе данных, осуществляется при помощи формы. Для выбора типа связи на форме создаются кнопки-переключатели (см. листинг 13.13).
Листинг 13.13. ManageProduct.asp (продолжение)
<%
' Create an ADO database connection
set dbProducts = server.createobject("adodb.connection")
' Create a record set
set rsProducts = server.CreateObject("adodb.recordset")
' Open the connection using our ODBC file DSN
dbProducts.open("filedsn=WildWillieCDs")
' Execute the stored procedure to retrieve the
' current list of products
sql = "execute sp_RetrieveProducts"
' Execute the SQL statement
set rsProducts = dbProducts.Execute(sql)
%>
<!-- Build a form to post the new relation
to the database. The form will post to
AddRelation.asp. -->
<form method="post" action="AddRelation.asp">
<!-- Build a hidden variable so the posting page
knows what product to relate this product to.
-->
<input type="hidden" name="idProductA"
value="<%=request("idProduct")%>">
<!-- Select box for the products to relate to
this product. -->
<select name="idProductB">
<%
' Loop through the products
do until rsProducts.EOF
%>
<!-- Build the option value -->
<option value="<%=rsProducts("idProduct")%>">
<%=rsProducts("chrProductName")%>
<%
' Move to the next row
rsProducts.MoveNext
' Loop back
Loop
%>
</select>
<BR><BR>
<!-- Radio buttons to indicate the type of
relationship. -->
<input type="Radio" value="1"
name="RelationType">1 - Related Products

<input type="Radio" value="2"
name="RelationType">2 - Up Sell
<BR><BR>
<!-- Submit button for the form. -->
<input type="Submit" name="Submit" value="Add Relation">
</form>
Хранимая процедура sp_RetrieveProductRelations (см. листинг 13.14) загружает все ранее определенные связи заданного товара.
Листинг 13.14. Хранимая процедура sp_RetrieveProductRelations
CREATE PROCEDURE sp_RetrieveProductRelations
@idProduct int
AS
select * from relatedproducts, products
where idProductA = @idProduct and
products.idProduct = relatedproducts.idProductb
Для поиска информации обо всех товарах в базе данных хранимая процедура sp_RetrieveProducts использует команду SQL SELECT (см. листинг 13.15).
Листинг 13.15. Хранимая процедура sp_RetrieveProducts
CREATE PROCEDURE sp_RetrieveProducts AS
select * from products
Переходим к созданию новых связей. В листинге 13.16 приведен код страницы AddRelation.asp, управляющей этим процессом. Идентификатор исходного товара и того, который с ним связывается, а также идентификатор типа связи эта страница получает из присланной формы.
Для сохранения в базе данных информации о новой связи вызывается хранимая процедура sp_InsertProductRelation. После вызова процедуры пользователь направляется на страницу ManageProduct.asp для продолжения редактирования.
Листинг 13.16. AddRelation.asp
<%@ Language=VBScript %>
<%
' Создать объект подключения к базе данных
set dbProdRelation = server.createobject("adodb.connection")
' Создать объект набора записей
set rsProdRelation = server.CreateObject("adodb.recordset")
' Открыть подключение, используя файловый DSN ODBC
dbProdRelation.open("filedsn=WildWillieCDs")
' Построить команду вызова хранимой процедуры для
' сохранения связи в таблице RelatedProducts.
sql = "execute sp_InsertProductRelation " & _
request("idProductA") & ", " & _
request("idProductB") & ", " & _
request("RelationType")
' Выполнить команду SQL
set rsProdRelation = dbProdRelation.Execute(sql)
Response.Redirect "ManageProduct.asp?idProduct=" & _
request("idProductA")
%>
SQL-код создания связей между товарами, рассмотренный в начале этой главы, был инкапсулирован в хранимой процедуре sp_InsertProductRelation. При вызове ей передаются идентификаторы обоих товаров и тип связи между ними (см. листинг 13.17).
Листинг 13.17. Хранимая процедура sp_InsertProductRelation
CREATE PROCEDURE sp_InsertProductRelation
@idProductA int,
@idProductB int,
@RelationType int
AS
insert into RelatedProducts(idProductA, idProductB, idRelationType)
values(@idProductA, @idProductB, @RelationType)
Перейдем к рассмотрению страницы DeleteRelation.asp (см. листинг 13.18), предназначенной для удаления существующих связей. Идентификатор удаляемой связи передается в URL.
Для удаления связи используется хранимая процедура sp_DeleteProductRelation. После удаления пользователь направляется на страницу ManageProduct.asp для продолжения редактирования.
Листинг 13.18. DeleteRelated.asp
<%@ Language=VBScript %>
<%
' Создать объект подключения к базе данных
set dbDelProdRelation = server.createobject("adodb.connection")
' Создать объект набора записей
set rsDelProdRelation = server.CreateObject("adodb.recordset")
' Открыть подключение, используя файловый DSN ODBC
dbDelProdRelation.open("filedsn=WildWillieCDs")
' Построить команду вызова хранимой процедуры
' для удаления связи из базы данных.
sql = "execute sp_DeleteProductRelation " & _
request("idRelatedProduct")
' Выполнить команду SQL
set rsDelProdRelation = dbDelProdRelation.Execute(sql)
' Направить пользователя на страницу ManageProduct.asp
Response.Redirect "ManageProduct.asp?idProduct=" & _
request("idProduct")
%>
Последний фрагмент кода, описанный в этой главе, представлен в листинге 13.19. Хранимая процедура sp_DeleteProductRelation удаляет из базы данных запись об указанной связи.
Листинг 13.19. Хранимая процедура sp_DeleteProductRelation
CREATE PROCEDURE sp_DeleteProductRelation
@idRelatedProduct int
AS
delete from RelatedProducts where
idRelatedProduct = @idRelatedProduct
Настало время проверить интерфейс управления в действии. Список связанных товаров для товара Circle Sax. Обратите внимание на наличие двух связей.

Итоги
На этом завершается наше знакомство с горизонтальными и вертикальными связями - двумя основными маркетинговыми элементами, предназначенными для демонстрации товаров, которые могут заинтересовать покупателя. Существуют и другие варианты реализации пользовательского интерфейса и интерфейса управления, здесь же представлена лишь базовая модель, на основе которой можно построить все необходимые функции.
В следующей главе мы познакомимся с тем, как организовать вывод рекламы товаров в нашем магазине. При этом будут рассмотрены некоторые дополнительные средства, привлекающие внимание покупателя к определенным товарам.

 

 
На главную | Содержание | < Назад....Вперёд >
С вопросами и предложениями можно обращаться по nicivas@bk.ru. 2013 г. Яндекс.Метрика