- •СОДЕРЖАНИЕ
- •1.1. Эволюция технологии программирования
- •1.2. Сущность технологии объектно-ориентированного программирования
- •1.3. Использование объектных моделей при организации удаленных соединений
- •2.1. Классификация объектов БД
- •2.2. Свойства и особенности элементов языка
- •2.3. Создание и удаление баз данных
- •2.4. Создание и модификация таблиц баз данных
- •ЛЕКЦИЯ 3.
- •РАБОТА С ДАННЫМИ В ЯЗЫКЕ TRANSACT-SQL
- •3.2. Создание
- •3.3. Команды манипуляции данными
- •4.1. Стандарты синтаксиса Transact-SQL
- •4.3. Курсоры
- •5.1. Разграничение прав доступа
- •5.3. Пользователи
- •5.6. Командные манипуляции с БД
- •5.7. Связанные и удаленные серверы
- •СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТУРЫ
- •ЛАБОРАТОРНАЯ РАБОТА № 3. ГЕНЕРИРОВАНИЕ ОТЧЕТОВ
- •ЛАБОРАТОРНАЯ РАБОТА № 4. УДАЛЕННОЕ СОЕДИНЕНИЕ С БД INTERBASE НА ОСНОВЕ BDE
- •ЛАБОРАТОРНАЯ РАБОТА № 5. РАБОТА С КОМПОНЕНТАМИ MICROSOFT SQL SERVER
- •САМОСТОЯТЕЛЬНАЯ РАБОТА:
- •ЛАБОРАТОРНАЯ РАБОТА № 6. КОМАНДЫ СОЗДАНИЯ, МОДИФИКАЦИИ И УДАЛЕНИЯ ТАБЛИЦ
ЛАБОРАТОРНАЯ РАБОТА № 6. КОМАНДЫ СОЗДАНИЯ, МОДИФИКАЦИИ И УДАЛЕНИЯ ТАБЛИЦ
Задание:
Доработайте схему БД предыдущего занятия в соответствии с новыми требованиями заказчика. Для этого создайте два SQL-скрипта (файлы с расши рением *.sql). Первый скрипт будет формировать структуру БД, а второй - за носить в БД тестовую информацию.
Учтите, что заказчиком были сформулированы новые требования:
1.Каждому работнику необходимо начислять заработную плату. Для этого необходимо иметь в БД соответствующие таблицы для хранения данных (год, месяц, сумма).
2.Начисление заработной платы следует выполнять на основе данных
опроизведенных в течение месяца работником деталях по формуле: (Объем - Брак) • Стоимость - 0,425 - 0,225-Брак-Стоимость. Настоятельно рекомендуется создать на рабочем диске компьютера соот
ветствующую папку, в которую будут помещены все необходимые файлы. На зовите папку SQL_2. В этой папке и будут созданы файлы БД. Здесь же следует разместить оба файла SQL-скриптов. Рекомендуется назвать их DBCreate.sql и DB_Data.sql.
Перед выполнением творческой части работы следует последовательно выполнить первые 13 пунктов обязательного задания. Только после этого можно приступать к самостоятельной работе. Для успешного выполнения работы потребуется наличие в вашей папке документа формата Microsoft Excel. Файл называется TableExcel.xls и находится в соответствующем раз деле сайта http://dit.perm .ru. Скопируйте этот архив и распакуйте документ.
Порядокработы:
1. Запустите Microsoft SQL Server 7.0 и убедитесь, что индикатор службы MSSQLServer появился на панели задач. Запустите En terprise Manager. Если созданная на предыдущем занятии БД db_lab5 присутствует в списке баз данных сервера, то удалите ее.
2.Создайте новую БД db_lab6_test, которая размещается в папке текущего занятия. В случае необходимости увеличения размера файла новая БД будет получать приращение с шагом в 2 Мб (по умолчанию размер файла БД увеличивается на 10 % от ее текущего объема). LOG-файл
БД. хранящий историю транзакций, будет находиться в этой же папке. Для этого на главной закладке окна General укажите имя БД нажмите кнопку «...» в разделе Location и укажите путь к папке занятия. В нижней части
окна укажите величину приращения основного файла БД установив 2 Мб. Перейдите на закладку Transaction Log и проделайте то же самое.
Самостоятельно напишите запрос, отвечающий на вопрос, каким коли чеством предметов обладает каждый человек. Далее в таблицу рабочих мест занесите данные вида:
-Иванов - нигде не работает (нет записей);
-Петров —грузчик на ОАО «Удача» и ночной сторож на автостоянке;
-Сидоров - пенсионер.
Попытайтесь написать запрос, который вернет данные о количестве мест работы наших граждан в следующем виде:
Иванов |
0 н |
Такое соответствие возможно |
|
Петров |
|||
2 |
только с директивой LEFT JOIN |
||
Сидоров |
1 |
|
Удалите имущество гражданина Петрова:
DELETE FROM t_predmet WHERE name LIKE '%Лошадь%';
8. Манипулировать с запросами достаточно неудобно. Поэтому создадим представление, которое собирает информацию о местах работы граждан.
CREATE VIEW V_1 AS
SELECT t_person.fio, t_workplace.workplace FROM t_person, t_workplace
WHERE (t_person.id = t_workplace.person_id)
Оцените содержимое представления и создайте его аналог с помощью ди рективы INNER JOIN:
CREATE VIEW V_2 AS
SELECT t_person.fio, t_workplace.workplace FROM t_person INNER JOIN
t_workplace ON t_person.id = t_workplace.person_id
В ряде случаев такое представление информации неудобно, так как следу ет показывать все данные (в том числе записи, на которые отсутствуют ссыл ки). В этом случае не обойтись без LEFT JOIN:
CREATE VIEW V_3 AS
SELECT t_person.fio, t_workplace.workplace FROM t_person
LEFT JOIN t_workplace ON t_person.id = t_workplace.person_id
Сравните полученный результат. И удалите второе представление.
DROP VIEW V_2;
Переключитесь к программе Enterprise Manager. Обратите внимание, что двойной щелчок мышью по имени представления открывает скрипт объекта, а двойной щелчок по имени таблицы распахивает окно с ее структурой. Убе дитесь в этом. Оцените структуру созданных объектов в пункте контекстно
го меню Design View. Далее в режиме визуальной разработки создайте новое представление V_4, которое объединяет данные из V I и T_Predmet. Если не обходимое связующее поле отсутствует, то визуально доработайте представле ние V_1.
9.Добавим ктаблице T_Personновый столбец,в котором будемнакапливать количество изменений мест работы.
ALTER TABLE t_person ADD ttt INTEGER DEFAULT 0;
Проверим содержимое таблицы работников:
SELECT * FROM t_person;
И занесем туда новую строку:
INSERT INTO t_person (fio) VALUES (‘Смирнов’);
Значение по умолчанию заносится только при вставке новых записей. По этому NULL значения в столбце ТТТ следует заменить на нули.
UPDATE t_person SET ttt=0 WHERE lsNull(ttt,1)=1; — = = i либо “ttt is null” |
10.Разработчик должен уверенно выполнять и визуальную разработку объектов БД. К таким объектам относятся не только информационные объекты, но и пользовательские типы данных, правила и умолчания. В режиме визуальной разработки создайте тип TypeDoc, основанный на стандартном типе varchar(20).
Конечно, все это можно выполнить и из командной строки:
EXEC sp_addtype N’TypeDoc’, N’varchar (20)’, N'nulP
11. Далее создайте умолчание DefDoc со значением «№». х>;
[ ] |
|°«® |
Строковые константы |
М* |
[№ |
набираются в одиночных |
|
|
апострофах. Числа заносятся |
|
|
обычным образом |
|
OK ( СапаI |
На* |
Создание этого же самого умолчания в командной строке SQL: CREATE DEFAULT [DefDoc] AS “№’
12.Самостоятельно разработайте правило RuleDoc, любое значение которого начинается с символа «№». Добавьте в таблицу T_Person поле MyDoc с соответствующим типом, правилом и умолчанием. Подключите эти элементы в нужном порядке. Затем визуально убедитесь, что в таблицу нельзя внести некорректные данные.
13.Часто в практике данные уже имеются в файлах другого формата, и их нужно импортировать в БД. Выполним это действие по
отношению к файлу TableExcelxls (предварительно ознакомьтесь с его содержимым).
В контекстном меню БД выберите пункт All Tasks—►Import Data.
а) В «source» укажите «Microsoft Excel 8.0» и внесите имя файла; б) Укажите вашу БД под авторизацией Windows NT;
в) Выберете режим Use a query и постройте запрос Query Builder,
г) выберете столбцы документа Company, Country и Email с сортировкой по названию компании. Затем укажите «все строки». Назовите новую таблицу T lm port (иначе она будет названа по умолчанию Results).
д) Убедитесь, что импортирование выполнено корректно. 14. Выполните самостоятельную работу.
Крупнин |
мастер |
4500 |
руб |
8431 |
R |
Кувалдина |
рабочий |
3500 |
руб |
8487 |
О |
Зубов |
рабочий |
3500 |
руб |
8423 |
R |
Тулева |
техничка |
1600 |
руб |
8441 |
R |
Шмаков |
рабочий |
3500 руб |
8452 |
R |
4.Создайте хранимую процедуру pJSelectAll, которая возвращает всю информацию из трех связанных таблиц (без расшифровки). Входных параметров у процедуры нет. Убедитесь в работоспособности процедуры.
CREATE procedure p_select_all as
SELECT T_worker.fio, T_worker.propusk, T_worker.oklad, T_worker.status, T_otdel.name, T_otdel.kolvo_worker, T_dol.name
FROM T_worker,T_otdel, T_dol
where T_otdel.id=T_worker.otdel_id and T_dol.id=T_worker.dolJd -exec p_select_all
5.Создайте хранимую процедуру p_Select_Worker, которая возвращает список фамилий и пропусков всех работников, у которых статус совпадает со значением входного параметра процедуры @status.
CREATE procedure p_select_worker @status varchar(2) as SELECTT_worker.fio,T_worker.propusk
FROM T_worker
where T_worker.status=@status -exec p_select_worker @status=’R’
6.Выполните вызов процедуру, не указав значение параметра. Убедитесь, что возникла ошибочная ситуация. Вызовите процедуру с параметром, который позволяет ей выбрать всех находящихся в отпуске работников.
7.Создайте новую хранимую процедуру p Modify (без входного
параметра), которая возвращает список фамилий работников в следующем виде:
ФИО заканчивается на «а» - выводятся в верхнем регистре;
получают меньше 2000 - к фамилии приклеивается «(мало)»; в пропуске содержится «-» - выдается слово «временный».
Разумеется, сами данные в физических таблицах не изменяются. Все промежуточные преобразования происходятво временной таблице.
CREATE procedure pjnodify as Begin
select fio into #temp_1 from t_worker where fio like *%a” select fio into #temp_2 from t_workerwhere oMad<2O0C select fio into #temp_3 from t_worker where propusk Bie *%-%' update #temp_2 set fio=fio+’ мало5
update #temp_1 set fio=UPPER(fio) update #temp_3 set fio=fio+’ временный’
-insert into #temp_1 (fam) select fam from #temp_2 -insert into #temp_1 (fam) select fam from #temp_3 select * from #temp_1
select * from #temp_2 select * from #temp_3 end
-exec p_modify
8. Создайте процедуру p_Otdel_Stat, которая выдает информацию в виде: отдел, работников (триггер), работников (фактически).
CREATE procedure t_otdel_stat as
select T_otdel.name,T_otdel.kolvo_worker as ‘Всего’, count(t_worker.id) as ‘Фактически’
from t_otdel,T_worker
where T_otdel.id=T_worker.otdelJd
group by T_otdel.name,T_otdel.kolvo_worker
Самостоятельно создайте новую процедуру plnsert, которая обеспечит расчет заработной платы каждого работника с занесением данных в соответс твующие таблицы базы данных BD work
Задание:
Выполните все пункты обязательного задания. Полученные навыки при мените для дальнейшего усовершенствования функциональной структуры ва шей БД.
Работу производите только в соответствующей папке на рабочем диске компьютера.
Порядокработы:
1. Откройте созданную на занятии № 7 БД db_lab7_test.
2. Следующая важнейшая проблема хранения данных связана с каскадными удалениями. Создадим триггер, отвечающий за каскадное удаление рабочих мест граждан.
CREATE TRIGGER tr_del_person |
Еще в триггерах ис |
ON t_person |
пользуются объект: |
FOR DELETE |
INSERTED |
|
|
AS |
|
DELETE FROM t_workplace |
|
WHERE personJd IN (SELECT id FROM DELETED); |
|
Последовательно выполните команды: |
|
SELECT* FROM t_person; |
|
SELECT* FROM t_workplace; |
|
Попытайтесь выполнить: |
|
DELETE FROM t.person WHERE fio LIKE 'П%'; |
|
Это сделать по очевидным причинам не удалось. Поэтому самостоятель но удалите связанные с Петровым записи в таблице имущества. После этого выполните команду:
DELETE FROM t_person WHERE fio LIKE ‘П%’;
Убедитесь, что оба рабочих места Петрова были автоматически удалены триггером. Выполните команду:
SELECT* FROM t.workplace;
Переключитесь к программе Enterprise Manager. В контекстном меню таб лицы T_Person выберите пункт All Tasks—> Manage Triggers.
Убедитесь, что у других таблиц триггеры отсутствуют. Закройте и удалите созданный ранее триггер командой SQL:
DROP TRIGGER tr_del_person;
В режиме визуальной разработки самостоятельно создайте аналогичный триггер, который удаляет данные в таблице имущества. После создания триг гера попытайтесь удалить данные об Иванове.
SELECT* FROM Lperson;
5.Откройте созданную на занятии № 7 БД db_lab7.
6.Ввиду того, что целостность данных будет контролироваться с помощью триггеров, в режиме визуальной разработки удалите все ограничения ссылочной целостности (связи надиаграмме). Создайте все необходимые триггеры (для каскадных удалений и всех возможных ситуаций автоматического обновления поля kolvo worker в таблице отделов). Поскольку данные были вставлены до создания триггеров, вручную заполните поле, характеризующее количество работников в отделах.
Create Trigger tr_del_otdel On t_otdel for delete as
Delete from T_worker
where otdeljd IN(select id from deleted) Create Trigger tr_del_dol On t_dol
for delete as
Delete from T_worker
where doljd IN(select id from deleted)
Create Trigger TR_update_Worker On t_worker For Update
As
declare @x decimal(18,0),@y decimal(18,0)
select @x=l.otdel_id from T_worker A,Inserted I where A.id=l.id select @y=D.otdel_id from T_worker B,Deleted D where B.id=D.id if exists(select * from T_otdel where id=@x)
begin
Update T_otdel set kolvo_worker=kolvo_worker+1 where id=@x Update T_otdel set kolvo_worker=kolvo_worker-1 where id=@y end
else begin
Rollback tran
Print ‘Нарушение целостности’ end
Create Trigger TR_lnsert_Worker
On t_worker
For Insert
As
declare @x decimai(18,0),@Y decimal(18,0)
select @x=l.otdel_id from T_worker A,Inserted I where A.id=l.id select @y=ll.dol_id from T_worker B,Inserted II where B.id=ll.id
if exists(select * from T_otdel where id=@x) and exists(select * from T_dol where id=@y)
begin
Update T_otdel set kolvo_worker=kolvo_worker+1 where id=@x end
else begin
Rollback tran
Print ‘Нарушение целостности’ -e n d
Для проверки корректности работы триггеров, добавьте в бухгалтерию нового работника, используя соответствующую хранимую процедуру:
Ложкина |
бухгалтер |
4000 руб |
8325 |
R |
Проверьте работоспособность всех триггеров, при обновляя значений внешнего ключа otdel_id.
7. Примените полученные в этой работе навыки в творческом задании.
Задание:
Для корректного и квалифицированного выполнения самостоятельной работы предварительно выполните все 12 пунктов обязательного задания.
На этой работе вы будете манипулировать с правами доступа не только к объектам БД, но и к самому серверу. Будьте предельно аккуратны и осторож ны. В противном случае вы можете вывести из строя не только ваш локальный SQL Server, но и удаленный сервер БД, на котором работают ваши коллеги.
Порядокработы:
1.Убедитесь, что на компьютере запущен Microsoft SQL Server. Затем
вEnterprise Manager откройте раздел сервера Security:
£] Security
Logins |
|
Пользователи |
|
_ |
r Роли пользователей (на сервере) |
||
Server Roles |
|||
|
|
||
!±1"Ии Linked Servers- |
|
Связанные серверы (другой тип) |
|
Rem ote Server |
|
Удаленные серверы (Microsoft SQL) |
Внимательно изучите содержимое всех этих разделов.
2.Создайте новую БД, назвав ее DB_lab9. В ней создайте таблицу Т1, состоящую из двух полей - id и fio. Занесите в нее три произвольные фамилии.
Запустите Query Analyzer и, подключившись к DB_lab9 под авторизацией Windows NT, убедитесь, что выборка из таблицы выполняется. Все это проис ходит под правами администратора сервера. Далее изучите содержимое разде лов Users и Roles вашей БД:
U s e r s /"
Roles
В списке пользователей должен быть только dbo. Всего в списке 10 ролей. Из них в две относятся к dbo. Найдите эти две роли
Двойной щелчок по роли отображает на экране список включенных в нее пользователей и групп пользователей.
Кнопка Permissions позволяет указать режим доступа к объектам БД
Г Кнопка Add позволяет присоединить к роли нового J пользователя БД или новую группу
Еще раз выполните команду вставки новой записи. Убедитесь, что она выполнилась успешно. Самостоятельно наделите пользователя user_boss воз можностью обновлять данные. Выполните команду:
update t1 set fio-пусто’ where (id=1)
А сейчас запретите группе public выполнять обновление данных в Т1 Учтите, что имеется трехзначная логика: 2 - разрешить, □ - н е указано,
К - запретить. Еще раз выполните команду обновления. Можно сделать вы вод: запрет доступа к объектам имеет максимальный приоритет.
6. А сейчас попытайтесь выполнить команду (для user_boss): create table t2 (name varchar(20))
Это сделать не удалось, так как роль public вообще не предусматривает возможность создания своих объектов БД (она не позволяет владеть какимилибо объектами). Значит, userboss нужно добавить к другой, более функцио нальной роли. Для этого откройте свойства роли dbow ner и добавьте к этой роли пользователя user_boss. Убедитесь, что команда создания таблицы выпол нилась. С помощью команд SQL занесите в Т2 слова «первый» и «второй».
Переключитесь к Enterprise Manager и убедитесь, что такая таблица создана (обратите внимание на ее владельца) и заполнена данными. А сейчас предпо ложим, что пользователю user_boss более не нужно давать возможность записи в БД какой-либо информации. Для этого рационально добавить нашего пользо вателя к роли db denydatawriter. Выполните это самостоятельно.
Попытайтесь занести в Т2 слово «третий». Это сделать не удалось, но вы борка данных и создание объектов для user_boss все еще возможны.
7.В Query Analyzer создайте еще одно подключение (под авторизацией Windows NT), в котором выполните команду:
select * from t2
Это сделать не получилось, хотя команда выполняется администратором. Дело в том, что Т2 создана пользователем user boss и находится в его схеме. Команда должна выглядеть так:
select * from user_boss.t2
Чтобы в дальнейшем эта проблема не становилась очень актуальной, со здание объектов БД лучше производить в схеме dbo. Например, выполните для user boss команду:
create table dbo.t3 (name varchar(20))
В этом случае другие пользователи смогут не писать имя схемы, а обращаться к объекту только по его названию:
select * from t3
Совершенно аналогичным образом можно манипулировать с правами доступа и именами других объектов БД. Учтите, что удаление пользователя из БД возможно только после удаления всех объектов, владельцем которых он является.
Если это невозможно, следуетизменить права владения объектом и удалить ненужную учетную запись. Для командной установки привилегий доступа
кобъектам используются директивы GRANT и REVOKE.
8.Предположим, что в нашей БД имеется очень ценная информация, потеря которой недопустима. Создадим полную резервную копию БД. Для этого активизируйте имя вашей БД и выберите ссылку создания Backup. Убедитесь, что выбрана нужная БД, отмечен переключатель Database - complete (БД полностью). Кнопкой Add укажите файл, в который будет происходить резервное копирование БД (рекомендуется назвать его MyBackup и расположить в вашей папке). Обратите внимание, что существует возможность добавления в один файл нескольких резервных копий БД (Append) или резервное копирование с перезаписью (Owerwrite).
Пункт Schedule позволит в случае необходимости создать расписание автоматического резервного копирования БД. Нажмите ОК и выполните со здание резервной копии.
9.Удалите из БД все таблицы, созданные user_boss и восстановите по резервной копии содержимое вашей БД. Для этого нужно выделить имя БД и активизировать ссылку восстановления по резервной копии.
10.Выполните создание DTS пакета, преобразующего уже известный вам документ TableExcel.xls в таблицу NewTable. На этот раз следует на одном из последних шагов построения пакета не просто выполнить его, а сохранить в БД с названием MyDTSl.
Г \ D ata Transformation |
Убедитесь, что пакет можно выполнить |
■Щ Local Package |
многократно, так как его описание хранится |
|
на сервере |
Откройте DTS-пакет и изучите его компоненты.
11. В некоторых случаях требуется выполнять манипуляции с БД на других (удаленных) серверах Microsoft SQL Server. Для этого
врабочей группе серверов нужно зарегистрировать новый. Выберите
вконтекстном меню элемента SQLServerGroup nyHicrNew SQL Server Registration. Далее выберите любой удаленный сервер БД и укажите авторизацию Windows NT (в реальных проектах используется авторизация SQL Server). Создайте на удаленном сервере свою БД. Ее название сформируйте на основе: NEW_DB_JIK (где ПК - это номер вашего компьютера в классе).
Поработайте с этой БД и под бдительным наблюдением вашего колле ги, работающего на удаленном сервере, удалите ее.
12. Присоединение и отсоединение БД |
от сервера (выполните |
это!) следует производить с помощью |
специальных директив. |
Разблокирование (отключение БД от сервера) происходит директивой
sp_detach_db @dbname = ‘DB_lab4’
После переноса файлов БД на другой компьютер (или носитель) следует подключить сервер к новому источнику данных:
sp_attach_db @dbname = ‘DBJab4\ @filename1 = ‘D:\DBJab4_Data.MDF
Самостоятельно выполните перенос БД на другой диск.
13. Приступайте к творческому заданию, получив его от преподавателя.
Программный код формы Frm jpodrazd Private s_Act As String
Private Sub cmd_Act_Click() Dim par_setAs String
Dim par_whereAs String DataLPodraz.Enabled = True frame_Act.Visible = False CmdJns.Enabled = True Cmd_upd.Enabled = True par_set = Trim(txt_Act.Text) If s_Act <> “0" Then par_where = Trim(s_Act)
MyDataEnvir.CmdPodrllp par_set, par_where Else
MyDataEnvir.Cmd_Podrls par_set End If
With MyDataEnvir
If ,rsCmd_podraz.State = adStateOpen Then
.rsCmd_podraz.Close End If
.Cmd_Podraz End With
DataLPodraz.RowMember = “cmd_podraz” DataLPodraz.DataMember = “cmd_podraz” Set DataLPodraz.DataSource = MyDataEnvir Set DataLPodraz.RowSource = MyDataEnvir End Sub
Private s_Act As String
Private Sub cmd_close_Click() DataLPodraz.Enabled = True frame_Act.Visible = False CmdJns.Enabled = True Cmd_upd.Enabled = True End Sub
Private Sub CmdJns_Click()
DataLPodraz.Enabled = False frame_Act.Visible = True frame_Act.Caption = “Вставка данных”
Программный код формы
Frm rabotnik
Option Explicit
Private s_fio As String
Private Sub Cmd_lns_Click() frame_Act.Visible = True frame_Act.Caption = “Операция вставки” d_dataCombo.Enabled = False cmd_Up.Enabled = False CmdJns.Enabled = False w_DataGrid.Enabled = False TxtJam.Text =
txt_DatR.Text = s_fio =
Frm_rabotnik.Width = 8310 End Sub
Private Sub cmd_Yes_Click()
Dim p_fiox, p_fioxx, p_mrab As String Dim p_datarxAs Date
Dim p_yn As Long frame_Act.Visible = False d_dataCombo.Enabled = True cmd_Up.Enabled = True CmdJns.Enabled = True w_DataGrid.Enabled = True pjnrab = Trim(d_dataCombo.Text) p_fiox = s_fio
p_fioxx = Trim(TxtJam.Text)
p_datarx = CDate(Trim(txt_DatR.Text)) p_yn = 0
If s_fio <> Then
MyDataEnvir.cmd_People_Up pjnrab, p_fiox, _ p_fioxx, p_datarx, p_yn Else
MyDataEnvir.cmd_PeopleJns p_mrab, p_fioxx, p_datarx End If
d_dataCombo_Change Frm_rabotnik.Width = 5145 End Sub
Private Sub Cmd_No_Click() frame_Act.Visible = False d_dataCombo.Enabled = True cmdJJp.Enabled = True CmdJns.Enabled = True w_DataGrid.Enabled = True Frm_rabotnik.Width = 5145 End Sub
Private Sub cmd_Up_Click() frame_Act.Visible = True
frame_Act.Caption = “Операция _ редактирования” d_dataCombo.Enabled = False
cmdJJp.Enabled = False CmdJns.Enabled = False wJDataGrid.Enabled = False Frm_rabotnik.Width = 8310 End Sub
Private Sub d_dataCombo_Change() Dim param As String
param = Trim(d_dataCombo.Text) With MyDataEnvir
if .rsCmd_QRab.State = adStateOpen Then
.rsCmd_QRab.Close End If
.cmd_QRab param
If .rsCmd_QRab.RecordCount <= 0 Then MsgBox “Нет записей”, , “Ошибка!" End If
End With
wJDataGrid.DataMember = “cmd_QRab” Set wJDataGrid.DataSource = MyDataEnvir Call w_DataGrid_RowColChange(0,0) End Sub
Private Sub w_DataGrid_RowCoiChange(LastRow As _ Variant, ByVal LastCol As
Integer)
w_DataGrid.Col = 0
TxtJam.Text = w_DataGrid.Text
s fio = w DataGrid.Text
w_DataGrid.Col = 1 txt_DatR.Text = w_DataGrid.Text w_DataGrid.Col = 0
End Sub
Для обеспечения функционала взаимодействия в рамках соединения сле дует создать команды, показанные ниже:
Команда Cmd_QRab
SELECT T_People.Fam, T_People.Datar, T_People.id FROM T_Podrazd INNER JOIN T_People ON T_Podrazd.id = T_People.id_podrazd WHERE (T_Podrazd.Podrazd = ?)
Команда CmdPeopleUp
(на основе хранимой процедуры dbo.People_Up, которая создается средствами SQL-сервера)
CREATE Procedure PeopleJJp @mrab_x varchar(15),@fio_x varchar(15),@fio_xx varchar(15),@date_x smalldatetime, @Yes_no int Output
As
Declare @id_mrab_x int
Begin
Select @id_mrab_x=t1 .id from dbo.T_podrazd t1 where t1 .Podrazd = @mrab_x
If exists(select * from T_People where fam=@fio_x and id_Podrazd=@id_mrab_x) Begin
Update T_People setfam=@fio_xx, datar=@date_x
where fam= @fio_x and id_Podrazd=@id_mrab_x set @yes_no=0
End
Else
Begin
Set @yes_no=1 End
end GO
Команда cmd_People_Ins
(на основе хранимой процедуры dbo.Peoplelns, которая создается средствами SQL-сервера)
CREATE Procedure Peoplejns @mrab_x varchar(30),@fio_xvarchar(30),@date_x smalldatetime
As
Declare @id_mrab_x int
Begin
Select @id_mrab_x=t1 .id from dbo.T_Podrazd t1 where Upper( tl.Podrazd) Upper(@mrab_x)
If not exists(select * from T_People where fam=@fio_x and id_podrazd=@id_mrab_x) Begin
insert into T_People (fam,datar,id_Podrazd) values(@fio_x,@date_x,@id_mrab_x) end
end GO
4. Сделайте выводы и защитите работу.
w_DataGrid.Enabled = False god_DataCombo.Enabled = False cmdJJpG.Enabled = False CmdJnsG.Enabled = False zp_DataGrid.Enabled = False cmd_UpZ.Enabled = False Cmd_lnsZ.Enabled = False frame_Act.Visible = True
Frm_work.Height = Frm_work.Height + frame_Act.Height + 300 End Sub
Private Sub Undo_x() d_dataCombo.Enabled = True w_DataGrid.Enabled = True god_DataCombo.Enabled = True cmd_UpG.Enabled = True CmdJnsG.Enabled = True zp_DataGrid.Enabled = True cmdJJpZ.Enabled = True CmdJnsZ.Enabled = True frame_Act.Visible = False Cmb_kateg .Visible = True txt_obem.Visible = True txt_brak.Visible = True txt_cena.Visible = True txt_data.Enabled = True
Frm_work.Height = Frm_work.Height - frame_Act.Height - 300 End Sub
Private Sub CmdJnsG_Click() Operation_x
Cmb_kateg .Visible = False txt_obem.Visible = False txt_brak.Visible = False txt_cena.Visible = False txt_data.Enabled = True txt_data.Text =
frame_Act.Caption = “Вставка новой даты” upr_Action = 2
End Sub
Private Sub CmdJnsZ_Click()
Operation_x
Cmb_kateg .Visible = True txt_obem.Visible = True txt_brak.Visible = True txt_cena.Visible = True txt_data.Enabled = False txt_data.Text = god_DataCombo.Text Cmb_kateg!istlndex = 0 txt_brak.Text =
txt_obem.Text = txt_cena.Text =
frame_Act.Caption = “Вставка новых сведений о начислении выработки” upr_Action = 4
End Sub
Private Sub Cmd_No_Click()
Undo_x
End Sub
Private Sub cmd_UpG_Click() Operation_x
Cmb_kateg .Visible = False txt_obem.Visible = False txt_brak.Visible = False txt_cena.Visible = False txt_data.Enabled = True txt_data.Text = god_DataCombo.Text data_x = CDate(Trim(txt_data.Text))
frame_Act.Caption = “Редактирование даты” upr_Action = 1
End Sub
Private Sub cmd_UpZ_Click() Operation_x
Cmb_kateg .Visible = True txt_obem.Visible = True txt_brak.Visible = True txt_cena.Visible = True txt_data.Enabled = False txt_data.Text = god_DataCombo.Text
frame_Act.Caption = “Редактирование данных о дневной выработки"
upr.Action = 3 End Sub
Private Sub cmd_Yes_C!ick()
Undo_x
Dim par_set As Date
par_set = CDate(Trim(txt_data.Text))
Select Case upr_Action
Case 1 To 2
If upr_Action = 1 Then MyDataEnvir.Cmd_Up_Dataw par_set, data_x Else
MyDataEnvir.Cmd_ins_Dataw par_set End If
With MyDataEnvir
If .rsCmd_QDataw.State = adStateOpen Then
.rsCmd_QDataw.Close
End If
.Cmd_Qdataw
End With
god_DataCombo.RowMember = “cmd_Qdataw” god_DataCombo.DataMember = “cmd_Qdataw” Set god_DataCombo.RowSource = MyDataEnvir Set god_DataCombo.DataSource = MyDataEnvir god_DataCombo.Text = par_set
Case 3 To 4
Dim id_xx, id_peoplexxAs Long Dim kategxxAs String
Dim datawxxAs Date
Dim obemxx, brakxx, cenaxxAs Currency id_xx = id.work
id_peoplexx = id_rabotnik datawxx = par_set
obemxx = CDbl(Trim(txt_obem.Text))
brakxx = CDbl(Trim(txt_brak.Text)) cenaxx = CDbl(Trim(txt_cena.Text)) kategxx = Trim(Cmb_kateg.Text)
If upr_Action = 3 Then
MyDataEnvir.cmd_Work_Up id_xx, kategxx, obemxx, brakxx, cenaxx Else
MyDataEnvir.cmd_Work_add id_peoplexx, kategxx, datawxx, obemxx, brakxx, cenaxx
End If god_DataCombo_Change
End Select
End Sub
Private Sub d_dataCombo_Change() Dim param As String
zp_DataGrid.Visible = False param = Trim(d_dataCombo.Text) With MyDataEnvir
If .rsCmd_QRab.State = adStateOpen Then
.rsCmd_QRab.Close End If
.cmd_QRab param
If .rsCmd_QRab.RecordCount <= 0 Then MsgBox “Нет записей”, , “Ошибка!” End If
End With
w_DataGrid.DataMember = “cmd_QRab” Set w_DataGrid.DataSource = MyDataEnvir w_DataGrid_RowColChange 0,0
End Sub
Private Sub Form_Load()
upr_Action = 0
upr_ActionO = 0
End Sub
Private Sub god_DataCombo_Change()
Dim par_god As Date
Dim parjd As Long
If upr_ActionO <> 0 Then zp_DataGrid.Visible = True par_god = god.DataComhfo.Text parjd = id_rabotnik
With MyDataEnvir
If .rsCmd_QWork.State = ftdStateOpen Then
.rsCmd_QWork.Close End If
.cmd_QWork parjd, par_$od
If .rsCmd_QWork.Record(>ount<= 0 Then MsgBox “Нет записей”, , ^Ошибка!” End If
End With
zp_DataGrid.DataMember fc “cmd_QWork” Set zp_DataGrid.DataSourfce = MyDataEnvir
If MyDataEnvir.rsCmd_QWbrk.RecordCount > 0 Then zp_DataGrid_RowColCh^ge 0,0
Else upr_ActionO = 1
wJDataGrid_RowColChan$e 0,0 End If
End Sub
2. Для обеспечения функционала взаимодействия в рамках соединения следует создать команды, показанные ниже:
Команда CmdUjUdataw
Update T_dataw Set dataV=? where dataw=?
Команда Cmd_In£dataw
Insert into T_dataw(dataw) values(?)
Команда CmdWbrkUp
-Parameter Properties-------------- |
|
|||
Name: |
|Param1 |
|
13 |
|
Direction: |
[Input |
|
||
|
|
|||
Data Type: jadD ВTimeStamp |
|
|||
|
|
| |
Size: [o |
|
^ |
Dala |
[Date (V/T_DATE) |
3 |
|
Required |
[Тше |
|
3 |
(на основе хранимой процедуры dbo. Work_Up, которая создается средствами SQL-сервера)
CREATE Procedure workjjp @id_x int,@kategx varchar(15),@obemx money,@ brakx money,@cenax money
As
Declare @id_kategx int
Begin
Select @id_kategx=t1 .id from dbo.T_kateg t1 where t1 .Kateg Like @kategx Update T_work
set id_kateg=@id_kategx, obem=@obemx, brak=@brakx, cena=@cenax
Where id=@id_x end
GO
Команда c m d w o r k a d d
(на основе хранимой процедуры dbo.work_add которая создается средствами SQL-сервера)
CREATE Procedure work_add @id_peoplex int,@kategx varchar(15),@datawx smalldatetime,@obemx money,@brakx money,@cenax_money
As
Declare @id_kategx int, @id_datawx int
Begin
Select @id_kategx=t1 .id from dbo.T_kateg t1 where t1 .Kateg Like @kategx Select @id_datawx=t1 .id from dbo.T_dataw t1 where t1 .dataw= @datawx Insert into t_work(id_kateg ,id_people,id_dataw,obem1brak,cena) values(@id_kategx,@id_peoplex1@id_datawx,@obemx,@brakx,@cenax) end
GO
3. Самостоятельно разработайте форму для расчета в указанном месяце заданного года зарплаты каждому работнику.
w_DataGrid.Visible = False cmd_R.Enabled = True Else
cmd_R.Enabled = False podr_DataGrid.Visible = False peop_DataGrid .Visible = False End If
End Sub
Private Sub cmd_R_Click()
Dim datanxx, datakxxAs Date
If Chk_w.Value = 1 Then
Dim famxxAs String peop_DataGrid .Visible = True famxx = Trim(famx)
datanxx = dn_DataCombo.Text datakxx = dk_DataCombo.Text
If MyDataEnvir.rsCmd_work_people.State = adStateOpen Then MyDataEnvir.rsCmd_work_people.Close
End If
MyDataEnvir.cmd_Work_people famxx, datanxx, datakxx peop_DataGrid.DataMember = “cmd_Work_people"
Set peop_DataGrid.DataSource = MyDataEnvir End If
If Chk_p.Value = 1 Then Dim podrxxAs String
podrxx = Trim(d_dataCombo.Text) podr_DataGrid.Visible = True datanxx = dn_DataCombo.Text datakxx = dk_DataCombo.Text
If MyDataEnvir.rsCmdj/vork_podrazd.State = adStateOpen Then MyDataEnvir.rsCmd_work_podrazd.Close
End If
MyDataEnvir.cmd_Work_podrazd podrxx, datanxx, datakxx peop_DataGrid.DataMember = “cmd_Work_podrazd”
Set podr.DataGrid.DataSource = MyDataEnvir
End If
End Sub
Private Sub Chk_w_Click()
If Chk_w.Value = 1 Then
Chk_p.Value = 0
Lbl_w.Visible = True
w_DataGrid.Visible = True
cmd_R.Enabled = True
Else
Lbl_w.Visible = False
w_DataGrid.Visible = False
cmd_R.Enabled = False
podr_DataGrid .Visible = False
peop_DataGrid .Visible = False
End If
End Sub
Private Sub d_dataCombo_Change()
Dim param As String
param = Trim(d_dataCombo.Text) With MyDataEnvir
If .rsCmd_QRab.State = adStateOpen Then
.rsCmd_QRab.Close End If
.cmd_QRab param
If .rsCmd_QRab.RecordCount <= 0 Then MsgBox “Нет записей”, , “Ошибка!" End If
End With
w_DataGrid.DataMember = “cmd_QRab" Set w_DataGrid.DataSource = MyDataEnvir w_DataGrid_RowColChange 0,0
End Sub
Private Sub w_DataGrid_RowColChange(LastRow As Variant, ByVal LastCol As Integer)
w_DataGrid.Col = 2
id_rabotnik = CLng(w_DataGrid.Text) w_DataGrid.Col = 0
famx = Trim(w_DataGrid.Text) End Sub
2.Для обеспечения функционала взаимодействия в рамках соединения следует создать команды, показанные ниже.
Команда Cmd_work_people
(на основе хранимой процедуры dbo.work_people, которая создается средс твами SQL-сервера)
CREATE PROCEDURE workpeople @famx varchar(15),@datan smalldatetime,@ datak smalldatetime
AS
SELECT p.Fam, k.Kateg, SUM(w.Obem) AS SObem, SUM(w.Brak) AS Sbrak, SUM(w.cena*(w.Obem - w.Brak)) AS Stoim
FROM dbo.T.People p INNER JOIN
dbo.T_work w ON p.id = w.id_people INNER JOIN dbo.T_Kateg k ON w.id_kateg = k.id INNER JOIN dbo.T_Dataw d ON w.id_Dataw = d.id
where p.Fam=@famx and d.dataw>=@datan and d.dataw<=@datak GROUP BY p.Fam, k.Kateg
GO
Команда Cmd_work_podrazd
(на основе хранимой процедуры dbo.work_podrazd, которая создается средс твами SQL-сервера)
CREATE PROCEDURE work_podrazd @podrxvarchar(15),@datan smalldatetime,@ datak smalldatetime
AS
SELECT p.Fam, k.Kateg, SUM(w.Obem) AS SObem, SUM(w.Brak) AS Sbrak, SUM(w.cena*(w.Obem - w.Brak)) AS Stoim
FROM dbo.T_Podrazd pp INNER JOIN
dbo.T_People p ON pp.id =p .id_podrazd INNER JOIN dbo.T_work w ON p.id = w.id_people INNER JOIN dbo.T_Kateg k ON w.id.kateg = k.id INNER JOIN dbo.T_Dataw d ON w.id_Dataw = d.id
where pp.podrazd=@podrx and d.dataw>=@datan and d.dataw<=@datak GROUP BY p.Fam, k.Kateg
GO
3.Самостоятельно разработайте форму для расчета заработной платы каждому работнику за указанный период.
Учебное издание
Косякин Сергей Иванович
ВЫСОКОУРОВНЕВЫЕ МЕТОДЫ ПРОГРАММИРОВАНИЯ
Учебно-методическое пособие
Редактор и корректор Н.А. Московкина
Подписано в печать 19,06.2008. Формат 60x90/16. Уел. печ. л, 9,25, Тираж 300 экз. Заказ № 152/2008.
Издательство Пермского государственного технического университета,
Адрес: 614990, г. Пермь, Комсомольский пр,, 29, к, ИЗ, Тел.: (342) 219-80-33; 219-82-11,