Главная страница
Навигация по странице:

  • Задание

  • Update ;create trigger TR_Materialli_BeforeUpdate

  • Update

  • ть. WS Разбор задания Бумажная фабрика. Бумажная фабрика


    Скачать 490.3 Kb.
    НазваниеБумажная фабрика
    Дата11.01.2022
    Размер490.3 Kb.
    Формат файлаdocx
    Имя файлаWS Разбор задания Бумажная фабрика.docx
    ТипДокументы
    #328584





    Разбор задания

    « Бумажная фабрика»

    ОГЛАВЛЕНИЕ


    Сессия 1

    Загрузка данных

    Исходя из файлов с данными получается такая ERD диаграмма.



    Соответственно все таблицы разбиваем с помощью функции “=ПРОСМОТР(искомое значение; просматриваемый вектор; вектор результатов)”. В видео на 12:05 происходит вставка значений, для того чтобы убедиться присутствуют ли все значения во второй таблице. Если некоторые значения будут отсутствовать, то функция ““=ПРОСМОТР()”, будет выдавать ошибку или возникнут проблемы при связывании таблиц.

    Trigger

    Для создания trigger’а потребуется базовое знание команд SQL.

    Задание: Реализуйте триггер, который будет срабатывать на добавление новых материалов и редактирование количества на складе уже существующих, добавляя информацию в таблицу истории изменения количества материалов на складе. Название триггера должно соответствовать шаблону: TR__, например, TR_Order_AfterUpdate.

    Из задания мы узнали, что нам нужно создать trigger на 2 события: insert и update. Так же для хранения истории нам понадобиться новая таблица с полями: id (auto_increment), id_material, kolichestvo, date. Столбец “date” мы добавили заранее т.к. во view потребуется написать запрос с использованием этого поля.

      1. MySQL

    Use userwsr1;
    drop trigger if exists TR_Materialli_BeforeInsert;
    create trigger TR_Materialli_BeforeInsert before insert on materialli

    for each row

    insert into history(id_material, kolichestvo, date)

    values(new.id, new.kolichestvo_na_sklade, now());

    drop trigger if exists TR_Materialli_BeforeUpdate_;create_trigger_TR_Materialli_BeforeUpdate'>Update;
    create trigger TR_Materialli_BeforeUpdate before update on materialli

    for each row

    insert into history(id_material, kolichestvo, date)

    values(new.id, new.kolichestvo_na_sklade, now());
    Тут создаются 2 trigger’а т.к. в MySQL нельзя создать 1 trigger на 2 события.

    Отличаются эти trigger’ы 3 словами.

    Функция now() возвращает сегодняшнюю дату.

    Объект new это строка из таблицы materialli.

      1. MSSQL

    use userWSR1;

    go

    create or alter trigger TR_Material_AfterInsert on Material

    for insert as

    insert into [userWSR1].[dbo].[Istoria](Material,[Kolichestvo],[Date])

    Select Id, KolichestvoNaSklade, GetDate() from inserted;

    go

    create or alter trigger TR_Material_AfterUpdate on Material

    for update as

    insert into [userWSR1].[dbo].[Istoria](Material,[Kolichestvo],[Date])

    Select Id, KolichestvoNaSklade, GetDate() from inserted;
    Trigger’ы различаются 2 словами.

    Функция GetDate() возвращает сегодняшнюю дату.

    В таблице inserted храниться строка с измененными данными из таблицы Material.

    View

    Задание: Создайте в базе данных представление (View) с названием VW_MaterialDetails для отображения списка материалов со следующими столбцами: Тип материала (наименование типа, не id), Наименование материала, Количество на складе, Количество возможных поставщиков, Текущая стоимость (в формате “#.## руб.”, например, “748.50 руб.”), Количество материалов на начало месяца (на основании истории изменения количества материалов на складе), Описание (первые 50 символов с многоточием в конце). Данные необходимо отсортировать по уменьшению текущей стоимости. При создании представления сохраняйте названия столбцов в соответствии с описанием, используя алиасы.

      1. MySQL

    drop view if exists VW_MaterialDetails;
    create view VW_MaterialDetails

    as Select tip_materialla.naimenovanie as 'Тип материала', materialli.naimenovanie as 'Наименование материала',

    kolichestvo_na_sklade as 'Количество на складе',

    (Select count(*) from materialli_postavshiki where materiall=materialli.id) as 'Количество возможных поставщиков',

    concat(round(thena, 2), ' руб.') as 'Текущая стоимость',

    (Select kolichestvo from history where history.id_material = materialli.id order by date limit 1) as 'Количество материалов на начало месяца',

    Concat(left(opisanie, 50), '...') as 'Описание'

    from materialli

    inner join tip_materialla on tip = tip_materialla.id

    order by thena desc;
    Select * from VW_MaterialDetails;

      1. MSSQL

    create or alter view VW_MaterialDetails as

    Select TipMaterialla.Naimenovanie as 'Тип материала', Material.Naimenovanie as 'Наименование материала',

    Material.KolichestvoNaSklade as 'Количество на складе',

    (Select count(*) from MaterialPostavshik where MaterialPostavshik.Material = Material.Id) as 'Количество возможных поставщиков',

    Format(Round(Material.Thena,2),'#.00 руб.') as 'Текущая стоимость',

    (select Top 1 Istoria.Kolichestvo from Istoria where Istoria.Material = Material.Id order by Istoria.Date asc) as 'Количество материалов на начало месяца',

    Concat(LEFT( Material.Opisanie, 50), '...') as 'Описание'

    from Material

    inner join TipMaterialla on Material.Tip = TipMaterialla.Id

    order by Material.Thena desc offset 0 rows;
    go
    Select * from VW_MaterialDetails;

    Сессия 2

    Разработка desktop-приложения

    В приведенных видео показывается один из способов реализации приложения. Так как данное задание нужно выполнить за ограниченное количество времени, то приходится жертвовать качеством кода. Главная цель при написании приложения – это выполнение большей части задания.

    Сохранение проекта нужно планировать, как минимум за 10 минут до окончания сессии. Но лучше также сохраняться во время сессии, после успешного добавления рабочих функций в приложение. В последние 10 минут лучше перечитать задание. При этом нужно сравнить, что требовалось сделать и что Вы по факту сделали. Особое внимание нужно обращать на правильные названия объектов. После выполнения данных действий нужно перейти к выполнению нетривиальных задач, не связанных с работоспособностью кода. Например, таких, как дописывание словаря ресурсов со стилями, создание файлика README.md(обязательно) и README_template.md(если, где-то мелькает во введении).

    При работе с БД, а в частности при обновлении БД могут появиться внутренние ошибки, которые нельзя исправить в коде приложения. Так что перед обновлением модели БД из базы данных следует сделать комит в git’e, к которому можно будет откатиться если все пойдет не по плану. Команды лучше протестировать до их применения на демо-экзамене, т.к. они удаляют все изменения до предыдущего комита.

    Если изменения еще не закомичены:

    git checkout .

    или

    git reset --hard HEAD

    Если изменения закомичены:

    git reset --hard HEAD

    1

    Данные ошибки возникают при изменении типа данных в уже существующих таблицах. Для того, чтобы избежать данных ошибок нужно удалить существующую модель и создать новую. Так же перед созданием новой модели надо из файла App.config удалить строку подключения. Новую модель называем также, как называлась у нас старая.









    Библиотека классов создается долго 5-10 минут из-за медленных hdd так что, если есть возможность поставьте её на создание в начале сессии до того, как вы начнете над ней работать.

    В дне проверки так же можно создать некоторые проекты для сохранения какого-то кода или для сохранения времени. Иногда их не удаляют. Базы данных всегда очищают от созданных таблиц. Так же можно попробовать записать авторизационные данные в текстовый файл для дальнейшего быстрого их использования.

    При возникновении сбоев или ошибок в работе программ или оборудования нужно обратиться к техническому эксперту. Если признают, что в этом виноваты не Вы, то Вам остановят время и починят неисправность. Это время вернут в конце сессии.

    Если вы обнаруживаете, что программе нужен доступ интернет для дозагрузки нужных файлов для работы, то следует обратиться так же к техническому эксперту. Не имеет значения, когда произошла данная ситуация в день проверки оборудования или во время сессии. Максимум, что во время сессии Вас предупредят, что подключение и дозагрузка необходимых библиотек будет происходить за счет вашего времени. И никто не будет восстанавливать вам потраченное на это время.

    При подготовке к демо-экзамену есть несколько способов выполнить конкретную часть задания, но нужно выбирать тот способ, при котором не требуется докачивать дополнительные материалы. Как пример можно привести проект с тестами. Есть NUnit и MSTest по сути библиотеки имеют схожую функциональность, но MSTest не нужен доступ в интернет для первоначального создания. Так же на данный момент лучше все проекты создавать только с использованием .Net Framework, а не .Net Core.

    При выборе программного обеспечения нужно руководствоваться инфраструктурным листом, где описаны все программы и модули, которые можно использовать.

    Комментарии в коде проекта оставлены для лучшего понимания кода, на демо-экзамене нужно оставлять комментарии вида:

    ///

    /// Что делает функция?

    ///


    /// Что возвращает функция?

    Пишите 3 слеша и VisualStudio автоматически генерирует данный шаблон.

    В папке находятся проекты, созданные в видео и итоговый проект “PaperFactory Final”, где реализовано практически все, что требовалось реализовать по заданию. Т.к. проект оценивается по критериям, то в проекте возможно отсутствует часть функций, которые проверяют критерии. Потому что, одно задание создается по самому максимальному коду и критерии пишутся к этому заданию. Далее данное задание могут сокращать до более меньших кодов и, в связи с этим удалять модули и вырезать абзацы с требованиями. Но данные изменения могут не затронуть критерии. Из-за этого получается ситуации, что критерии оценивают ту функциональность, которая не написана в задании.

    В итоговом задании были выделены модули программы в отдельные классы для улучшения читаемости кода. На демо-экзамене код не нужно так разбивать, т.к. в данном случае в приоритете стоит количество выполненного задания.

    При использовании Entity Framework возникает ситуация, когда нужно отменить все несохраненные изменения, внесенные пользователем. Например при редактировании объекта пользователь может вернуться назад тем самым отменяя внесенные изменения. EF имеет функцию сохранения изменения (.SaveChanges()), но функция отмены внесенных изменений отсутствует. Для того, чтобы отменить внесенные изменения нужно пересоздать объект базы данных.

    userWSR1Entities paper = new userWSR1Entities();

    Для разворачивания проектов нужно создать пользователя и БД с именем userWSR1 и загрузить файл *.sql. Все нужные скрипты приведены. Для создания пользователей скрипты лежат в папке Создаздание рабочего окружения(admin)\DB.

    Что необходимо знать для выполнения задания: коллекции (List<>), Linq, Entity Framework, WPF(Grid, DataGrid, Label, TextBox, ComboBox, Button, Image, Pages, Frame) и некоторые их свойства и события, уметь выводить в них данные и получать из них данные, StyleDictionary, WPF Bindings.

    Создание библиотеки

    В данном задании главное назвать правильно все объекты: название библиотеки – WSUniversalLib, название метода - public int GetQuantityForProduct(int productType, int materialType, int count, float width, float length), название репозитория – WSUniversalLib, название класса - Calculation. Также обязательно созданную библиотеку нужно поместить в отдельный репозиторий с определенным названием. Работа будет проверяться только в том случае, если объекты будут названы правильно. Для проверки библиотеки мы создаем дополнительный консольный проект, в нем добавляем ссылку на библиотечный проект и создаем объект класса и проверяем правильность возвращаемых результатов.

    В данном случае результат для сверки нам дан некорректный т.к. первая получившаяся цифра (113 805) совпадает. Но последующий результат является не верным, т.к. процент брака 1 типа материала должен быть 0.3%. Если высчитать процент брака в задании (114 147,442/113 805), то получается 1,003009024, что не соответствует условию задачи. Результат должен быть равен 1,003.

    namespace WSUniversalLib

    {

    public class Calculation

    {

    private Dictionary productType = new Dictionary()

    {

    { 1, 1.1},

    { 2, 2.5},

    { 3, 8.43}

    };
    private Dictionary materialType = new Dictionary()

    {

    { 1, 0.3},

    { 2, 0.12}

    };
    public int GetQuantityForProduct(int productType, int materialType,

    int count, float width, float length)

    {

    if (!this.productType.ContainsKey(productType) ||

    !this.materialType.ContainsKey(materialType) ||

    count <= 0 || width <=0 || length <=0)

    {

    return -1;

    }
    double square = count * (width * length) * this.productType[productType];

    double flaw = square * (1 + this.materialType[materialType] / 100);
    return (int)Math.Ceiling(flaw);

    }

    }

    }
    Calculation c = new Calculation();

    Console.WriteLine(l.GetQuantityForProduct(3, 1, 15, 20, 45));



    написать администратору сайта