Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Высокоуровневые методы программирования..pdf
Скачиваний:
8
Добавлен:
15.11.2022
Размер:
10.32 Mб
Скачать

ЛАБОРАТОРНАЯ РАБОТА № 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,