
- •Задание на работу
- •0.1. Функциональные требования
- •0.2. Содержание работы
- •1. Разработка функциональных требований к подсистеме
- •2. Разработка проектной модели классов
- •3. Разработка модели хранения
- •4. Разработка физической модели данных и поддерживающих процедур
- •4.1 Процедура, создающая запись в таблице «orders»:
- •4.2 Процедура, добавляющая позицию заказа:
- •4.3 Процедура, изменяющая тип конфигурируемости объекта-изделия:
- •4.4 Процедура, изменяющая конфигурируемость параметра:
- •4.5 Процедура, возвращающая список конфигурируемых параметров данного объекта-изделия:
- •4.6 Процедура, возвращающая список нЕконфигурируемых параметров данного объекта-изделия:
- •4.7 Процедура, возвращающая список всех параметров данного объекта-изделия:
- •4.8 Процедура, возвращающая список вариантов исполнения для данного типового изделия с конфигуратором:
- •4.9 Процедура, создающая вариант исполнения по данному типовому изделию с конфигуратором:
- •4.10 Процедура, создающая типовое изделие с конфигуратором по данному типовому изделию без конфигуратора:
- •4.11 Процедура, выводящая сведения о деталях заказа:
- •4.12 Процедура, связывающая имеющийся параметр с продуктом:
- •4.13 Процедура, задающая значения параметра для продукции:
- •5. Тестирование процедур
4.12 Процедура, связывающая имеющийся параметр с продуктом:
def create_prod_param(new_prod_id, new_param_id, is_configurable):
функция: create_prod_param - процедура, связывающая имеющийся параметр с продуктом
-- вход:
-- 1. new_prod_id - id продукции
-- 2. new_param_id - id параметра
-- 3. is_configurable - флаг конфигурируемости
-- выход: 1 - успех / 0 - иначе
-- эффекты:
-- 1. создание новой записи в таблице prod_param
-- требования:
-- 1. передаваемые аргументы должны существовать
try:
cursor.execute("SELECT product_name FROM product WHERE id = ?", (new_prod_id,))
is_new_product_name_exist = cursor.fetchone()
if is_new_product_name_exist is None:
print(f'Ошибка в create_prod_param: изделия с id {new_prod_id} не найдено')
return 0
cursor.execute('''
SELECT param_name FROM param WHERE id = ?
''', (new_param_id,))
is_new_param_name_exist = cursor.fetchone()
if is_new_param_name_exist is None:
print(f'Ошибка в create_prod_param: параметра с id {new_param_id} не найдено')
return 0
# проверяем, является ли изделие вариантом исполнения
cursor.execute('''
SELECT configurable_type FROM product WHERE id = ?
''', (new_prod_id,))
configurable_type = cursor.fetchone()[0]
if configurable_type == 0:
raise ValueError(f'Вы пытаетесь задать значения параметров обычному изделию с типом 0, которое не может быть параметризовано. Вместо этого, сначала сделайте конфигурацию для этой продукции через функцию create_configuration_product_by_existing_prod_id')
# 2-3 lab check
if not (is_param_allowed_to_prod_category(new_param_id, new_prod_id)):
raise ValueError(f'ошибка! для продукции с id={new_prod_id} параметр с id={new_param_id} является недопустимым. \nЕсли параметр должен быть допустимым, добавьте запись в таблицу class_param с id параметра из таблицы param и class_param_id(id_category в таблице terminal_classifier) для продукции соотвествующей category')
# 2-3 lab check
if not (isinstance(is_configurable, bool)):
raise ValueError(f'значения переданного аргумента is_configurable={is_configurable} не является bool')
cursor.execute('''
INSERT INTO prod_param (prod_id, param_id, is_configurable)
VALUES (?, ?, ?)
''', (new_prod_id, new_param_id, is_configurable))
res = cursor.rowcount
conn.commit()
if res == 1:
print(f'\nДобавлена запись в таблицу prod_param\n')
return 1
else:
return 0
except sqlite3.Error as e:
print(f"Ошибка в create_prod_param: {e}")
conn.rollback()
return 0
4.13 Процедура, задающая значения параметра для продукции:
функция: fill_prod_param - процедура, задающая значения параметра для продукции
-- вход:
-- 1. prod_id - id продукции
-- 2. param_id - id параметра
-- 3. new_int_val - целочисленное значение
-- 4. new_real_val - вещественное значение
-- 5. new_str_val - строчное значение
-- выход: 1 - успех / 0 - иначе
-- эффекты:
-- 1. задание значений параметров для варианта исполнения
-- требования:
-- 1. передаваемые аргументы должны существовать
-- 2. значения должны попадать в пределы, допустимы для текущего параметра (указано в таблице param)
def fill_prod_param(prod_id, param_id, new_int_val, new_real_val, new_str_val):
try:
# Validate product and parameter existence
if not is_exist_by_id_in_table(prod_id, PRODUCT_TABLE):
raise ValueError(f'нет продукта с таким prod_id={prod_id} в таблице product')
if not is_exist_by_id_in_table(param_id, PARAM_TABLE):
raise ValueError(f'нет параметра с таким param_id={param_id} в таблице param')
cursor.execute('''
SELECT configurable_type FROM product WHERE id = ?
''', (prod_id,))
configurable_type = cursor.fetchone()[0]
if configurable_type in [0, 1]:
variant = ''
if configurable_type == 0:
variant = 'продукция без конфигуратора'
if configurable_type == 1:
variant = 'продукция с конфигуратора'
raise ValueError(f'ошибка! заполнение параметров для продукции доступно только для варианта исполнения. тип введеного id продукции = {variant}')
# Validate new_int_val range
if new_int_val is not None:
cursor.execute('''SELECT min_val, max_val FROM param WHERE id = ?''', (param_id,))
min_val, max_val = cursor.fetchone()
if not (min_val <= new_int_val <= max_val):
raise ValueError(f'значение {new_int_val} не попадает в промежуток границ параметра [{min_val} ; {max_val}]')
# Validate new_real_val range
if new_real_val is not None:
cursor.execute('''SELECT min_val, max_val FROM param WHERE id = ?''', (param_id,))
min_val, max_val = cursor.fetchone()
if not (min_val <= new_real_val <= max_val):
raise ValueError(f'значение {new_real_val} не попадает в промежуток границ параметра [{min_val} ; {max_val}]')
# Проверка существования записи
cursor.execute('''
SELECT COUNT(*) FROM prod_param WHERE prod_id = ? AND param_id = ?
''', (prod_id, param_id))
exists = cursor.fetchone()[0]
if exists:
# Обновление существующей записи
cursor.execute('''
UPDATE prod_param
SET int_value = ?, str_value = ?, real_value = ?
WHERE prod_id = ? AND param_id = ?
''', (new_int_val, new_str_val, new_real_val, prod_id, param_id))
else:
# Добавление новой записи
cursor.execute('''
INSERT INTO prod_param (prod_id, param_id, int_value, str_value, real_value)
VALUES (?, ?, ?, ?, ?)
''', (prod_id, param_id, new_int_val, new_str_val, new_real_val))
# Проверка успешности операции
cursor.execute('''
SELECT int_value, str_value, real_value
FROM prod_param
WHERE prod_id = ? AND param_id = ?
''', (prod_id, param_id))
updated_row = cursor.fetchone()
if (updated_row == (new_int_val, new_str_val, new_real_val)):
print(f'для изделия с prod_id={prod_id} обновлены или добавлены параметры с param_id={param_id}')
conn.commit()
return 1
else:
raise ValueError(f'не получилось вставить или обновить значения параметра с param_id={param_id} для изделия с prod_id={prod_id}')
except sqlite3.Error as e:
print(f"Ошибка в fill_prod_param: {e}")
conn.rollback()
return 0