С Новым годом! Форум программистов, компьютерный форум, киберфорум
C#: Базы данных, ADO.NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/75: Рейтинг темы: голосов - 75, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 16.09.2015
Сообщений: 23
1

База данных записи на приём к врачу

23.09.2015, 11:39. Показов 15020. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток! Суть программы "Запись на приём к врачу". Например 23.09.2015 записались 2 чел на время, одного записали на 8:00, а другого на 8:30 (т.к врач не может принимать обоих сразу). Планировалось сделать так, чтобы если в один день записали на 8:00, то нельзя было бы записать ещё одного человека на тоже время, а с интервалом в 30 минут. База данных WinForms+SQL
Принцип работы: Выбранное время+30 мин.
Пробнул реализовать это всё,но безуспешно.
C#
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
namespace Test1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
      
        internal struct Reception
        {
            public string TimeName;
            public DateTime Begin;
            public DateTime End;
            public bool IsUse;
 
            public Reception(string name, DateTime begin, bool isuse)
            {
                TimeName = name;
                Begin = begin;
                End = begin + new TimeSpan(0, 0, 30, 0);
                IsUse = isuse;
            }
        }
       
        internal class ReleaseReception
        {
            List<Reception> Reception = new List<Reception>();
 
            public ReleaseReception()
            {
                Reception.Add(new Reception("8:30 - 9:00", new DateTime(2015, 10, 1, 8, 30, 0), false));
                Reception.Add(new Reception("9:00 - 9:30", new DateTime(2015, 10, 1, 9, 0, 0), false));
                Reception.Add(new Reception("9:30 - 10:00", new DateTime(2015, 10, 1, 9, 30, 0), false));
                Reception.Add(new Reception("10:00 - 10:30", new DateTime(2015, 10, 1, 10, 0, 0), false));
                Reception.Add(new Reception("10:30 - 11:00", new DateTime(2015, 10, 1, 10, 30, 0), false));
                Reception.Add(new Reception("11:00 - 11:30", new DateTime(2015, 10, 1, 11, 0, 0), false));
                ///////
                Reception.Add(new Reception("11:30 - 12:00", new DateTime(2015, 10, 1, 10, 0, 0), false));
               // Reception.Add(new Reception("10:30 - 11:00", new DateTime(2015, 10, 1, 10, 30, 0), false));
               // Reception.Add(new Reception("11:00 - 11:30", new DateTime(2015, 10, 1, 11, 0, 0), false));
            }
        }
 
        private void clientsInfoBindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
            DateTime temp1 = датаDateTimePicker.Value;
            DateTime temp2 = времяDateTimePicker.Value;
            датаDateTimePicker.Value = DateTime.Now;
            времяDateTimePicker.Value = DateTime.Now;
            датаDateTimePicker.Value = temp1;
            времяDateTimePicker.Value = temp2;
            try
            {
                this.Validate();
                this.clientsInfoBindingSource.EndEdit();
                this.tableAdapterManager.UpdateAll(this.clientsDataSet1);
            }
            catch
            {
                MessageBox.Show("Вы забыли ввести данные");
            }
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            
            
            // TODO: данная строка кода позволяет загрузить данные в таблицу "clientsDataSet1.ClientsInfo". При необходимости она может быть перемещена или удалена.
            this.clientsInfoTableAdapter.Fill(this.clientsDataSet1.ClientsInfo);
            timer1.Start();
 
        }
 
        private void времяDateTimePicker_ValueChanged(object sender, EventArgs e)
        {
           // времяDateTimePicker.Format = DateTimePickerFormat.Custom;
           // времяDateTimePicker.CustomFormat = "HH:mm";
        }
 
        private void датаDateTimePicker_ValueChanged(object sender, EventArgs e)
        {
            датаDateTimePicker.Format = DateTimePickerFormat.Custom;
            датаDateTimePicker.CustomFormat = "dd.MM.yyyy";
        }
        int count = 0;
        private void timer1_Tick(object sender, EventArgs e)
        {
            count = clientsInfoBindingSource.Count;
            label1_status.Text = "Колличество записей в базе: "+count.ToString();
        }
 
        private void searchNameToolStripButton_Click(object sender, EventArgs e)
        {
            try
            {
                this.clientsInfoTableAdapter.SearchName(this.clientsDataSet1.ClientsInfo, фамилияToolStripTextBox.Text);
            }
            catch (System.Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message);
            }
 
        }
 
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            
            this.clientsInfoBindingSource.Filter = string.Format("Фамилия LIKE '{0}' + '%'", textBox1.Text);
        }
 
        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            this.clientsInfoBindingSource.Filter = string.Format("Телефон1 LIKE '{0}' + '%'", textBox2.Text);
        }
 
        private void фамилияTextBox_Validating(object sender, CancelEventArgs e)
        {
            ValidateSurname();
        }
        private bool ValidateSurname()
        {
            bool bStatus = true;
            if (фамилияTextBox.Text == "")
            {
                errorProvider1.SetError(фамилияTextBox, "Вы не ввели данные");
                bStatus = false;
            }
            else
                errorProvider1.SetError(фамилияTextBox, "");
            return bStatus;
        }
 
        private void имяTextBox_Validating(object sender, CancelEventArgs e)
        {
            ValidateName();
        }
        private bool ValidateName()
        {
            bool bStatus = true;
            if (имяTextBox.Text == "")
            {
                errorProvider1.SetError(имяTextBox, "Вы не ввели данные");
                bStatus = false;
            }
            else
                errorProvider1.SetError(имяTextBox, "");
            return bStatus;
        }
 
        private void телефон1MaskedTextBox_Validating(object sender, CancelEventArgs e)
        {
             ValidateTel1();
        }
        private bool ValidateTel1()
        {
            bool bStatus = true;
            if (телефон1MaskedTextBox.Text == "")
            {
                errorProvider1.SetError(телефон1MaskedTextBox, "Вы не ввели данные");
                bStatus = false;
            }
            else
                errorProvider1.SetError(телефон1MaskedTextBox, "");
            return bStatus;
        
        }
 
        private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
        {
            датаDateTimePicker.Value = DateTime.Now;
            времяDateTimePicker.Value = DateTime.Now;
        }
    }
}
Миниатюры
База данных записи на приём к врачу  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.09.2015, 11:39
Ответы с готовыми решениями:

