Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Ведение базы данных учета командировок и больничных листов. / 21 сообщений из 21, страница 1 из 1
10.06.2020, 11:19
    #39967759
Shelleex
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ведение базы данных учета командировок и больничных листов.
«Ведение базы данных учета командировок и больничных листов» Во время трудоустройства сотрудники предприятия заполняют личную карточку, где хранятся такие данные: фамилия, имя, отчество, год рождения, дата зачисления на работу, должность, оклад, подразделение, идентификационный код и т.д. Каждый человек имеет свой табельный номер. На предприятии несколько подразделений. Если сотрудник болел, он должен подать больничный лист (Л / л) до табельного службы. В Л / л указанные ФИО человека, дата начала больничного, дата конца больничного. Если сотрудник был в командировке, то командировки тоже оформляется через табельное службу, где указывается начало и конец командировки.

Ежемесячно система может формировать отчеты по таким данным: - справочник подразделений и их работников; - количество людей, которые имели командировки по каждому подразделению; - количество людей, которые болели и имеют больничные листы в текущем месяце, продолжительность больничного; - общий список людей, которые не имеют больничные листы (по алфавиту). -
  • создать таблицу работников возраст которых более 60 лет

  • Само задание звучит так.

    Пока что я сделал

    Код: plsql
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    12.
    13.
    14.
    15.
    16.
    17.
    18.
    19.
    20.
    21.
    CREATE TABLE Worker
    (
         ТабельныйНомер INT PRIMARY KEY IDENTITY,
         Имя NVARCHAR (20) NOT NULL,
         Фамилия NVARCHAR (20) NOT NULL,
         Отчество NVARCHAR (20) NOT NULL,
         ГодРождения INT NOT NULL CHECK (ГодРождения> 1900 AND ГодРождения <2002),
         Дата Date NOT NULL,
         Должность NVARCHAR (20) NOT NULL,
         Оклад INT CHECK (оклад> = 0),
         Подразделение NVARCHAR (20) NOT NULL
    )
    
    CREATE TABLE SickLeave (
         НормеЛикарняногоЛиста INT PRIMARY KEY IDENTITY,
         Имя NVARCHAR (20) NOT NULL,
         Фамилия NVARCHAR (20) NOT NULL,
         Отчество NVARCHAR (20) NOT NULL,
         ДатаНачала Date NOT NULL,
         ДатаОкончания Date NOT NULL CHECK (ДатаОкончания >= ДатаНачала), 
    )
    



    Но почему-то в SickLeave ругается на дату окончания, как сделать проверку чтоб дата начала не была позднее даты начала?

    И помогите сделать:
    • справочник подразделений и их работников;
    • количество людей, которые имели командировки по каждому подразделению;
    • количество людей, которые болели и имеют больничные листы в текущем месяце, продолжительность больничного;
    • общий список людей, которые не имеют больничные листы (по алфавиту).
    • создать таблицу работников возраст которых более 60 лет
    ...
    Рейтинг: 0 / 0
    10.06.2020, 11:31
        #39967766
    crutchmaster
    Участник
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Ведение базы данных учета командировок и больничных листов.
    ТабельныйНомер
    Это - ересь. В коде только ascii.
    ГодРождения> 1900 AND ГодРождения <2002
    Уже через год будет неактуально. И не год рождения, а дата.
    Дата Date
    Это что такое?
    Оклад INT
    Бывают совместители на нескольких должностях. Связь один человек - одна должность может не выполняться. Уточни у препода этот момент.
    Отчество NVARCHAR (20)
    20 - очень мало.
    Подразделение NVARCHAR (20) NOT NULL
    Тут должен быть ключ на таблицу с подразделениями.
    Должность NVARCHAR (20) NOT NULL
    Тут тоже.
    CREATE TABLE SickLeave (
    ...
    Имя NVARCHAR (20) NOT NULL,
    Фамилия NVARCHAR (20) NOT NULL,
    Отчество NVARCHAR (20) NOT NULL,
    ...

    Зачем тут опять ФИО? Тебя спросят про нормальные формы, не ответить и завалишь защиту.

    Shelleex
    Пока что я сделал

    10 число, а ты только сел делать диплом.
    ...
    Рейтинг: 0 / 0
    10.06.2020, 11:32
        #39967767
    crutchmaster
    Участник
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Ведение базы данных учета командировок и больничных листов.
    Shelleex
    И помогите сделать:

    Любой каприз за ваши деньги.
    ...
    Рейтинг: 0 / 0
    10.06.2020, 11:32
        #39967769
    Ролг Хупин
    Участник
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Ведение базы данных учета командировок и больничных листов.
    В SickLeave надо бы использовать ссылку на Worker, где список всех юзеров, а не барабанить по-новому ФИО и т.д.
    ...
    Рейтинг: 0 / 0
    10.06.2020, 11:40
        #39967776
    a_voronin
    Участник
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Ведение базы данных учета командировок и больничных листов.
    Shelleex
    • справочник подразделений и их работников;
    • количество людей, которые имели командировки по каждому подразделению;
    • количество людей, которые болели и имеют больничные листы в текущем месяце, продолжительность больничного;
    • общий список людей, которые не имеют больничные листы (по алфавиту).
    • создать таблицу работников возраст которых более 60 лет

    По прочтении без труда сделаете сами

    https://sql-language.ru/knigi-po-sql/sql-zaprosy-dlya-prostyx-smertnyx.html
    ...
    Рейтинг: 0 / 0
    10.06.2020, 11:42
        #39967779
    Shelleex
    Гость
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Ведение базы данных учета командировок и больничных листов.
    Ролг Хупин, а как сделать ссылку?
    ...
    Рейтинг: 0 / 0
    10.06.2020, 11:58
        #39967791
    alexeyvg
    Участник
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Ведение базы данных учета командировок и больничных листов.
    Shelleex
    Ролг Хупин, а как сделать ссылку?

    В SickLeave добавить поле ТабельныйНомер INT, сделать его Foreign Key на Worker

    И удалить поля Имя, Фамилия, Отчество
    Shelleex
    Код: plsql
    1.
    2.
    3.
    4.
    5.
    6.
    CREATE TABLE SickLeave (
         НормеЛикарняногоЛиста INT PRIMARY KEY IDENTITY,
         ТабельныйНомер INT NOT NULL REFERENCES Worker(ТабельныйНомер),
         ДатаНачала Date NOT NULL,
         ДатаОкончания Date NOT NULL CHECK (ДатаОкончания >= ДатаНачала), 
    )
    

    ...
    Рейтинг: 0 / 0
    10.06.2020, 12:21
        #39967808
    Shelleex
    Гость
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Ведение базы данных учета командировок и больничных листов.
    alexeyvg,

    SickLeave
    Оно так и должно? И как обнулить счётчик, Номера просто уже началось не с 1 а с 2.
    ...
    Рейтинг: 0 / 0
    10.06.2020, 13:22
        #39967845
    Ролг Хупин
    Участник
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Ведение базы данных учета командировок и больничных листов.
    Shelleex
    alexeyvg,

    SickLeave
    Оно так и должно? И как обнулить счётчик, Номера просто уже началось не с 1 а с 2.


    НормеЛікарняногоЛиста с 2? ну так ви ж identity использовали.
    Можно сбить на 1, можно identity не использовать, если номера важны.
    ...
    Рейтинг: 0 / 0
    10.06.2020, 13:49
        #39967864
    Владислав Колосов
    Участник
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Ведение базы данных учета командировок и больничных листов.
    Shelleex,

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

    Неплохая методическая разработка, например, здесь: https://rep.bntu.by/bitstream/handle/data/4940/Bazy_dannyh.pdf?sequence=1&isAllowed=y
    ...
    Рейтинг: 0 / 0
    10.06.2020, 14:03
        #39967869
    Shelleex
    Гость
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Ведение базы данных учета командировок и больничных листов.
    Я хочу что бы из таблицы Position бралось в Worker должность, оклад, подразделение.

    Создал я 3 таблицы и то вероятно не правильно.

    Код: sql
    1.
    2.
    3.
    4.
    5.
    6.
    7.
    8.
    9.
    10.
    11.
    12.
    13.
    14.
    15.
    16.
    17.
    18.
    19.
    20.
    21.
    22.
    23.
    24.
    25.
    26.
    27.
    28.
    CREATE TABLE Worker
    (
            ТабельныйНомер INT PRIMARY KEY IDENTITY, 
            Имя NVARCHAR(20) NOT NULL,
            Фамилия NVARCHAR(20) NOT NULL,
    	Отчетсво NVARCHAR(20) NOT NULL,
    	ГодРождения INT NOT NULL CHECK(ГодРождения >= 1900 AND ГодРождения <= 2002),
    	ДатаПринятия Date NOT NULL,
    	Должность NVARCHAR(20) NOT NULL REFERENCES Position(Должность),
    	Оклад INT NOT NULL REFERENCES Position(Оклад),
            Подразделение NVARCHAR(20) NOT NULL REFERENCES Position(Подразделение) 
    );
    
    CREATE TABLE SickLeave
    (
            НомерБольничногоЛиста INT PRIMARY KEY IDENTITY, 
    	ТабельныйНомер INT NOT NULL REFERENCES Worker(ТабельныйНомер),
    	ДатаНачала Date NOT NULL,
    	ДатаОкончания Date NOT NULL,
    	constraint CK_ДатаОкончания CHECK (ДатаОкончания >= ДатаНачала)
    );
    
    CREATE TABLE Position
    (
            Должность NVARCHAR(20) PRIMARY KEY, 
    	Оклад INT CHECK(Оклад >= 0) NOT NULL,
    	Подразделение NVARCHAR(20) NOT NULL
    );
    
    ...
    Рейтинг: 0 / 0
    10.06.2020, 14:48
        #39967894
    alexeyvg
    Участник
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Ведение базы данных учета командировок и больничных листов.
    Shelleex
    alexeyvg,

    SickLeave
    Оно так и должно?
    Да.

    Shelleex
    И как обнулить счётчик, Номера просто уже началось не с 1 а с 2.
    DBCC CHECKIDENT
    ...
    Рейтинг: 0 / 0
    10.06.2020, 14:50
        #39967895
    alexeyvg
    Участник
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Ведение базы данных учета командировок и больничных листов.
    Shelleex
    Создал я 3 таблицы и то вероятно не правильно.
    Ага.

    В Worker не надо Оклад и Подразделение, они же есть в таблице Position
    Нужно просто ссылку на Position, то есть поле Должность
    Код: sql
    1.
    Должность NVARCHAR(20) NOT NULL REFERENCES Position(Должность)
    
    ...
    Рейтинг: 0 / 0
    10.06.2020, 16:03
        #39967925
    Shelleex
    Гость
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Ведение базы данных учета командировок и больничных листов.
    • справочник подразделений и их работников;
    • количество людей, которые имели командировки по каждому подразделению;
    • количество людей, которые болели и имеют больничные листы в текущем месяце, продолжительность больничного;
    • общий список людей, которые не имеют больничные листы (по алфавиту).
    • создать таблицу работников возраст которых более 60 лет
    ...
    Рейтинг: 0 / 0
    10.06.2020, 17:11
        #39967955
    Критик
    Участник
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Ведение базы данных учета командировок и больничных листов.
    Человек может уволится, а потом устроится туда же с тем же табельником.
    Человек может работать на часть ставки в нескольких подразделениях, в одном на 0.1, в другом на 0.5, а в третьем на 0.4
    Год рождения никому не интересен, интересна дата.
    Почему "оклад" имеет тип Int?
    Почему в Position у вас ключ текстовой, могут в двух подразделениях быть позиции "аналитик" с кардинально разной зп?

    Да и вообще все не правильно, ибо человек может мигрировать по должностям хоть каждый месяц, у вас это хоть как-то учтено? Позиции могут сегодня быть, а завтра их не будет и т.д. По уму вам нужно взять модель данных из какого-нибудь SAP HR или 1c в соответствующих профильных форумах.
    ...
    Рейтинг: 0 / 0
    10.06.2020, 20:32
        #39968048
    Shelleex
    Гость
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Ведение базы данных учета командировок и больничных листов.
    SELECT Count(ei.ТабельныйНомер) КоличествоЛюдей, Sum(DAY(ei.ДатаОкончания) - DAY(ei.ДатаНачла)) КоличествоДней FROM Worker e
    JOIN SickLeave ei
    ON e.ТабельныйНомер = ei.ТабельныйНомер
    JOIN Position ea
    ON e.Должность = ea.Должность
    Where MONTH(GETDATE()) = MONTH(ei.ДатаОкончания) OR MONTH(GETDATE()) = MONTH(ei.ДатаНачла)

    • количество людей, которые болели и имеют больничные листы в текущем месяце, продолжительность больничного;
    ...
    Рейтинг: 0 / 0
    10.06.2020, 22:51
        #39968070
    alexeyvg
    Участник
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Ведение базы данных учета командировок и больничных листов.
    Shelleex
    Как сделать суму всех, у меня получается берет суму только первого в таблице SickLeave
    У вас не берёт первого, всё нормально.
    Только сумму дней вы криво считаете.

    Человек болел с 31 января по 2 февраля ,сколько дней получится?
    DAY(2 февраля) - DAY(31 января) = 2 - 31 = -29 дней.
    Человек болел минус 29 дней, это что, Карл?

    Воспользуйтесь функцией DATEDIFF
    ...
    Рейтинг: 0 / 0
    10.06.2020, 23:54
        #39968077
    ИВП
    Участник
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Ведение базы данных учета командировок и больничных листов.
    Критик
    Человек может уволится, а потом устроится туда же с тем же табельником.
    Человек может работать на часть ставки в нескольких подразделениях, в одном на 0.1, в другом на 0.5, а в третьем на 0.4
    Год рождения никому не интересен, интересна дата.
    Почему "оклад" имеет тип Int?
    Почему в Position у вас ключ текстовой, могут в двух подразделениях быть позиции "аналитик" с кардинально разной зп?

    Да и вообще все не правильно, ибо человек может мигрировать по должностям хоть каждый месяц, у вас это хоть как-то учтено? Позиции могут сегодня быть, а завтра их не будет и т.д. По уму вам нужно взять модель данных из какого-нибудь SAP HR или 1c в соответствующих профильных форумах.

    Ребят! Учебное задание!!!
    "Уволиться и устроиться с тем же табельником" - фантастика! Сколько раз в год? Учебное задание!!!
    "Почему "оклад" имеет тип Int?" - Копейки даже в Пятерочке отбрасывают/округляют. Это Учебное задание!!!
    "Работа в разных подразделениях на долю ставки" - зачем в учебном задании?
    "Год рождения не интересен" - кто сказал? Учебное задание!!!
    "Миграция по должностям, удаление позиций..."
    вы требуете от УЧЕБНОГО задания учет всех маловероятных случаев!!!
    ...
    Рейтинг: 0 / 0
    11.06.2020, 01:33
        #39968089
    Критик
    Участник
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Ведение базы данных учета командировок и больничных листов.
    ИВП,

    Почему нет? Учебные задачи нужно делать качественно, основывая их на реальности, а не используя выхолощенные до предела примеры. Тем более, что hr-модель довольно простая.
    ...
    Рейтинг: 0 / 0
    11.06.2020, 05:58
        #39968099
    crutchmaster
    Участник
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Ведение базы данных учета командировок и больничных листов.
    ИВП
    "Работа в разных подразделениях на долю ставки" - зачем в учебном задании?

    Чтобы поиздеваться над студентом?
    ...
    Рейтинг: 0 / 0
    11.06.2020, 09:25
        #39968117
    L_argo
    Участник
    Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
    Ведение базы данных учета командировок и больничных листов.
    По уму вам нужно взять модель данных из какого-нибудь SAP HR или 1c в соответствующих профильных форумах. Чиво ? Там душевнобольные напроектировали сотню таблиц, в которых совсем не просто разобраться. И там 90% ненужного по сабжу.

    Мы делали так: Есть справочник сотрудников. Есть справочник вакансий с повторами должностей, если их нужно много (н-р грузчики, водители). Специальный документ принимает/увольняет сотрудников на ID конкретной вакансии с конкретной ЗП. Т.е. вакансия может быть занята, вакантна, неактуальна. И можно всегда узнать где и когда с какой ЗП работал сотрудник.
    Потом документ Табелирование подневно заполняет раб. дни отработанными часами сотрудников (или больничными, отпусками и отлулами) со ссылкой на ID вакансии + доп. инфа. Раз в мес. на это уходит пару минут в полуручном режиме.

    Всегда можно четко сказать на любую дату, какое штатное расписание, открытые вакансии и какой ФОТ.
    ЗП рассчитывается элементарно.
    Можно числиться хоть на 10 должностях в разных конторах холдинга.
    Можно делать очень сложную формулу расчета заработков/больничных/переработок и т.п.
    Можно четко вести учет ФОТ-затрат на конкретные работы, н-р строительство объекта: табелировать почасово на конкретные проекты.
    Любой сотрудник может получить подробный список, из чего состоит его ЗП за конкретный период.
    В любой момент можно перетабелировать, если была ошибка.

    Штрафы и премии были в отдельном документе.

    Всего десяток таблиц покрывал и кадры и расчет ЗП. Проект жив с 2003г.
    ...
    Рейтинг: 0 / 0
    Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Ведение базы данных учета командировок и больничных листов. / 21 сообщений из 21, страница 1 из 1
    Целевая тема:
    Создать новую тему:
    Автор:
    Найденые пользователи ...
    Разблокировать пользователей ...
    Читали форум (0):
    Пользователи онлайн (0):
    x
    x
    Закрыть


    Просмотр
    0 / 0
    Close
    Debug Console [Select Text]