
- •Задание на работу
- •1.1. Разработать проект каркаса для работы со спецификациями изделий
- •1.2. Содержание работы
- •Аннотация
- •Введение
- •2. Описание выполненной работы
- •2.1. Разработка функциональных требований к подсистеме
- •2.2. Разработка проектной модели классов
- •2.4. Разработка модели хранения
- •2.5. Разработка поддерживающих процедур
- •2.5.1. Процедура, создающая запись в таблице «acceptable_components»:
- •2.5.2. Процедура, создающая запись в таблице «prod_position_union»:
- •2.5.3. Процедура, удаляющая запись в таблице «prod_position_union»:
- •2.5.4. Процедура, удаляющая запись в таблице «acceptable_components»:
- •2.5.5. Процедура, меняющая количество в таблице «prod_position_union»:
- •2.5.6. Процедура наследование допустимых составов в таблице «acceptable_components»:
- •2.5.7. Процедура получения списка допустимых компонентов для данного класса из таблицы «acceptable_components»:
- •2.5.8. Процедура рекурсивного получения списка допустимых компонентов нижнего уровня для данного класса из таблицы «acceptable_components»:
- •2.5.9. Процедура получения списка компонентов для данного объекта (продукции) из таблицы «prod_position_union»:
- •2.5.10. Процедура рекурсивного получения списка компонентов нижнего уровня для данного объекта (продукции) из таблицы «prod_position_union»:
- •2.5.11. Процедура получения списка компонентов определенного класса для данного объекта (продукции) из таблицы «prod_position_union»:
- •2.5.12. Процедура рекурсивного получения списка компонентов нижнего уровня и определенного класса для данного объекта (изделия) из таблицы «prod_position_unioin»:
- •2.5.13. Процедура получения списка объектов, которые могут быть компонентами данного объекта (продукции):
- •2.5.14. Процедура рекурсивного получения списка объектов, которые могут быть компонентами нижнего уровня данного объекта (продукции):
- •2.6. Тестирование процедур
- •2.6.1. Тестирование процедуры, создающей запись в таблице «acceptable_components»:
- •2.6.2. Тестирование процедуры, создающей запись в таблице «prod_position_union»:
2.5.11. Процедура получения списка компонентов определенного класса для данного объекта (продукции) из таблицы «prod_position_union»:
функция: find_components_by_object_and_class - получение списка компонентов определенного класса для данного объекта (продукции) из таблицы prod_position_union
-- 1. object_id - id объекта для продукции
-- 1. class_id - id класса для продукции
-- выход: список компонентов объектов для данного объекта определенного класса
-- эффекты:
-- нет.
-- требования:
-- 1. передаваемое id продукции и id класса должно существовать
def find_components_by_object_and_class(object_id, class_id):
try:
cursor.execute('''
SELECT comp_id, quantity FROM prod_position_union WHERE prod_id = ?
''', (object_id,))
components = cursor.fetchall()
result = []
for comp_id, quantity in components:
cursor.execute("SELECT id_category, product_name FROM product WHERE id = ?", (comp_id,))
parent_info = cursor.fetchone()
if parent_info and parent_info[0] == class_id: # Check if parent matches class_id
result.append((comp_id, parent_info[1], quantity))
print(f'для объекта с id={object_id} класса с id={class_id} компоненты: {result}')
return result
except Exception as e:
print(f"Error occurred while finding components by object and class: {e}")
return []
2.5.12. Процедура рекурсивного получения списка компонентов нижнего уровня и определенного класса для данного объекта (изделия) из таблицы «prod_position_unioin»:
функция: find_components_by_object_and_class_recursive - получение списка компонентов определенного класса для данного объекта (продукции) из таблицы prod_position_union рекурсивно
-- 1. object_id - id объекта для продукции
-- 1. class_id - id класса для продукции
-- выход: список компонентов объектов для данного объекта определенного класса рекурсивно
-- эффекты:
-- нет.
-- требования:
-- 1. передаваемое id продукции и id класса должно существовать
def find_components_by_object_and_class_recursive(object_id, class_id):
try:
def get_classifier_name(category_id):
cursor.execute("SELECT terminal_classifier_name FROM terminal_classifier WHERE id = ?", (category_id,))
row = cursor.fetchone()
return row[0] if row else None
def find_components(obj_id, result):
cursor.execute("SELECT comp_id, quantity FROM prod_position_union WHERE prod_id = ?", (obj_id,))
components = cursor.fetchall()
for comp_id, quantity in components:
cursor.execute("SELECT id_category, product_name FROM product WHERE id = ?", (comp_id,))
parent_info = cursor.fetchone()
if parent_info:
product_category = parent_info[0] # Component's category (id_category)
product_name_in_func = parent_info[1] # Name from terminal_classifier table
classifier_name = get_classifier_name(product_category)
root_category_name = get_classifier_name(class_id)
category_children = get_category_children(root_category_name)
if classifier_name in category_children or classifier_name == root_category_name:
# Add or update the accumulated quantity in the result dictionary
if comp_id in result:
result[comp_id]["quantity"] += quantity
else:
result[comp_id] = {"name": product_name_in_func, "quantity": quantity, "category_name": classifier_name}
cursor.execute("SELECT COUNT(*) FROM prod_position_union WHERE prod_id = ?", (comp_id,))
has_nested_components = cursor.fetchone()[0] > 0
if has_nested_components:
find_components(comp_id, result)
result = {}
find_components(object_id, result)
# Prepare the final result as a list of tuples
final_result = [
(comp_id, data["name"], data["quantity"]) for comp_id, data in result.items()
]
print(f"Final result for object_id={object_id} and class_id={class_id}: {final_result}")
return final_result
except Exception as e:
print(f"Error occurred while finding components recursively: {e}")
return []