Создание электронной записи на приём к врачу
Может ли кто-то подсказать плагин, который осуществил бы платную электронную запись на приём к...

Нужно создать электронную запись на приём к врачу в Access базу данных, и сделать саму программу в delphi
Базу данных я уже сделал, но ещё нужно сделать электронную очередь в которой будет показываться уже...

Как подключить базу данных (Автоматическая реестрация записи к врачу)
Доброго времени суток. Я новичек и делаю курсовой, на тему &quot;Автоматическая реестрация записи к...

Создать программу самозаписи на прием к врачу
Итак, мне необходимо создать программу самозаписи на прием к врачу. Т.е. есть форма на которой...

15
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.09.2015, 11:45 2
kindibon, создай в БД триггер, который будет проверять, нет ли на это время кого-то и всё.

Добавлено через 1 минуту

Не по теме:

алсо я искренне надеюсь, что это лаба для универа, а не реальный софт

0
0 / 0 / 0
Регистрация: 16.09.2015
Сообщений: 23
23.09.2015, 11:47  [ТС] 3
Psilon, можно пример пожалуйста?
0
Master of Orion
Эксперт .NET
6100 / 4956 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
23.09.2015, 15:11 4
T-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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
USE [Test]
GO
/****** Object:  Trigger [dbo].[Main_Updated]    Script Date: 23.09.2015 15:10:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
    ALTER TRIGGER [dbo].[Main_Updated] ON [dbo].[Main]
    INSTEAD OF INSERT,UPDATE
    AS
    BEGIN
        SET NOCOUNT ON;
 
        DECLARE @IsUpdate BIT = 0
 
        DECLARE @ErrMessage NVARCHAR(255)
 
        IF EXISTS (SELECT TOP 1 * FROM deleted d)
            SET @IsUpdate = 1
 
        SET @ErrMessage = 'Value(s) can not be ' + IIF(@IsUpdate=1,'updated','inserted') + ' - there are existing Receptions which are less than 30 Minutes away!'
 
        IF EXISTS(
            SELECT TOP 1 *
            FROM inserted i
            JOIN dbo.Main t ON
            ABS(DATEDIFF(MINUTE, i.ReceptionBegin, t.ReceptionBegin)) <= 30)
 
        BEGIN
            RAISERROR(@ErrMessage,16,1)
            RETURN
        END
 
        IF @IsUpdate = 1
        BEGIN
            UPDATE  t
            SET     t.ReceptionBegin = i.ReceptionBegin,
                    t.ReceptionEnd = t.ReceptionEnd
            FROM    Main t
                    INNER JOIN inserted i ON t.id = i.id
        END
        ELSE
        BEGIN
            INSERT INTO Main(ReceptionBegin,ReceptionEnd)
            SELECT i.ReceptionBegin, i.ReceptionEnd FROM inserted i
        END
    END
Пишем триггер, который не даст вставить в табличку данные, если они плохие. После этого просто ловим эксепшн от базы и говорим, что вставить такое значение нельзя.


Я проверял на такой табличке:
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
USE [Test]
GO
/****** Object:  Table [dbo].[Main]    Script Date: 23.09.2015 15:11:26 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Main](
    [id] [int] IDENTITY(1,1) NOT NULL,
    [ReceptionBegin] [datetime] NOT NULL,
    [ReceptionEnd] [datetime] NOT NULL,
 CONSTRAINT [PK_Main] PRIMARY KEY CLUSTERED 
(
    [id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
 
GO
1
0 / 0 / 0
Регистрация: 16.09.2015
Сообщений: 23
24.09.2015, 14:12  [ТС] 5
Psilon, Большое спасибо, буду пробовать.

Добавлено через 42 секунды
База имеет формат .sdf

Добавлено через 1 час 28 минут
Может знает кто как реализовать задумку не используя триггера? База имеет формат .sdf. Я написал структуру для времени, но она не работает.

Добавлено через 27 минут
Хоть какой нибудь изощрённый способ
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
25.09.2015, 12:48 6
Перед вставкой записи делайте запрос к БД и проверяете,что время не занято.
0
0 / 0 / 0
Регистрация: 16.09.2015
Сообщений: 23
25.09.2015, 12:54  [ТС] 7
Igr_ok, а можно пожалуйста пример?
0
471 / 234 / 73
Регистрация: 25.05.2012
Сообщений: 1,076
Записей в блоге: 1
25.09.2015, 13:00 8
kindibon, может есть смысл
- разбить время работы на интервалы по полчаса (8:00 - 8:30, 8:30 - 9:00 и т.д.)

- создать справочник
ID - Интервал
1 - 8:00 - 8:30
2 - 8:30 - 9:00
3 - 9:00 - 9:30
...

- в таблице записи на прием указывать ID интервала и дату

Добавлено через 2 минуты
если невозможно реализовать проверку (занят ли интервал) на уровне СУБД, то делать это надо на уровне приложения.
Цитата Сообщение от Igr_ok Посмотреть сообщение
Перед вставкой записи делайте запрос к БД и проверяете,что время не занято.
0
0 / 0 / 0
Регистрация: 16.09.2015
Сообщений: 23
25.09.2015, 13:03  [ТС] 9
NewOrdered, проблема в то что я не знаю как он должен выглядеть и к чему его привязывать.
0
471 / 234 / 73
Регистрация: 25.05.2012
Сообщений: 1,076
Записей в блоге: 1
25.09.2015, 13:08 10
Цитата Сообщение от kindibon Посмотреть сообщение
NewOrdered, проблема в то что я не знаю как он должен выглядеть и к чему его привязывать.
что как выглядеть должно?
0
785 / 616 / 273
Регистрация: 04.08.2015
Сообщений: 1,713
25.09.2015, 13:20 11
Цитата Сообщение от kindibon Посмотреть сообщение
Igr_ok, а можно пожалуйста пример?
Создаете DateTime c нужным вам временем, чтобы использовать его в качестве параметра при обращении к БД.
Выполняете параметризированный запрос к БД.
0
0 / 0 / 0
Регистрация: 16.09.2015
Сообщений: 23
25.09.2015, 13:38  [ТС] 12
Igr_ok, я имею ввиду, как должен выглядеть запрос, код?
0
471 / 234 / 73
Регистрация: 25.05.2012
Сообщений: 1,076
Записей в блоге: 1
25.09.2015, 13:40 13
Цитата Сообщение от kindibon Посмотреть сообщение
NewOrdered, проблема в то что я не знаю как он должен выглядеть и к чему его привязывать.
если очень упрощенно, то как-то так
База данных записи на приём к врачу


смысл этого справочника - избавить вас от геморроя с DateTime, а именно с назначением времени и проверкой не занято ли оно.
Поля IntervalID и Date однозначно определяют дату и время посещения, но при этом не нужно высчитывать никаких часов-минут.
1
0 / 0 / 0
Регистрация: 16.09.2015
Сообщений: 23
25.09.2015, 13:59  [ТС] 14
NewOrdered, благодарю вас! Буду тестить.
0
80 / 73 / 25
Регистрация: 26.10.2010
Сообщений: 231
26.09.2015, 19:16 15
NewOrdered, kindibon,

к схеме БД можно еще добавить табличку (к примеру "РабочееВремя") между "Интервалы" и "Специалисты", которая в свою очередь будет описывать время приема для каждого доктора.
Что позволит отображать для каждого доктора его индивидуальный график часов приема.
Конечно же все можно еще усилить к примеру днями недель.

NewOrdered,
в каком редакторе рисовалась блок-схема ?
0
471 / 234 / 73
Регистрация: 25.05.2012
Сообщений: 1,076
Записей в блоге: 1
26.09.2015, 21:02 16
tvv1, вы конечно же правы. схему я привел, чтобы показать саму концепцию проектирования.

схема создана в MS Visio 2010
1
26.09.2015, 21:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.09.2015, 21:02
Помогаю со студенческими работами здесь

Талоны на прием к врачу. Цикл с параметром
В поликлинике ведут прием хирург, невропатолог и терапевт. В регистратуре в этот день брали талоны...

Запись на приём к врачу (тонкости со временем)
Всем доброго времени суток! Делаю программу типа: &quot;запись на приём к врачу&quot;. При записи пациента к...

1C Предприятие Регистр Сведений, Запись на приём к врачу
Здравствуйте! Помогите мне,пожалуйста! Есть документы: Расписание врачей, Запись Пациента, регистр...

Сколькими способами можно составить очередь на прием к врачу
на приеме у терапевта 18 человек,в день терапевт осматривает 15 человек.сколькими способами можно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru