cs_coloring.md 6.1 KB

Подсветка элементов по условию. Дополнительные выборки.

В списке продукции необходимо подсвечивать светло-красным цветом те продукты, которые не продавались агентами в последний месяц.

Пагинация, сортировка, фильтрация, поиск Содержание Подсветка элементов по условию. Дополнительные выборки.
Критерий Баллы
Реализовано выделение (любым образом) продуктов, которые не продавались агентами в последний месяц 1.5
Выделение реализовано в виде светло-красной подсветки элемента продукции 0.5
Итого 2

В самом списке продукции данных о продажах нет. Судя по названиям таблиц данные эти должны быть в таблице ProductSale. Судя по связям этой таблицы, мы должны заполнить ещё таблицы Agent и AgentType.

На демо-экзамене до этого вы вряд-ли дойдёте (хотя критерий достаточно жирный), но в рамках курсовой/дипломной работы реализовать дополнительный функционал надо.

Добавление данных вручную

  1. Добавляем типы агентов

    Исходных данных для этой и последующих таблиц нет, поэтому вы можете писать туда что угодно (но близко к предметной области). Для типов агентов подойдут "индивидуальный предприниматель" и "Общество с ограниченной ответственностью" (для не обязательных таблиц много данных придумывать не надо, достаточно одной-двух записей)

    И так как исходных данных нет, а редактировать напрямую из MySQL Workbench нельзя, то пишем SQL-запрос вставки данных в основном его синтаксисе (с VALUE)

    INSERT INTO AgentType
        (Title)
    VALUES 
        ('ИП'), ('ООО');
    

    Одной командой можно внести сразу несколько строк. Поле Image не обязательное, поэтому заполнять я его не стал.

  2. Добавляем агента

    INSERT INTO Agent
        (Title, AgentTypeID, INN, Phone, Priority)
    VALUES
        ('ИП Колесников Е.И.', 1, '1234567890', '322223', 0);
    

    Тут заполняем только обязательные поля. AgentTypeID смотрим в таблице AgentType.

  3. Создание продаж продукции

    INSERT INTO ProductSale
        (AgentID, ProductID, SaleDate, ProductCount)
    VALUES
        (1, 2, '2021-10-09', 1),
        (1, 3, '2021-10-09', 1),
        (1, 4, '2021-10-09', 1),
        (1, 5, '2021-10-09', 1);
    

    Добавляем несколько записей. Поля AgentID и ProductID смотрим в соответствующих таблицах. Дата продажи заполняется в формате YYYY-MM-DD

Дополнительная выборка

Сначала пишем и отлаживаем запрос получения количества дней с последней продажи (дата продажи сама по себе нам не нужна, достаточно знать сколько дней прошло с момента продажи)

SELECT 
    ProductID, 
    DATEDIFF(NOW(), max(SaleDate)) AS LastSaleDate
FROM 
    ProductSale
GROUP BY 
    ProductID
  • Функция DATEDIFF вычисляет количество дней между датами.
  • Функция NOW возвращает текущую дату.

Теперь этот запрос можно вставить в нашу основную выборку ещё одним LEFT JOIN-ом

SELECT 
    p.*,
    pt.Title AS ProductTypeTitle,
    pp.MaterialList, pp.Total,
    Sales.DaysFromLastSale
FROM
    Product p
LEFT JOIN
    ProductType pt ON p.ProductTypeID = pt.ID
LEFT JOIN
    (
    SELECT
        pm.ProductID,
        GROUP_CONCAT(m.Title SEPARATOR ', ') as MaterialList, 
        SUM(pm.Count * m.Cost / m.CountInPack) as Total
    FROM
        Material m,
        ProductMaterial pm
    WHERE m.ID = pm.MaterialID
    GROUP BY ProductID
    ) pp ON pp.ProductID = p.ID
LEFT JOIN 
    (
        select 
            ProductID, 
            DATEDIFF(NOW(), max(SaleDate)) as DaysFromLastSale
        from 
            ProductSale
        group by ProductID
    ) Sales on Sales.ProductID = p.ID ;

Атрибут DaysFromLastSale в модель и метод получения продукции пропишите сами.

Раскраска по условию

Тут элементарно. У элемента рамка (Border) задаем цвет фона:

<Border 
    BorderThickness="1" 
    BorderBrush="Black" 
    Background="{Binding BackgroundColor}"
                ^^^^^^^^^^^^^^^^^^^^^^^^^
    CornerRadius="5">

И добавляем в модель геттер BackgroundColor

public string BackgroundColor {
    get {
        if(DaysFromLastSale>30) return "#faa";
        return "#fff";
    }
}