Московский
Государственный Технический Университет им. Н.Э. Баумана
Лабораторная работа №2
по дисциплине
«Разработка КИСП»
Тема: «Автоматизация SQL взаимодействия
и построения приложений на базе CTD»
15
(вариант)
Отчет по лабораторной работе
(вид документа)
Бумага писчая (A4)
(вид носителя)
27
(количество листов)
Проверил:
___________________
«___»_________2007 г.
Выполнил:
студент группы :
.
__________________
«___»_________2007 г.
Москва 2007 г.
4. Работа в режиме конечного пользователя с Database
Explorer.
4.2. Просмотр и ввод данных в таблицы.
4.3. Визуальное создание запросов.
5. Работа в режиме SQL - оперативная отладка запросов.
5.3. Внесение записей в таблицы БД.
5.4. Удаление записей из таблицы БД.
5.5. Модификация полей и таблиц БД.
5.6. Изменение данных в таблицах БД.
5.7. Выборки данных из таблиц БД.
Целью данной ЛР является: изучение
автоматизированных механизмов SQL взаимодействия (технологий и оперативного
доступа к БД ) и средств быстрого построения приложений (RAD) на основе систем классов; освоение режима
конечного пользователя при работе в компоненте СTD DatabaseExplorer;
автоматизированной отладки SQL-запросов и использования их программах;
создание учебных БД; создание приложения на основе системы классов QUICK объектов (Automation.apl и qckbase.apl) и ее
изучение.
1. Знакомство с
компонентой DatabaseExplorer.
Запуск CTD2000
и из нее с помощью пунктов меню TOOLS->DATABASE
EXPLORER->SQLBASE.
· Подключается БД ISLAND (создана по умолчанию
при установке) для локального варианта (логин и пароль при авторизации не
вводятся).
· Знакомство с закладками с компонентой Database Explorer (контекстное меню вызывается правой кнопкой мыши или с меню DATABASE).
· Знакомство с закладкой дизайнера БД.
· Создание БД (KISPS315 для локального
варианта). Название БД не может превышать 8 символов и должно быть набрано
только латиницей.
· Знакомство с закладками: DEFINITION, DATA, REPORT для таблиц.
· Знакомство с закладкой SQLTALK для выполнения запросов. Создание и
сохранение скриптов, выполнение SQL
команд.
2. Работа в режиме конечного пользователя с Database Explorer
· Создание БД. Создание, просмотр, заполнение,
модификация и удаление таблиц БД в DEFINITION. Названия таблиц и полей,
значения вводимых данных должны вводится латинскими буквами.
· Просмотр и ввод данных. Режим DATA. Создание,
просмотр, заполнение, модификация и удаление данных в таблицы БД.
· Визуальное создание запросов. Режим REPORT. Создание одного запроса для выборки списка
сотрудников с указанием должности и отдела, в котором он работает.
·
Создание
отчетов. Режим REPORT BUILDER. Вызов из меню
TOOLS->REPORT BUILDER..
3. Работа в режиме SQL — оперативная отладка
запросов.
Закладка SQLTALK (в дереве просмотра имя любой созданной БД,
например ISLAND). Удаляется БД
созданная в интерактивном режиме п.2 (DROP DATABASE). Все запросы
записываются в файл скрипта SQLS315.sql.
· С помощью SQL — запросов создать БД и таблицы
БД (описание БД дано ниже). Файл запросов запоминается на локальном диске [используются
команды: «CREATE DATABASE...» и «CREATE TABLE...»]
· Выполняются операторы удаления созданных
таблиц [DROP TABLE].
· В таблицы с помощью запросов заносятся записи
[INSERT INTO ..].
· В таблицах выполняются операторы удаления
записей [DELETE ...]
· Выполняются операторы модификации полей и
таблиц БД [ALTER TABLE ...]
· Выполняются операторы модификации данных
[UPDATE ...]
· Выполняются операторы запросов данных из БД
(Примеры запросов и перечень необходимых запросов приведен ниже. [SELECT ...]
4. Работа в режиме
приложения — создание приложений на базе "быстрых" классов объектов (QUICK OBJECT).
·
Создается
новое приложение для вывода списка задач с указанием названия, варианта и
проекта, в который они включены. Создается окно в формате “Мастер-деталь”
·
Создаются
окна для ввода задач и проектов.
·
Подключаются
файлы в режиме LIBRARIES INCLUDE: Automation.apl и qckbase.apl.
·
Создается
для проверки одно окно с подключением к БД KISPS315.
·
В это
окно подключаются объекты классов QUICK OBJECT: cQuickTable — таблицы, cQuickCommander — кнопки (три), cQuickField — поля,
cQuickListBox — список, cQuickComboBox — комбинированный список и другие.
·
При
настройке объектов необходимо в визуальном режиме выполнить настройку на нужные
объекты БД. Также используется прямое программирование на языке SAL.
·
Выполняется
проверка работы приложения в режиме дизайнера CTD. Приложение запоминается с именем APPS315.app.
Предметная область представляет собой процесс проектирования. Выделено 3 таблицы:
таблица проектов (Project), таблица анализируемых вариантов (Variant) и таблица прикладных задач варианта(Task).
Логическая и физическая структуры БД
разработаны с использованием CASE-средства AllFusion ERWin Data Modeler r7.
Логическая структура БД представлена на рисунке 1.
Рис. 1 Логическая структура БД
Физическая структура БД представлена на рисунке 2.
Рис. 2 Физическая структура БД
4.
Работа в режиме конечного пользователя с Database Explorer.
Посредством Database Explorer можно производить создание, просмотр, заполнение, модификацию и удаление таблиц БД.
Создание БД и
таблиц происходит через пункт меню Database Explorer -> New и дальнейшего
выбора пункта Table или
Database, которые
доступны для выбора в зависимости от того, какой уровень иерархии дерева
объектов выбран в левой части окна.
Создание и модификация таблиц происходит в режиме Definition (см. рисунок 3).
Рис. 3 Создание новой таблицы БД
в режиме Definition в Database Explorer
Просмотр, ввод/удаление и редактирование данных таблиц происходит в режиме Data (см. рисунок 4).
Рис. 4 Добавление новой строки в
таблицу в режие Data в Database Explorer
Визуальное создание запросов происходит в режиме Report в Database Explorer.
На рисунке 5 представлено, как выглядит визуально в режиме Report Design простейший запрос выборки и таблицы:
SELECT ALL PROJECT_ID, PROJ_NAME, VAR_COUNT, WORK_TIME, MEMB_COUNT, FEATURES, DATE_BEGIN, DATE_END, DATE_FACT_END, ROWID FROM S315_PROJECT
Рис. 5 Визуальное создание запроса
в режиме Report Design в Database Explorer
В режиме Report Preview получаем в итоге вывод, представленный на рисунке 6:
Рис. 6 Вывод запроса в режиме Report Preview в Database Explorer
Создание отчетов выполняется в режиме Report Builder в Database Explorer. Вызов осуществляется из меню Tools – Report Builder.
Запрос, на основе которого формируется отчет, легко
создается с помощью визуальных средств. Пример создания запроса для отчета,
выводящего выборку проекта, со всеми вариантами, которые он включает,
представлен на рисунке 7.
SQL-код представленного запроса:
SELECT ALL
SYSADM.S315_PROJECT.MEMB_COUNT, PROJ_NAME, SYSADM.S315_PROJECT.PROJECT_ID,
SYSADM.S315_VARIANT.MEMB_COUNT, SYSADM.S315_VARIANT.PROJECT_ID, VAR_ID,
VAR_NAME FROM SYSADM.S315_PROJECT, SYSADM.S315_VARIANT WHERE SYSADM.S315_PROJECT.PROJECT_ID =
SYSADM.S315_VARIANT.PROJECT_ID
Рис. 7 Формирование запроса посредством визуальных средств в Report Builder
Работа с отчетом в режиме Report Design и Report Preview аналогична подобным режимам в режиме Report в Database Explorer.
Для работы в режиме SQL используется закладка SQLTalk.
Ниже приведен отлаженный запрос, создающий БД
и таблицы в ней:
--
соединение с сервером SQLBase
SET
SERVER SERVER1;
--
удаление БД, созданной в интерактивном режиме и её повторное создание
DROP DATABASE KISPS315;
CREATE DATABASE KISPS315;
--
подключение к озданной БД
CONNECT
KISPS315;
--
создание таблиц БД, индексов и внешних ключей
CREATE TABLE S315_Project
(
project_id int
NOT NULL ,
proj_name CHAR(40)
,
var_count SMALLINT
,
work_time int ,
memb_count int ,
features char(100)
,
date_begin DATE ,
date_end DATE ,
date_fact_end
DATE ,
PRIMARY KEY
(project_id)
);
CREATE UNIQUE INDEX XPKS315_Project ON S315_Project
(
project_id ASC
);
CREATE TABLE S315_Task
(
task_id int
NOT NULL ,
task_name CHAR(40)
,
work_time int ,
memb_count int ,
intensity REAL ,
description
CHAR(100) ,
PRIMARY KEY
(task_id)
);
CREATE UNIQUE INDEX XPKS315_Task ON S315_Task
(
task_id ASC
);
CREATE TABLE S315_Variant
(
var_id int
NOT NULL ,
depart_id int ,
var_name CHAR(40)
,
var_code CHAR(20)
,
work_time int ,
memb_count int ,
task_count smallint
,
features CHAR(100)
,
date_begin DATE ,
date_end DATE ,
date_fact_end
DATE ,
project_id int ,
PRIMARY KEY
(var_id)
);
CREATE UNIQUE INDEX XPKS315_Variant ON S315_Variant
(
var_id ASC
);
CREATE INDEX XIF1S315_Variant ON S315_Variant
(
project_id ASC
);
CREATE TABLE S315_Variant_Task
(
var_id int
NOT NULL ,
task_id int
NOT NULL ,
PRIMARY KEY
(var_id,task_id)
);
CREATE UNIQUE INDEX XPKS315_Var_Task ON S315_Variant_Task
(
var_id ASC,
task_id ASC
);
CREATE INDEX XIF1S315_Var_Task ON S315_Variant_Task
(
var_id ASC
);
CREATE INDEX XIF2S315_Var_Task ON S315_Variant_Task
(
task_id ASC
);
ALTER TABLE S315_Variant
FOREIGN KEY (project_id) REFERENCES S315_Project
ON DELETE
RESTRICT;
ALTER TABLE S315_Variant_Task
FOREIGN KEY (var_id) REFERENCES S315_Variant
ON DELETE
RESTRICT;
ALTER TABLE S315_Variant_Task
FOREIGN KEY
(task_id) REFERENCES S315_Task
ON DELETE RESTRICT;
--
сохранение изменений в БД
COMMIT;
Результат выполнения приведенных SQL-запросов в SQLTalk представлен на
рисунке 8:
Рис. 8 Результат выполнения
SQL-запросов создания БД и её таблиц в SQLTalk
В результате получаем БД с таблицами,
которые можно посмотреть в Database Explorer (см. рисунок 3).
Для удаления таблиц БД используется оператор DROP TABLE. Пример SQL-запроса и результат его
выполнения в SQLTalk представлены на рисунке 9:
Рис. 9 Удаление таблицы оператором DROP TABLE в
SQLTalk
5.3.
Внесение
записей в таблицы БД.
Для внесения записей в таблицы БД
используется оператор INSERT INTO.
Запросы на заполнение таблицы S315_Project и
результаты их выполнения в SQLTalk представлены на рисунке 10.
Рис. 10 Заполнение таблицы S315_Project
Запросы на заполнение таблицы S315_Variant представлены
ниже:
INSERT INTO S315_VARIANT(var_id,
depart_id, project_id, var_name, var_code, work_time, memb_count,task_count,
features, date_begin, date_end, date_fact_end)
VALUES (1, 1, 1, 'Variant 1.1', 'В1.1', 1, 1, 1, 'Variants featuress 1.1',
01.01.2007, 01.02.2007, 15.02.2007);
INSERT INTO S315_VARIANT(var_id,
depart_id, project_id, var_name, var_code, work_time, memb_count, task_count,
features, date_begin, date_end, date_fact_end)
VALUES (2, 1, 1, 'Variant 1.2', 'В1.2', 2, 2, 2, 'Variants featuress 1.2',
01.01.2007, 15.02.2007, 14.01.2007);
INSERT INTO S315_VARIANT(var_id,
depart_id, project_id, var_name, var_code, work_time, memb_count, task_count,
features, date_begin, date_end, date_fact_end)
VALUES
(3, 1, 2, 'Variant 2.1', 'В2.1', 1,
1, 3, 'Variants featuress 2.1', 02.02.2008, 02.04.2008, 12.03.2008);
INSERT INTO S315_VARIANT(var_id,
depart_id, project_id, var_name, var_code, work_time, memb_count, task_count,
features, date_begin, date_end, date_fact_end)
VALUES (4, 1, 2, 'Variant 2.2', 'В2.2', 2, 2, 4, 'Variants featuress 2.2',
12.02.2008, 12.04.2008, 02.04.2008);
INSERT INTO S315_VARIANT(var_id,
depart_id, project_id, var_name, var_code, work_time, memb_count, task_count,
features, date_begin, date_end, date_fact_end)
VALUES (5, 2, 2, 'Variant 2.3', 'В2.3', 3, 3, 5, 'Variants featuress 2.3',
23.03.2008, 01.04.2008, 01.04.2008);
INSERT INTO S315_VARIANT(var_id, depart_id,
project_id, var_name, var_code, work_time, memb_count, task_count, features,
date_begin, date_end, date_fact_end)
VALUES (6, 2, 2, 'Variant 2.4', 'В2.4', 4, 4, 1, 'Variants featuress 2.4',
04.03.2008, 14.03.2008, 14.03.2008);
INSERT INTO S315_VARIANT(var_id,
depart_id, project_id, var_name, var_code, work_time, memb_count, task_count,
features, date_begin, date_end, date_fact_end)
VALUES (7, 2, 3, 'Variant 3.1', 'В3.1', 1, 1, 2, 'Variants featuress 3.1',
03.03.2008, 03.05.2008, 06.06.2008);
INSERT INTO S315_VARIANT(var_id,
depart_id, project_id, var_name, var_code, work_time, memb_count, task_count,
features, date_begin, date_end, date_fact_end)
VALUES (8, 2, 3, 'Variant 3.2', 'В3.2', 2, 2, 3, 'Variants featuress 3.2',
03.03.2008, 03.05.2008, 06.06.2008);
INSERT INTO S315_VARIANT(var_id,
depart_id, project_id, var_name, var_code, work_time, memb_count, task_count,
features, date_begin, date_end, date_fact_end)
VALUES (9, 3, 3, 'Variant 3.3', 'В3.3', 3, 3, 4, 'Variants featuress 3.3',
02.05.2008, 02.06.2008, 02.06.2008);
INSERT INTO S315_VARIANT(var_id,
depart_id, project_id, var_name, var_code, work_time, memb_count, task_count,
features, date_begin, date_end, date_fact_end)
VALUES (10, 3, 3, 'Variant 3.4', 'В3.4', 4, 4, 5, 'Variants featuress 3.4',
03.03.2008, 07.06.2008, 13.06.2008);
INSERT INTO S315_VARIANT(var_id,
depart_id, project_id, var_name, var_code, work_time, memb_count, task_count,
features, date_begin, date_end, date_fact_end)
VALUES (11, 3, 3, 'Variant 3.5', 'В3.5', 5, 5, 5, 'Variants featuress 3.5',
05.05.2008, 15.05.2008, 15.05.2008);
INSERT INTO S315_VARIANT(var_id,
depart_id, project_id, var_name, var_code, work_time, memb_count, task_count,
features, date_begin, date_end, date_fact_end)
VALUES (12, 3, 3, 'Variant 3.6', 'В3.6', 6, 6, 1, 'Variants featuress 3.6',
16.03.2008, 06.06.2008, 06.06.2008);
Распечатка результатов выполнения запросов в SQLTalk
представлена ниже:
CURSOR 7 CONNECTED TO
KISPS315
1 ROW INSERTED
1 ROW INSERTED
1 ROW INSERTED
1 ROW INSERTED
1 ROW INSERTED
1 ROW INSERTED
1 ROW INSERTED
1 ROW INSERTED
1 ROW INSERTED
1 ROW INSERTED
1 ROW INSERTED
1 ROW INSERTED
TRANSACTION COMMITTED
Рис. 11 Заполнение таблицы S315_Variant в SQLTalk
Запросы на заполнение таблицы S315_Task и результаты
их выполнения в SQLTalk представлены на рисунке 12.
Рис. 12 Заполнение таблицы S315_Task в SQLTalk
Запросы на заполнение связующей таблицы S315_Variant_task представлены ниже:
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(1, 1);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(2, 1);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(2, 2);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(3, 1);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(3, 2);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(3, 3);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(4, 1);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(4, 2);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(4, 3);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(4, 4);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(5, 1);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(5, 2);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(12, 5);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(5, 4);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(5, 5);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(6, 1);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(7, 1);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(7, 2);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(8, 1);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(8, 2);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(8, 3);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(9, 1);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(9, 2);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(9, 3);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(9, 4);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(10, 1);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(10, 2);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(10, 3);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(10, 4);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(10, 5);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(11, 1);
INSERT INTO S315_VARIANT_TASK(var_id, task_id) VALUES(12, 1);
INSERT
INTO S315_VARIANT_TASK(var_id, task_id)
VALUES(12, 2);
Результаты выполнения этих запросов в SQLTalk
представлен ниже на рисунке 13:
Рис. 13 Заполнение таблицы S315_Variant_task в SQLTalk
5.4.
Удаление
записей из таблицы БД.
Для удаления записей из таблицы используется
оператор DELETE. Пример запроса и результат его выполнения представлены на
рисунке 14:
Рис. 14 Пример удаления записей из таблиц БД в SQLTalk
5.5.
Модификация
полей и таблиц БД.
Для модификации полей и таблиц БД используется оператор ALTER TABLE. Пример запроса и результат его выполнения в SQLTalk представлены ниже.
ALTER TABLE S315_project ADD description CHAR(30);
ALTER TABLE S315_project MODIFY dscription CHAR(250);
Рис. 15 Пример модификации полей и таблиц БД в SQLTalk
5.6.
Изменение
данных в таблицах БД.
Изменение данных в таблицах БД производится с помощью оператора UPDATE. Пример запроса и результат его выполнения представлены ниже.
UPDATE S315_variant SET task_count = task_count * 2
WHERE
id = 5;
Рис. 16 Пример изменения данных в таблицах БД в SQLTalk
5.7.
Выборки
данных из таблиц БД.
Для выборки данных из таблиц БД используется оператор SELECT. Ниже приведены различные примеры выборок из созданных выше таблиц БД.
a) простая выборка из всех таблиц.
SELECT * FROM S315_project;
SELECT * FROM S315_variant;
SELECT * FROM S315_task;
SELECT * FROM S315_variant_task;
Рис. 17 Пример простой выборки из всех таблиц в SQLTalk
b) подсчет числа вариантов и задач, фиксация данных в БД.
UPDATE S315_variant s
SET task_count=(
SELECT COUNT(*)
FROM S315_variant_task st,
S315_task su
WHERE s.var_id=st.var_id AND
su.task_id = st.task_id
);
UPDATE S315_project s
SET var_count=(
SELECT COUNT(*)
FROM S315_variant st
WHERE
st.project_id=s.project_id
);
Рис. 18 Подсчет числа вариантов и задач, фиксация данных в БД с помощью SQLTalk
c) подсчет числа сотрудников для варианта, фиксация данных в БД
UPDATE S315_variant s
SET memb_count=(
SELECT SUM(memb_count)
FROM S315_task st
WHERE st.task_id in (
SELECT
su.task_id
FROM
S315_variant_task su
WHERE
su.var_id = s.var_id)
);
Рис. 19 Подсчет числа сотрудников для варианта в SQLTalk
d) подсчет трудоемкости варианта
UPDATE S315_variant s
SET work_time=(
SELECT SUM(su.work_time)
FROM S315_variant_task st,
S315_task su
WHERE s.var_id=st.var_id
AND
su.task_id=st.task_id
);
Рис. 20 Подсчет трудоемкости варианта в SQLTalk
e) подсчет трудоемкости проекта
Рис. 21 Подсчет трудоемкости проекта в SQLTalk
f) выбор списка вариантов и задач для проекта без повторений
Запрос и результат его выполнения в SQLTalk представлены на рисунке 22:
Рис. 22 Выбор списка вариантов и задач для проекта без повторений в SQLTalk
g) список всех задач
SELECT task_name from S315_task;
Рис. 23 Выбор списка всех задач в SQLTalk
h) список всех проектов с трудоемкостью
SELECT proj_name, work_time FROM S315_project;
Рис. 24 Список всех проектов с трудоемкостью в SQLTalk
i) список вариантов с проектами и трудоемкостью
SELECT s.var_name, s.work_time, st.proj_name
FROM
S315_variant s, S315_Project st
WHERE
s.project_id = st.project_id;
Рис. 25 Список вариантов с проектами и трудоемкостью
j) выборка проектов и вариантов, выполненных не в срок
k) список всех задач отсортированных по вариантам и проектам
SELECT s.task_name, st.var_name,
su.proj_name
FROM
S315_task s,
S315_variant_task sx,
S315_variant st,
S315_project su
WHERE
s.task_id=sx.task_id
AND
st.var_id=sx.var_id
AND
su.project_id=st.project_id
ORDER BY 1, 2, 3;
Рис. 26 Список всех задач, отсортированных по вариантам и проектам
6.
Работа в
режиме приложения - создание приложений на базе "быстрых" классов
объектов (QUICK
OBJECT) и с
использованием прямого программирования на языке SAL.
Окно дизайнера CTD с
разработанным приложением представлено на рисунке 27:
Рис. 27 Окно дизайнера CTD с
разработанным приложением
Ниже приведены непосредственно экранные формы разработанного приложения.
Форма для соединения с БД с возможностью указания БД, логина и пароля:
Рис. 28 Форма для соединения с БД
Главное окно программы, предоставляющее возможность перебора всех задач и просмотра вариантов и проектов, в которые они входят:
Рис. 29 Главное окно программы
Форма добавления нового варианта в БД:
Рис. 30 Форма добавления нового варианта
Форма добавления нового проекта в БД:
Рис. 31 Форма добавления нового проекта
1) Большаков С. А. «Изучаем программирование в
Gupta Team Developer» [Электронный источник]: интернет-ресурс http://www.interface.ru/home.asp?artId=2259
.
2) Справочная система CTD2000 [Электронный
источник]: centura.hlp