Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
7 сем / 3 / мисприс-2.3_1374_Наволоцкий_Зырянов_Харитонов.docx
Скачиваний:
3
Добавлен:
29.03.2025
Размер:
1.79 Mб
Скачать

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

Соседние файлы в папке 3