
В предыдущем рассказе я упомянул о двух микроскопических задачках, про одну я рассказал. Теперь очередь рассказать о решении второй.
На производстве обратился ко мне руководитель производства и попросил внести небольшое изменение в генерируемый отчет за период: дополнить список опций опцией реальных поставщиков, так как опция "ВСЕ ПОСТАВЩИКИ" включает в себя и заводские пересортировки.
Первым делом посмотрел соответсвующий код (JSscript):
<td valign=top>
<select onchange="location.href='scripts/chvar.asp?page=default.asp&name1=SupplierID&val1='+value">
<option value="0">ВСЕ ПОСТАВЩИКИ</option>
<%
var flExists=0;
while(!rs.eof)
{
%>
<option value="<%=rs("SupplierID")%>"<%if(parseInt(rs("SupplierID"))==parseInt(Session("SupplierID"))){ flExists=1;%> selected<%}%>><%=String(rs("SupplierName"))%></option>
<%
rs.MoveNext();
}
if((flExists==0)&&(Session("SupplierID")!=0))
{
Session("SupplierID")=0;
%>
<SCRIPT LANGUAGE="JavaScript">
document.location="scripts/chvar.asp?page=default.asp&name1=SupplierID&val1=0";
</SCRIPT>
<%
}
%>
</select>
</td>
Вроде как все понятно: необходимая опция выбирается из списка. В списке первая опция обьявляется явно, остальные читаются циклом while из базы данных (из рекордсета). Очевидным, но неработающим, решением казалось просто добавить еще одну явно обьявленную опцию, определить для нее некоторое уникальное значение, которое позже выловлю и обработаю. Но ничего не получилось.
Внимательно просмотрев код я обратил внимание на то, что выбор опции сопровождается перезагрузкой страницы (1) и значение SupplierID записывается в перемеменные сессии (2).
В результате раздумий родилось такое решение:
<td valign=top>
<select onchange="location.href='scripts/chvar.asp?page=default.asp&name1=SupplierID&val1='+value">
<option value="0">ВСЕ ПОСТАВЩИКИ</option>
<%
var flExists=0; // Очень важен порядок строк !
%>
<option value="1000000"<%if(Session("SupplierID")==1000000){%> selected<%}%><%Session("SupplierID")=1000000;flExists=1;%>>Все, без пересортировок</option>
<%
while(!rs.eof)
{
%>
<option value="<%=rs("SupplierID")%>"<%if(parseInt(rs("SupplierID"))==parseInt(Session("SupplierID"))){ flExists=1;%> selected<%}%>><%=String(rs("SupplierName"))%></option>
<%
rs.MoveNext();
}
if((flExists==0)&&(Session("SupplierID")!=0))
{
Session("SupplierID")=0;
%>
<SCRIPT LANGUAGE="JavaScript">
document.location="scripts/chvar.asp?page=default.asp&name1=SupplierID&val1=0";
</SCRIPT>
<%
}
%>
</select>
</td>
То, как отлавливаю и обрабатываю выбор добавленной опции тривиально и интереса для этого изложения не представляет.
Простая задачка оказалась отнюдь не простой.
Зато приобрел опыт работы с сессиями