Книга: Windows Script Host для Windows 2000/XP

Фильтрация записей в таблице 

закрыть рекламу

Фильтрация записей в таблице 

Оператор SELECT позволяет выбирать из источника данных не все записи, а лишь те, которые удовлетворяют определенному критерию. Для этой цели в операторе SELECT применяется оператор WHERE. Например, следующий SQL-запрос

SELECT * FROM Phone WHERE (LastName LIKE 'П%')

вернет только те записи таблицы Phone, у которых значение поля LastName начинается на букву 'П' (шаблон '%' означает любое число любых символов).

Мы напишем сценарий FilterRecords.wsf, в котором можно ввести в диалоговом окне один или несколько символов (рис. 9.14) и получить список людей, фамилии которых начинаются с этих символов (рис. 9.15).


Рис. 9.14. Ввод первых символов фамилии для фильтрации записей


Рис. 9.15. Отфильтрованные в сценарии FilterRecords.wsf записи

Как и в сценарии SortRecords.wsf, символы в диалоговом окне вводятся с помощью VBScript-функции WSHInputBox():

//Выводим диалоговое окно для ввода первой буквы фамилии
Res=WSHInputBox("Введите первые буквы фамилии", "Работа с базой данных");

После этого формируется строка с нужным SQL-запросом (переменная SSource) и строка с параметрами соединения с базой данных (переменная SConnect):

//Формируем шаблон, по которому будет производиться фильтрация
SFilt="'"+Res+"%'";
//Формируем SQL-запрос к таблице Phone
SSource = "SELECT * FROM Phone WHERE (LastName LIKE "+SFilt+")";
//Формируем строку с параметрами соединения с БД
//(указываем нужный DSN)
SConnect = "DSN=PhoneDS";

Создав объект Recordset (переменная RS), мы присваиваем значение 3 свойству CursorType (это позволит узнать количество записей в наборе RS после выполнения SQL-запроса):

//Создаем объект Recordset

RS=WScript.CreateObject("ADODB.Recordset");
//Задаем статический курсор
RS.CursorType = 3;
//Открываем набор записей - результат запроса
RS.Open(SSource, SConnect);
//Определяем число записей в наборе
RS_NomRecs = RS.RecordCount;

Если в наборе RS не окажется ни одной записи (нет фамилий, начинающихся на нужные символы), то будет выведено соответствующее сообщение и произойдет выход из сценария:

if (NomRecs==0) {
 WScript.Echo("В таблице Phone нет ни одной фамилии, начинающейся на '"+Res+"'");
 WScript.Quit();
}

Если же подходящие записи найдены, то они, как обычно, обрабатываются в цикле for. В результате формируется строка SOut со значениями полей LastName, Name и Phone для этих записей:

SOut="ВСЕГО "+NomRecs+" ЗАПИСЕЙ, НАЧИНАЮЩИХСЯ НА '"+Res+"':n";
//Перебираем все записи набора данных RS
while (!RS.EOF) {
 //Формируем строку со значениями трех полей, которые разделены
 //символами табуляции
 s=RS.Fields("LastName")+"t"+RS.Fields("Name")+"t"+ RS.Fields("Phone");
 //В конце строки ставим символ перевода строки
 s+="n";
 //Добавляем сформированную строку к переменной SOut
 SOut+=s;
 //Переходим к следующей записи
 RS.MoveNext();
}

В конце сценария объект Recordset закрывается, а строка SOut выводится на экран:

//Закрываем объект Recordset
RS.Close();
//Выводим на экран строку SOut
WScript.Echo(SOut);

Полностью текст сценария FilterRecords.wsf приведен в листинге 9.6.

Листинг 9.6. Фильтрация записей в таблице

<job>
<runtime>
<description>
Имя: FilterRecords.wsf
Описание: Фильтрация записей таблицы Phone по первому символу
          фамилии
</description>
</runtime>
<script language="VBScript">
'Функция для реализации диалогового окна со строкой ввода
'в сценариях JScript
Function WSHInputBox(Message,Title)
'Выводим диалоговое окно со строкой ввода
WSHInputBox = InputBox(Message,Title)
End Function
</script>
<script language="JScript">
//Объявляем переменные
var
 RS,       //Экземпляр объекта Recordset
 SSource,  //Текст SQL-запроса к БД
 SConnect, //Строка с параметрами соединения с БД
 SOut,     //Строка, в которой сохраняется выходная информация
 Res,      //Результат ввода в диалоговом окне
 SFilt,    //Шаблон, по которому будет производиться фильтрация
 NomRecs,  //Количество записей в отфильтрованном наборе
 s;
//Выводим диалоговое окно для ввода первой буквы фамилии
Res=WSHInputBox("Введите первые буквы фамилии","Работа с базой данных");
//Формируем шаблон, по которому будет производиться фильтрация
SFilt="'"+Res+"%'";
//Формируем SQL-запрос к таблице Phone
SSource = "SELECT * FROM Phone WHERE (LastName LIKE "+SFilt+")";
//Формируем строку с параметрами соединения с БД
//(указываем нужный DSN)
SConnect = "DSN=PhoneDS";
//Создаем объект Recordset
RS=WScript.CreateObject("ADODB.Recordset");
//Задаем статический курсор
RS.CursorType = 3;
//Открываем набор записей-результат запроса
RS.Open(SSource,SConnect);
//Определяем число записей в наборе RS
NomRecs = RS.RecordCount;
if (NomRecs==0) {
 WScript.Echo("В таблице Phone нет ни одной фамилии, начинающейся на '" + Res+"'");
 WScript.Quit();
}
SOut="ВСЕГО "+NomRecs+" ЗАПИСЕЙ, НАЧИНАЮЩИХСЯ НА '"+Res+"':n";
//Перебираем все записи набора данных RS
while (!RS.EOF) {
 //Формируем строку со значениями трех полей, которые разделены
 //символами табуляции
 s=RS.Fields("LastName")+"t"+RS.Fields("Name")+"t"+RS.Fields("Phone");
 //В конце строки ставим символ перевода строки
 s+="n";
 //Добавляем сформированную строку к переменной SOut
 SOut+=s;
 //Переходим к следующей записи
 RS.MoveNext();
}
//Закрываем объект Recordset
RS.Close();
//Выводим на экран строку SOut
WScript.Echo(SOut);
</script>
</job>

Оглавление книги


Генерация: 1.239. Запросов К БД/Cache: 4 / 1
поделиться
Вверх Вниз